original in tr Özcan Güngör
tr to en Özcan Güngör
en to ru Pukhlyakov Kirill
MYSQL
Эта структура используется для подключения к базе.
typedef struct st_mysql { NET net; /* Communication parameters */ gptr connector_fd; /* ConnectorFd for 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 for connection in server */ my_ulonglong affected_rows; my_ulonglong insert_id; /* id if insert on table with NEXTNR */ my_ulonglong extra_info; /* Used by mysqlshow */ unsigned long packet_length; enum mysql_status status; MYSQL_FIELD *fields; MEM_ROOT field_alloc; my_bool free_me; /* If free in mysql_close */ my_bool reconnect; /* set to 1 if automatic reconnect */ struct st_mysql_options options; char scramble_buff[9]; struct charset_info_st *charset; unsigned int server_language; } MYSQL;
MYSQL_RES
Эта структура представляет результаты запроса, возвращает данные строками.
Возвращаемые данные называются 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; /* If unbuffered read */ MYSQL_ROW current_row; /* buffer to current row */ unsigned long *lengths; /* column lengths of current row */ MYSQL *handle; /* for unbuffered reads */ my_bool eof; /* Used my mysql_fetch_row */ } MYSQL_RES;
MYSQL_ROW
Это еще одна структура для представления данных. Но вы не можете
использовать ее как строку, заканчивающуюся нулевым символом, потому, что строка может быть
двоичной и может содержать этот символ.
typedef struct st_mysql_field { char *name; /* Name of column */ char *table; /* Table of column if column was a field */ char *def; /* Default value (set by mysql_list_fields) */ enum enum_field_types type; /* Type of field. Se mysql_com.h for types */ unsigned int length; /* Width of column */ unsigned int max_length; /* Max width of selected set */ unsigned int flags; /* Div flags */ unsigned int decimals; /* Number of decimals in field */ } MYSQL_FIELD;
my_ulonglong
Этот тип используется для таких величин и функций как: количество
строк mysql_affected_rows(), mysql_num_rows(), и mysql_insert_id(). Диапазон этого типа:
от 0 до 1.84e19. В некоторых системах Вы не сможете вывести значение этого типа ( my_ulonglong ),
чтобы сделать это Вам придется превести это значение к типу unsigned long и использовать
формат %lu функции printf.
Например:
printf(Количество строк: %lu\n", (unsigned long) mysql_num_rows(result));
typedef unsigned long my_ulonglong;
Как Вы уже знаете, MySQL функции находятся в библиотеке mysqlclient. Поэтому, для компиляции приложений, взаимодействующих с MySQL, необходимо добавить опцию -lmysqlclient. Заголовочные файлы MySQL находятся в каталоге /usr/include/mysql ( впрочем зависит от вашего дистрибутива Linux ). Заголовок Вашего приложения должен выглядеть следующим образом:
#include <mysql/mysql.h>
Функции и переменные MySQL определены в этом заголовочном файле.
Далее, необходимо создать переменную для подключения к базе данных. Это достаточно просто и выглядит следующим образом:
MYSQL *mysql;
Перед непосредственным подключением к базе данных необходимо вызвать следующую функцию для инициализации переменной mysql:
mysql_init(MYSQL *mysql)
Затем вызывается функция
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);
для подключения. host - имя компьютера с запущенным сервером MySQL, user - пользователь, которым мы хотим подключиться, passwd - пароль, db - база данных, к которой мы хотим подключиться, port - номер TCP/IP порта, unix_socket - тип соединения, clientflag - флаг, позволяющий MySQL работать подобно ODBC. В данной заметке для этого аргумента указываем значение 0. Эта функция возвращает 0 в случае успешного соединения.
Теперь мы можем подключиться к базе данных и выполнить запрос:
char *query;
Используя эту строку мы можем создать любой SQL запрос. Функция для выполнения запроса:
int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned int length);mysql - переменная, которую мы создали, q - строка SQL запроса, length - длина этой строки. Если запрос прошел успешно - функция возвращает 0.
После выполнения запроса нам потребуется переменная типа MYSQL_RES, чтобы мы могли использовать его результатыin. Эта переменная создается следующим образом:
MYSQL_RES *res;Затем
mysql_use_result(MYSQL *query)Эта функция используется для чтения результатов.
Также мы можем использовать запросы более простым способом, но для этого нам нужны другие функции. Первая из них:
MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);Эта функция преобразует результат в строки. Как вы заметили, функция возвращает результат в формате переменной типа MYSQL_ROW. Эта переменная создается следующим образом:
MYSQL_ROW row;Как мы уже сказали переменная row это массив строк. Это значит, что row[0] первая колонка первой строки, row[1] - вторая колонка первой строки... Функция mysql_fetch_row возвращает следующую строку результата, если данных больше нет - возвращается отрицательное значение. После окончания работы мы должны закрыть соединение:
mysql_close(MYSQL *mysql)
unsigned int STDCALL mysql_num_fields(MYSQL *mysql);
Чтобы узнать количество строк результата запроса используйте:
my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res);
my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql);
Эта функция возвращает количество строк при использовании SQL запросов INSERT, DELETE, UPDATE. Обратите внимание, что возвращаемый резутьтат имеет тип my_ulonglong.И наконец пример кода:
#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 connecting to 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); }