original in trÖzcan
Güngör
tr to en Özcan
Güngör
en to pt Bruno Sousa
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;
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)
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); }