【HTTP图片服务器】【项目记录3】:数据库接口测试

本项目主要分为三部分:
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 算法, 具有三个特性:

  1. 不管源字符串多长, 得到的最终 md5 值都是固定长度
  2. 源字符串稍微变化一点点内容, md5 值会变化很大(降低冲突概率)
  3. 通过原字符串很容易计算得到 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

下一篇:【HTTP图片服务器】【项目记录4】:服务器API设计&封装数据库操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值