[LinuxFocus-icon]
<--  | Домой  | Карта  | Индекс  | Поиск

Новости | Архивы | Ссылки | Про LF
[an error occurred while processing this directive]
Ozcan Gungor
автор Özcan Güngör
<ozcangungor(at)netscape.net>

Об авторе:
Я использую Linux с 1997 г. Свобода, настраиваемость и открытый код - это именно те качества, которые мне нравятся.

Перевод на Русский:
Pukhlyakov Kirill <kirill(at)linuxfocus.org>

Содержание:

 

MySQL C API

mysql logo

Резюме:

В этой заметке я расскажу как использовать C API, поставляемый с MySQL. Чтобы понять о чем идет речь в заметке, необходимы следующие знания:

  • Переменные в C
  • Функции в C
  • Указатели в C

_________________ _________________ _________________

 

Введение

C API распространяется с MySQL и входит в библиотеку mysqlclient. Назначение API - подключение к базе и выполнение запросов. Некоторые примеры использования доступны в каталоге clients.  

Типы переменных в MySQL C

Следующие переменные определены в библиотеке MySQL. Они необходимы для использования функций MySQL. Они подробно описаны, но это не самое главное для написания кода.

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 и выполнение запроса

Итак, предположим, что MySQL установлена, заведен пользователь и создана таблица с данными. Если у Вас возникли какие-нибудь вопросы или проблемы с этими моментами - обратитесь на сайт http://www.mysql.com/.

Как Вы уже знаете, 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);
}
 

Рекомендации

 

Страница отзывов

У каждой заметки есть страница отзывов. На этой странице вы можете оставить свой комментарий или просмотреть комментарии других читателей.
 talkback page 

<--, перейти к начальной странице выпуска

Webpages maintained by the LinuxFocus Editor team
© Özcan Güngör, FDL
LinuxFocus.org
Translation information:
tr --> -- : Özcan Güngör <ozcangungor(at)netscape.net>
tr --> en: Özcan Güngör <ozcangungor(at)netscape.net>
en --> ru: Pukhlyakov Kirill <kirill(at)linuxfocus.org>

2003-09-02, generated by lfparser version 2.42