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

267 lines
9.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
文件名: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() {
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位有符号整数
local result = blob.readn('i');
Sq_Delete_Point(intSizePoint);
return result;
}
// 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) {
local binary_length_point = Memory.alloc(binary_length);
//MySQL_get_binary
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++) {
//判断是否为空值
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));
} else if (column_type_list[j] == "string") {
row.push(ReadStringColumn(j));
} else if (column_type_list[j] == "uint") {
row.push(ReadUIntColumn(j));
} else if (column_type_list[j] == "float") {
row.push(ReadFloatColumn(j));
} 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() {
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);
}
}
}