Spec-Zone .ru
спецификации, руководства, описания, API

22.7.4. Встроенные Примеры Сервера

Эти два примера программы должны работать без любых изменений над системой FreeBSD или Linux. Для других операционных систем незначительные изменения необходимы, главным образом с путями к файлам. Эти примеры разрабатываются, чтобы дать достаточно многие детали для Вас, чтобы понять проблему без помехи, которая является необходимой частью реального приложения. Первый пример является очень прямым. Второй пример немного больше усовершенствован с некоторой проверкой на ошибки. Первое сопровождается записью командной строки для того, чтобы скомпилировать программу. Второе сопровождается файлом GNUmake, который может использоваться для того, чтобы скомпилировать вместо этого.

Пример 1

test1_libmysqld.c

#include <stdio.h>#include <stdlib.h>#include <stdarg.h>#include "mysql.h"MYSQL *mysql;MYSQL_RES *results;MYSQL_ROW record;static char *server_options[] = \       { "mysql_test", "--defaults-file=my.cnf", NULL };int num_elements = (sizeof(server_options) / sizeof(char *)) - 1;static char *server_groups[] = { "libmysqld_server",                                 "libmysqld_client", NULL };int main(void){   mysql_library_init(num_elements, server_options, server_groups);   mysql = mysql_init(NULL);   mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "libmysqld_client");   mysql_options(mysql, MYSQL_OPT_USE_EMBEDDED_CONNECTION, NULL);   mysql_real_connect(mysql, NULL,NULL,NULL, "database1", 0,NULL,0);   mysql_query(mysql, "SELECT column1, column2 FROM table1");   results = mysql_store_result(mysql);   while((record = mysql_fetch_row(results))) {      printf("%s - %s \n", record[0], record[1]);   }   mysql_free_result(results);   mysql_close(mysql);   mysql_library_end();   return 0;}

Вот командная строка для того, чтобы скомпилировать вышеупомянутую программу:

gcc test1_libmysqld.c -o test1_libmysqld \ `/usr/local/mysql/bin/mysql_config --include --libmysqld-libs`

Пример 2

Чтобы попробовать пример, создайте test2_libmysqld каталог на том же самом уровне как исходный каталог MySQL. Сохраните test2_libmysqld.c источник и GNUmakefile в каталоге, и выполненном GNU make изнутри test2_libmysqld каталог.

test2_libmysqld.c

/* * A simple example client, using the embedded MySQL server library*/#include <mysql.h>#include <stdarg.h>#include <stdio.h>#include <stdlib.h>MYSQL *db_connect(const char *dbname);void db_disconnect(MYSQL *db);void db_do_query(MYSQL *db, const char *query);const char *server_groups[] = {  "test2_libmysqld_SERVER", "embedded", "server", NULL};intmain(int argc, char **argv){  MYSQL *one, *two;  /* mysql_library_init() must be called before any other mysql   * functions.   *   * You can use mysql_library_init(0, NULL, NULL), and it   * initializes the server using groups = {   *   "server", "embedded", NULL   *  }.   *   * In your $HOME/.my.cnf file, you probably want to put:[test2_libmysqld_SERVER]language = /path/to/source/of/mysql/sql/share/english   * You could, of course, modify argc and argv before passing   * them to this function.  Or you could create new ones in any   * way you like.  But all of the arguments in argv (except for   * argv[0], which is the program name) should be valid options   * for the MySQL server.   *   * If you link this client against the normal mysqlclient   * library, this function is just a stub that does nothing.   */  mysql_library_init(argc, argv, (char **)server_groups);  one = db_connect("test");  two = db_connect(NULL);  db_do_query(one, "SHOW TABLE STATUS");  db_do_query(two, "SHOW DATABASES");  mysql_close(two);  mysql_close(one);  /* This must be called after all other mysql functions */  mysql_library_end();  exit(EXIT_SUCCESS);}static voiddie(MYSQL *db, char *fmt, ...){  va_list ap;  va_start(ap, fmt);  vfprintf(stderr, fmt, ap);  va_end(ap);  (void)putc('\n', stderr);  if (db)    db_disconnect(db);  exit(EXIT_FAILURE);}MYSQL *db_connect(const char *dbname){  MYSQL *db = mysql_init(NULL);  if (!db)    die(db, "mysql_init failed: no memory");  /*   * Notice that the client and server use separate group names.   * This is critical, because the server does not accept the   * client's options, and vice versa.   */  mysql_options(db, MYSQL_READ_DEFAULT_GROUP, "test2_libmysqld_CLIENT");  if (!mysql_real_connect(db, NULL, NULL, NULL, dbname, 0, NULL, 0))    die(db, "mysql_real_connect failed: %s", mysql_error(db));  return db;}voiddb_disconnect(MYSQL *db){  mysql_close(db);}voiddb_do_query(MYSQL *db, const char *query){  if (mysql_query(db, query) != 0)    goto err;  if (mysql_field_count(db) > 0)  {    MYSQL_RES   *res;    MYSQL_ROW    row, end_row;    int num_fields;    if (!(res = mysql_store_result(db)))      goto err;    num_fields = mysql_num_fields(res);    while ((row = mysql_fetch_row(res)))    {      (void)fputs(">> ", stdout);      for (end_row = row + num_fields; row < end_row; ++row)        (void)printf("%s\t", row ? (char*)*row : "NULL");      (void)fputc('\n', stdout);    }    (void)fputc('\n', stdout);    mysql_free_result(res);  }  else    (void)printf("Affected rows: %lld\n", mysql_affected_rows(db));  return;err:  die(db, "db_do_query failed: %s [%s]", mysql_error(db), query);}

GNUmakefile

# This assumes the MySQL software is installed in /usr/local/mysqlinc      := /usr/local/mysql/include/mysqllib      := /usr/local/mysql/lib# If you have not installed the MySQL software yet, try this instead#inc      := $(HOME)/mysql-5.6/include#lib      := $(HOME)/mysql-5.6/libmysqldCC       := gccCPPFLAGS := -I$(inc) -D_THREAD_SAFE -D_REENTRANTCFLAGS   := -g -W -WallLDFLAGS  := -static# You can change -lmysqld to -lmysqlclient to use the# client/server libraryLDLIBS    = -L$(lib) -lmysqld -lm -ldl -lcryptifneq (,$(shell grep FreeBSD /COPYRIGHT 2>/dev/null))# FreeBSDLDFLAGS += -pthreadelse# Assume LinuxLDLIBS += -lpthreadendif# This works for simple one-file test programssources := $(wildcard *.c)objects := $(patsubst %c,%o,$(sources))targets := $(basename $(sources))all: $(targets)clean:rm -f $(targets) $(objects) *.core