Page 1 of 1

Nuevo ejemplo de HDO con RDL de SQLite

PostPosted: Wed Oct 05, 2016 3:17 pm
by xmanuel
Aqui https://xa.yimg.com/df/HDO_Harbour/demo00_hdo.rar?token=IEq-M2jkNkiyDR0j7Myy3U6AGtMC7md3NCtS41Ad5WuHKHgssigZ4YWjMmTHFYWib4F4t4glpMPusAcWaU_eIVjLxG3ysVoep0S68Xw-658D0gPU9HA&type=download podeis descargar un ejemplo de HDO.
Ejemplo de HDO para migrar TEST.DBF de la carpeta de ejemplos de Harbour a SQLite.
Usa las técnicas de preparación de sentencias en el lado del servidor y transacciones. Esto hace que el proceso vaya muy rápido y evita la inyección de código sql (https://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL)

Para que funciones copiar test.dbf donde se vaya a ejecutar la demo...

Podéis comprobar la rapidez de la migración :D

Re: Nuevo ejemplo de HDO con RDL de SQLite

PostPosted: Thu Oct 06, 2016 3:55 pm
by xmanuel
Hay que estar dado de alta en los grupos de yahoo...

El enlace de la carpeta es este: https://es.groups.yahoo.com/neo/groups/HDO_Harbour/files/Ejemplos/

Re: Nuevo ejemplo de HDO con RDL de SQLite

PostPosted: Thu Oct 06, 2016 4:44 pm
by Compuin
Hola,

Si ya FWH trae MySQL nativo ademas de la clase Tdolphin, cual es el valor agregado o beneficio de tu clase?

Re: Nuevo ejemplo de HDO con RDL de SQLite

PostPosted: Thu Oct 06, 2016 5:17 pm
by xmanuel
En primer lugar no es una clase para acceder sólo a MySQL si no que además lo podrás hacer también a SQLite, Postgres, Firebird, Oracle y a otras muchas usando ODBC.
Todas ellas accediendo de manera nativa.
El 100% de las clases están hechas en lenguaje C por lo que son muy rápidas y robustas evitando la MV de Harbour.
Tienes la posibilidad usar sentencias preparadas en el lado del servidor por lo que el tráfico en la red es mínimo y, el que hay, será binario, imposible de inyectar código malicioso.
Además te garantizo que si usas SQL estándar podrás tener un mismo programa preparado para todas las bases de datos sólo cambiando una línea :P , esta:
Code: Select all  Expand view
oDb := THDO():new( "sqlite" )

Cambiando "sqlite" por "mysql" tendrás un programa compatible con uno u otro gestor de bases de datos.
Y sobre todo he cuidado la velocidad, ¿has probado el programa que he puesto? los 500 registros los pasa instantáneamente el tiempo de retardo es el de repintado del contador!!!

Por si no te lo has descargado, este es el código para que veas lo fácil que es usarlo:
Code: Select all  Expand view
   
#include "hdo.ch"

//------------------------------------------------------------------------------
// Programa principal

procedure main()

    local oDb, e
    local cCreaTabla := ;
       "CREATE TABLE test ( "       + ;
       "idreg INTEGER PRIMARY KEY," + ;
       "first       TEXT,"          + ;
       "last        TEXT,"          + ;
       "street      TEXT,"          + ;
       "city        TEXT,"          + ;
       "state       TEXT,"          + ;
       "zip         TEXT,"          + ;
       "hiredate    TEXT,"          + ;
       "married     INTEGER,"       + ;
       "age         INTEGER,"       + ;
       "salary      REAL,"          + ;
       "notes       TEXT );"

    oDb := THDO():new( "sqlite" )

    if oDb:connect( "demo.db" )

        msg( "demo.db abierta" )

        try
            oDb:exec( cCreaTabla )
            msg( "Traspaso de datos..." )
            traspasa( oDb )
        catch  e
            eval( errorblock(), e )
        end

    endif

    oDb:disconnect()
    msg( "demo.db cerrada" )

return

//------------------------------------------------------------------------------
// Usa sentencias preparadas en el lado del servidor y transacciones.

procedure traspasa( oDb )

    local n := 0
    local oInsert
    local first, last, street, city, state, zip, hiredate, married, age, salary, notes
    local cSentencia := "INSERT INTO test ( first, last, street, city, state, zip, " + ;
                            "hiredate, married, age, salary, notes ) "  + ;
                            "VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? );"

    if file( "test.dbf" )
       
        use test new
       
        oInsert := oDb:prepare( cSentencia ) // Crea el objeto y prepara la sentencia

        // Vincula las variables harbour con cada una de las "?" por su posicion
        oInsert:bindParam(  1, @first  )
        oInsert:bindParam(  2, @last  )
        oInsert:bindParam(  3, @street )
        oInsert:bindParam(  4, @city )
        oInsert:bindParam(  5, @state )
        oInsert:bindParam(  6, @zip )
        oInsert:bindParam(  7, @hiredate )
        oInsert:bindParam(  8, @married )
        oInsert:bindParam(  9, @age )
        oInsert:bindParam( 10, @salary )
        oInsert:bindParam( 11, @notes )
   
        oDb:beginTransaction()
   
        while test->( !eof() )
            first    := test->first
            last     := test->last
            street   := test->street
            city     := test->city
            state    := test->state
            zip      := test->zip
            hiredate := dtos( test->hiredate )
            married  := if( test->married, 1, 0 )
            age      := test->age
            salary   := test->salary
            notes    := test->notes
       
            oInsert:execute()
       
            @ 10, 10 say str( ++n )
       
            test->( dbskip( 1 ) )
        end
   
        oDb:commit()   
        oInsert:free()
    else
        msg( "Fichero no encontrado -> test.dbf" )
    endif

return

//------------------------------------------------------------------------------
 


Cualquier duda estoy aquí para responder...
:D

Re: Nuevo ejemplo de HDO con RDL de SQLite

PostPosted: Fri Nov 18, 2016 6:31 pm
by José Luis Sánchez
Manu,
tengo mucho interes en probar HDO. Escribeme a joseluis.sncz@yahoo.es por favor y dime la manera de darme de alta en tu grupo de yahoo.

Saludos,
José Luis

Re: Nuevo ejemplo de HDO con RDL de SQLite

PostPosted: Fri Nov 18, 2016 9:14 pm
by xmanuel
José Luis cuanto me alegra saber de ti... somos unos descastados!!!

Ahora mismo sólo está la RDL para SQLite y créeme que va como un tiro. Puedes comparar con cualquier cosa que se haya publicado. Toda la jerarquía de clases está hecha en lenguaje C ni siquiera usa la máquina virtual de harbour.
Quiero meter una nueva clase que llamaré RowSet (jaja qué imaginación!!!) para usar los cursores que genere el propio cliente de la base de datos como por ejemplo MySQL. Habrá otros clientes como SQLite que los fabricaré con arrays de lenguaje C...

Voy a ir poniendo un ejemplo cada semana en el foro yahoo de HDO https://es.groups.yahoo.com/neo/groups/HDO_Harbour/info

Te puedes dar de alta en el foro y yo te lo apruebo rápido :D :roll: