Page 1 of 2

HDO una imagen vale más que...

PostPosted: Mon May 04, 2015 8:33 pm
by xmanuel
A ver si alguien adivina que es esto? :D
Image

Y un ejemplo en PRG
Code: Select all  Expand view

/*******************************************************************************
 * Proyecto: Harbour Data Objects hdo
 * Fichero: demo01.prg
 * Descripcion: Demo con el RDL SQLite
 * Autor: Manu Exposito
 * Fecha: 04/05/2015
 ******************************************************************************/


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

#include "hdo.ch"

//------------------------------------------------------------------------------
// Funcion principal

procedure main()

    local i := 0
    local oCur, aCur, e
/**/
    local oHdo
    local cCrea := "CREATE TABLE socio " + ;
                        "( clavesocio INTEGER PRIMARY KEY," + ;
                           "socio TEXT,"                    + ;
                           "direccion TEXT,"                + ;
                           "telefono TEXT,"                 + ;
                           "categoria TEXT );"

    local cIns :=   "INSERT INTO socio ( clavesocio, socio, direccion, telefono, categoria ) "      + ;
                             "VALUES (1, 'Paula', 'California, 34', '955667788', 'de primera' ); "  + ;
                    "INSERT INTO socio ( clavesocio, socio, direccion, telefono, categoria ) "      + ;
                             "VALUES (2, 'Manuel', 'Formentera, 44', '955127756', 'de segunda' ); " + ;
                    "INSERT INTO socio ( clavesocio, socio, direccion, telefono, categoria ) "      + ;
                             "VALUES (3, 'Carmen', 'Tinto, 33', '932667778', 'de quinta' ); "       + ;
                    "INSERT INTO socio ( clavesocio, socio, direccion, telefono, categoria ) "      + ;
                             "VALUES (4, 'Isabel', 'El Cano, 4', '923667745', 'de segunda' ); "     + ;
                    "INSERT INTO socio ( clavesocio, socio, direccion, telefono, categoria ) "      + ;
                             "VALUES (5, 'Adrian', 'Octavio Paz, 2', '955333788', 'de primera' ); " + ;
                    "INSERT INTO socio ( clavesocio, socio, direccion, telefono, categoria ) "      + ;
                             "VALUES (6, 'Lorenzo', 'Alvareda, 9', '955222288', 'de cuarta' ); "

    cls

    oHdo := THDo():new( "SQLITE" )

    muestra( oHdo:getObjDriver():listDrivers(), "Drivers" )

    // Todas las sentencias que se envian al servidor deberian ir envueltas
    // en un TRY - CATCH
    TRY
        oHdo:connect( "agenda.db" )

        msg( oHdo:getHost() + ";" + oHdo:getDbName() + ";" + ;
             oHdo:getUser() + ";" + oHdo:getPasswd() + ";" + ;
             oHdo:getDrvName(), "Datos conexion" )

        muestra( oHdo:driverInfo(), "Datos del driver" )

        TRY
            oHdo:exec( cCrea )
        CATCH  e
            muestra( e:SubSystem +";" + padl( e:SubCode, 4 ) + ";" + ;
                     e:Operation + ";" + e:Description, "Error desde Harbour" )
            muestra( oHdo:errorInfo(), "Error desde rdl:errorInfo()" )
        END

        TRY
            if oHdo:inTransaction()
                msg( "1 Esta en una trasaccion" )
            else
                msg( "1 No esta en una trasaccion" )
            endif
            oHdo:beginTransaction()
            if oHdo:inTransaction()
                msg( "2 Esta en una trasaccion" )
            else
                msg( "2 No esta en una trasaccion" )
            endif
            i := oHdo:exec( cIns )
            oHdo:commit()
        CATCH
            muestra( oHdo:errorInfo(), "Datos del error" )
            oHdo:rollBack()
        END

        msg( AllTrim( Str( i ) ) + " - " + AllTrim( Str( oHdo:lastInsertId() ) ) , "Columnas afectadas y rowid" )

        TRY
            oHdo:exec( "SELECT * FROM socio WHERE clavesocioX = 1;" )
            muestra( oHdo:errorInfo(), "Datos del error" )
        CATCH
            muestra( oHdo:errorInfo(), "Datos del error" )
        END

        msg( oHdo:escapeStr( "Manuel's kely \todo mi\o" ) )

    CATCH
        muestra( oHdo:errorInfo(), "Conexion" )
    FINALLY
        oHdo:disconnect()
    END

    msg( ";;;;ESTO ES TODO!!!;;;;;" )

return
 

Re: HDO una imagen vale más que...

PostPosted: Mon May 04, 2015 11:49 pm
by ruben Dario
Es una clase en C para accesar base de datos SQLITE y creo que sirve para Paradox.

Interesante...

Re: HDO una imagen vale más que...

PostPosted: Tue May 05, 2015 6:04 am
by wmormar
Amigo Manu,

Muy interesante.

Podra ser usado solo desde [x]Harbour ?

Re: HDO una imagen vale más que...

PostPosted: Tue May 05, 2015 4:33 pm
by xmanuel
Es un sistema que he creado para hacer clases de harbour pero codificadas en lenguaje C, esto hace que nos saltemos la vm con lo que la velocidad mejora notablemente y sin renunciar las bondades del paradigma de la POO.

En principio uso la API del motor de objetos de harbour por lo que puede diferir de el de xharbour.

Los usuarios de TDbf pro ya lo conocen.

Ejemplo del constructor de la clase principal:
Code: Select all  Expand view


HB_METHOD( THDO_NEW )
{
    PHB_ITEM pSelf = hb_pSelf();

    if( pSelf )
    {
        HDOP hdo = (HDOP) hb_xgrab( sizeof( HDO ) );

        if( hdo )
        {
            hdo->sp_vMethods = dfGetMethod(); // Ojo: Carga los supermetodos

            if( SPHDO_INIT( hdo, hb_param( 2, HB_IT_OBJECT ) ) == HB_SUCCESS )
            {
                PHB_ITEM pDrvName = hb_param( 1, HB_IT_STRING );

                if( pDrvName )
                {
                    HB_SIZE uiLen = hb_itemGetCLen( pDrvName );
                    PHB_ITEM pName = hb_itemNew( NULL );
                    PFGETMETHOD pFGetMth;

                    hdo->szDrvName = ( char * ) hb_xgrab( uiLen + 1 );

                    hb_strncpyUpperTrim( hdo->szDrvName, hb_itemGetCPtr( pDrvName ), uiLen );

                    // Envio al objeto hbdriver
                    hb_itemPutC( pName, hdo->szDrvName );
                    hb_objSendMsg( hdo->pDriver, "getPFuncByName", 1, pName );
                    hb_itemRelease( pName );

                    // el resultado se obtiene desde la pila
                    pFGetMth = hb_itemGetPtr( hb_stackReturnItem() );

                    if( pFGetMth )
                    {
                        hdo->vMethods = pFGetMth();
                    }
                    else
                    {
                        hdo->szDrvName = (char * ) hb_xrealloc( hdo->szDrvName, 7 );
                        strcpy( hdo->szDrvName, "DEFSQL" );
                        hdo->vMethods = dfGetMethod();
                    }
                }
                else
                {
                    hdo->szDrvName = hb_strdup( "DEFSQL" );
                    hdo->vMethods = dfGetMethod();
                }

                hdo_inheritMethods( hdo->vMethods, hdo->sp_vMethods );
            }
        }
        // MUY IMPORTANTE: Asigna la estructura recien creada a la clase
        hb_arraySetPtr( pSelf, IVAR_HDO, hdo );
    }
    // Un constructor siempre devuelve SELF
    hb_itemReturnRelease( pSelf );
}

 

:D

Re: HDO una imagen vale más que...

PostPosted: Tue May 05, 2015 7:30 pm
by elvira
Hola Manuel,

¿Tienes comparativas de rendimiento de usar clases directas en vez de ADO?.

En nuestro caso, lo que prima es la reutilización del código, de ahí que ADORDD nos parece una muy buena idea.

Pero reescribir una aplicación de 15 años es una locura :cry:

Re: HDO una imagen vale más que...

PostPosted: Wed May 06, 2015 9:21 am
by Baxajaun
Grande Manu !!!

Re: HDO una imagen vale más que...

PostPosted: Wed May 06, 2015 10:30 am
by cnavarro
Manu, ++++++1

Re: HDO una imagen vale más que...

PostPosted: Wed May 06, 2015 2:20 pm
by xmanuel
Cristobal y Felix, vosotros sois viejos amigos así que no sé si contaros... jeje

Elvira, en cuanto esté terminado el RDL (Replaceable Data Link, Enlace de Datos Reemplazable) de SQLite podemos hacer una prueba.
Haremos un programa identico para ADO y HDO...


PD: El primer RDL va a ser SQLite pero, cual quereis que sea el siguiente?

Re: HDO una imagen vale más que...

PostPosted: Wed May 06, 2015 2:45 pm
by elvira
Manuel,

Muy agradecida. ¿Podría ser Access o MySQL?.

:D

Re: HDO una imagen vale más que...

PostPosted: Wed May 06, 2015 2:46 pm
by cnavarro
Creo que MySql, no?

Re: HDO una imagen vale más que...

PostPosted: Wed May 06, 2015 2:51 pm
by xmanuel
Elvira el problema de los viejos grandes proyectos es precisamente ese... que son viejos y grandes.
Mentener algo que se ha quedado viejo al final resulta costoso, mucho más que hacer algo nuevo.

Se debería empezar de una vez por todas a usar los patrones de arquitectura de software, que están super depurados por todos los programadores y que se basan en la experiencia de todos...
Por ejemplo el MVC (Modelo-Vista-Controlador) que separa los datos y la lógica de negocio de una aplicación (modelo) de la interfaz de usuario (vista) y el módulo encargado de gestionar los eventos y las comunicaciones (controlador).
Esto hubiera hecho que el cambio necesario para pasar de las obsoletas DBF (RDD) a SQL se tornara fácil ya que sólo habría que tocar una parte muy definida del PRG (afectaría al módulo del modelo).
O pasar del modo texto a FiveWin (afectaría al módulo de la vista)

Hay muchos patrones en los que inspirarnos para hacer nuestros programas:
Factoria, DAO o Adaptador por decir los que casi todo el mundo ha usado incluso sin saberlo...

Re: HDO una imagen vale más que...

PostPosted: Wed May 06, 2015 2:54 pm
by xmanuel
Jaja ese era mi orden.
Pensaba que Felix querría Oracle (OCILIB) :-)

Re: HDO una imagen vale más que...

PostPosted: Wed May 06, 2015 3:24 pm
by Carlos Mora
xmanuel wrote:Elvira el problema de los viejos grandes proyectos es precisamente ese... que son viejos y grandes.
Mentener algo que se ha quedado viejo al final resulta costoso, mucho más que hacer algo nuevo.

Se debería empezar de una vez por todas a usar los patrones de arquitectura de software, que están super depurados por todos los programadores y que se basan en la experiencia de todos...
Por ejemplo el MVC (Modelo-Vista-Controlador) que separa los datos y la lógica de negocio de una aplicación (modelo) de la interfaz de usuario (vista) y el módulo encargado de gestionar los eventos y las comunicaciones (controlador).
Esto hubiera hecho que el cambio necesario para pasar de las obsoletas DBF (RDD) a SQL se tornara fácil ya que sólo habría que tocar una parte muy definida del PRG (afectaría al módulo del modelo).
O pasar del modo texto a FiveWin (afectaría al módulo de la vista)

Hay muchos patrones en los que inspirarnos para hacer nuestros programas:
Factoria, DAO o Adaptador por decir los que casi todo el mundo ha usado incluso sin saberlo...

Amén!
El cambio es grande, pero el esfuerzo vale la pena. Los veteranos de guerra, entre los que me incluyo, hemos pasado de DOS a Windows, de Windows a Win32, pronto a Win64/RTL o sabediosqué...
y esto es en definitiva otro cambio más.

Re: HDO una imagen vale más que...

PostPosted: Wed May 06, 2015 3:25 pm
by Baxajaun
Joder !!! Manu como me conoces ....

Re: HDO una imagen vale más que...

PostPosted: Fri May 08, 2015 2:34 pm
by xmanuel
:D