Clipper On Line • Ver Tópico - Harbour + SQLite3 no Linux

Harbour + SQLite3 no Linux

Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

 

Harbour + SQLite3 no Linux

Mensagempor sergiosouzalima » 27 Jun 2021 17:08

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:
# teste_sqlite3.prg
#include "hbclass.ch"
#require "hbsqlit3"

? sqlite3_libversion()


Instalei a biblioteca sqlite3 no meu Linux Mint. Então a biblioteca está em
$ 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:
$  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:
#
# $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:
$ 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
sergiosouzalima
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 48
Data de registro: 26 Out 2020 11:25
Cidade/Estado: São Paulo / SP
Curtiu: 1 vez
Mens.Curtidas: 4 vezes

Harbour + SQLite3 no Linux

Mensagempor Itamar M. Lins Jr. » 27 Jun 2021 17:24

Olá!
Instalou ele certinho ? A lib ?
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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6959
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 313 vezes
Mens.Curtidas: 508 vezes

Harbour + SQLite3 no Linux

Mensagempor Itamar M. Lins Jr. » 27 Jun 2021 17:55

Olá!
O problema é quem usa, não faz aqui o passo a passo.
Mas eu consegui.
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

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.

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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6959
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 313 vezes
Mens.Curtidas: 508 vezes

Harbour + SQLite3 no Linux

Mensagempor Itamar M. Lins Jr. » 27 Jun 2021 17:58

Olá!
O arquivo hbmk.hbm
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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6959
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 313 vezes
Mens.Curtidas: 508 vezes

Harbour + SQLite3 no Linux

Mensagempor JoséQuintas » 28 Jun 2021 09:51

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18161
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Harbour + SQLite3 no Linux

Mensagempor JoséQuintas » 28 Jun 2021 09:56

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18161
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Harbour + SQLite3 no Linux

Mensagempor sergiosouzalima » 28 Jun 2021 21:12

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":
~/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
~/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"
~/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"

$ 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
~/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.

~/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:
#
# $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:
#include "hbclass.ch"
#require "hbsqlit3"

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


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


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

Sergio Lima
sergiosouzalima
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 48
Data de registro: 26 Out 2020 11:25
Cidade/Estado: São Paulo / SP
Curtiu: 1 vez
Mens.Curtidas: 4 vezes




Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 12 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro