Mysql com C/Lazarus/Python/PHP/R – Parte 2
Neste segundo artigo iremos abordar como realizar um crud simples em C usando banco de dados Mysql como referência.
No artigo anterior, tratamos de criar o banco de dados.
Agora iremos tratar de algumas definições do nosso projeto:
Para facilitar o CRUD, iremos dividir em pequenos aplicativos, alias, essa divisão deixa muito didática e fácil de entender.
- insPessoa.c – Inclui uma pessoa na tabela de pessoas
- SelPessoa.c – Lista a relação de pessoas
- UpdPessoa.c – Atualiza os dados de uma pessoa da tabela de pessoa
- remPessoa.c – Remove uma pessoa da tabela de pessoas
Com isso, finalizamos o crud e teremos alcançado nosso objetivo neste artigo.
Dependências
Iremos incluir aqui as dependências necessárias para seguir com este programa.
Primeiro pedimos para seguir o primeiro tutorial, pois sem a instalação do mysql fica dificil implementar.
Em seguida a instalação do ncurses, conforme o link abaixo:
http://maurinsoft.com.br/index.php/2022/01/31/instalando-ncurses/
GIT do Projeto
Estaremos modificando o git incluindo a pasta gcc, nela incluiremos todos os fontes do projeto.
https://github.com/marcelomaurin/mysql-vs-todos
Começa o Jogo!
Primeiro iremos criar o Makefile
CC=gcc
SOURCE_INS=insPessoa.c
SOURCE_SEL=selPessoa.c
SOURCE_DEL=delPessoa.c
SOURCE_UPD=updPessoa.c
LIBS= -lmysql -lncurses
TARGET_INS=insPessoas
TARGET_SEL=selPessoas
TARGET_DEL=delPessoas
TARGET_UPD=updPessoas
all: clean compile install
clean:
rm *.o
compile:
$(CC) $(SOURCE_INS) -o $(TARGET_INS)
$(CC) $(SOURCE_SEL) -o $(TARGET_SEL)
$(CC) $(SOURCE_DEL) -o $(TARGET_DEL)
$(CC) $(SOURCE_UPD) -o $(TARGET_UPD)
install:
cp $(TARGET_INS) /usr/local/bin/
cp $(TARGET_SEL) /usr/local/bin/
cp $(TARGET_DEL) /usr/local/bin/
cp $(TARGET_UPD) /usr/local/bin/
Ao chamar o make, iremos compilar todos os fontes incluindo eles na pasta /usr/local/bin, que permite executar em qualquer local que quisermos.
Explicação do programa
Este programa irei apresentar na integra, comentando os pontos principais.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql.h>
#define USER "gcc"
#define HOST "localhost"
#define DATABASE "testedb"
#define PASS "123456"
#define SUCCESS 0
#define ERROR 1
MYSQL *mycon;
//char PASS[20];
int res;
int conecta(void){
mycon = mysql_init(NULL);
/*
mysql_real_connect(MYSQL *mysql,
const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned long client_flag)
*/
//mysql_options(mycon, MYSQL_READ_DEFAULT_FILE, (void *)"./my.cnf");
res = mysql_real_connect(
mycon,
HOST,
USER,
PASS,
DATABASE,
3306,
NULL,
0);
if(res!=NULL)
{
printf("Sucesso na conexão com servidor\n");
return SUCCESS;
}
else {
printf("Falha na conexao! Erro:%s\n",mysql_error(mycon));
return ERROR;
}
}
//Estrutura de cadastro de pessoas
typedef struct PESSOAS {
int idpessoa;
char nome[30];
char dtnasc[20];
char profissao[20];
char sexo;
} PESSOAS;
void desconecta(void){
mysql_close(mycon);
mysql_library_end();
printf("Desconectado\n");
}
int Select( PESSOAS *pes){
char sql[500];
memset(sql,'\0',sizeof(sql));
sprintf(sql,"select * from pessoas where nome like '%%%s%%'",
pes->nome
);
printf("SQL:%s\n\n",sql);
//mysql_prepare(
res = mysql_query(mycon,sql);
if(!res) {
printf("Pesquisa com sucesso!\n");
MYSQL_RES *result = mysql_store_result(mycon);
if (!result) {
printf("Couldn't get results set: %s\n", mysql_error(mycon));
} else {
MYSQL_ROW row;
int i;
unsigned int num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result))) {
for (i = 0; i < num_fields; i++) {
printf("%s, ", row[i]);
}
putchar('\n');
}
mysql_free_result(result);
}
} else {
printf("Falha na pesquisa Error:%s\n",mysql_error(mycon));
}
}
void captura_dados(PESSOAS *pes){
printf("Digite as informações que deseja pesquisar\n");
printf("==========================================\n");
printf("\nNome:");
scanf("%s",pes->nome);
printf("\n\n");
}
void Wellcome(void){
printf("Software selPessoa\n");
printf("Criado por Marcelo Maurin Martins\n");
printf("Maurinsoft.com.br\n");
//printf("Senha do banco:");
//scanf("%s",PASS);
}
//funcao principal
void main(int argc, char *argv[]){
Wellcome();
PESSOAS pessoa;
/*Testa conexao*/
if (conecta()==SUCCESS) {
captura_dados(&pessoa);
Select(&pessoa);
desconecta();
}
}
A primeira parte importante é a inclusão da lib, que permite compilar os comandos do mysql
#include <mysql.h>
Include da lib do mysql
O outro ponto importante é a declaração mycon.
MYSQL *mycon;
variavel de conexão do mysq
A mycon, é um handle do mysql. Que permite identificar a comunicação do banco aberta no comando mysql_init.
mycon = mysql_init(NULL);
inicia a comunicação com o mysql
Atribuindo acesso ao banco.
O comando mysql_real_connect atribui usuário e senha a conexão. Bem como estabelecendo um caminho entre o servidor correto.
res = mysql_real_connect(
mycon,
HOST,
USER,
PASS,
DATABASE,
3306,
NULL,
0);
São os principais parametros, HOST (o ip do servidor), user (usuário do banco), PASS(senha do banco), DATABASE (banco de dados), PORTA (default 3306).
mysql_query
O mysql_query permite rodar os comandos, tanto select, como update, delete e insert, ele é o mais importante comando.
Para não falar em vídeozinho
Segue a apresentação dos programas rodando.
Referências
https://dev.mysql.com/doc/c-api/8.0/en/
https://zetcode.com/db/mysqlc/