本项目主要分为三部分:
1.数据库模块
2.服务器模块
3.客户端模块及全部功能测试
本文介绍数据库模块部分内容。
1.数据库设计
新建数据库
create database if not exists image_system;
use image_system;
新建表
drop table if exists image_table
create table image_table (image_id int not null primary key auto_increment,
image_name varchar(128),
size bigint,
upload_time varchar(128),
md5 varchar(128),
content_type varchar(128) comment '图片类型',
path varchar(1024) comment '图片所在路径');
什么是 md5?
这是一种常见字符串 hash 算法, 具有三个特性:
- 不管源字符串多长, 得到的最终 md5 值都是固定长度
- 源字符串稍微变化一点点内容, md5 值会变化很大(降低冲突概率)
- 通过原字符串很容易计算得到 md5 值, 但是根据 md5 推导出原字符串很难(几乎不可能)
2.使用 MySQL C API 操作数据库
安装 MySQL C API
yum install mysql-devel
2.1.测试插入数据接口
vim mysql_insert.cc
//mysql_insert.cc
#include <cstdio>
#include <cstdlib>
#include <memory>
#include <mysql/mysql.h>
int main() {
// 1. 初始化句柄
MYSQL* connect_fd = mysql_init(NULL);
// 2. 建立链接
//依次填入mysql_init返回的指针、主机地址、用户名、密码、数据库名、
//端口号、unix_socket、client_flag
if (mysql_real_connect(connect_fd, "127.0.0.1", "root", "12345678",
"image_system", 3306, NULL, 0) == NULL) {
printf("连接失败! %s\n", mysql_error(connect_fd));
return 1;
}
// 3. 设置编码格式
mysql_set_character_set(connect_fd, "utf8");
// 4. 拼装 SQL 语句
char sql[4096] = { 0 };
char image_name[] = "测试.jpg";
int size = 16 * 1024;
char upload_time[] = "2020/11/03";
char md5[] = "123456";
char content_type[] = "jpg";
char path[] = "./测试.jpg";
sprintf(sql, "insert into image_table values(null, '%s', %d, '%s', '%s', '%s', '%s')",
image_name, size, upload_time, md5, content_type, path);
// 5. 执行 SQL 语句
int ret = mysql_query(connect_fd, sql);
if (ret != 0) {
printf("执行 sql 失败! %s\n", mysql_error(connect_fd));
return 1;
}
// 6. 关闭句柄
mysql_close(connect_fd);
printf("执行成功!\n");
return 0;
}
2.2.测试查看数据接口
vim mysql_select.cc
//mysql_select.cc
#include <cstdio>
#include <cstdlib>
#include <mysql/mysql.h>
int main() {
// 1. 初始化句柄
MYSQL* connect_fd = mysql_init(NULL);
// 2. 建立链接
//依次填入mysql_init返回的指针、主机地址、用户名、密码、数据库名、
//端口号、unix_socket、client_flag
if (mysql_real_connect(connect_fd, "127.0.0.1", "root", "12345678",
"image_system", 3306, NULL, 0) == NULL) {
printf("连接失败! %s\n", mysql_error(connect_fd));
return 1;
}
// 3. 设置编码格式
mysql_set_character_set(connect_fd, "utf8");
// 4. 拼装 SQL 语句
char sql[1024 * 4] = { 0 };
sprintf(sql, "select * from image_table");
// 5. 执行 SQL 语句
int ret = mysql_query(connect_fd, sql);
if (ret < 0) {
printf("执行 sql 失败! %s\n", mysql_error(connect_fd));
return 1;
}
// 6. 遍历查询结果
MYSQL_RES* result = mysql_store_result(connect_fd);
if (result == NULL) {
printf("获取结果失败! %s\n", mysql_error(connect_fd));
return 1;
}
// a) 获取行数和列数
int rows = mysql_num_rows(result);
int fields = mysql_num_fields(result);
printf("rows: %d, fields: %d\n", rows, fields);
// b) 打印结果
for (int i = 0; i < rows; ++i) {
MYSQL_ROW row = mysql_fetch_row(result);
for (int j = 0; j < fields; ++j) {
printf("%s\t", row[j]);
}
printf("\n");
}
// 7. 释放结果集
mysql_free_result(result);
// 8. 关闭句柄
mysql_close(connect_fd);
printf("执行成功!\n");
return 0;
}
以上两个文件的 Makefile:
.PHONY:all
all:mysql_select mysql_insert
mysql_insert:mysql_insert.cc
g++ $^ -o $@ -L/usr/lib64/mysql -lmysqlclient
mysql_select:mysql_select.cc
g++ $^ -o $@ -L/usr/lib64/mysql -lmysqlclient
.PHONY:clean
clean:
rm mysql_insert mysql_select