martes, 8 de julio de 2008

LetoDB (RDD cliente servidor para [x]Harbour)

Hasta ahora la mayoría de entradas de este bloc, hacen referencia al acceso a datos mediante el uso de ADO, como alternativa al uso clásico de los ficheros DBF.
LetoDB
En esta nueva entrada, nos vamos a quedar en medio de la dos tecnologías, y hablaremos de un proyecto Open Source creado por Alexander S. Kresin, llamado LetoDB.

LetoDB, es un servidor de base de datos multi plataforma(Windows y Linux), escrito en Harbour y que nos permite trabajar con ficheros DBF e indices CDX o NTX. Se implementa como un RDD de harbour, y por tanto la forma de usarlo es prácticamente igual que usar DBFs de toda la vida, solo nos harán falta unas pocas instrucciones para realizar la conexión al servidor.

LetodDB se divide en dos partes fundamentales, el servidor (letodb.exe) y la parte cliente (rddleto.lib). También se incluye un programa de consola, que nos permite monitorizar el estado del servidor.
Aunque el tema es amplio y habría mucho que comentar sobre la implementación del servidor, el uso de multihilos, etc, como siempre intentare ser eminentemente práctico, y que de una manera rápida y senciilla podáis probar ester servidor, y si os interesa el tema vosotros mismos podréis ir profundizando.

Para empezar nuestras pruebas, deberemos descargarnos una serie de archivos, aunque os los podéis descargar de sourceforge (http://sourceforge.net/projects/letodb/ ) y compilarlos con la version que deseeis, aquí os pongo un enlace para que os podeis descargar un fichero en el que ya estan los ejecutables y la librería listas para usar.

Descargar letodb.zip
Este archivo contiene lo siguiente
Letodb.exe ->Ejecutable del servidor
rddleto.lib -> RDD (compilado con Harbour 1.0.0RC1(Rev.8835) )
manage.exe -> Consola del servidor.
Una vez tengamos descargado este archivo, podemos crear una carpeta (C:\letoDB por ejemplo), y descomprimimos letodb.zip.

El servidor de LetoDB, por defecto trabaja sobre el puerto 2812, y el path por defecto es c:\, estos parametros pueden ser modificados mediante el uso del fichero letodb.ini, si no existe este fichero, se utilizaran los valores por defecto, y si existe los tomara del fichero. Debe crearse en la misma carpeta donde se encuentra ubicado letodb.exe.
Ejemplo letodb.ini

Port = 2812
DataPath =c:/letodb
Logfile = "letodb.log"
Default_Driver = CDX

Para arranncar el servidor, simplemente ejecutaremos letodb.exe, el servidor no tiene ventana asociada, y solo nos arrancara un proceso en nuestro sistema. Para detener el servidor, ejecutaremos el “letodb stop”.
Administrador de tareas

Ahora ya podemos arrancar la utilidad de consola, que nos va a permitir monitorizar nuestro servidor. Para conectarnos al servidor, debemos especificar la IP donde esta letoDb ejecutandos, el port que usamos y pulsar sobre el boton Go. Si lo estamos ejecutando en local sobre nuestro PC, en la dirección pondremos 127.0.0.1 o bien localhost. consola LetoDB
El tercer campo que por defecto tien 2 como valor, son los segundos que tarda en refrescar la información.


Una vez hemos pulsado GO, dispondremos de tres vistas, que podremos ir cambiando pulsando los botones Main, Users, Tables. La información de cada una de estas pantallas es autoexplicativa, en la primera información general del servidor, en Users veremos los usuarios y procedimientos conectados, y en Tables veremos cada proceso con los ficheros que tiene abiertos.
consola Tables
A estas alturas ya estamos listos para escribir el código fuente que nos permita conectar con el servidor letoDB, y realizar nuestras primeras operaciones cliente servidor usando ficheros DBF.

El código fuente es el siguiente, y para que funcione tenéis que linkarlo junto con RddLeto.lib, y por supuesto el servidor debe de estar ejecutándose.

Source

Como podeis apreciar prácticamente todo son comandos estándar de harbour, el único comando no estándar es el que nos comprueba si tenemos conexión con el servidor, el resto son todos nativos de Harbour.
Observar también que debemos definir la dirección IP y el puerto que uso nuestro servidor LetodDB.
El ejemplo es muy sencillo, todo el código esta comentado y creo que se entiende perfectamente.
Ademas de los visto, letoDB incorpora otras funciones adicionales, pero que ya podréis descubriendo si os interesa este sistema cliente servidor, entre las cosas destacadas comentaros que incorpora control de transaccional ( leto_BeginTransaction(), leto_Rollback(), leto_CommitTransaction()), y que el autor tiene pensado en un futuro implementar procesos almacenados que estarán escritos en Harbour.

Desde aqui podeis descargar el código fuente, y el ejecutable.
Descargar ejecutable
Descargar código fuente
Descargar letodb.zip
Podréis encontrar más información sobre letoDB, y descargaros el proyecto completo con su código fuente en sourceforge (http://sourceforge.net/projects/letodb/ )

Ya que son varios los que me lo habeis pedido, aqui os pongo un fichero .bat y .bc para que podais construir la libreria y el ejecutable del servidor con Harbour(1.0.0RC1)y Borland C 5.5, para versiones anteriores de Harbour no vale, ya que se han renombrado las libreriras. Estos ficheros asumen el compilador de C en C:\Borland\bcc55\bin y Harbour en c:\harbour. Si los tienes así, copia estos dos archhivos en la carpeta donde te has descargado letoDB(desde sourcefourge)y basta con ejecutar make_b6 desde la linea de comandos(Si quieres asegurarte de limpiar copias antiguas, ejecuta primero make_b6 clean).
Descargar make_b6.bat
Descargar makefileb6.bc



Gracias a Alex Kresin, y a todos los que han contribuido en el desarrollo de LetoDB, que nos brinda otra alternativa de acceso a datos para el mundo xBase.

Saludos desde Mallorca.



...

27 comentarios:

Carlos Mora dijo...

Hola Gabriel,

gracias por la introducción. Una pregunta: ¿Hay forma de saber si una tabla ya existe en el servidor?

Un saludo,

Carlos.

Biel Maimó dijo...

Hola Carlos.

Si, existe la funcion Leto_File(),
le pasas como parametro la direccion del servidor mas el fichero a comprobar.
Ejempplo:
cServer:='//192.168.101.4:2812/'
IF Leto_File(cServer+'prueba1.dbf')
?'existe'
ELSE
?'no existe'
ENDIF

Para que esto funcione tienes que poner en el fichero ini la siguiente entrada.
EnableFileFunc = 1

Saludos.

Anónimo dijo...

Hola Gabriel

Gracias, muchas gracias por el artículo.
¿Puedes por favor proporcionar el bat para compilar la lib con xharbour?

Fernando Leal

Carlos Mora dijo...

Gracias biel,

mirando los fuentes descubrí esas funciones y las otras LETO_*, que seguro son imprescindibles para mantener las estructuras de los archivos.
Voy a ver si me hago tiempo para hacer las pruebas, alterando algun programa que ya este funcionando.

Saludos.

Biel Maimó dijo...

Muy bien Carlos, ya me comentaras los resultados de las pruebas.

Anónimo dijo...

Gracias por la informacion, he estado buscando programadores de harbour pero parece que ya estan bastante escazos, no se si seguir en esta programacion o migrar a php mysql, abri un foro para dudas, consultas, etc

http://harbour.foroslatinos.net

gracias

Anónimo dijo...

No, todo lo contrario, yo pienso que no son escasos los programadores de Harbour, lo que pasa es que estan concentrados según el GUI que esten usando, vease FiveWin, Xailer, xHarbour comercial, MiniuGui, etc

Anónimo dijo...

Como se haría para definir en un mismo PC con base de datos de Produccion, otra de contabilidad, etc ?

Gracias

JoGaBar
www.oohg.org

Anónimo dijo...

Disculpen mi ignorancia, pero como trabaja o que hace este servidor?

entiendo que esto con un mínimo de modificaciones puedo cambiar un programa para que trabaje remotamente, pero además:

Gano velocidad en las consultas ?
Seguridad en las transacciones ?
Hace como SQl que entrega sololsolo manda las tablas
etc...

Salu2.

JoGaBar
www.ooHg.org

Anónimo dijo...

La verdad excelente idea.
Estoy utilizando xHarbour 1.1.0 y tengo el siguiente error:

Error: Unresolved external '_hb_vmProcessSymbolsEx' referenced from C:\LETODB\RDDLETO.LIB|leto1

Les agradezco mucho su aporte para poder probar este proyecto que si funciona será una maravilla para los que usamos .DBF

Anónimo dijo...

Actualmente uso debian con samba, para servidor de archivos, guardando alli las dbfs, pero quisiera saber si puedo usar Letodb usando esta estructura, servidor=debian y cliente=winXP, y de ser asi, hay algun ejemplo para poder hacerlo o algun tutorial.

Gracias.

Biel Maimó dijo...

Ricardo, siento no poder ayudarte, pero actualmente no estoy usando xHarbour, y todas las pruebas con letoDB las tengo con Harbour.

Biel Maimó dijo...

Supongo que puedes utilizar letoDB con samba, aunque no lo he probado.
De todas maneras, tienes una version para Linux de letoDB, que seguramente es mejor opción.

Anónimo dijo...

Hola Bielsys...

Lamento decepcionarte pero no me funcionó tu ejemplo al compilarlo con xHarbour + ooHG + bcc5.

Generé la librería y me manda el error en la linea 15 del fuente.

(Generé la libreria rddleto para xHarbour)

Saludos...

Anónimo dijo...

Baixei o LetoDB de una pagina RUSA ou CROATA, v0.7, in sourgeforge la version é 0.6 porem nenhuma compila com MiniGUI-Extend 1.6.62 and xharbour 1.2.0, HELP! PLEASE! ajuda por-favor, sou do:
-pais..:BRASIL
-estado:SÃO PAULO
-cidade:RIBEIRAO PRETO"
abraços
Luiz Escobar
escobar@megasistema.com.br

Anónimo dijo...

MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
bcc32 -c -Iinclude;C:\MINIGUI\HARBOUR\include -d -tWM -D__WIN32__ -D__WIN_DAEMON__ -oobj\b32\leto1.obj source\client\leto1.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
source\client\leto1.c:
Error E2451 source\client\leto1.c 341: Undefined symbol 'hb_cdp_page' in function leto_ConnectionNew
Error E2451 source\client\leto1.c 341: Undefined symbol 'hb_set' in function leto_ConnectionNew
Error E2451 source\client\leto1.c 914: Undefined symbol 'hb_set' in function letoGoBottom
Error E2451 source\client\leto1.c 939: Undefined symbol 'hb_set' in function letoGoTo
Error E2451 source\client\leto1.c 980: Undefined symbol 'hb_set' in function letoGoTop
Error E2451 source\client\leto1.c 1020: Undefined symbol 'hb_cdp_page' in function letoKeyToStr
Error E2451 source\client\leto1.c 1046: Undefined symbol 'hb_set' in function letoSeek
Warning W8057 source\client\leto1.c 1081: Parameter 'bSoftSeek' is never used in function letoSeek
Warning W8057 source\client\leto1.c 1081: Parameter 'bFindLast' is never used in function letoSeek
Error E2451 source\client\leto1.c 1150: Undefined symbol 'hb_set' in function letoSkipRaw
Error E2451 source\client\leto1.c 1311: Undefined symbol 'hb_cdp_page' in function letoGetMemoValue
Error E2451 source\client\leto1.c 1341: Undefined symbol 'hb_cdp_page' in function letoGetValue
Error E2451 source\client\leto1.c 1535: Undefined symbol 'hb_cdp_page' in function letoPutMemoValue
Error E2451 source\client\leto1.c 1585: Undefined symbol 'hb_cdp_page' in function letoPutValue
Error E2451 source\client\leto1.c 2105: Undefined symbol 'hb_set' in function letoOpenConnection
Error E2451 source\client\leto1.c 2120: Undefined symbol 'hb_set' in function letoOpenConnection
Error E2451 source\client\leto1.c 2230: Undefined symbol 'hb_cdp_page' in function letoCreate
Error E2451 source\client\leto1.c 2326: Undefined symbol 'HARBOUR_MAX_RDD_ALIAS_LENGTH' in function letoOpen
Error E2451 source\client\leto1.c 2391: Undefined symbol 'hb_cdp_page' in function letoOpen
Error E2451 source\client\leto1.c 2483: Undefined symbol 'hb_set' in function letoOpen
Error E2451 source\client\leto1.c 2525: Undefined symbol 'HARBOUR_MAX_RDD_DRIVERNAME_LENGTH' in function letoSysName
Error E2451 source\client\leto1.c 3792: Undefined symbol 'hb_set' in function HB_FUN_LETO_SUM
*** 20 errors in Compile ***

** error 1 ** deleting obj\b32\leto1.obj
Luiz Escobar

Anónimo dijo...

C:\letodb>make_xhb.bat
xHarbour Compiler build 1.1.0 (SimpLex)
Copyright 1999-2008, http://www.xharbour.org http://www.harbour-project.org/
xHarbour Compiler build 1.1.0 (SimpLex)
Copyright 1999-2008, http://www.xharbour.org http://www.harbour-project.org/
xHarbour Compiler build 1.1.0 (SimpLex)
Copyright 1999-2008, http://www.xharbour.org http://www.harbour-project.org/
'c:\xharbour\bin\xcc.exe' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.
'c:\xharbour\bin\xcc.exe' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.
'c:\xharbour\bin\xcc.exe' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.
'c:\xharbour\bin\xcc.exe' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.
'c:\xharbour\bin\xlink.exe' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.
'c:\xharbour\bin\xcc.exe' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.
'c:\xharbour\bin\xcc.exe' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.
'c:\xharbour\bin\xcc.exe' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.
'c:\xharbour\bin\xlib.exe' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.

Luiz Escobar

Anónimo dijo...

como se abre una base de datos
con un indice ya existente

he probado pero funciona

use datos
set index to codigo.ntx
seek "100"

Ivan dijo...

Hola Gabriel! Ante todo gracias por compartir tus conocimientos!
Vi el proceso de manera que se transforme una PC de una red local como servidor, la pregunta es, se puede acceder a un servidor web?, como se montaría?
Gracias!

Ivan

Anónimo dijo...

Hola Gabriel:

He intentado realizar pruebas con la version de xHarbour(1.1.o Intl) con la que trabajo actualmente pero no he podido crear la libreria y el servidor, abra modo de poder solucionar mi problema con algun archivo .bat, estoy interesado en probarla para futuros proyectos..

Saludos desde Mexico...
Victor Daniel Cuatecatl Leon

Anónimo dijo...

Hola Gabriel:
Necesito saber si todavia esta disponible el foro para incursionar en Letodb.
Gracias

Oscar Figueroa
Tucuman - Argentina

CHAK EM dijo...

Hola Biel,

Queria informar de un fallo con respecto a la creación índices cuando se les pone una extensión personalizada.. como en el ejemplo que sigue:

use (cPath+'prueba1.001') new
index on campo1 to 'xprueba.001'

pero funciona perfectamente sin esa extensión :

use (cPath+'prueba1.001') new
index on campo1 to 'xprueba'

Alguna solución?

Gracias de antemano,

saludos cordiales

CHAK EM

Anónimo dijo...

Como Instalar letodb para debian lenny con harbour.
gracias.

Hernan Cano dijo...

Buenos días, xbiel.

Leo en la página de Leto que se puede usar en otros lenguajes como C y Delphi.

Te pregunto: ¿puedo conectarme a un servidor Leto desde el lenguaje Lua o desde el lenguaje VFP? En caso afirmativo, ¿cómo lo lograría o dónde hay info al reespecto?

Gracias.

Hernan dijo...

Hola, he compilado el código ejemplo incluyendo la lib y me dan los siguientes errores, alguna ayuda al respecto, muchas gracias y saldudos cordiales

[60261.928] .hbmk/win/mingw/letosample.o:letosample.c:(.data+0x48): undefined reference to `HB_FUN_LETO_CONNECT'
[60261.930] .hbmk/win/mingw/letosample.o:letosample.c:(.data+0x178): undefined reference to `HB_FUN_LETO'
[60261.932] C:/Gaby/hb32/comp/mingw/bin/../lib/gcc/i686-w64-mingw32/4.9.2/../../../../i686-w64-mingw32/bin/ld.exe: .hbmk/win/mingw/letosample.o: bad reloc address 0xf in section `.text.startup'
[60261.933] C:/Gaby/hb32/comp/mingw/bin/../lib/gcc/i686-w64-mingw32/4.9.2/../../../../i686-w64-mingw32/bin/ld.exe: final link failed: Invalid operation
[60261.935] collect2.exe: error: ld returned 1 exit status
[60261.937]
[60261.960] hbmk2: Error: Running linker. 1
[60261.962] C:\Gaby\hb32\comp\mingw\bin\gcc.exe .hbmk/win/mingw/letosample.o .hbmk/win/mingw/_hbmkaut_letosample.o -mconsole -Wl,--start-group -lhbextern -lhbdebug -lhbvm -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbmainstd -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -liphlpapi -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib -Wl,--end-group -oletosample.exe -LC:/Gaby/hb32/lib/win/mingw
[60261.965]
[60261.968]
[60261.969] hbmk2: Error: Referenced, missing, but unknown function(s): LETO_CONNECT(), LETO()

Adolfredo Martinez dijo...

Buenos Dias xbiel.

Estoy probando Letodb.
Baje la librería y el ejecutable de la pagina oficial. Corro el ejecutable el servidor Letodb.
El archivo letodb.ini tiene esta configuración:


; path to a data directory on a server;
; DataPath = C:\PREDFUN13.01

; path and name of a log file;
; Logpath = letodb.log

; default RDD to open files on server ( CDX/NTX );
; Default_Driver = CDX

; memo type ( FPT/DBT ). Default: FPT for DBFCDX, DBT for DBFNTX;
; Memo_Type = FPT

; if 1, convert all paths to lower case;
; Lower_Path = 0

; if 1, using of file functions ( leto_file(),
; leto_ferase(), leto_frename() is enabled;
; EnableFileFunc = 1
//----------------------------------------------------------------------------
Tiene esa configuracion en el path predfun13.01, tengo un archivo que se llama catastro.dbf.
Lo que quiero probar es la rutina esta para saber si el archivo existe.
asi:
Dice que no existe, pero el archivo si existe, que hago mal.

Adolfredo Martinez

#include "FiveWin.ch"
#include "rddleto.ch"



Function Main
LOCAL cServer:="//127.0.0.1:2812/"
IF Leto_File(cServer+'catastro.dbf')
?'existe'
ELSE
?'no existe'
ENDIF

return nil

Adolfredo Martinez dijo...

Hola xbiel.

Otra vez por aqui.

El ejemplo que publicas en el Bloq, corre perfectamente. Pero me crea el archivo en la siguientes carpeta: C:\Users\pc-2\AppData\Local\VirtualStore.
Pero en la configuracion del arhcivo letodb.ini esta asi: DataPath =C:/letodb\bin/daemon_mode