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.

GTXSII. Visual Basic .NET

Estamos trabajando muy duro en intentar en soportar más lenguajes de programación para nuestra librería GtxSII, para el Suministro Inmedi...