267 lines
9.4 KiB
Plaintext
267 lines
9.4 KiB
Plaintext
/*
|
||
文件名: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顺序,int,string,unit,float,binary
|
||
* @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);
|
||
}
|
||
}
|
||
} |