Chinaunix首页 | 论坛 | 博客
  • 博客访问: 320323
  • 博文数量: 43
  • 博客积分: 1044
  • 博客等级: 准尉
  • 技术积分: 658
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-20 14:56
个人简介

人法地,地法天,天法道,道法自然。

文章分类

全部博文(43)

文章存档

2019年(1)

2013年(3)

2012年(15)

2011年(24)

分类: Mysql/postgreSQL

2011-11-22 17:33:57

mysql api的简单例子。这个里面没有包括查询的API,因为mysql有两套查询api。
  1. /**********************************************************************************
  2.   * File name:mysql_api_examples.c
  3.   * Description:mysql api examples
  4.   * Author:Wales.guo
  5.   * Date:2011-11-22
  6.   * Revision History:
  7. ***********************************************************************************/
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include <string.h>

  11. #include <mysql.h>

  12. int main(int argc,char *argv[])
  13. {
  14.     MYSQL *mysql = NULL;
  15.     unsigned long client_flag = CLIENT_COMPRESS | CLIENT_SSL;

  16.     unsigned long client_version = 0;
  17.     unsigned long server_version = 0;
  18.     char *server_stat = NULL;

  19.     int ret = EXIT_SUCCESS;

  20.     client_version = mysql_get_client_version();
  21.     if(client_version < 50100) {
  22.         fprintf(stderr, "mysql client library version is too low.\n");
  23.         ret = EXIT_FAILURE;
  24.         goto END;
  25.     }

  26. #ifdef MYSQL_EMBEDDED
  27.     /*
  28.        * 英文文档里面写的是mysql_library_init
  29.        * 中文文档里面写的是mysql_server_init
  30.        * 最终发现这个:
  31.        *
  32.        * mysql_library_init()和mysql_library_end()实际上
  33.        * 是#define符号,这类符号使得它们
  34.        * 等效于mysql_server_init()和mysql_server_end()
  35.        * 但其名称更清楚地指明,无论应
  36.        * 用程序使用的是mysqlclient或mysqld库,
  37.        * 启动或结束MySQL库时,应调用它们。
  38.        * 对于早期的MySQL版本,可调用
  39.        * mysql_server_init()和mysql_server_end()取而代之。
  40.        */
  41.     ret = mysql_server_init(0, NULL, NULL);
  42.     if (ret != 0) {
  43.       fprintf(stderr, "could not initialize MySQL library\n");
  44.       ret = EXIT_FAILURE;
  45.       goto END;
  46.     }
  47. #endif
  48.     mysql = mysql_init(NULL);
  49.     if (mysql == NULL) {
  50.         fprintf(stderr, "could not initialize MySQL\n");
  51.         ret = EXIT_FAILURE;
  52.         goto EMBEDDED_END;
  53.     }

  54.     ret = mysql_ssl_set(mysql, NULL, NULL, NULL, NULL, NULL);
  55.     if (ret != 0) {
  56.         printf("call mysql_ssl_set error.error = %s\n",mysql_error(pMySQL));
  57.         ret = EXIT_FAILURE;
  58.         goto EMBEDDED_END;
  59.     }

  60.     if (mysql_real_connect(mysql, "host", "user", "passwd", "mysql", port, NULL, client_flag)) {
  61.          fprintf(stderr, "failed to connect to database: Error: %s\n", mysql_error(mysql));
  62.          ret = EXIT_FAILURE;
  63.          goto MYSQL_END;
  64.     }

  65. #ifdef MYSQL_EMBEDDED
  66.     mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "libmysqld_client");
  67.     mysql_options(mysql, MYSQL_OPT_USE_EMBEDDED_CONNECTION, NULL);
  68. #endif

  69.     ret = mysql_set_character_set(mysql, "utf8");
  70.     if (ret != 0) {
  71.         fprintf(stderr, "could not set character set. Error: %s\n",mysql_error(mysql));
  72.         ret = EXIT_FAILURE;
  73.         goto MYSQL_END;
  74.     }

  75.     mysql_set_server_option(mysql, MYSQL_OPTION_MULTI_STATEMENTS_ON);

  76.     ret = mysql_change_user(mysql, "root", "root123", NULL);
  77.     if (ret != 0) {
  78.        fprintf(stderr, "failed to change user. Error: %s\n", mysql_error(mysql));
  79.        ret = EXIT_FAILURE;
  80.        goto MYSQL_END;
  81.     }

  82.     server_version = mysql_get_server_version(mysql);
  83.     if (server_version < 50100) {
  84.         fprintf(stderr, "mysql server version is too low.\n");
  85.         ret = EXIT_FAILURE;
  86.         goto MYSQL_END;
  87.     }

  88.     ret = mysql_create_db(mysql, "my_database");
  89.     if (ret != 0) {
  90.        fprintf(stderr, "failed to create new database. Error: %s\n", mysql_error(mysql));
  91.        ret = EXIT_FAILURE;
  92.        goto MYSQL_END;
  93.     }

  94.     ret = mysql_select_db(mysql, "my_database");
  95.     if (ret != 0) {
  96.        fprintf(stderr, "failed to select database. Error: %s\n", mysql_error(mysql));
  97.        ret = EXIT_FAILURE;
  98.        goto DROP_DB_END;
  99.     }

  100.     ret = mysql_autocommit(mysql, 0);
  101.     if (ret != 0) {
  102.         fprintf(stderr, "failed to select database. Error: %s\n", mysql_error(mysql));
  103.         ret = EXIT_FAILURE;
  104.         goto DROP_DB_END;
  105.     }
  106.     /*
  107.       * 这里调用查询API,但是这里有两套API可以调用
  108.       * 下一遍介绍中会看到: 普通查询API和预处理API
  109.       */
  110.     ret = mysql_commit(mysql);
  111.     if (ret != 0) {
  112.         fprintf(stderr, "failed to commit. Error: %s\n", mysql_error(mysql));
  113.         ret = EXIT_FAILURE;
  114.         goto ROLL_BACK_END;
  115.     }

  116.     server_stat = mysql_stat(mysql);
  117.     if (server_stat != NULL) {
  118.         printf("%s",server_stat);
  119.     } else {
  120.         printf("%s","cannot get mysql server status. Error: %s\n", mysql_error(mysql));
  121.     }
  122.     goto DROP_DB_END;

  123. ROLL_BACK_END:
  124.      ret = mysql_rollback(mysql);
  125.      if (ret != 0) {
  126.         fprintf(stderr, "failed to roll back. Error: %s\n", mysql_error(mysql));
  127.         ret = EXIT_FAILURE;
  128.      }

  129. DROP_DB_END:
  130.     ret = mysql_drop_db(mysql, "my_database");
  131.     if (ret != 0) {
  132.        fprintf(stderr, "failed to select database. Error: %s\n", mysql_error(mysql));
  133.        ret = EXIT_FAILURE;
  134.        goto MYSQL_END;
  135.     }

  136. MYSQL_END:
  137.     if (mysql != NULL) {
  138.         mysql_close(mysql);
  139.         mysql = NULL;
  140.     }

  141. EMBEDDED_END:
  142. #ifdef MYSQL_EMBEDDED
  143.     mysql_server_end();
  144. #endif

  145. END:
  146.     return ret;
  147. }
以上代码在linux下使用:
  1. gcc mysql_api_examples.c -DMYSQL_EMBEDDED -o test1_libmysqld -lz \
  2. `/usr/local/mysql/bin/mysql_config --include --libmysqld-libs`
进行编译。

这里简单的组织出mysql api中非查询所用的函数,以及他们的调用顺序。一下简要介绍函数:
---------------------------------------------------------------------------------------------
  1. int mysql_library_init(int argc, char **argv, char **groups);
  2. void mysql_library_end(void);
像sqlite,leveldb一样,mysql所支持的内嵌式数据库的两个函数。
参照:http://dev.mysql.com/doc/refman/5.1/en/libmysqld.html
---------------------------------------------------------------------------------------------
  1. MYSQL *mysql_init(MYSQL *mysql);
  2. void mysql_close(MYSQL *mysql);
mysql库的初始化函数
参照:http://dev.mysql.com/doc/refman/5.1/zh/apis.html#mysql-init
---------------------------------------------------------------------------------------------
  1. int mysql_ssl_set(MYSQL *mysql, const char *key, const char *cert, const char *ca, const char *capath, const char *cipher);
使用mysql_ssl_set(),可采用SSL建立安全连接。必须在mysql_real_connect()之前调用它。
除非在客户端库中允许了OpenSSL支持,否则mysql_ssl_set()不作任何事。
参照:http://dev.mysql.com/doc/refman/5.1/zh/apis.html#mysql-ssl-set
---------------------------------------------------------------------------------------------
  1. MYSQL *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 long client_flag)
连接mysql数据库。mysql_connect处于废弃状态,建议不要使用。
参照:http://dev.mysql.com/doc/refman/5.1/zh/apis.html#mysql-real-connect
---------------------------------------------------------------------------------------------
  1. int mysql_options(MYSQL *mysql, enum mysql_option option, const void *arg)
参照:http://dev.mysql.com/doc/refman/5.1/en/mysql-options.html
---------------------------------------------------------------------------------------------
  1. int mysql_set_character_set(MYSQL *mysql, char *csname);
设置该连接的字符集。
参照:http://dev.mysql.com/doc/refman/5.1/zh/apis.html#mysql-set-character-set
另:和字符集相关的函数还有:
  1. const char *mysql_character_set_name(MYSQL *mysql);
为当前连接返回默认的字符集。
  1. void mysql_get_character_set_info(MYSQL *mysql, MY_CHARSET_INFO *cs)
该函数提供了关于默认客户端字符集的信息。
  1. int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)
设置关于字符集的参数:MYSQL_SET_CHARSET_DIR和MYSQL_SET_CHARSET_NAME
  1. unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, unsigned long length)
该函数用于创建可在SQL语句中使用的合法SQL字符串。
---------------------------------------------------------------------------------------------
  1. unsigned long mysql_get_client_version(void)
返回表示客户端库版本的整数。该值的格式是XYYZZ,其中X是主版本号,YY是发布级别,ZZ是发布级别内的版本号。例如,值40102表示客户端库的版本是4.1.2。
参照:http://dev.mysql.com/doc/refman/5.1/zh/apis.html#mysql-get-client-version
  1. char *mysql_get_server_info(MYSQL *mysql)
返回代表服务器版本号的字符串。
参照:http://dev.mysql.com/doc/refman/5.1/zh/apis.html#mysql-get-server-info
---------------------------------------------------------------------------------------------
  1. my_bool mysql_change_user(MYSQL *mysql, const char *user, const char *password, const char *db)
更改用户,并使由db指定的数据库成为由mysql指定的连接上的默认数据库(当前数据库)。
参照:http://dev.mysql.com/doc/refman/5.1/zh/apis.html#mysql-get-server-info
---------------------------------------------------------------------------------------------
  1. int mysql_create_db(MYSQL *mysql, const char *db)
创建由db参数命名的数据库。该函数已过时。最好使用mysql_query()来发出SQL CREATE DATABASE语句。
参照:http://dev.mysql.com/doc/refman/5.1/zh/apis.html#mysql-get-server-info
  1. int mysql_drop_db(MYSQL *mysql, const char *db)
撤销由db参数命名数据库。该函数已过时。最好使用mysql_query()来发出SQL DROP DATABASE语句
参照:http://dev.mysql.com/doc/refman/5.1/zh/apis.html#mysql-drop-db
  1. int mysql_select_db(MYSQL *mysql, const char *db)
使由db指定的数据库成为由mysql指定的连接上的默认数据库(当前数据库)。
参照:http://dev.mysql.com/doc/refman/5.1/zh/apis.html#mysql-select-db
---------------------------------------------------------------------------------------------
  1. my_bool mysql_autocommit(MYSQL *mysql, my_bool mode)
  2. my_bool mysql_commit(MYSQL *mysql)
  3. my_bool mysql_rollback(MYSQL *mysql)
实务操作的三个函数。
参照:http://dev.mysql.com/doc/refman/5.1/zh/apis.html#mysql-rollbac
阅读(2262) | 评论(0) | 转发(0) |
0

上一篇:MYSQL系统信息相关

下一篇:mysql查詢api

给主人留下些什么吧!~~