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