MySQL嵌入式版本的小程序例子
MySQL嵌入式版本的小程序例子
MySQL嵌入式版本越来越式微了。碰巧有个小应用用到了它,顺便记录一下。文档可以参考http://dev.mysql.com/doc/refman/5.6/en/libmysqld-example.html,看起来年久失修的样子,没法一看就懂。
希望下面这个简化的步骤可以起到点作用。
1. 下载代码并且进行版本编译。这个还比较简单,文档说的也很靠谱。
$ cmake . -DCMAKE_INSTALL_PREFIX=/home/mysql -DWITH_EMBEDDED_SERVER=1
$ make clean $ make -j 8
$ make install
2. 写个小程序
$ ls
GNUmakefile main.cc my.cnf
具体代码就看附件好了,其实很简单。
$ make
3. 安装好MySQL,初始化一下
$ cd /home/mysql
$ scripts/mysql_install_db --defaults-file=/home/mysql/my.cnf
4. 启动小程序
$ ./main
附件:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | # This assumes the MySQL software is installed in /usr/local/mysql #inc := /usr/local/mysql/include/mysql #lib := /usr/local/mysql/lib # If you have not installed the MySQL software yet, try this instead topdir := /home/mysql/mysql-5.5.35 inc := $(topdir)/include lib := $(topdir)/libmysqld CXX := g++ CPPFLAGS := -I$(inc) -D_THREAD_SAFE -D_REENTRANT CXXFLAGS := -g -Wall LDFLAGS := # You can change -lmysqld to -lmysqlclient to use the # client/server library LDLIBS = -L$(lib) -lmysqld -lm -lcrypt -ldl -lz -lrt ifneq (,$(shell grep FreeBSD /COPYRIGHT 2>/dev/null)) # FreeBSD LDFLAGS += -pthread else # Assume Linux LDLIBS += -pthread endif # This works for simple one-file test programs sources := $(wildcard *.cc) objects := $(patsubst %cc,%o,$(sources)) targets := $(basename $(sources)) all: $(targets) clean: rm -f $(targets) $(objects) *.core --- #include <mysql.h> #include <iostream> #include <cassert> using namespace std; const char *server_options[] = { "mysql_test", "--defaults-file=my.cnf", NULL }; int num_elements = (sizeof(server_options) / sizeof(char *)) - 1; const char *server_groups[]= { "libmysqld_server", "libmysqld_client", NULL}; bool is_server_started= false; MYSQL *MySQL= NULL; const char *db= NULL; void start_server() { cout << "enter start_server()" << endl; if (mysql_library_init(num_elements, (char **) server_options, (char **) server_groups)) { is_server_started= false; cout << "ERROR: start server failed." << endl; } else { is_server_started= true; cout << "INFO: start server OK." << endl; } } void stop_server() { cout << "enter stop_server()" << endl; mysql_server_end(); } bool connect_server() { cout << "enter connect_server()" << endl; bool rc = true; MySQL = mysql_init(NULL); if (!MySQL) return rc; if (mysql_real_connect(MySQL, NULL, NULL, NULL, db, 0, NULL, 0)) rc = false; MySQL->reconnect= 1; return rc; } void output_rows(MYSQL_RES *res) { MYSQL_ROW row; unsigned long n = 0; while ((row= mysql_fetch_row(res)) != 0) { mysql_field_seek(res, 0); for (unsigned int i= 0 ; i < mysql_num_fields(res); i++) cout << "row[" << n++ << "]:"<< row[i] << endl; } } bool get_dbs() { MYSQL_RES *res; if (!is_server_started) return true; if (!(res= mysql_list_dbs(MySQL, "%"))) return true; output_rows(res); mysql_free_result(res); return false; } int main(int argc, char *argv[]) { start_server(); if (is_server_started) { cout << "server started." << endl; if (!connect_server()) { get_dbs(); } stop_server(); } return 0; } --- [libmysqld_client] [libmysqld_server] basedir=/home/mysql/ datadir=/home/mysql/data tmpdir=/home/mysql/tmp log-error=/home/mysql/alert.log lc_messages_dir=/home/mysql/share innodb_data_home_dir=/home/mysql/data innodb_log_group_home_dir=/home/mysql/data |