usando SQLite com linguagem C

Iniciado por C00L3R, 16 de Junho , 2009, 01:00:25 PM

tópico anterior - próximo tópico

0 Membros e 1 Visitante estão vendo este tópico.

C00L3R

Este Post vai ser informativo,divertido e descontraído !

Como vai leitores do Darkers neste "post" vamos trabalhar com
Banco de dados em "linguagem C" usando o SQLite vamos dar uma revisada
neste banco como não vejo muitos artigos brasileiros falando do mesmo.
aqueles que não gostam de estudar algoritmos com linguagem C, vão adorar
pois usando SQL podemos dar simples comandos para dar SORT e fazer buscas
de forma rápida sem pensar muito e atingir nosso objetivo fora que fica muito
mais organizado os dados usando SQLite...

Sabe aquele seu patrão "FDP" que pede prá fazer um sistema de ERP,CRM
com cadastros e tal ?

Ele vai te soltar a bomba(sisteminha para cadastrar produtos,funcionarios...) e em 30min
tu vai falar ta ai fiz em "linguagem C" tu vai rodar no terminal naquele "Cularis 10 velho"
da sua empresa e seu de primeira seu patrão vai ter um ataque de felicidade vai pedir
para tirar o software velho em lentojava velho para botar seu software em C hahahah
quem sabe você convence o coitado a tirar aquele servidor Cularis cujo tenha tomado
mais de 10 defaces e trocar por um FreeBSD também hahaha...
no mundo em que nós vivemos isso ta longe da realidade ! seu patrão maioria
das vezes é um leigo em T.I poco se importa a linguagem que tu vai usar para fazer o
sisteminha, para ele tendo GUI bonita e fazendo rápido o que ele quer esta bom...
se você fazer em Assembly ele vai olhar prá você e vai falar
"por que demorou 3 semanas,estagiario falo que faz em 2 dias"
e você fala "fiz em assembly" e ele fala "idai ?" nem vou continuar você já deve imaginar...

mas mesmo sabendo disso nós somos loucos para continuar os estudos em linguagem C


O que é SQLite ?

SQLite é uma biblioteca C que implementa um banco de dados SQL embutido ou seja
SQLite é o servidor. A biblioteca SQLite lê e escreve diretamente para o arquivo
do banco de dados no disco.

Por que vamos usar SQLite?

SQLite foi escolhido para este artigo por não necessitar de
configurações complicadas e por sua instalação ser rapida e limpa...
Suporta bases de dados acima de 2 terabytes,O Banco de Dados é guardado em um único arquivo
e Sem dependências externas e outros motivos,É facil exportar dados,por ser rapido...

Como instalar ?

caso use windows ou queira instalar direto do tarball http://www.sqlite.org
linux debianos em geral "apt-get install sqlite3 libsqlite3-dev(biblioteca do C) sqlite3-doc(caso queira ler as doc)"
Slackers installpkg sqlite3_bla_bla.tgz,chapeis vermelhos e azuis "yum install sqlite",Daemons,puffers
procure nos ports. caso use windows instale o cygwin e por ele o GCC...

Quem usa SQLite ?
Firefox,adobe,symbianOS,amarok entre outros...

Algumas características do SQLite:

. Software livre/domínio público e Multiplataforma;
. Mecanismo de armazenamento seguro com transações ACID;
. Não necessita de instalação, configuração ou administração;
. Implementa a maioria do SQL92;
. O Banco de Dados é guardado em um único arquivo;
. Suporta bases de dados acima de 2 terabytes;
. Sem dependências externas.

antes de continuar treine comandos SQL no SQLite crie tabelas etc...

vamos iniciar com o Rock and Roll

Por que vamos usar SQLite com linguagem C ?

para fácilitar nossa vida para guardar dados de forma inteligente poder executar comandos SQL usando regex
entre outras milhares de utilidades,tendo tudo em mãos vamos ao primeiro exemplo de uso,antes de me perguntar

"O que é isu tio Cooler?

te falo
"Menino ta tudo comentado o código linha por linha então só ler e aprender


// exemplo bu Antonio(Cooler)
// http://botecoUnix.com.br
#include <stdio.h>
// lib do SQLite
#include <sqlite3.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20

int main(int argc, char** args) {
char *sql,nome[MAX],*end;
int retval,i;
int q_cnt = 5,q_size = 150,ind = 0;
  char **queries = malloc(sizeof(char) * q_cnt * q_size);
// definindo ponteiros
sqlite3_stmt *stmt;
sqlite3 *handle;
// abrindo seu banco, antes de rodar o programa crie um banco com SQLite
retval = sqlite3_open("agenda.sqlite3",&handle);
// caso de erro na conexão vai mostrar msg
if(retval) { printf("Erro no banco\n"); return -1; }
// caso nao tenha dado erro continua
printf("Deu certo\n");
// pega entrada do usuário
printf("digite um nome para adicionar no banco\n");
getchar();
fgets(nome, MAX, stdin);
i = strlen(nome)-1;
  if(nome[i] == '\n') {
      nome[i] = '\0';
  }

// vai adicionar no banco na tabela agenda no campo nome o nome digitado pelo usuario
sql = (char *)malloc( sizeof(char) * q_size );
strcpy(sql, "INSERT INTO agenda VALUES('" );
strcat(sql,nome);
// vai aidionar no banco o numero de tell 43432222
strcat(sql,"', '43432222')");
// em suma he uma query soh INSERT INTO agenda Values('STDIN(entrada do user)', 'numero_definido')

// executa nosso comando no banco
retval = sqlite3_exec(handle,sql,0,0,0);
// fecha a conexão
sqlite3_close(handle);
return 0;
}

para compilar isso ai de o comando
gcc seuprograma.c -o seuprograma -l sqlite3 -std=c99; ./seuprograma
se deu certo no seu banco chamado "agenda.sqlite3″ na tabela agenda vai ter um campo
com nome que vocẽ adicionou pelo nosso programa...

*-l usamos esta paradigma para definir a lib a ser usada em conjunto com nosso programa
*-std definimos o padrão C99 ou seja o padrão da linguagem C de 1999 um C ala K&R só que melhorado

este exemplo foi simples somente para adicionar um campo chamado nome em uma tabela chamada agenda
em que tenha (nome,tell),agora como seria para dar um SELECT ou seja mostrar o conteudo da tabela ? próximo
exemplo mostra uma solução

// Antonio (Cooler)
// http://botecoUnix.com.br
#include<stdio.h>
#include<sqlite3.h>
#include<stdlib.h>

int main(int argc, char** args) {
//definindo vars e mem
int retval;
int q_cnt = 5,q_size = 150,ind = 0;
char **queries = malloc(sizeof(char) * q_cnt * q_size);
// preparando
sqlite3_stmt *stmt;

// criando o ponteiro para conectar
sqlite3 *handle;

// definindo nome do banco para conectar
retval = sqlite3_open("agenda.sqlite3",&handle);
// condição caso de erro
if(retval) { printf("erro na conexao com banco agenda.sqlite3\n"); return -1; }
printf("Coexao com banco ok\n");
// definimos a query SQL para uma busca simples enquanto tiver resultado ira nos mostrar as saidas
    queries[ind++] = "SELECT * from agenda";
    retval = sqlite3_prepare_v2(handle,queries[ind-1],-1,&stmt,0);
// caso de erro
    if(retval)
    {
    printf("db selecionado com erro\n");
    return -1;
    }

    // le numero de colunas
    int cols = sqlite3_column_count(stmt);
   while(1)
    {
    // retorna os statos
    retval = sqlite3_step(stmt);

    if(retval == SQLITE_ROW)
    {

    // nos retornando os resultados
    for(int col=0 ; col<cols;col++)
    {
    const char *val = (const char*)sqlite3_column_text(stmt,col);
// definimos como vai ser a saida das colunas
    printf("%s = %s\t",sqlite3_column_name(stmt,col),val);
    }
    printf("\n");
    }
    else if(retval == SQLITE_DONE)
    {
    // termina
    printf("pronto\n");
    break;
    }
    else
    {
    // caso ocorra algum erro
    printf("algum erro\n");
    return -1;
    }
    }
// fecha conexão
sqlite3_close(handle);
return 0;
}


mesmo meta de compilar do anterior porem ele vai mostrar os dados da tabela sendo dois nome e telefone...


se até agora você não conseguiu compilar os programas aqui propostos é por que tem algum Bug, procure o erro
veja se você tem realmente a lib SQLite3 em "/usr/include" , caso tenha veja se tem algum erro de sintaxe...
Aqui usando um Debian lenny +GCC rodou tudo perfeitamente então baseado nisso de escolha
um "OS" decente para trabalhar...

agora só para finalizar nosso estudos com SQlite e linguagem C vamos fazer um programa que crie uma tabela
no seu banco com SQlite :)

#include<stdio.h>
#include<sqlite3.h>
#include<stdlib.h>

int main(int argc, char** args) {
int retval;
int q_cnt = 5,q_size = 150,ind = 0;
char **queries = malloc(sizeof(char) * q_cnt * q_size);
// preparando estados com ponteiro
sqlite3_stmt *stmt;

// criando ponteiro leitor do banco
sqlite3 *handle;

// definimos local do banco sqlite
retval = sqlite3_open("agenda.sqlite3",&handle);
// condição caso de certo
if(retval) { printf("erro no banco\n"); return -1; }
printf("OK\n");
// nossa query para executar no banco
char create_table[100] = "CREATE TABLE users (nome varchar(30), senha varchar(12))";
// Executando a qury no banco
retval = sqlite3_exec(handle,create_table,0,0,0);
// fechando conexão
sqlite3_close(handle);
return 0;
}


bom pessoal espero ter ajudado ai programadores em C em geral ou iniciantes no mesmo a usar SQlite com C
bem, não estou postando com a mesma meta de sempre por que ando com uns problemas de saúde mas assim que eu
melhorar volto com tudo...

fiquem com Deus

blackwinner

Boa lib... eu acho que pra um ambiente industrial.. então C++ é mais indicado do que C. =/

Mas enfim.. viva o C. o/ hehe =]
sergaralho.blogspot.com --> a informação como ela deve ser.. pura!

C00L3R

INDICADO? acho que este termo não he bom
sim C ansi não tem POO como C++ e não é facil como C++
a questão do indicado não existe pois o mais indicado para se programar
é sempre ASM ou C ,acontece que a cada dia que passa nós programadores
estamos mais preguiçosos e obtamos por linguagens faceis cujo desempenho
não é tão bom como ruby,java,perl...  mesmo usando "threads" nestas linguagens
não chega a bater a velocidade de um codigo bem feito em C ou asm,lisp...


Claro que as empresas vão prefirir os mais rapido,mais tambem claro que as
empresas de porte fraco vão preferir pagar menos para alguem que faz um código
em outra linguagem menos rapido,
só fazer testes com benchmark que você vai confirmar tudo que falo...

C++ que ando vendo anda sendo usado mercado mais de Jogos,programas para cell
entre outras coisas simples programas para desk etc.... C++ é bom considero uma
boa linguagem mais lembrando q foi feito nos mesmos laboratorios do C o bell labs
ou seja C++ é como se fosse um C99 porem com POO e mais frescurites...
em suma o que vocẽ faz em C++ você pode fazer em C só quer vai aumentar as linhas!
ja viu a lib alegro ? então !

vejo que você é um amante do C assim como eu visita ai depois botecounix.com.br
abraço



blackwinner

Por isso mesmo ele é o mais indicado.
Em relação performace x tempo de desenvolvimento.. eu acredito que ele seja a melhor linguagem para aplicações usuário.

Mesmo porque, com o avanço das otimizações feitas pelo compilador, programar em C da quase na mesma coisa que em C++ trantando-se de aplicações user-mode.

O qsort da STL por exemplo, é mais rápido que o sort do C.
E o C++ não é nada fácil.. o que eu mais vejo é ele sendo usado de forma errada. =/

O ideal para aplicações user-mode, é C++ e um inline assembly.

A diferença de performace só da para perceber mesmo, por erros de programação.

A outra grande diferença além da relação performace x tempo de desenvolvimento é que nas empresas você tem que trabalhar com programadores estúpidos muitas vezes infelizmente.
O C++ permite que você faça um código mais compreensível já que alguns programadores, nem se você escrever um testamento no comentário, conseguem entender se você não fizer da forma como o professor ensinou na sala de aula ou muito parecida.

Mas se eu fosse programar sem um patrão me irritando, sem o relógio fazendo "tic-tac" enquanto o suor escorre pelo meu rosto.. ai eu iria realmente preferir C.

A STL é uma mão na roda realmente e muito bem feita.. da uma olhada nela que você vai perceber.
Dificilmente, você vai conseguir fazer as funções já implementadas nela em C na hora, com pressa e tendo o mesmo desempenho.

E pra comprovar isso, é a programação de jogos em C++.
Lembro que na época que o C++ começou a ser usado para jogos, muitos rangiam os dentes e falavam: "C++ é um lixo.. é muito lento!" blablablabla

Mas hoje em dia o C++ já conseguiu seu lugar ao sol.
Em um jogo, uma diferença mínima de performace já é um exagero.

Enfim, cada um tem seu gosto.. mas C++ não é lento e muito menos fácil.

PS: o blog é seu?
Legal ele, vou dar uma lida nele. =]
sergaralho.blogspot.com --> a informação como ela deve ser.. pura!