天佐.乾坤袋 基于抽屉式文件存储的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 是一个开源的工具,专门用于简化机器学…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...

轻量级Docker管理工具Docker Switchboard
简介 什么是 Docker Switchboard ? Docker Switchboard 是一个轻量级的 Web 应用程序,用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器,使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...