C++ 将 Lua userdata 结构数据存入数据库并读取还原
C++ 将 Lua userdata 结构数据存入数据库并读取还原
本文提供 C++ 代码示例,演示如何将 Lua userdata 结构数据存入数据库以及从数据库中读取并还原到 Lua 表中,适合需要在 Lua 和数据库之间进行数据交互的开发者参考。
存入数据库
#include <mysql.h>
#include <lua.hpp>
// 连接数据库
MYSQL* conn = mysql_init(NULL);
mysql_real_connect(conn, "localhost", "root", "password", "database", 0, NULL, 0);
// 准备SQL语句
const char* sql = "INSERT INTO user_data (data) VALUES (?)";
MYSQL_STMT* stmt = mysql_stmt_init(conn);
mysql_stmt_prepare(stmt, sql, strlen(sql));
// 绑定参数
MYSQL_BIND bind;
memset(&bind, 0, sizeof(bind));
bind.buffer_type = MYSQL_TYPE_BLOB;
bind.buffer = (void*)lua_touserdata(L, -1);
bind.buffer_length = lua_rawlen(L, -1);
mysql_stmt_bind_param(stmt, &bind);
// 执行SQL语句
mysql_stmt_execute(stmt);
// 关闭连接
mysql_stmt_close(stmt);
mysql_close(conn);
从数据库中读取
#include <mysql.h>
#include <lua.hpp>
// 连接数据库
MYSQL* conn = mysql_init(NULL);
mysql_real_connect(conn, "localhost", "root", "password", "database", 0, NULL, 0);
// 准备SQL语句
const char* sql = "SELECT data FROM user_data WHERE id = ?";
MYSQL_STMT* stmt = mysql_stmt_init(conn);
mysql_stmt_prepare(stmt, sql, strlen(sql));
// 绑定参数
MYSQL_BIND bind;
memset(&bind, 0, sizeof(bind));
bind.buffer_type = MYSQL_TYPE_LONG;
bind.buffer = (void*)&id;
mysql_stmt_bind_param(stmt, &bind);
// 绑定结果
MYSQL_BIND result;
memset(&result, 0, sizeof(result));
result.buffer_type = MYSQL_TYPE_BLOB;
result.buffer = (void*)buffer;
result.buffer_length = MAX_SIZE;
mysql_stmt_bind_result(stmt, &result);
// 执行SQL语句
mysql_stmt_execute(stmt);
// 获取结果
if (mysql_stmt_fetch(stmt) == 0) {
size_t size = result.length;
void* data = result.buffer;
lua_newuserdata(L, size);
memcpy(lua_touserdata(L, -1), data, size);
}
// 关闭连接
mysql_stmt_close(stmt);
mysql_close(conn);
注意:
- 代码中的
id是数据库中数据的唯一标识符,需要根据实际情况进行调整。 MAX_SIZE是用于存储数据的缓冲区大小,需要根据实际情况进行设置,确保足够大以容纳所有数据。- 代码中使用
mysql_stmt_bind_param和mysql_stmt_bind_result绑定参数和结果,可以提高代码效率和安全性。 - 代码中的
lua_touserdata函数用于在 Lua 中创建新的 userdata 对象。 memcpy函数用于将数据库中读取的数据复制到 Lua userdata 中。
原文地址: https://www.cveoy.top/t/topic/oY9C 著作权归作者所有。请勿转载和采集!