viernes, 30 de enero de 2015

Usando mxml


Debido a los problemas de memoria usando la clase TXMLDocument, he decidido usar directamente la librería mxml.

Pongo un ejemplo de COMO se obtienen los datos a partir de una cadena que contiene el XML.

Parece una tonteria, pero no he encontrado un ejemplo tan simple como esto.
Espero os ayude 


function read_xml()
  Local htree, hNode, cType, hTarifa, hNext, hDias, hDia, hHab, hPrecios
  Local xml := [<?xml version="1.0" encoding="UTF-8"?> ]+;
                [<Precios>]+;
                [    <Tarifa Codigo="BAR" Tipo="DIARIO" ImpuestosIncluidos="true" >]+;
                [        <Habitacion Tipo="DOB1" PAX="1">]+;
                [            <DIAS>]+;
                [                <Dia Precio="1" Fecha="01-08-2013" Estado="A"/>]+;
                [                <Dia Precio="2" Fecha="02-08-2013" Estado="C"/>]+;
                [            </DIAS>]+;
                [        </Habitacion>]+;
                [        <Habitacion Tipo="DOB2" PAX="2">]+;
                [            <DIAS>]+;
                [                <Dia Precio="3.1415" Fecha="01-08-2013" Estado="A"/>]+;
                [                <Dia Precio="3.1415" Fecha="02-08-2013" Estado="A"/>]+;
                [            </DIAS>]+;
                [        </Habitacion>]+;
                [    </Tarifa>]+;
                [</Precios>]

      hTree = mxmlLoadString( nil, xml )

      IF Empty( hTarifa := mxmlFindElement( hTree, hTree, "Tarifa",,, MXML_DESCEND ) )
         OutErr( "Unable to find first <tarifas> element in XML tree!" + hb_eol() )

         mxmlDelete( hTree )
         ErrorLevel( 1 )
         QUIT
      endif  

      Alert( "Tarifa coger atributos:"+ mxmlGetElement( hTarifa )   )
      Alert( "Codigo Tarifa.:" + mxmlElementGetAttr( hTarifa, "Codigo" ) + hb_osnewline() + ;
             "Tipo de Tarifa:" + mxmlElementGetAttr( hTarifa, "Tipo" )   + hb_osnewline() +;
             "Impuestos.....:" + mxmlElementGetAttr( hTarifa, "ImpuestosIncluidos" ) )
    
       hNext := mxmlWalkNext( hTarifa, hTree, MXML_DESCEND )   // Cogo habitacion1 porque hTarifa es el nodo principal
       while hNext != NIL
             Alert( "Hab:" + mxmlElementGetAttr( hNext, "Tipo" ) )
             hDias := mxmlWalkNext( hNext, hTree, MXML_DESCEND )        // Cojo nodo DIAS, descendiendo un nivel
                   hDia  := mxmlWalkNext( hDias, hTree, MXML_DESCEND )  // Cojo nodo DIA , descendiendo un nivel
                   while hDia != NIL
                         alert( "DIA :" + mxmlGetElement( hDia ) + "-->" + mxmlElementGetAttr( hDia, "Precio" )  )
                         alert("      " + mxmlGetElement( hDia ) + "-->" + mxmlElementGetAttr( hDia, "Fecha" )  )
                         alert("      " + mxmlGetElement( hDia ) + "-->" + mxmlElementGetAttr( hDia, "Estado" )  )
                         hDia := mxmlGetNextSibling( hDia ) // Siguiente Node dia, al mismo NIVEL
                   end while     

             hNext := mxmlGetNextSibling( hNext ) // El siguiente nodo es la habitacion, mismo NIVEL
       end while

    alert( "mira:" + MXMLSAVEALLOCSTRING( hTree ))
    mxmlDelete( hTree )

return nil

jueves, 29 de enero de 2015

Cuando estás a punto de guardar....


Hacia muucho tiempo que no conseguia que Windows 7 se me rompiera.

Ayer programando el servidor Web en Harbour, haciendo pruebas de estres, parece ser que se estresó el dichoso Windows y me dejo una bonita pantalla azul 'paraiso'. ;-(


Harbour. The Lost of Memory. 2 Parte ( UPDATE )








Aplicando un pequeño parche al codigo;

function play_doc(  )
   Local oTarifas
   Local cEncoding := "ISO-8859-1"

  
   oTarifas := Twebtarifas():New()
   for x := 1 to 10
       oTarifas:Append( X )
   next

   UAddHeader( "Content-Type", "text/xml;charset=utf-8" )
   UWrite( oTarifas:WriteXML() )
  
   // PATCH
   oTarifas := NIL
   HB_GCALL( .F. ) // limpia basuras .T. fuerza


RETURN nil

Pero si miramos el gráfico, los picos de memoria en la imagen gráfica amarilla, llega a hasta a 9Mb RAM , finalmente se queda en 5Megas RAM

Pero ojo, esto se queda así , y se va acumulando cada vez que hay más y más peticiones.
A la larga, el programa necesita ser reiniciado por el consumo excesivo de memoria.

Android y Git. Disponer del hash automáticamente.

Una de las cosas a las que estoy acostumbrado, es tener siempre en mi código, el hash/tag/versión del control de versiones que estoy usan...