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);
}