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.

http://maurinsoft.com.br/index.php/2022/01/31/mysql-com-c-lazarus-python-php-r-parte-1

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

Inclusão dos fontes dos projetos em C

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/

Artigos Relacionados