天佐.乾坤袋 基于抽屉式文件存储的NoSql数据库
天佐.乾坤袋

天佐.乾坤袋
简介

天佐.乾坤袋 基于抽屉式文件存储的NoSql数据库,可用于文件打包,数据整合,加密存放等多种用途。可以方便快捷的搭建和部署存储应用的系统。
传说:
弥勒所有,专做储物之用。拥有不可思议之力,内部有著奇异之空间,空间之大似能将天地收纳于内。袋中另有乾坤,应有尽有,取之不尽。
目标
构建一种使用简单接口调用就可以完成数据管理的NoSql数据库。

功能
- 🧩 集成简单
- 📦 存放文件可自由选择压缩
- 🪢 数据经过256位AES算法加密
- 📒 支持数据批量增加/删除/修改/查询
- 📃 支持直接获取原始数据流
截图
天佐.乾坤袋测试程序:

例子
cpp#include <iostream>
#include <memory>
#include "tianzuo.QiankunInterface.h" // 接口头文件 interface heaher fileint main() {// 准备数据 prepare dataQiankun_db_verify_struct db_verify("qiankunDataBase.Ztz", "password");int integer = 12345678;Qiankun_data_type_struct data_type(Qiankun_data_type_integer, -1, "integer");Qiankun_user_data_struct user_data(&integer, 0);int data_size = 0;Qiankun_get_user_data_struct get_user_data(reinterpret_cast<void*&>(integer), &data_size);// 初始化接口 initialize the interfacestd::unique_ptr<tianzuo_QiankunInterface> qiankun_interface(new tianzuo_QiankunInterface());// 创建实例 create an instancetianzuo_QiankunInt* qiankun = qiankun_interface->initialize();// 初始化实例 initialize the instanceint error_code = qiankun->initialize();if (error_code != Qiankun_errorcode_success) {std::cout << "initialize error: " << error_code;goto return_error;return -1;}// 创建数据库 create databaseerror_code = qiankun->db_create_database(&db_verify, "qiankunDataBase", true);if (error_code != Qiankun_errorcode_success) {std::cout << "db_create_database error: " << error_code;goto return_error;return -1;}// 打开数据库 open databaseerror_code = qiankun->db_open_database(&db_verify);if (error_code != Qiankun_errorcode_success) {std::cout << "db_open_database error: " << error_code;goto return_error;return -1;}// 向数据库写入一个整型数据 writes an integer to the databaseerror_code = qiankun->data_combine(&db_verify, &data_type, nullptr, &user_data, false, -1);if (error_code != Qiankun_errorcode_success) {std::cout << "data_combine error: " << error_code;goto return_error;return -1;}// 读取刚写入的数据 read the data just writteninteger = -1;error_code = qiankun->data_extract(&db_verify, &data_type, nullptr, &get_user_data);if (error_code != Qiankun_errorcode_success) {std::cout << "data_extract error: " << error_code;goto return_error;return -1;}std::cout << "get integer data: " << integer;// 关闭数据库 close databaseerror_code = qiankun->db_close_database(&db_verify);if (error_code != Qiankun_errorcode_success) {std::cout << "db_close_database error: " << error_code;goto return_error;return -1;}return_error:// 释放接口 terminate the interfaceif (qiankun_interface != nullptr && qiankun != nullptr) {qiankun_interface->terminate(&qiankun);}std::cout << "test done -------------------";return 0;
}
python
from ctypes import *
from enum import Enum
import ctypestianzuo_QiankunLib = cdll.LoadLibrary('./tianzuo.Qiankun.dll')class Qiankun_error_code(Enum):Qiankun_errorcode_success = 1 # 正确的值Qiankun_errorcode_normal = 2 # 错误的值Qiankun_errorcode_differ = 3 # 数据库文件数效验未通过 (The number of database files fails to be verified)Qiankun_errorcode_no_rights = 4 # 数据库密码效验未通过 (The database password verification failed)Qiankun_errorcode_db_not_exist = 5 # 数据库文件不存在 (The database file does not exist)Qiankun_errorcode_exist = 6 # 数据已存在 (Data already exists)Qiankun_errorcode_not_exist = 7 # 数据不存在 (Data does not exist)Qiankun_errorcode_out_of_range = 8 # 超出范围 (out of range)Qiankun_errorcode_type = 9 # 类型不符 (wrong type)Qiankun_errorcode_param = 10 # 参数错误 (parameter error)Qiankun_errorcode_compress = 11 # 压缩错误 (compression error)Qiankun_errorcode_get_array = 12 # 数组错误 (arrary error)Qiankun_errorcode_out_of_memory = 13 # 内存溢出 (memory overflow)Qiankun_errorcode_handle = 14 # 句柄错误 (error handle)Qiankun_errorcode_io = 15 # IO错误 (io error)class tianzuo_QiankunInt:def __init__(self):tianzuo_QiankunLib.tianzuo_QiankunInterface_initialize.restype = c_void_pself.obj = tianzuo_QiankunLib.tianzuo_QiankunInterface_initialize()def __del__(self):tianzuo_QiankunLib.tianzuo_QiankunInterface_terminate.argtypes = [c_void_p]tianzuo_QiankunLib.tianzuo_QiankunInterface_terminate(self.obj)def initialize(self):tianzuo_QiankunLib.tianzuo_QiankunInterface_initialize.restype = c_inttianzuo_QiankunLib.tianzuo_QiankunInt_initialize.argtypes = [c_void_p]return tianzuo_QiankunLib.tianzuo_QiankunInt_initialize(self.obj)def db_create_database(self, db_file_name, db_password, db_name, over_write):tianzuo_QiankunLib.tianzuo_QiankunInt_db_create_database.argtypes = [c_void_p, c_char_p, c_char_p, c_char_p, c_int]return tianzuo_QiankunLib.tianzuo_QiankunInt_db_create_database(self.obj, db_file_name, db_password, db_name, over_write)def db_open_database(self, db_file_name, db_password):tianzuo_QiankunLib.tianzuo_QiankunInt_db_open_database.argtypes = [c_void_p, c_char_p, c_char_p]return tianzuo_QiankunLib.tianzuo_QiankunInt_db_open_database(self.obj, db_file_name, db_password)def db_close_database(self, db_file_name, db_password):tianzuo_QiankunLib.tianzuo_QiankunInt_db_close_database.argtypes = [c_void_p, c_char_p, c_char_p]return tianzuo_QiankunLib.tianzuo_QiankunInt_db_close_database(self.obj, db_file_name, db_password)def data_int_combine(self, db_file_name, db_password, data_name, remark, data):tianzuo_QiankunLib.tianzuo_QiankunInt_data_int_combine.argtypes = [c_void_p, c_char_p, c_char_p, c_char_p, c_char_p, c_int]return tianzuo_QiankunLib.tianzuo_QiankunInt_data_int_combine(self.obj, db_file_name, db_password, data_name, remark, data)def data_int_extract(self, db_file_name, db_password, data_name, data):tianzuo_QiankunLib.tianzuo_QiankunInt_data_int_extract.argtypes = [c_void_p, c_char_p, c_char_p, c_char_p, ctypes.POINTER(ctypes.c_int)]return tianzuo_QiankunLib.tianzuo_QiankunInt_data_int_extract(self.obj, db_file_name, db_password, data_name, data)def main():# 初始化接口 initialize the interfaceprint("initialize the interface")# 创建实例 create an instanceqiankun = tianzuo_QiankunInt()error_code = qiankun.initialize()if error_code != Qiankun_error_code.Qiankun_errorcode_success.value:print("initialize error:", error_code)return# 创建数据库 create databasedb_file_name = b"qiankunDataBase.Ztz"db_password = b"password"error_code = qiankun.db_create_database(db_file_name, db_password, b"qiankunDataBase", True)if error_code != Qiankun_error_code.Qiankun_errorcode_success.value:print("db_create_database error:", error_code)return# 打开数据库 open databaseerror_code = qiankun.db_open_database(db_file_name, db_password)if error_code != Qiankun_error_code.Qiankun_errorcode_success.value:print("db_open_database error:", error_code)return# 向数据库写入一个整型数据 writes an integer to the databaseintInt = 12345678error_code = qiankun.data_int_combine(db_file_name, db_password, b"integer", None, intInt)if error_code != Qiankun_error_code.Qiankun_errorcode_success.value:print("data_combine error:", error_code)return# 读取刚写入的数据 read the data just writtenreturn_data = ctypes.c_int()error_code = qiankun.data_int_extract(db_file_name, db_password, b"integer", ctypes.byref(return_data))if error_code != Qiankun_error_code.Qiankun_errorcode_success.value:print("data_extract error:", error_code)returninteger = return_data.valueprint("get integer data: {}".format(integer))# 关闭数据库 close databaseerror_code = qiankun.db_close_database(db_file_name, db_password)if error_code != Qiankun_error_code.Qiankun_errorcode_success.value:print("db_close_database error:", error_code)returnprint("test done -------------------")if __name__ == '__main__':main() java
package cn.camelsoft;import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;enum Qiankun_error_code {Qiankun_errorcode_success (0x00000001), ///< 正确的值Qiankun_errorcode_normal (0x00000002), ///< 错误的值Qiankun_errorcode_differ (0x00000003), ///< 数据库文件数效验未通过 (The number of database files fails to be verified)Qiankun_errorcode_no_rights (0x00000004), ///< 数据库密码效验未通过 (The database password verification failed)Qiankun_errorcode_db_not_exist (0x00000005), ///< 数据库文件不存在 (The database file does not exist)Qiankun_errorcode_exist (0x00000006), ///< 数据已存在 (Data already exists)Qiankun_errorcode_not_exist (0x00000007), ///< 数据不存在 (Data does not exist)Qiankun_errorcode_out_of_range (0x00000008), ///< 超出范围 (out of range)Qiankun_errorcode_type (0x00000009), ///< 类型不符 (wrong type)Qiankun_errorcode_param (0x0000000A), ///< 参数错误 (parameter error)Qiankun_errorcode_compress (0x0000000B), ///< 压缩错误 (compression error)Qiankun_errorcode_get_array (0x0000000C), ///< 数组错误 (arrary error)Qiankun_errorcode_out_of_memory (0x0000000D), ///< 内存溢出 (memory overflow)Qiankun_errorcode_handle (0x0000000E), ///< 句柄错误 (error handle)Qiankun_errorcode_io (0x0000000F); ///< IO错误 (io error)private int value;Qiankun_error_code(int value) {this.value = value;}public int getValue() {return value;}
}public class Main {public interface tianzuo_QiankunLib extends Library {tianzuo_QiankunLib instance = (tianzuo_QiankunLib) Native.load("./tianzuo.Qiankun.dll", tianzuo_QiankunLib.class);Pointer tianzuo_QiankunInterface_initialize();void tianzuo_QiankunInterface_terminate(Pointer qiankun);int tianzuo_QiankunInt_initialize(Pointer qiankun);int tianzuo_QiankunInt_db_create_database(Pointer qiankun, String db_file_name, String db_password, String db_name, Boolean over_write);int tianzuo_QiankunInt_db_open_database(Pointer qiankun, String db_file_name, String db_password);int tianzuo_QiankunInt_db_close_database(Pointer qiankun, String db_file_name, String db_password);int tianzuo_QiankunInt_data_int_combine(Pointer qiankun, String db_file_name, String db_password, String data_name, String remark, int data);int tianzuo_QiankunInt_data_int_extract(Pointer qiankun, String db_file_name, String db_password, String data_name, int[] data);}public static void main(String[] args) {System.setProperty("jna.encoding","UTF-8");// 初始化接口 initialize the interfaceSystem.out.printf("initialize the interface\n");// 创建实例 create an instancePointer qiankun = tianzuo_QiankunLib.instance.tianzuo_QiankunInterface_initialize();int error_code = tianzuo_QiankunLib.instance.tianzuo_QiankunInt_initialize(qiankun);if (error_code != Qiankun_error_code.Qiankun_errorcode_success.getValue()) {System.out.printf("tianzuo_QiankunInt_initialize error: %d\n", error_code);return;}// 创建数据库 create databaseString db_file_name = "qiankunDataBase.Ztz";String db_password = "password";error_code = tianzuo_QiankunLib.instance.tianzuo_QiankunInt_db_create_database(qiankun, db_file_name, db_password, "qiankunDataBase", true);if (error_code != Qiankun_error_code.Qiankun_errorcode_success.getValue()) {System.out.printf("tianzuo_QiankunInt_db_create_database error: %d\n", error_code);return;}// 打开数据库 open databaseerror_code = tianzuo_QiankunLib.instance.tianzuo_QiankunInt_db_open_database(qiankun, db_file_name, db_password);if (error_code != Qiankun_error_code.Qiankun_errorcode_success.getValue()) {System.out.printf("tianzuo_QiankunInt_db_open_database error: %d\n", error_code);return;}// 向数据库写入一个整型数据 writes an integer to the databaseint intInt = 12345678;error_code = tianzuo_QiankunLib.instance.tianzuo_QiankunInt_data_int_combine(qiankun, db_file_name, db_password, "integer", "", intInt);if (error_code != Qiankun_error_code.Qiankun_errorcode_success.getValue()) {System.out.printf("tianzuo_QiankunInt_data_int_combine error: %d\n", error_code);return;}// 读取刚写入的数据 read the data just writtenint[] return_data = {0};error_code = tianzuo_QiankunLib.instance.tianzuo_QiankunInt_data_int_extract(qiankun, db_file_name, db_password, "integer", return_data);if (error_code != Qiankun_error_code.Qiankun_errorcode_success.getValue()) {System.out.printf("tianzuo_QiankunInt_data_int_extract error: %d\n", error_code);return;}System.out.printf("get int: %d\n", return_data[0]);// 关闭数据库 close databaseerror_code = tianzuo_QiankunLib.instance.tianzuo_QiankunInt_db_close_database(qiankun, db_file_name, db_password);if (error_code != Qiankun_error_code.Qiankun_errorcode_success.getValue()) {System.out.printf("tianzuo_QiankunInt_db_close_database error: %d\n", error_code);return;}System.out.printf("test done -------------------\n");tianzuo_QiankunLib.instance.tianzuo_QiankunInterface_terminate(qiankun);}
}
csharp
using System.Runtime.InteropServices;public enum Qiankun_error_code
{Qiankun_errorcode_success = 0x00000001, ///< 正确的值Qiankun_errorcode_normal = 0x00000002, ///< 错误的值Qiankun_errorcode_differ = 0x00000003, ///< 数据库文件数效验未通过 (The number of database files fails to be verified)Qiankun_errorcode_no_rights = 0x00000004, ///< 数据库密码效验未通过 (The database password verification failed)Qiankun_errorcode_db_not_exist = 0x00000005, ///< 数据库文件不存在 (The database file does not exist)Qiankun_errorcode_exist = 0x00000006, ///< 数据已存在 (Data already exists)Qiankun_errorcode_not_exist = 0x00000007, ///< 数据不存在 (Data does not exist)Qiankun_errorcode_out_of_range = 0x00000008, ///< 超出范围 (out of range)Qiankun_errorcode_type = 0x00000009, ///< 类型不符 (wrong type)Qiankun_errorcode_param = 0x0000000A, ///< 参数错误 (parameter error)Qiankun_errorcode_compress = 0x0000000B, ///< 压缩错误 (compression error)Qiankun_errorcode_get_array = 0x0000000C, ///< 数组错误 (arrary error)Qiankun_errorcode_out_of_memory = 0x0000000D, ///< 内存溢出 (memory overflow)Qiankun_errorcode_handle = 0x0000000E, ///< 句柄错误 (error handle)Qiankun_errorcode_io = 0x0000000F, ///< IO错误 (io error)
}class Program {[DllImport("tianzuo.Qiankun.dll")]public static extern IntPtr tianzuo_QiankunInterface_initialize();[DllImport("tianzuo.Qiankun.dll")]public static extern void tianzuo_QiankunInterface_terminate(IntPtr qiankun);[DllImport("tianzuo.Qiankun.dll")]public static extern int tianzuo_QiankunInt_initialize(IntPtr qiankun);[DllImport("tianzuo.Qiankun.dll")]public static extern int tianzuo_QiankunInt_db_create_database(IntPtr qiankun, string db_file_name, string db_password, string db_name, bool over_write);[DllImport("tianzuo.Qiankun.dll")]public static extern int tianzuo_QiankunInt_db_open_database(IntPtr qiankun, string db_file_name, string db_password);[DllImport("tianzuo.Qiankun.dll")]public static extern int tianzuo_QiankunInt_db_close_database(IntPtr qiankun, string db_file_name, string db_password);[DllImport("tianzuo.Qiankun.dll")]public static extern int tianzuo_QiankunInt_data_int_combine(IntPtr qiankun, string db_file_name, string db_password, string data_name, string remark, int data);[DllImport("tianzuo.Qiankun.dll")]public static extern int tianzuo_QiankunInt_data_int_extract(IntPtr qiankun, string db_file_name, string db_password, string data_name, ref int data);static void Main(string[] args) {// 初始化接口 initialize the interfaceConsole.WriteLine("initialize the interface\n");// 创建实例 create an instanceIntPtr qiankun = tianzuo_QiankunInterface_initialize();int error_code = tianzuo_QiankunInt_initialize(qiankun);if (error_code != ((int)Qiankun_error_code.Qiankun_errorcode_success)){Console.WriteLine("tianzuo_QiankunInt_initialize error:" + error_code);return;}// 创建数据库 create databasestring db_file_name = "qiankunDataBase.Ztz";string db_password = "password";error_code = tianzuo_QiankunInt_db_create_database(qiankun, db_file_name, db_password, "qiankunDataBase", true);if (error_code != ((int)Qiankun_error_code.Qiankun_errorcode_success)){Console.WriteLine("tianzuo_QiankunInt_db_create_database error:" + error_code);return;}// 打开数据库 open databaseerror_code = tianzuo_QiankunInt_db_open_database(qiankun, db_file_name, db_password);if (error_code != ((int)Qiankun_error_code.Qiankun_errorcode_success)) {Console.WriteLine("tianzuo_QiankunInt_db_open_database error:" + error_code);return;}// 向数据库写入一个整型数据 writes an integer to the databaseint intInt = 12345678;error_code = tianzuo_QiankunInt_data_int_combine(qiankun, db_file_name, db_password, "integer", "", intInt);if (error_code != ((int)Qiankun_error_code.Qiankun_errorcode_success)){Console.WriteLine("tianzuo_QiankunInt_data_int_combine error:" + error_code);return;}// 读取刚写入的数据 read the data just writtenint return_data = 0;error_code = tianzuo_QiankunInt_data_int_extract(qiankun, db_file_name, db_password, "integer", ref return_data);if (error_code != ((int)Qiankun_error_code.Qiankun_errorcode_success)){Console.WriteLine("tianzuo_QiankunInt_data_int_extract error:" + error_code);return;}Console.WriteLine("get int: " + return_data);// 关闭数据库 close databaseerror_code = tianzuo_QiankunInt_db_close_database(qiankun, db_file_name, db_password);if (error_code != ((int)Qiankun_error_code.Qiankun_errorcode_success)){Console.WriteLine("tianzuo_QiankunInt_db_close_database error:" + error_code);return;}Console.WriteLine("test done -------------------\n");tianzuo_QiankunInterface_terminate(qiankun);}}
javascript
Qiankun_errorcode_success = 0x00000001; ///< 正确的值
Qiankun_errorcode_normal = 0x00000002; ///< 错误的值
Qiankun_errorcode_differ = 0x00000003; ///< 数据库文件数效验未通过 (The number of database files fails to be verified)
Qiankun_errorcode_no_rights = 0x00000004; ///< 数据库密码效验未通过 (The database password verification failed)
Qiankun_errorcode_db_not_exist = 0x00000005; ///< 数据库文件不存在 (The database file does not exist)
Qiankun_errorcode_exist = 0x00000006; ///< 数据已存在 (Data already exists)
Qiankun_errorcode_not_exist = 0x00000007; ///< 数据不存在 (Data does not exist)
Qiankun_errorcode_out_of_range = 0x00000008; ///< 超出范围 (out of range)
Qiankun_errorcode_type = 0x00000009; ///< 类型不符 (wrong type)
Qiankun_errorcode_param = 0x0000000A; ///< 参数错误 (parameter error)
Qiankun_errorcode_compress = 0x0000000B; ///< 压缩错误 (compression error)
Qiankun_errorcode_get_array = 0x0000000C; ///< 数组错误 (arrary error)
Qiankun_errorcode_out_of_memory = 0x0000000D; ///< 内存溢出 (memory overflow)
Qiankun_errorcode_handle = 0x0000000E; ///< 句柄错误 (error handle)
Qiankun_errorcode_io = 0x0000000F; ///< IO错误 (io error)let ffi = require('ffi-napi')
const ref = require('ref-napi');let tianzuo_QiankunLib = ffi.Library("tianzuo.Qiankun.dll", {'tianzuo_QiankunInterface_initialize': ['pointer', []],'tianzuo_QiankunInterface_terminate':['void',['pointer']],'tianzuo_QiankunInt_initialize':['int',['pointer']],'tianzuo_QiankunInt_db_create_database':['int',['pointer','string','string','string', 'bool']],'tianzuo_QiankunInt_db_open_database':['int',['pointer', 'string', 'string']],'tianzuo_QiankunInt_db_close_database':['int',['pointer', 'string', 'string']],'tianzuo_QiankunInt_data_int_combine':['int',['pointer','string','string','string', 'string', 'int']],'tianzuo_QiankunInt_data_int_extract':['int',['pointer','string','string','string', 'pointer']],
})// 初始化接口 initialize the interface
console.log("initialize the interface\n");// 创建实例 create an instance
let qiankun = tianzuo_QiankunLib.tianzuo_QiankunInterface_initialize();
let error_code = tianzuo_QiankunLib.tianzuo_QiankunInt_initialize(qiankun);
if (error_code !== Qiankun_errorcode_success) {console.log("tianzuo_QiankunInt_initialize error: %d\n", error_code);return;
}// 创建数据库 create database
let db_file_name = "qiankunDataBase.Ztz";
let db_password = "password";
error_code = tianzuo_QiankunLib.tianzuo_QiankunInt_db_create_database(qiankun, db_file_name, db_password, "qiankunDataBase", true);
if (error_code !== Qiankun_errorcode_success) {console.log("tianzuo_QiankunInt_db_create_database error: %d\n", error_code);return;
}// 打开数据库 open database
error_code = tianzuo_QiankunLib.tianzuo_QiankunInt_db_open_database(qiankun, db_file_name, db_password);
if (error_code !== Qiankun_errorcode_success) {console.log("tianzuo_QiankunInt_db_open_database error: %d\n", error_code);return;
}// 向数据库写入一个整型数据 writes an integer to the database
let intInt = 12345678;
error_code = tianzuo_QiankunLib.tianzuo_QiankunInt_data_int_combine(qiankun, db_file_name, db_password, "integer", "", intInt);
if (error_code !== Qiankun_errorcode_success) {console.log("tianzuo_QiankunInt_data_int_combine error: %d\n", error_code);return;
}// 读取刚写入的数据 read the data just written
return_buf = Buffer.alloc(1 * ref.sizeof.int);
error_code = tianzuo_QiankunLib.tianzuo_QiankunInt_data_int_extract(qiankun, db_file_name, db_password, "integer", return_buf);
if (error_code !== Qiankun_errorcode_success) {console.log("tianzuo_QiankunInt_data_int_extract error: %d\n", error_code);return;
}return_data = ref.get(return_buf, 0, ref.types.int);
console.log("get int: %d\n", return_data);// 关闭数据库 close database
error_code = tianzuo_QiankunLib.tianzuo_QiankunInt_db_close_database(qiankun, db_file_name, db_password);
if (error_code !== Qiankun_errorcode_success) {console.log("tianzuo_QiankunInt_db_close_database error: %d\n", error_code);return;
}console.log("test done -------------------\n");tianzuo_QiankunLib.tianzuo_QiankunInterface_terminate(qiankun); php
<?php// 检查是否加载了 FFI 扩展
if (extension_loaded('ffi')) {echo("已启用 FFI 扩展\n");
} else {die("未启动 FFI 扩展\n");
}enum Qiankun_error_code
{
const Qiankun_errorcode_success = 0x00000001; ///< 正确的值
const Qiankun_errorcode_normal = 0x00000002; ///< 错误的值
const Qiankun_errorcode_differ = 0x00000003; ///< 数据库文件数效验未通过 (The number of database files fails to be verified)
const Qiankun_errorcode_no_rights = 0x00000004; ///< 数据库密码效验未通过 (The database password verification failed)
const Qiankun_errorcode_db_not_exist = 0x00000005; ///< 数据库文件不存在 (The database file does not exist)
const Qiankun_errorcode_exist = 0x00000006; ///< 数据已存在 (Data already exists)
const Qiankun_errorcode_not_exist = 0x00000007; ///< 数据不存在 (Data does not exist)
const Qiankun_errorcode_out_of_range = 0x00000008; ///< 超出范围 (out of range)
const Qiankun_errorcode_type = 0x00000009; ///< 类型不符 (wrong type)
const Qiankun_errorcode_param = 0x0000000A; ///< 参数错误 (parameter error)
const Qiankun_errorcode_compress = 0x0000000B; ///< 压缩错误 (compression error)
const Qiankun_errorcode_get_array = 0x0000000C; ///< 数组错误 (arrary error)
const Qiankun_errorcode_out_of_memory = 0x0000000D; ///< 内存溢出 (memory overflow)
const Qiankun_errorcode_handle = 0x0000000E; ///< 句柄错误 (error handle)
const Qiankun_errorcode_io = 0x0000000F; ///< IO错误 (io error)
}$ffi = FFI::cdef("void* tianzuo_QiankunInterface_initialize();void tianzuo_QiankunInterface_terminate(void* *QiankunInt_pointer);int tianzuo_QiankunInt_initialize(void* QiankunInt_pointer);int tianzuo_QiankunInt_db_create_database(void* QiankunInt_pointer, const char* db_file_name, const char* db_password, const char* db_name, bool const over_write);int tianzuo_QiankunInt_db_open_database(void* QiankunInt_pointer, const char* db_file_name, const char* db_password);int tianzuo_QiankunInt_db_close_database(void* QiankunInt_pointer, const char* db_file_name, const char* db_password);int tianzuo_QiankunInt_data_int_combine(void* QiankunInt_pointer, const char* db_file_name, const char* db_password, const char* data_name, const char* remark, int data);int tianzuo_QiankunInt_data_int_extract(void* QiankunInt_pointer, const char* db_file_name, const char* db_password, const char* data_name, int* data);
", "tianzuo.Qiankun.dll");# 初始化接口 initialize the interface
echo "initialize the interface" . "\n";# 创建实例 create an instance
$qiankun = $ffi->tianzuo_QiankunInterface_initialize();$error_code = $ffi->tianzuo_QiankunInt_initialize($qiankun);
if ($error_code != Qiankun_error_code::Qiankun_errorcode_success) {echo "initialize error: " . $error_code . "\n";return;
}# 创建数据库 create database
$db_file_name = "qiankunDataBase.Ztz";
$db_password = "password";
$error_code = $ffi->tianzuo_QiankunInt_db_create_database($qiankun, $db_file_name, $db_password, "qiankunDataBase", true);
if ($error_code != Qiankun_error_code::Qiankun_errorcode_success) {echo "tianzuo_QiankunInt_db_create_database error: " . $error_code . "\n";return;
}# 打开数据库 open database
$error_code = $ffi->tianzuo_QiankunInt_db_open_database($qiankun, $db_file_name, $db_password);
if ($error_code != Qiankun_error_code::Qiankun_errorcode_success) {echo "tianzuo_QiankunInt_db_open_database error: " . $error_code . "\n";return;
}# 向数据库写入一个整型数据 writes an integer to the database
$intInt = 12345678;
$error_code = $ffi->tianzuo_QiankunInt_data_int_combine($qiankun, $db_file_name, $db_password, "integer", "", $intInt);
if ($error_code != Qiankun_error_code::Qiankun_errorcode_success) {echo "tianzuo_QiankunInt_data_int_combine error: " . $error_code . "\n";return;
}# 读取刚写入的数据 read the data just written
$return_data = FFI::new("int");
$error_code = $ffi->tianzuo_QiankunInt_data_int_extract($qiankun, $db_file_name, $db_password, "integer", FFI::addr($return_data));
if ($error_code != Qiankun_error_code::Qiankun_errorcode_success) {echo "tianzuo_QiankunInt_data_int_extract error: " . $error_code . "\n";return;
}echo "get integer data: " . $return_data->cdata . "\n";# 关闭数据库 close database
$error_code = $ffi->tianzuo_QiankunInt_db_close_database($qiankun, $db_file_name, $db_password);
if ($error_code != Qiankun_error_code::Qiankun_errorcode_success) {echo "tianzuo_QiankunInt_db_close_database error: " . $error_code . "\n";return;
}echo "test done -------------------" . "\n";?>
vb
Imports System.Runtime.InteropServicesEnum Qiankun_error_codeQiankun_errorcode_success = 1 ' 正确的值Qiankun_errorcode_normal = 2 ' 错误的值Qiankun_errorcode_differ = 3 ' 数据库文件数效验未通过 (The number Of database files fails To be verified)Qiankun_errorcode_no_rights = 4 ' 数据库密码效验未通过 (The database password verification failed)Qiankun_errorcode_db_not_exist = 5 ' 数据库文件不存在 (The database file does Not exist)Qiankun_errorcode_exist = 6 ' 数据已存在 (Data already exists)Qiankun_errorcode_not_exist = 7 ' 数据不存在 (Data does Not exist)Qiankun_errorcode_out_of_range = 8 ' 超出范围 (out Of range)Qiankun_errorcode_type = 9 ' 类型不符 (wrong type)Qiankun_errorcode_param = 10 ' 参数错误 (parameter Error)Qiankun_errorcode_compress = 11 ' 压缩错误 (compression Error)Qiankun_errorcode_get_array = 12 ' 数组错误 (arrary Error)Qiankun_errorcode_out_of_memory = 13 ' 内存溢出 (memory overflow)Qiankun_errorcode_handle = 14 ' 句柄错误 (Error handle)Qiankun_errorcode_io = 15 ' IO错误 (io Error)
End EnumModule Program<DllImport("tianzuo.Qiankun.dll")>Public Function tianzuo_QiankunInterface_initialize() As IntPtrEnd Function<DllImport("tianzuo.Qiankun.dll")>Public Function tianzuo_QiankunInterface_terminate(ByRef QiankunInt_pointer As IntPtr)End Function<DllImport("tianzuo.Qiankun.dll")>Public Function tianzuo_QiankunInt_initialize(QiankunInt_pointer As IntPtr) As IntegerEnd Function<DllImport("tianzuo.Qiankun.dll")>Public Function tianzuo_QiankunInt_db_create_database(QiankunInt_pointer As IntPtr, db_file_name As String, db_password As String, db_name As String, over_write As Boolean) As IntegerEnd Function<DllImport("tianzuo.Qiankun.dll")>Public Function tianzuo_QiankunInt_db_open_database(QiankunInt_pointer As IntPtr, db_file_name As String, db_password As String) As IntegerEnd Function<DllImport("tianzuo.Qiankun.dll")>Public Function tianzuo_QiankunInt_db_close_database(QiankunInt_pointer As IntPtr, db_file_name As String, db_password As String) As IntegerEnd Function<DllImport("tianzuo.Qiankun.dll")>Public Function tianzuo_QiankunInt_data_int_combine(QiankunInt_pointer As IntPtr, db_file_name As String, db_password As String, data_name As String, remark As String, data As Integer) As IntegerEnd Function<DllImport("tianzuo.Qiankun.dll")>Public Function tianzuo_QiankunInt_data_int_extract(QiankunInt_pointer As IntPtr, db_file_name As String, db_password As String, data_name As String, ByRef data As Integer) As IntegerEnd FunctionSub Main(args As String())' 初始化接口 initialize the interfaceConsole.WriteLine("initialize the interface")' 创建实例 create an instanceDim qiankun As IntPtr = tianzuo_QiankunInterface_initialize()Dim error_code As Integer = tianzuo_QiankunInt_initialize(qiankun)If (error_code <> Qiankun_error_code.Qiankun_errorcode_success) ThenConsole.WriteLine("tianzuo_QiankunInt_initialize error:" + error_code.ToString)ReturnEnd If' 创建数据库 create databaseDim db_file_name As String = "qiankunDataBase.Ztz"Dim db_password As String = "password"error_code = tianzuo_QiankunInt_db_create_database(qiankun, db_file_name, db_password, "qiankunDataBase", True)If (error_code <> Qiankun_error_code.Qiankun_errorcode_success) ThenConsole.WriteLine("tianzuo_QiankunInt_db_create_database error:" + error_code.ToString)ReturnEnd If' 打开数据库 open databaseerror_code = tianzuo_QiankunInt_db_open_database(qiankun, db_file_name, db_password)If (error_code <> Qiankun_error_code.Qiankun_errorcode_success) ThenConsole.WriteLine("tianzuo_QiankunInt_db_open_database error:" + error_code.ToString)ReturnEnd If' 向数据库写入一个整型数据 writes an integer to the databaseDim intInt As Integer = 12345678error_code = tianzuo_QiankunInt_data_int_combine(qiankun, db_file_name, db_password, "integer", "", intInt)If (error_code <> Qiankun_error_code.Qiankun_errorcode_success) ThenConsole.WriteLine("tianzuo_QiankunInt_data_int_combine error:" + error_code.ToString)ReturnEnd If' 读取刚写入的数据 read the data just writtenDim return_data As Integer = 0error_code = tianzuo_QiankunInt_data_int_extract(qiankun, db_file_name, db_password, "integer", return_data)If (error_code <> Qiankun_error_code.Qiankun_errorcode_success) ThenConsole.WriteLine("tianzuo_QiankunInt_data_int_extract error:" + error_code.ToString)ReturnEnd IfConsole.WriteLine("get int: " + return_data.ToString)' 关闭数据库 close databaseerror_code = tianzuo_QiankunInt_db_close_database(qiankun, db_file_name, db_password)If (error_code <> Qiankun_error_code.Qiankun_errorcode_success) ThenConsole.WriteLine("tianzuo_QiankunInt_db_close_database error:" + error_code.ToString)ReturnEnd IfConsole.WriteLine("test done -------------------")End Sub
End Module go
package main/*
#include "tianzuo.QiankunInterface.h"
*/
import "C"
import ("fmt""syscall""unsafe"
)const (Qiankun_errorcode_success = 1 // 正确的值Qiankun_errorcode_normal = 2 // 错误的值Qiankun_errorcode_differ = 3 // 数据库文件数效验未通过 (The number Of database files fails To be verified)Qiankun_errorcode_no_rights = 4 // 数据库密码效验未通过 (The database password verification failed)Qiankun_errorcode_db_not_exist = 5 // 数据库文件不存在 (The database file does Not exist)Qiankun_errorcode_exist = 6 // 数据已存在 (Data already exists)Qiankun_errorcode_not_exist = 7 // 数据不存在 (Data does Not exist)Qiankun_errorcode_out_of_range = 8 // 超出范围 (out Of range)Qiankun_errorcode_type = 9 // 类型不符 (wrong type)Qiankun_errorcode_param = 10 // 参数错误 (parameter Error)Qiankun_errorcode_compress = 11 // 压缩错误 (compression Error)Qiankun_errorcode_get_array = 12 // 数组错误 (arrary Error)Qiankun_errorcode_out_of_memory = 13 // 内存溢出 (memory overflow)Qiankun_errorcode_handle = 14 // 句柄错误 (Error handle)Qiankun_errorcode_io = 15 // IO错误 (io Error)
)func main() {// 初始化接口 initialize the interfacedll := syscall.MustLoadDLL("tianzuo.Qiankun.dll")// 创建实例 create an instancetianzuo_QiankunInterface_initialize := dll.MustFindProc("tianzuo_QiankunInterface_initialize")qiankun, _, _ := tianzuo_QiankunInterface_initialize.Call()tianzuo_QiankunInt_initialize := dll.MustFindProc("tianzuo_QiankunInt_initialize")error_code, _, _ := tianzuo_QiankunInt_initialize.Call(qiankun)if error_code != Qiankun_errorcode_success {fmt.Println("tianzuo_QiankunInt_initialize error: ", error_code)}// 创建数据库 create databasedb_file_name := C.CString("qiankunDataBase.Ztz")db_password := C.CString("password")tianzuo_QiankunInt_db_create_database := dll.MustFindProc("tianzuo_QiankunInt_db_create_database")error_code, _, _ = tianzuo_QiankunInt_db_create_database.Call(qiankun, uintptr(unsafe.Pointer(db_file_name)), uintptr(unsafe.Pointer(db_password)), uintptr(unsafe.Pointer(C.CString("qiankunDataBase"))), 1)if error_code != Qiankun_errorcode_success {fmt.Println("tianzuo_QiankunInt_db_create_database error: ", error_code)}// 打开数据库 open databasetianzuo_QiankunInt_db_open_database := dll.MustFindProc("tianzuo_QiankunInt_db_open_database")error_code, _, _ = tianzuo_QiankunInt_db_open_database.Call(qiankun, uintptr(unsafe.Pointer(db_file_name)), uintptr(unsafe.Pointer(db_password)))if error_code != Qiankun_errorcode_success {fmt.Println("tianzuo_QiankunInt_db_open_database error: ", error_code)}// 向数据库写入一个整型数据 writes an integer to the databaseintInt := C.int(12345678)tianzuo_QiankunInt_data_int_combine := dll.MustFindProc("tianzuo_QiankunInt_data_int_combine")error_code, _, _ = tianzuo_QiankunInt_data_int_combine.Call(qiankun, uintptr(unsafe.Pointer(db_file_name)), uintptr(unsafe.Pointer(db_password)), uintptr(unsafe.Pointer(C.CString("integer"))), uintptr(unsafe.Pointer(C.CString(""))), uintptr(intInt))if error_code != Qiankun_errorcode_success {fmt.Println("tianzuo_QiankunInt_data_int_combine error: ", error_code)}// 读取刚写入的数据 read the data just writtenreturn_int := C.int(0)tianzuo_QiankunInt_data_int_extract := dll.MustFindProc("tianzuo_QiankunInt_data_int_extract")error_code, _, _ = tianzuo_QiankunInt_data_int_extract.Call(qiankun, uintptr(unsafe.Pointer(db_file_name)), uintptr(unsafe.Pointer(db_password)), uintptr(unsafe.Pointer(C.CString("integer"))), uintptr(unsafe.Pointer(&return_int)))if error_code != Qiankun_errorcode_success {fmt.Println("tianzuo_QiankunInt_data_int_extract error: ", error_code)}fmt.Println("get integer data: ", return_int)// 关闭数据库 close databasetianzuo_QiankunInt_db_close_database := dll.MustFindProc("tianzuo_QiankunInt_db_close_database")error_code, _, _ = tianzuo_QiankunInt_db_close_database.Call(qiankun, uintptr(unsafe.Pointer(db_file_name)), uintptr(unsafe.Pointer(db_password)))if error_code != Qiankun_errorcode_success {fmt.Println("tianzuo_QiankunInt_db_close_database error: ", error_code)}fmt.Println("test done -------------------")
} rust
use std::os::raw::c_char;
use std::ffi::{c_int};
use std::ffi::CString;
use std::ptr::null;#[link(name = "tianzuo.Qiankun")]
extern {fn tianzuo_QiankunInterface_initialize() -> *mut std::ffi::c_void;fn tianzuo_QiankunInterface_terminate(obj: *mut std::ffi::c_void);fn tianzuo_QiankunInt_initialize(obj: *mut std::ffi::c_void) -> c_int;fn tianzuo_QiankunInt_db_create_database(obj: *mut std::ffi::c_void, db_file_name: *const c_char, db_password: *const c_char, db_name: *const c_char, over_write: c_int) -> c_int;fn tianzuo_QiankunInt_db_open_database(obj: *mut std::ffi::c_void, db_file_name: *const c_char, db_password: *const c_char) -> c_int;fn tianzuo_QiankunInt_db_close_database(obj: *mut std::ffi::c_void, db_file_name: *const c_char, db_password: *const c_char) -> c_int;fn tianzuo_QiankunInt_data_int_combine(obj: *mut std::ffi::c_void, db_file_name: *const c_char, db_password: *const c_char, data_name: *const c_char, remark: *const c_char, data: c_int) -> c_int;fn tianzuo_QiankunInt_data_int_extract(obj: *mut std::ffi::c_void, db_file_name: *const c_char, db_password: *const c_char, data_name: *const c_char, data: *const c_int) -> c_int;
}fn main() {unsafe {// 初始化接口 initialize the interfaceprintln!("initialize the interface");// 创建实例 create an instancelet qiankun = tianzuo_QiankunInterface_initialize();let error_code = tianzuo_QiankunInt_initialize(qiankun);if 1 != error_code {println!("initialize error: {:?}", error_code);}// 创建数据库 create databaselet db_file_name = CString::new(String::from("qiankunDataBase.Ztz")).expect("Failed to create CString");let db_password = CString::new(String::from("password")).expect("Failed to create CString");let db_name = CString::new(String::from("qiankunDataBase")).expect("Failed to create CString");let error_code = tianzuo_QiankunInt_db_create_database(qiankun, db_file_name.as_ptr(), db_password.as_ptr(), db_name.as_ptr(), 1);if 1 != error_code {println!("db_create_database error: {:?}", error_code);}// 打开数据库 open databaselet error_code = tianzuo_QiankunInt_db_open_database(qiankun, db_file_name.as_ptr(), db_password.as_ptr());if 1 != error_code {println!("db_open_database error: {:?}", error_code);}// 向数据库写入一个整型数据 writes an integer to the databaselet int = 12345678;let data_name = CString::new(String::from("integer")).expect("Failed to create CString");let error_code = tianzuo_QiankunInt_data_int_combine(qiankun, db_file_name.as_ptr(), db_password.as_ptr(), data_name.as_ptr(), null(), int);if 1 != error_code {println!("data_combine error: {:?}", error_code);}// 读取刚写入的数据 read the data just writtenlet mut return_data: c_int = 0;let error_code = tianzuo_QiankunInt_data_int_extract(qiankun, db_file_name.as_ptr(), db_password.as_ptr(), data_name.as_ptr(), &mut return_data);if 1 != error_code {println!("data_extract error: {:?}", error_code);}println!("get integer data: {:?}", return_data);// 关闭数据库 close databaselet error_code = tianzuo_QiankunInt_db_close_database(qiankun, db_file_name.as_ptr(), db_password.as_ptr());if 1 != error_code {println!("db_close_database error: {:?}", error_code);}println!("test done -------------------")}
} ruby
require 'fiddle'lib = Fiddle::dlopen('C:/Users/zhengtianzuo/RubymineProjects/tianzuo.QiankunTest/tianzuo.Qiankun.dll')
tianzuo_QiankunInterface_initialize = Fiddle::Function.new(lib['tianzuo_QiankunInterface_initialize'], [], Fiddle::TYPE_VOIDP)
tianzuo_QiankunInterface_terminate = Fiddle::Function.new(lib['tianzuo_QiankunInterface_terminate'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOID)
tianzuo_QiankunInt_initialize = Fiddle::Function.new(lib['tianzuo_QiankunInt_initialize'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
tianzuo_QiankunInt_db_create_database = Fiddle::Function.new(lib['tianzuo_QiankunInt_db_create_database'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT], Fiddle::TYPE_INT)
tianzuo_QiankunInt_db_open_database = Fiddle::Function.new(lib['tianzuo_QiankunInt_db_open_database'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
tianzuo_QiankunInt_data_int_combine = Fiddle::Function.new(lib['tianzuo_QiankunInt_data_int_combine'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT], Fiddle::TYPE_INT)
tianzuo_QiankunInt_data_int_extract = Fiddle::Function.new(lib['tianzuo_QiankunInt_data_int_extract'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
tianzuo_QiankunInt_db_close_database = Fiddle::Function.new(lib['tianzuo_QiankunInt_db_close_database'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)# 初始化接口 initialize the interface
print("initialize the interface\n")# 创建实例 create an instance
qiankun = tianzuo_QiankunInterface_initialize.call()
error_code = tianzuo_QiankunInt_initialize.call(qiankun)
if error_code != 1print("initialize error:", error_code, "\n")return
end# 创建数据库 create database
db_file_name = "qiankunDataBase.Ztz"
db_password = "password"
error_code = tianzuo_QiankunInt_db_create_database.call(qiankun, db_file_name, db_password, "qiankunDataBase", 1)
if error_code != 1print("db_create_database error:", error_code, "\n")return
end# 打开数据库 open database
error_code = tianzuo_QiankunInt_db_open_database.call(qiankun, db_file_name, db_password)
if error_code != 1print("db_open_database error:", error_code, "\n")
return
end# 向数据库写入一个整型数据 writes an integer to the database
intInt = 12345678
error_code = tianzuo_QiankunInt_data_int_combine.call(qiankun, db_file_name, db_password, "integer", "", intInt)
if error_code != 1print("data_combine error:", error_code, "\n")
return
end# 读取刚写入的数据 read the data just written
return_data = Fiddle::Pointer.malloc(Fiddle::SIZEOF_INT)
error_code = tianzuo_QiankunInt_data_int_extract.call(qiankun, db_file_name, db_password, "integer", return_data)
if error_code != 1print("data_extract error:", error_code, "\n")
return
endinteger = return_data[0, Fiddle::SIZEOF_INT].unpack('I')[0]
print("get integer data: ", integer, "\n")# 关闭数据库 close database
error_code = tianzuo_QiankunInt_db_close_database.call(qiankun, db_file_name, db_password)
if error_code != 1print("db_close_database error:", error_code)
return
endprint("test done -------------------")
下载
| https://github.com/zhengtianzuo/tianzuo.Qiankun/releases | https://gitee.com/zhengtianzuo/tianzuo.Qiankun/releases | https://pan.baidu.com/s/1ecnWXCHtFUT0edNqCLwFbQ?pwd=1234 | https://share.weiyun.com/TVxOYtJr |
| 作者 | 郑天佐 | |
| 邮箱 | zhengtianzuo06@163.com | |
| 主页 | http://www.zhengtianzuo.com | |
| github | https://github.com/zhengtianzuo |
相关文章:
天佐.乾坤袋 基于抽屉式文件存储的NoSql数据库
天佐.乾坤袋 天佐.乾坤袋 简介 天佐.乾坤袋 基于抽屉式文件存储的NoSql数据库,可用于文件打包,数据整合,加密存放等多种用途。可以方便快捷的搭建和部署存储应用的系统。 传说: 弥勒所有,专做储物之用。拥有不可思议之力&#x…...
win11编译pytorch cuda128版本流程
Geforce 50xx系显卡最低支持cuda128,torch cu128 release版本目前还没有释放,所以自己基于2.6.0源码自己编译wheel包。 1. 前置条件 1. 使用visual studio installer 安装visual studio 2022,工作负荷选择【使用c的桌面开发】,安装完成后将…...
Windows 11 下正确安装 Docker Desktop 到 D 盘的完整教程
文章目录 Windows 11 在 D 盘正确安装 Docker Desktop 的完整教程**前言****准备工作****1. 手动创建 Docker 相关目录**(⚠️ **这一步非常重要**,否则会报错)**2. 下载 Docker Desktop 安装程序****3. 使用管理员权限打开终端** **安装 Doc…...
IDEA - 查看类的继承结构(通过快捷键查看、通过生成类图查看)
一、通过快捷键查看 在项目中定位到目标类(例如,Executor.java) 按下快捷键 【Ctrl H】 此时会弹出 Type Hierarchy 窗口,展示所有相关的父类、子类、接口 二、通过生成类图查看 在项目中定位到目标类(例如&#x…...
Vue 3指令全解析:内置指令与自定义指令实战指南
Vue指令是模板语法的核心武器,它们以v-前缀的形式为HTML元素添加特殊功能。本文将深入探讨Vue 3中的指令系统,覆盖10个核心指令的妙用,并手把手教你打造专属自定义指令。 一、Vue指令基础认知 指令本质上是DOM操作的语法糖,它们&…...
Springboot 自动化装配的原理
Springboot 自动化装配的原理 SpringBoot 主要作用为:起步依赖、自动装配。而为了实现这种功能,SpringBoot 底层主要使用了 SpringBootApplication 注解。 首先,SpringBootApplication 是一个复合注解,它结合了 Configuration、…...
Linux——进程池
前言:大佬写博客给别人看,菜鸟写博客给自己看,我是菜鸟。 1.实现思路 思路:通过创建匿名管道,来实现父子进程之间的通信 注1:父写,子读 注2:匿名管道只能用来进行具有血管关系的进程…...
Qt基于等待条件QWaitCondition实现的任务队列模型示例
核心概念 Qt中的QWaitCondition是一个用于多线程同步的类,允许线程在某些条件满足时唤醒其他等待的线程。它通常与QMutex配合使用,协调线程之间的执行顺序,适用于生产者-消费者模型、任务队列调度等场景。 wait():使当前线程进…...
微服务即时通信系统---(六)语音识别子服务
目录 功能设计 模块划分 业务接口/功能示意图 服务实现流程思想 服务代码实现 编写proto文件 服务端创建子类(SpeechRecognitionServiceImpl)完成RPC服务调用函数重写 SpeechRecognize(语音识别) 服务端完成语音识别子服务类(SpeechRecognitionServer) 注意 …...
JavaWeb基础专项复习5——请求对象和响应对象request and response
系列文章目录 1、JavaWeb基础专项复习1——XML文件-CSDN博客 2、JavaWeb基础专项复习2——JSP文件-CSDN博客 3、JavaWeb基础专项复习2——Servlet相关知识-CSDN博客 4、JavaWeb基础专项复习4——会话对象Session and Cookie-CSDN博客 文章目录 系列文章目录文章目录1、Tom…...
mac下载MAMP6.8.1;解决mac使用小皮面板安装php7.4
因为mac的小皮面板没有php7.4了 链接:c9cc270e6961c17c.dmg官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 鹅选一 附上大佬写的教程:MAMP PRO教程 - 牛奔 - 博客园 更新一下,2-27 昨天已经可以使用php7.4了,我就在想能…...
大模型WebUI:Gradio全解12——LangChain原理、架构和组件(3)
大模型WebUI:Gradio全解12——LangChain原理、架构和组件(3) 前言本篇摘要12. LangChain原理及agents构建Gradio UI12.3 LangChain架构12.3.1 LangChain12.3.2 Integration Packages1. 概念2. 示例12.3.3 LangGraph1. 概念2. 示例12.3.4 LangGraph Platform1. 概览2. 优势分…...
redis --- 相关基础知识整理
目录 一、基本1、数据结构2、有序集合的编码1. 压缩列表(Ziplist)2. 跳跃列表(SkipList)3. 动态转换机制 二、应用场景三、持久化1、 RDB 持久化2、 AOF 持久化3、 混合持久化(RDB AOF)4、 RDB和AOF的对比…...
如何用 Python 进行机器学习
文章目录 前言1. 环境准备Python安装选择Python开发环境安装必要库 2. 数据收集与加载3. 数据探索与可视化4. 数据预处理5. 模型选择与训练6. 模型评估7. 模型调优8. 模型部署 前言 使用 Python 进行机器学习一般可以按照以下步骤进行,下面将详细介绍每个步骤及对应…...
《Effective Objective-C》阅读笔记(下)
目录 内存管理 理解引用计数 引用计数工作原理 自动释放池 保留环 以ARC简化引用计数 使用ARC时必须遵循的方法命名规则 变量的内存管理语义 ARC如何清理实例变量 在dealloc方法中只释放引用并解除监听 编写“异常安全代码”时留意内存管理问题 以弱引用避免保留环 …...
解释Promise的工作原理及其状态
Promise的工作原理及其状态 1. 什么是Promise? Promise是JavaScript中的一种用于处理异步操作的对象。它代表一个可能在未来某个时间点完成的操作,并且可以有三种状态:待定(pending)、已解决(fulfilled&a…...
SHELL32!ILCombine函数分析之连接两个idl
SHELL32!ILCombine函数分析之连接两个idl 第一部分: STDAPI_(LPITEMIDLIST) ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) { // Let me pass in NULL pointers if (!pidl1) { if (!pidl2) { return NULL; …...
es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片?
Elasticsearch 生产集群部署架构及面试解析 在后端面试中,Elasticsearch(ES)是一个经常被问到的技术点,尤其是涉及到 生产环境的部署架构。面试官往往希望通过这个问题来验证你是否有真正的生产经验,而不仅仅是玩过一…...
Qt跨线程信号槽调用:为什么信号不能像普通函数那样调用
1. 信号与槽机制的基本原理 在 Qt 中,信号与槽机制是一种事件驱动的通信方式,用于对象之间的解耦交互。其关键特点如下: 信号不能直接调用 信号只是一个声明,并没有实际的函数实现。它们通过 emit 关键字在对象内部被触发&…...
ollama和open-webui部署ds
博客地址: ollama和open-webui部署ds 引言 最近,deepseek是越来越火,我也趁着这个机会做了下私有化部署,我这边使用的ollama和 open-webui实现的web版本 ollama 简介 Ollama 是一个开源的工具,专门用于简化机器学…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
