A API em C do MySQL

ArticleCategory:

SoftwareDevelopment

AuthorImage:

Ozcan Gungor

TranslationInfo:

original in trÖzcan Güngör
tr to en Özcan Güngör
en to pt Bruno Sousa

AboutTheAuthor:

Eu uso o Linux desde 1997. Liberdade, flexibilidade e c�digo aberto. Estas s�o as propriedades que gosto.

Abstract:

Neste Artigo, aprenderemos a usar as APIs em C (Interfaces de programa��o de aplica��es) que v�m com o MySQL. No sentido de compreender este artigo precisa de ter conhecimento dos seguintes pr�-requisitos:

ArticleIllustration:

mysql logo

ArticleBody:

Introdu��o

As APIs em C s�o distribuidas com o c�digo do MySQL e est�o inclu�das na biblioteca do mysqlclient. S�o usadas para se ligar a uma base de dados e executar consultas. Existem alguns exemplos no direct�rio clients do c�digo fonte do MySQL.

Tipos de Vari�veis do MySQL C

Os seguintes tipos de vari�veis est�o definidos na biblioteca do MySQL. Necessitamos destas vari�veis no sentido de usar as fun��es do MySQL. As vari�veis s�o explicadas em detalhe mas os detalhes n�o s�o agora importantes para escrever c�digo.

MYSQL
A estrutura seguinte � o handler de comunica��o que � usado para se ligar a uma base de dados.

typedef struct st_mysql {
NET           net;            /* Par�metros de liga��o */
  gptr          connector_fd;   /* Descriptor da liga��o para SSL */
  char          *host,*user,*passwd,*unix_socket,
                *server_version,*host_info,*info,*db;
  unsigned int  port,client_flag,server_capabilities;
  unsigned int  protocol_version;
  unsigned int  field_count;
  unsigned int  server_status;
  unsigned long thread_id;      /* Id para a liga��o no servidor */
  my_ulonglong affected_rows;
	my_ulonglong insert_id;       /* id da pr�xima inser��o se for usado o NEXTNR */
  my_ulonglong extra_info;              /* Usado pelo mysqlshow */
  unsigned long packet_length;
  enum mysql_status status;
  MYSQL_FIELD   *fields;
  MEM_ROOT      field_alloc;
  my_bool       free_me;        /* Se est� livre ap�s mysql_close */
	my_bool       reconnect;      /* definido a 1 para uma re-liga��o autom�tica */
  struct st_mysql_options options;
  char          scramble_buff[9];
  struct charset_info_st *charset;
  unsigned int  server_language;
} MYSQL;



MYSQL_RES
Esta estrutura representa os resultados de uma consulta que retorna linhas. Os dados retornados chamam-se result-set.

typedef struct st_mysql_res {
  my_ulonglong row_count;
  unsigned int  field_count, current_field;
  MYSQL_FIELD   *fields;
  MYSQL_DATA    *data;
  MYSQL_ROWS    *data_cursor;
  MEM_ROOT      field_alloc;
	MYSQL_ROW     row;            /* Se faz leitura recorrendo a buffers*/
	MYSQL_ROW     current_row;    /* buffer da actual linha */
	unsigned long *lengths;       /* tamanho das colunas da linha actual */
	MYSQL         *handle;        /* Para leituras que n�o recorrem a buffers */
  my_bool       eof;            /* Usado por mysql_fetch_row */
} MYSQL_RES;



MYSQL_ROW
Esta estrutura � uma representa��o de dados seguros numa linha. N�o pode usar isto como uma string que termine com o caracter nulo porque os dados nesta string podem ser bin�rios e podem incluir o caracter nulo.

typedef struct st_mysql_field {
  char *name;                   /* Nome da coluna */
	char *table;                  /* Tabela da coluna se a coluna for um campo */
  char *def;                    /* Valor por omiss�o (definido por mysql_list_fields) */
  enum enum_field_types type;   /* Tipo de campo. Veja o mysql_com.h para os tipos */
  unsigned int length;          /* Tamanho da coluna */
  unsigned int max_length;      /* Tamanho m�ximo do set seleccionado */
  unsigned int flags;           /* Div flags */
  unsigned int decimals;        /* N�mero de decimais */
} MYSQL_FIELD;



my_ulonglong
Este � o tipo usado para o n�mero de linhas e para mysql_affected_rows(), mysql_num_rows(), e mysql_insert_id(). Este tipo fornece um intervalo de 0 a 1.84e19. Nalguns sistemas tentar imprimir o valor do tipo my_ulonglong n�o trabalhar�. Para imprimir tal valor, converta-o para um long sem sinal (unsigned long) e uso o formato de impress�o %lu do printf. Example:
%lu printf format. Example:
printf(Number of rows: %lu\n", (unsigned long) mysql_num_rows(result));

typedef unsigned long my_ulonglong;

Ligando-se ao MySQL e fazendo uma consulta

Agora, assumo que tem o MySQL instalado e que est� criado um utilizador, uma tabela e uma base de dados. No caso de ter algum problema, por favor d� uma vista de olhos no website www.mysql.com.

Como j� dito antes as bibliotecas do MySQL est�o na biblioteca mysqlclient. Assim ao compilar o programa MySQL, � necess�rio adicionar a op��o de compila��o -lmysqlclient. Os ficheiros cabe�alho do MySQL est�o sob /usr/include/mysql (tal pode variar da sua distribui��o de Linux). O cabe�alho do seu programa pode assemelhar-se a algo como isto:

#include <mysql/mysql.h>

Os tipos de vari�veis do MySQL e as fun��es est�o inclu�das neste ficheiro cabe�alho.

Depois, precisamos de criar a vari�vel que � usada para se ligar � base de dados. Isto � simplesmente feito com:

MYSQL *mysql;

Antes de se ligar a uma base de dados, devemos iniciar a seguinte fun��o para inicializar a vari�vel mysql:

mysql_init(MYSQL *mysql)

Depois a

MYSQL * STDCALL 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 int clientflag);

fun��o � usada para se ligar � base de dados. O host � o nome da m�quina servidora onde o MySQL est� alojado. O user � o utilizador com o qual nos queremos ligar. A passwd � a palavra chave associada ao utilizador. A db � a base de dados � qual nos queremos ligar. A port � o n�mero da porta TCP/IP do servidor MySQL. O unix_socket � o tipo de liga��o pretendida. A clientflag � a flag que faz com que o MySQL corra tipo ODBC. Neste artigo � definida a zero. Esta fun��o retorna zero quando a liga��o � estabelecida.

Agora podemos ligarmo-nos a uma base de dados e fazer uma consulta:

char *query;

Usando esta fun��o podemos construir qualquer senten�a em SQL e fazer uma consulta. A fun��o que executa a consulta �:

int STDCALL mysql_real_query(MYSQL *mysql, 
                             const char *q,
                             unsigned int length);
mysql � a vari�vel que us�mos acima. O q � a string de consulta em SQL. A length � o tamanho desta string. Se a consulta tiver sucesso sem nenhum erro, a fun��o retorna 0.

Despois de fazer uma consulta necessitamos de uma vari�vel MYSQL_RES no sentido de pudermos usar os valores resultantes da consulta. A seguinte linha cria esta vari�vel:

MYSQL_RES *res;
Then
mysql_use_result(MYSQL *query)
A fun��o � usada para ler resultados.

Apesar de conseguirmos fazer consultas facilmente, precisamos de algumas outras fun��es para usar os resultados. A primeira �:

MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);
Esta fun��o transforma os resultados em linhas. Como notou, a fun��o retorna um tipo dispon�vel de MYSQL_ROW. A seguinte linha cria tal vari�vel:
MYSQL_ROW row;
Como explicado anteriormente a vari�vel row � um vector de strings. Isto significa que a row[0] � a primeira coluna da primeira linha, row[1] � a segunda coluna da primeira linha... Quando usamos mysql_fetch_row, ent�o a vari�vel obtem os dados da pr�xima linha do resultado. Quando atingimos o fim do resultado ent�o a fun��o retorna um valor negativo. Por fim necessitamos de terminar a liga��o:
mysql_close(MYSQL *mysql)

Algumas fun��es �teis

Vejamos como obter o n�mero de campos de uma tabela. A seguinte fun��o faz isto:
unsigned int STDCALL mysql_num_fields(MYSQL *mysql);
Esta fun��o retorna o n�mero de campos de uma tabela.

Para obter o n�mero de linhas do resultado de uma consulta, usamos:

my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res);

my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql);

Esta fun��o � usada para saber o n�mero de lihas que s�o afectadas pelas instru��es de INSERT, de DELETE, de UPDATE. Note que a fun��o retorna o tipo my_ulonglong.

Por fim algum c�digo exemplificativo:

#include <mysql/mysql.h>
#include <stdio.h>

void main(){
   MYSQL *mysql;
   MYSQL_RES *res;
   MYSQL_ROW row;
   char *query;
   int t,r;

   mysql_init(mysql);
   if (!mysql_real_connect(mysql,"localhost","mysql",
        "mysql","deneme",0,NULL,0))
   {
       printf( "Error connectin ot database: %s\n",mysql_error(mysql));
   }
   else printf("Connected...\n");

   query="select * from Deneme";

   t=mysql_real_query(mysql,query,(unsigned int) strlen(query));
   if (t)
   {
      printf("Error making query: %s\n",
              mysql_error(mysql));
   }
   else printf("Query made...\n");
   res=mysql_use_result(mysql);
   for(r=0;r<=mysql_field_count(mysql);r++){
           row=mysql_fetch_row(res);
           if(row<0) break;
           for(t=0;t<mysql_num_fields(res);t++){
                   printf("%s ",row[t]);
           }
           printf("\n");
   }
   mysql_close(mysql);
}

Leituras Recomendadas