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