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++)