Harbour + SQLite3 no Linux

Fórum sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

sergiosouzalima
Usuário Nível 1
Usuário Nível 1
Mensagens: 48
Registrado em: 26 Out 2020 11:25
Localização: São Paulo / SP

Harbour + SQLite3 no Linux

Mensagem por sergiosouzalima »

Ola pessoal.

Estou desenvolvendo um sistema em Harbour e agora vou começar a acessar o SQLite3.

Não consegui fazer o Harbour "enxergar" as bibliotecas "hbsqlit3".

Para começar, eu criei um programa teste:

Código: Selecionar todos

# teste_sqlite3.prg
#include "hbclass.ch"
#require "hbsqlit3"

? sqlite3_libversion()
Instalei a biblioteca sqlite3 no meu Linux Mint. Então a biblioteca está em

Código: Selecionar todos

$ ll /usr/bin/sqlite3
-rwxr-xr-x 1 root root 1447632 Jul 23  2020 /usr/bin/sqlite3*
Fiz o git clone do repositório do Harbour, para ter as bibliotecas Harbour do sqlite3:

Código: Selecionar todos

$  ll ~/workspace/core/contrib/3rd/sqlite3
total 5420
drwxrwxr-x 2 sergio sergio    4096 Jun 27 16:53 ./
drwxrwxr-x 3 sergio sergio    4096 Jun 27 14:02 ../
-rw-rw-r-- 1 sergio sergio 5143905 Jun 27 14:02 sqlite3.c
-rw-rw-r-- 1 sergio sergio    1507 Jun 27 14:02 sqlite3.diff
-rw-rw-r-- 1 sergio sergio  353468 Jun 27 14:02 sqlite3.h
-rw-rw-r-- 1 sergio sergio      62 Jun 27 14:02 sqlite3.hbc
-rw-rw-r-- 1 sergio sergio    1505 Jun 27 14:02 sqlite3.hbp
-rw-rw-r-- 1 sergio sergio   26110 Jun 27 14:02 sqlite3x.h
Tenho o arquivo "hbp", chamado compila.hbp, com o seguinte conteúdo:

Código: Selecionar todos

#
# $Id: compila.hbp $
#
-w2
-gc3
-ocontas_receber

teste_sqlite3.prg
crmenu.prg
modcli.prg
modlib.prg
Ao dar o comando "hbmk2" para compilar e gerar o executável, tenho a seguinte saída:

Código: Selecionar todos

$ hbmk2 compila.hbp
Harbour 3.2.0dev (r1712151853)
Copyright (c) 1999-2016, http://harbour-project.org/
Compiling 'teste_sqlite3.prg'...
Lines 717, Functions/Procedures 1
Generating C source output to '/tmp/hbmk_X1x7jk.dir/teste_sqlite3.c'... Done.
Compiling 'crmenu.prg'...
Lines 69, Functions/Procedures 3
Generating C source output to '/tmp/hbmk_X1x7jk.dir/crmenu.c'... Done.
Compiling 'modcli.prg'...
modcli.prg(81) Warning W0003  Variable 'NPROGRAMAESCOLHIDO' declared but not used in function 'MOSTRA_DADOS_CLI(61)'
Lines 89, Functions/Procedures 5
Generating C source output to '/tmp/hbmk_X1x7jk.dir/modcli.c'... Done.
Compiling 'modlib.prg'...
Lines 61, Functions/Procedures 6
Generating C source output to '/tmp/hbmk_X1x7jk.dir/modlib.c'... Done.
/usr/bin/ld: /tmp/hbmk_X1x7jk.dir/teste_sqlite3.o:(.data.rel+0x50): undefined reference to `HB_FUN_SQLITE3_LIBVERSION'
collect2: error: ld returned 1 exit status
hbmk2[compila]: Error: Running linker. 1
gcc '/tmp/hbmk_X1x7jk.dir/teste_sqlite3.o' '/tmp/hbmk_X1x7jk.dir/crmenu.o' '/tmp/hbmk_X1x7jk.dir/modcli.o' '/tmp/hbmk_X1x7jk.dir/modlib.o' '/tmp/hbmk_X1x7jk.dir/hbmk_1xkRCm.o'   -Wl,--start-group -lhbcplr -lhbdebug -lharbour   -Wl,--end-group -o'contas_receber' -L/usr/lib/harbour

hbmk2: Hint: Install package hbsqlit3 and add option 'hbsqlit3.hbc' for missing
       function(s): sqlite3_libversion()

O executável não é gerado.

O que mais tenho que fazer no "hbp" para ligar meu fonte às bibliotecas "hbsqlit3", e usar o SQLite3?


Obrigado!!
Sergio Lima
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Harbour + SQLite3 no Linux

Mensagem por Itamar M. Lins Jr. »

Olá!
Instalou ele certinho ? A lib ?

Código: Selecionar todos

itamar@itamar-desktop:~/dev/hb32/contrib$ sudo hbmk2 make.hb hbsqlit3 install
[sudo] senha para itamar: 
! Package build and install... 1 project(s)
/usr/local/bin/hbmk2 -quiet -width=0 -autohbm- @../hbpre -inc ../3rd/sqlite3/sqlite3.hbp @../hbpost
hbmk2: Alvo atualizado: ../../lib/linux/gcc/libsqlite3.a
/usr/local/bin/hbmk2 -quiet -width=0 -autohbm- @../hbpre -inc ../hbsqlit3/hbsqlit3.hbp @../hbpost
hbmk2: Alvo atualizado: ../../lib/linux/gcc/libhbsqlit3.a
itamar@itamar-desktop:~/dev/hb32/contrib$ 
Eu não uso creio que seja assim.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Harbour + SQLite3 no Linux

Mensagem por Itamar M. Lins Jr. »

Olá!
O problema é quem usa, não faz aqui o passo a passo.
Mas eu consegui.

Código: Selecionar todos

tamar@itamar-desktop:~/dev/hb32/contrib/hbsqlit3$ sudo apt install libsqlite3-dev
Lendo listas de pacotes... Pronto
Construindo árvore de dependências... Pronto
Lendo informação de estado... Pronto        
Os seguintes pacotes foram instalados automaticamente e já não são necessários:
  libboost-log1.74.0 libboost-program-options1.74.0 liblxc-common liblxc1 libpam-cgfs libsdbus-c++0 lxc lxc-utils lxcfs uidmap
Utilize 'sudo apt autoremove' para os remover.
Pacotes sugeridos:
  sqlite3-doc
Os NOVOS pacotes a seguir serão instalados:
  libsqlite3-dev
0 pacotes atualizados, 1 pacotes novos instalados, 0 a serem removidos e 0 não atualizados.
É preciso baixar 753 kB de arquivos.
Depois desta operação, 2.622 kB adicionais de espaço em disco serão usados.
Obter:1 http://archive.ubuntu.com/ubuntu hirsute/main amd64 libsqlite3-dev amd64 3.34.1-3 [753 kB]
Baixados 753 kB em 2s (451 kB/s)        
A seleccionar pacote anteriormente não seleccionado libsqlite3-dev:amd64.
(Lendo banco de dados ... 608333 ficheiros e directórios actualmente instalados.)
A preparar para desempacotar .../libsqlite3-dev_3.34.1-3_amd64.deb ...
A descompactar libsqlite3-dev:amd64 (3.34.1-3) ...
Configurando libsqlite3-dev:amd64 (3.34.1-3) ...
Agora precisa desses flags para compilar o demo.prg
hbmk2 demo.prg -ldl -lpthread

Código: Selecionar todos

hbmk2 demo.prg  -ldl -lpthread
hbmk2: Processando script local: hbmk.hbm
Harbour 3.2.0dev (r2104142025)
Copyright (c) 1999-2021, https://harbour.github.io/
Compiling 'demo.prg'...
Lines 274, Functions/Procedures 3
Generating C source output to '/tmp/hbmk_mmmyrx.dir/demo.c'... Done.

Código: Selecionar todos

itamar@itamar-desktop:~/dev/hb32/contrib/hbsqlit3/tests$ ./demo 
   
3.8.2                                                                                                                                
CREATE TABLE t1 - Ok                                                                                                                 
BEGIN TRANSACTION                                                                                                                    
INSERT INTO t1( name, age ) VALUES( 'Bob', 52 )                                                                                      
INSERT INTO t1( name, age ) VALUES( 'Fred', 40 )                                                                                     
INSERT INTO t1( name, age ) VALUES( 'Sasha', 25 )                                                                                    
INSERT INTO t1( name, age ) VALUES( 'Ivet', 28 )                                                                                     
COMMIT                                                                                                                               
The number of database rows that were changed: 1                                                                                     
Total changes: 4                                                                                                                     
INSERT INTO t1( name, age ) VALUES( 'Andy', 17 ) - Done                                                                              
INSERT INTO t1( name, age ) VALUES( 'Mary', 19 ) - Done                                                                              
The number of database rows that were changed: 1                                                                                     
Total changes: 6                                                                                                                     
Last _ROWID_:          6                                                                                                             
                                                                                                                                     

SELECT * FROM t1 WHERE name == 'Andy'                                                                                                
Record #          1                                                                                                                  
Column name :                                                                                                                        
Column type : SQLITE_NULL                                                                                                            
Column value: NULL                                                                                                                   
Column name : id                                                                                                                     
Column type : SQLITE_INTEGER                                                                                                         
Column value:          5                                                                                                             
Column name : name                                                                                                                   
Column type : SQLITE_TEXT                                                                                                            
Column value: Andy                                                                                                                   
Total records -          1                                                                                                           
                                                                                                                                     
SELECT * FROM t1 WHERE age >= 40                                                                                                     
Record #          1                                                                                                                  
Column name : id                                                                                                                     
Column type : SQLITE_INTEGER
Column value:          1    
Column name : name      
Column type : SQLITE_TEXT
Column value: Bob        
Column name : age
Column type : SQLITE_INTEGER
Column value:         52    
Record #          2     
Column name : id   
Column type : SQLITE_INTEGER
Column value:          2    
Column name : name      
Column type : SQLITE_TEXT
Column value: Fred       
Column name : age 
Column type : SQLITE_INTEGER
Column value:         40    
Total records -          2
                          
SELECT id, name, age + 5 FROM t1
id                              
name
age + 5
SQLITE_NULL
SQLITE_NULL
SQLITE_NULL
INTEGER    
TEXT   
    

sqlite3_get_table
name  age        
Andy  17 
Mary  19
itamar@itamar-desktop:~/dev/hb32/contrib/hbsqlit3/tests$ 
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Harbour + SQLite3 no Linux

Mensagem por Itamar M. Lins Jr. »

Olá!
O arquivo hbmk.hbm

Código: Selecionar todos

itamar@itamar-desktop:~/dev/hb32/contrib/hbsqlit3/tests$ cat  hbmk.hbm 
hbsqlit3.hbc

-w3 -es2
Esse arquivo deverá ser criado na pasta contrib/hbsqlit3/tests

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Harbour + SQLite3 no Linux

Mensagem por JoséQuintas »

Compiling 'modcli.prg'...
modcli.prg(81) Warning W0003 Variable 'NPROGRAMAESCOLHIDO' declared but not used in function 'MOSTRA_DADOS_CLI(61)'
Está avisando que a variável foi criada, mas não é usada pra nada.
Ou elimina a criação da variável do fonte, ou compila usando -w0, pra não ter essa checagem.

Quanto ao SQLIte, é outra história.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Harbour + SQLite3 no Linux

Mensagem por JoséQuintas »

Quanto ao SQLITE, é seguir o que foi mostrado.

vai na na pasta do Harbour ref sqlite e compila pelo HBP.
Talvez.... talvez tenha que copiar a lib gerada para a pasta de libs do Harbour.
E por último, acrescentar o hbc do sqlite na compilação.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
sergiosouzalima
Usuário Nível 1
Usuário Nível 1
Mensagens: 48
Registrado em: 26 Out 2020 11:25
Localização: São Paulo / SP

Harbour + SQLite3 no Linux

Mensagem por sergiosouzalima »

Olá, pessoal!

Meu objetivo foi alcançado. Eu precisava usar a biblioteca "hbsqlit3" do Harbour que dá acesso ao "banco de dados" SQLite3.

Agradeço ao Itamar e ao José Quintas pelas mensagens.

Vou mostrar o que fiz para chegar lá. Pode não ser o melhor caminho, mas pelo menos para mim, funcionou.

Para quem usar estes passos como referência, ou tutorial, preste atenção na mudança de diretórios.

01) Instalei a biblioteca do Harbour, a lib "hbsqlit3":

Código: Selecionar todos

~/workspace/core/contrib$
$ sudo hbmk2 make.hb hbsqlit3 install
[sudo] password for sergio:     
! Package build and install... 1 project(s)
/usr/bin/hbmk2 -quiet -width=0 -autohbm- @../hbpre -inc ../3rd/sqlite3/sqlite3.hbp @../hbpost
/usr/bin/hbmk2 -quiet -width=0 -autohbm- @../hbpre -inc ../hbsqlit3/hbsqlit3.hbp @../hbpost
02) Instalei o pacote "libsqlite3-dev" do SQLite3 para o Linux

Código: Selecionar todos

~/workspace/core/contrib$
$ sudo apt install libsqlite3-dev -y
[sudo] password for sergio:     
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Suggested packages:
  sqlite3-doc
The following NEW packages will be installed:
  libsqlite3-dev
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 696 kB of archives.
After this operation, 2.372 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libsqlite3-dev amd64 3.31.1-4ubuntu0.2 [696 kB]
Fetched 696 kB in 2s (327 kB/s)         
Selecting previously unselected package libsqlite3-dev:amd64.
(Reading database ... 367450 files and directories currently installed.)
Preparing to unpack .../libsqlite3-dev_3.31.1-4ubuntu0.2_amd64.deb ...
Unpacking libsqlite3-dev:amd64 (3.31.1-4ubuntu0.2) ...
Setting up libsqlite3-dev:amd64 (3.31.1-4ubuntu0.2) ...
03) Gerei uma lib chamada "libsqlite3.a"

Código: Selecionar todos

~/workspace/core/contrib/3rd/sqlite3$
$ hbmk2 sqlite3.hbp
hbmk2: Compiling...
hbmk2: Creating static library... libsqlite3.a
sergio@sergio-Parallels-Virtual-Platform:~/workspace/core/contrib/3rd/sqlite3$
$ ll
total 6756
drwxrwxr-x 3 sergio sergio    4096 Jun 28 19:19 ./
drwxrwxr-x 3 sergio sergio    4096 Jun 27 14:02 ../
drwxrwxr-x 3 sergio sergio    4096 Jun 28 19:18 .hbmk/
-rw-rw-r-- 1 sergio sergio 1362764 Jun 28 19:19 libsqlite3.a
-rw-rw-r-- 1 sergio sergio 5143905 Jun 27 14:02 sqlite3.c
-rw-rw-r-- 1 sergio sergio    1507 Jun 27 14:02 sqlite3.diff
-rw-rw-r-- 1 sergio sergio  353468 Jun 27 14:02 sqlite3.h
-rw-rw-r-- 1 sergio sergio      62 Jun 27 14:02 sqlite3.hbc
-rw-rw-r-- 1 sergio sergio    1505 Jun 27 14:02 sqlite3.hbp
-rw-rw-r-- 1 sergio sergio   26110 Jun 27 14:02 sqlite3x.h
04) Aqui eu tive que interferir em um arquivo da biblioteca hbsqlite3.
Mudei um caminho que estava dentro do arquivo pois impedia de achar o arquivo
"sqlite3.hbc"

Código: Selecionar todos

$ cat /usr/share/harbour/contrib/hbsqlit3/hbsqlit3.hbc
description=SQLite3 wrapper (SQL)

incpaths=.

headers=${hb_name}.ch

libs=${_HB_DYNPREF}${hb_name}${_HB_DYNSUFF}
# libs=../3rd/sqlite3/sqlite3.hbc
# mudei para a linha abaixo:
libs=/home/sergio/workspace/core/contrib/3rd/sqlite3/sqlite3.hbc
05) Agora eu consigo compilar e gerar um demo para testar e criar um banco de dados SQLite3

Código: Selecionar todos

~/workspace/core/contrib/hbsqlit3/tests$
$ hbmk2 demo.prg -ldl -lpthread
hbmk2: Processing local make script: hbmk.hbm
Harbour 3.2.0dev (r1712151853)
Copyright (c) 1999-2016, http://harbour-project.org/
Compiling 'demo.prg'...
Lines 274, Functions/Procedures 3
Generating C source output to '/tmp/hbmk_7sP9aZ.dir/demo.c'... Done.
06) Executo o arquivo "demo" que cria um banco de dados SQLite3,
chamado "new.s3db", e insere dados dentro dele.

Código: Selecionar todos

~/workspace/core/contrib/hbsqlit3/tests$
$ ./demo 
   
3.8.2                                                                                                                                                                                                 
CREATE TABLE t1 - Ok
BEGIN TRANSACTION   
INSERT INTO t1( name, age ) VALUES( 'Bob', 52 )
INSERT INTO t1( name, age ) VALUES( 'Fred', 40 )
INSERT INTO t1( name, age ) VALUES( 'Sasha', 25 )
INSERT INTO t1( name, age ) VALUES( 'Ivet', 28 ) 
COMMIT                                          
The number of database rows that were changed: 1
Total changes: 4                                
INSERT INTO t1( name, age ) VALUES( 'Andy', 17 ) - Done
INSERT INTO t1( name, age ) VALUES( 'Mary', 19 ) - Done
The number of database rows that were changed: 1       
Total changes: 6                                
Last _ROWID_:          6
                        

SELECT * FROM t1 WHERE name == 'Andy'
Record #          1                  
Column name :      
Column type : SQLITE_NULL
Column value: NULL       
Column name : id  
Column type : SQLITE_INTEGER
Column value:          5    
Column name : name      
Column type : SQLITE_TEXT
Column value: Andy       
Total records -          1
                          
SELECT * FROM t1 WHERE age >= 40
Record #          1             
Column name : id   
Column type : SQLITE_INTEGER
Column value:          1    
Column name : name      
Column type : SQLITE_TEXT
Column value: Bob        
Column name : age
Column type : SQLITE_INTEGER
Column value:         52    
Record #          2     
Column name : id   
Column type : SQLITE_INTEGER
Column value:          2    
Column name : name      
Column type : SQLITE_TEXT
Column value: Fred       
Column name : age 
Column type : SQLITE_INTEGER
Column value:         40    
Total records -          2
                          
SELECT id, name, age + 5 FROM t1
id                              
name
age + 5
SQLITE_NULL
SQLITE_NULL
SQLITE_NULL
INTEGER    
TEXT   
    

sqlite3_get_table
name  age        
Andy  17 
Mary  19
sergio@sergio-Parallels-Virtual-Platform:~/workspace/core/contrib/hbsqlit3/tests$
$ ll
total 1208
drwxrwxr-x 2 sergio sergio    4096 Jun 28 19:29 ./
drwxrwxr-x 3 sergio sergio    4096 Jun 27 14:02 ../
-rw-rw-r-- 1 sergio sergio    6814 Jun 27 14:02 authoriz.prg
-rw-rw-r-- 1 sergio sergio    5623 Jun 27 14:02 backup.prg
-rw-rw-r-- 1 sergio sergio    4789 Jun 27 14:02 blob.prg
-rwxrwxr-x 1 sergio sergio 1138488 Jun 28 19:28 demo*
-rw-rw-r-- 1 sergio sergio    8536 Jun 27 14:02 demo.prg
-rw-rw-r-- 1 sergio sergio      23 Jun 27 14:02 hbmk.hbm
-rw-rw-r-- 1 sergio sergio     667 Jun 28 19:29 hbsq3_pr.log
-rw-rw-r-- 1 sergio sergio     574 Jun 28 19:29 hbsq3_tr.log
-rw-rw-r-- 1 sergio sergio    4814 Jun 27 14:02 hdbc.prg
-rw-rw-r-- 1 sergio sergio    5854 Jun 27 14:02 hooks.prg
-rw-rw-r-- 1 sergio sergio    3592 Jun 27 14:02 metadata.prg
-rw-r--r-- 1 sergio sergio   12288 Jun 28 19:29 new.s3db
-rw-rw-r-- 1 sergio sergio    2411 Jun 27 14:02 pack.prg
-rw-rw-r-- 1 sergio sergio    3614 Jun 27 14:02 pngtest.png
07) Finalmente consigo responder à minha pergunta inicial:
O que mais tenho que fazer no "hbp" para ligar meu fonte às bibliotecas "hbsqlit3", e usar o SQLite3?

Tive que incluir as linhas:
-ldl -lpthread

hbsqlit3.hbc

Então meu arquivo "compila.hbp" ficou assim:

Código: Selecionar todos

#
# $Id: compila.hbp $
#
-w2
-gc3
-ocontas_receber

-ldl -lpthread

hbsqlit3.hbc

crmenu.prg
modcli.prg
modlib.prg
moduti.prg
08) E usei somente uma função da biblioteca para testar e funcionou:

Código: Selecionar todos

#include "hbclass.ch"
#require "hbsqlit3"

? "=========="
? sqlite3_libversion()
? "=========="
Inkey(0)

Código: Selecionar todos

==========
3.8.2
==========

É isso! Espero que seja útil para alguém.


Sergio Lima
Responder