| 
									
										
										
										
											2024-09-20 19:24:32 +08:00
										 |  |  |  | /* | 
					
						
							|  |  |  |  | 文件名: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); | 
					
						
							| 
									
										
										
										
											2024-09-20 19:24:32 +08:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     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'); | 
					
						
							| 
									
										
										
										
											2024-09-20 19:24:32 +08:00
										 |  |  |  |             Sq_Delete_Point(intSizePoint); | 
					
						
							|  |  |  |  |             return result; | 
					
						
							|  |  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-10-05 11:47:12 +08:00
										 |  |  |  |         // Sq_Delete_Point(intSizePoint); | 
					
						
							| 
									
										
										
										
											2024-09-20 19:24:32 +08:00
										 |  |  |  |         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); | 
					
						
							| 
									
										
										
										
											2024-09-20 19:24:32 +08:00
										 |  |  |  |             //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; | 
					
						
							| 
									
										
										
										
											2024-09-20 19:24:32 +08:00
										 |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |         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++) { | 
					
						
							| 
									
										
										
										
											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") { | 
					
						
							| 
									
										
										
										
											2024-09-20 19:24:32 +08:00
										 |  |  |  |                             row.push(ReadIntColumn(j)); | 
					
						
							| 
									
										
										
										
											2024-10-05 11:47:12 +08:00
										 |  |  |  |                         } else if (column_type_list[j] == "string") { | 
					
						
							| 
									
										
										
										
											2024-09-20 19:24:32 +08:00
										 |  |  |  |                             row.push(ReadStringColumn(j)); | 
					
						
							| 
									
										
										
										
											2024-10-05 11:47:12 +08:00
										 |  |  |  |                         } else if (column_type_list[j] == "uint") { | 
					
						
							| 
									
										
										
										
											2024-09-20 19:24:32 +08:00
										 |  |  |  |                             row.push(ReadUIntColumn(j)); | 
					
						
							| 
									
										
										
										
											2024-10-05 11:47:12 +08:00
										 |  |  |  |                         } else if (column_type_list[j] == "float") { | 
					
						
							| 
									
										
										
										
											2024-09-20 19:24:32 +08:00
										 |  |  |  |                             row.push(ReadFloatColumn(j)); | 
					
						
							| 
									
										
										
										
											2024-10-05 11:47:12 +08:00
										 |  |  |  |                         } else if (column_type_list[j] == "binary") { | 
					
						
							| 
									
										
										
										
											2024-09-20 19:24:32 +08:00
										 |  |  |  |                             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; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-05 22:03:40 +08:00
										 |  |  |  |     //是否已经初始化 | 
					
						
							|  |  |  |  |     IsInit = false; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-20 19:24:32 +08:00
										 |  |  |  |     constructor() { | 
					
						
							|  |  |  |  |         PoolList = []; | 
					
						
							|  |  |  |  |         getroottable()._MysqlPoolObject <- this; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     function GetInstance() { | 
					
						
							| 
									
										
										
										
											2024-10-02 21:00:21 +08:00
										 |  |  |  |         if (!(getroottable().rawin("_MysqlPoolObject"))) MysqlPool(); | 
					
						
							|  |  |  |  |         // MysqlPool(); | 
					
						
							| 
									
										
										
										
											2024-09-20 19:24:32 +08:00
										 |  |  |  |         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() { | 
					
						
							| 
									
										
										
										
											2025-04-05 22:03:40 +08:00
										 |  |  |  |         if(IsInit)return; | 
					
						
							| 
									
										
										
										
											2024-09-20 19:24:32 +08:00
										 |  |  |  |         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); | 
					
						
							|  |  |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-04-05 22:03:40 +08:00
										 |  |  |  |         IsInit = true; | 
					
						
							| 
									
										
										
										
											2024-09-20 19:24:32 +08:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     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); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | } |