DP-S-Script/Dps_A/BaseClass/MysqlClass/MysqlClass.nut

267 lines
9.4 KiB
Plaintext
Raw Normal View History

/*
文件名:MysqlClass.nut
路径:Dps_A/BaseClass/MysqlClass/MysqlClass.nut
创建日期:2024-09-16 21:23
文件用途:数据库类
*/
class Mysql extends Base_C_Object {
// 0空闲 1任务中 2死亡
State = 0;
constructor(Ip, Port, Name, Account, Password) {
if (!Open(Ip, Port, Name, Account, Password)) error("数据库连接失败");
}
/*
* 读取mysql返回的数据读取binary类型的字段
* @param this.C_Object mysql数据库句柄
* @param columnIndex 要读取的字段的位置
*/
function Open(db_ip, db_port, db_name, db_username, db_password) {
base.constructor(Sq_New_Point(0x80000));
Sq_CallFunc(S_Ptr("0x83F3AC8"), "pointer", ["pointer"], this.C_Object);
Sq_CallFunc(S_Ptr("0x83F3CE4"), "int", ["pointer"], this.C_Object);
//打开数据库句柄
if (Sq_CallFunc(S_Ptr("0x83F4024"), "int", ["pointer", "pointer", "int", "pointer", "pointer", "pointer"],
this.C_Object, db_ip, db_port, db_name, db_username, db_password)) {
return true;
}
return false;
}
function Fetch() {
2024-10-05 11:47:12 +08:00
return Sq_CallFunc(S_Ptr("0x83F44BC"), "int", ["pointer"], this.C_Object);
}
function Close() {
Sq_CallFunc(S_Ptr("0x83F3E74"), "int", ["pointer"], this.C_Object);
Sq_Delete_Point(this.C_Object);
State = 2;
}
/*
* 读取mysql返回的数据读取string类型的字段
* @param this.C_Object mysql数据库句柄
* @param columnIndex 要读取的字段的位置
*/
function ReadStringColumn(columnIndex) {
//MySQL_get_binary_length
local binary_length = Sq_CallFunc(S_Ptr("0x81253DE"), "int", ["pointer", "int"], this.C_Object, columnIndex);
local binary_length_point = Sq_New_Point(binary_length);
//MySQL_get_binary
if (1 == Sq_CallFunc(S_Ptr("0x812531A"), "int", ["pointer", "int", "pointer", "int"], this.C_Object, columnIndex, binary_length_point, binary_length)) {
//读取string类型的数据
local result = Sq_ReadAddressString(binary_length_point, binary_length);
Sq_Delete_Point(binary_length_point);
return result;
}
Sq_Delete_Point(binary_length_point);
return null;
}
/*
* 读取mysql返回的数据读取有符号int类型的字段
* @param this.C_Object mysql数据库句柄
* @param columnIndex 要读取的字段的位置
*/
function ReadIntColumn(columnIndex) {
local intSizePoint = Sq_New_Point(4);
//MySQL_get_int
if (1 == Sq_CallFunc(S_Ptr("0x811692C"), "int", ["pointer", "int", "pointer"], this.C_Object, columnIndex, intSizePoint)) {
//转为blob
local blob = Sq_Point2Blob(intSizePoint, 4);
//读取8位有符号整数
2024-10-06 16:22:53 +08:00
local result = blob.readn('i');
Sq_Delete_Point(intSizePoint);
return result;
}
2024-10-05 11:47:12 +08:00
// Sq_Delete_Point(intSizePoint);
return null;
}
/*
* 读取mysql返回的数据读取无符号int类型的字段
* @param this.C_Object mysql数据库句柄
* @param columnIndex 要读取的字段的位置
*/
function ReadUIntColumn(columnIndex) {
local intSizePoint = Sq_New_Point(4);
//MySQL_get_uint
if (1 == Sq_CallFunc(S_Ptr("0x80E22F2"), "int", ["pointer", "int", "pointer"], this.C_Object, columnIndex, intSizePoint)) {
//转为blob
local blob = Sq_Point2Blob(intSizePoint, 4);
//读取8位无符号整数
local result = blob.readn('b');
Sq_Delete_Point(intSizePoint);
return result;
}
Sq_Delete_Point(intSizePoint);
return null;
}
/*
* 读取mysql返回的数据读取float类型的字段
* @param this.C_Object mysql数据库句柄
* @param columnIndex 要读取的字段的位置
*/
function ReadFloatColumn(columnIndex) {
local intSizePoint = Sq_New_Point(4);
//MySQL_get_float
if (1 == Sq_CallFunc(S_Ptr("0x844D6D0"), "int", ["pointer", "int", "pointer"], this.C_Object, columnIndex, intSizePoint)) {
//转为blob
local blob = Sq_Point2Blob(intSizePoint, 4);
//读取32位浮点数
local result = blob.readn('f');
Sq_Delete_Point(intSizePoint);
return result;
}
Sq_Delete_Point(intSizePoint);
return null;
}
/*
* 读取mysql返回的数据读取binary类型的字段
* @param this.C_Object mysql数据库句柄
* @param columnIndex 要读取的字段的位置
*/
function ReadBinaryColumn(columnIndex) {
//MySQL_get_binary_length
local binary_length = Sq_CallFunc(S_Ptr("0x81253DE"), "int", ["pointer", "int"], this.C_Object, columnIndex);
if (binary_length > 0) {
2024-10-05 11:47:12 +08:00
local binary_length_point = Memory.alloc(binary_length);
//MySQL_get_binary
2024-10-05 11:47:12 +08:00
if (1 == Sq_CallFunc(S_Ptr("0x812531A"), "int", ["pointer", "int", "pointer", "int"], this.C_Object, columnIndex, binary_length_point.C_Object, binary_length)) {
return binary_length_point;
}
}
return null;
}
/**
* mysql查询带返回结果返回一个二维数组
* @param {*} db_pointer 数据库句柄
* @param {*} select_sql 要执行的查询语句
* @param {*} column_type_list 返回结果的类型list按select的column顺序intstringunitfloatbinary
* @returns
*/
function Select(select_sql, column_type_list) {
local result_list = [];
if (Exec_Sql(select_sql)) {
//获取查询到的数据总数
local row_count = Sq_CallFunc(S_Ptr("0x80E236C"), "int", ["pointer"], this.C_Object);
if (row_count > 0) {
for (local i = 0; i< row_count; i++) {
Fetch();
local row = [];
for (local j = 0; j< column_type_list.len(); j++) {
2024-10-05 11:47:12 +08:00
//判断是否为空值
if (!Sq_CallFunc(S_Ptr("0x85F41B2"), "bool", ["pointer", "int"], this.C_Object, j)) {
row.push(null);
} else if (column_type_list[j] == "int") {
row.push(ReadIntColumn(j));
2024-10-05 11:47:12 +08:00
} else if (column_type_list[j] == "string") {
row.push(ReadStringColumn(j));
2024-10-05 11:47:12 +08:00
} else if (column_type_list[j] == "uint") {
row.push(ReadUIntColumn(j));
2024-10-05 11:47:12 +08:00
} else if (column_type_list[j] == "float") {
row.push(ReadFloatColumn(j));
2024-10-05 11:47:12 +08:00
} else if (column_type_list[j] == "binary") {
row.push(ReadBinaryColumn(j));
}
}
result_list.push(row);
}
}
}
return result_list;
}
//执行查询返回执行是否成功
function Exec_Sql(sql) {
local sql_ptr = Str_Ptr(sql);
//set query
local set_query = Sq_CallFunc(S_Ptr("0x83F41C0"), "int", ["pointer", "pointer"], this.C_Object, sql_ptr);
//执行sql
local sql_exec_result = Sq_CallFunc(S_Ptr("0x83F4326"), "int", ["pointer", "int"], this.C_Object, 1);
return sql_exec_result;
}
//获取服务端版本
function GetServerVersion() {
return Sq_CallFunc(S_Ptr("0x83F460C"), "int", ["pointer"], this.C_Object);
}
//获取客户端版本
function GetClientVersion() {
return Sq_CallFunc(S_Ptr("0x83F4622"), "int", ["pointer"], this.C_Object);
}
}
class MysqlPool {
// 用于存储数据库的 IP 地址
db_ip = null;
// 用于存储数据库的端口号
db_port = null;
// 用于存储数据库的名称
db_name = null;
// 用于存储数据库的用户名
db_username = null;
// 用于存储数据库的密码
db_password = null;
//连接池大小
PoolSize = 10;
//连接编码
Charset = "latin1";
//连接池
PoolList = null;
constructor() {
PoolList = [];
getroottable()._MysqlPoolObject <- this;
}
function GetInstance() {
2024-10-02 21:00:21 +08:00
if (!(getroottable().rawin("_MysqlPoolObject"))) MysqlPool();
// MysqlPool();
return getroottable()._MysqlPoolObject;
}
//设置基础配置
function SetBaseConfiguration(Ip, Port, Account, Password) {
db_ip = Str_Ptr(Ip);
db_port = Port;
db_name = Str_Ptr("taiwan_cain");
db_username = Str_Ptr(Account);
db_password = Str_Ptr(Password);
}
//初始化连接池
function Init() {
for (local i = 0; i< PoolSize; i++) {
local Buffer = Mysql(db_ip, db_port, db_name, db_username, db_password);
Buffer.Exec_Sql(format("SET NAMES %s", Charset));
PoolList.append(Buffer);
// print("创建了一条连接,编号: " + i + ",地址: " + Buffer + ", 指针地址: " + Buffer.C_Object);
}
}
function GetConnect() {
local _Connect = PoolList.pop();
if (_Connect.State == 0) {
_Connect.State = 1;
return _Connect;
}
}
function PutConnect(_Connect) {
if (_Connect.State == 1) {
_Connect.State = 0;
PoolList.append(_Connect);
}
}
}