当前位置: 首页 > news >正文

天佐.乾坤袋 基于抽屉式文件存储的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/releaseshttps://gitee.com/zhengtianzuo/tianzuo.Qiankun/releaseshttps://pan.baidu.com/s/1ecnWXCHtFUT0edNqCLwFbQ?pwd=1234https://share.weiyun.com/TVxOYtJr
作者郑天佐
邮箱zhengtianzuo06@163.com
主页http://www.zhengtianzuo.com
githubhttps://github.com/zhengtianzuo

相关文章:

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

天佐.乾坤袋 天佐.乾坤袋 简介 天佐.乾坤袋 基于抽屉式文件存储的NoSql数据库&#xff0c;可用于文件打包&#xff0c;数据整合&#xff0c;加密存放等多种用途。可以方便快捷的搭建和部署存储应用的系统。 传说: 弥勒所有&#xff0c;专做储物之用。拥有不可思议之力&#x…...

win11编译pytorch cuda128版本流程

Geforce 50xx系显卡最低支持cuda128&#xff0c;torch cu128 release版本目前还没有释放&#xff0c;所以自己基于2.6.0源码自己编译wheel包。 1. 前置条件 1. 使用visual studio installer 安装visual studio 2022&#xff0c;工作负荷选择【使用c的桌面开发】,安装完成后将…...

Windows 11 下正确安装 Docker Desktop 到 D 盘的完整教程

文章目录 Windows 11 在 D 盘正确安装 Docker Desktop 的完整教程**前言****准备工作****1. 手动创建 Docker 相关目录**&#xff08;⚠️ **这一步非常重要**&#xff0c;否则会报错&#xff09;**2. 下载 Docker Desktop 安装程序****3. 使用管理员权限打开终端** **安装 Doc…...

IDEA - 查看类的继承结构(通过快捷键查看、通过生成类图查看)

一、通过快捷键查看 在项目中定位到目标类&#xff08;例如&#xff0c;Executor.java&#xff09; 按下快捷键 【Ctrl H】 此时会弹出 Type Hierarchy 窗口&#xff0c;展示所有相关的父类、子类、接口 二、通过生成类图查看 在项目中定位到目标类&#xff08;例如&#x…...

Vue 3指令全解析:内置指令与自定义指令实战指南

Vue指令是模板语法的核心武器&#xff0c;它们以v-前缀的形式为HTML元素添加特殊功能。本文将深入探讨Vue 3中的指令系统&#xff0c;覆盖10个核心指令的妙用&#xff0c;并手把手教你打造专属自定义指令。 一、Vue指令基础认知 指令本质上是DOM操作的语法糖&#xff0c;它们&…...

Springboot 自动化装配的原理

Springboot 自动化装配的原理 SpringBoot 主要作用为&#xff1a;起步依赖、自动装配。而为了实现这种功能&#xff0c;SpringBoot 底层主要使用了 SpringBootApplication 注解。 首先&#xff0c;SpringBootApplication 是一个复合注解&#xff0c;它结合了 Configuration、…...

Linux——进程池

前言&#xff1a;大佬写博客给别人看&#xff0c;菜鸟写博客给自己看&#xff0c;我是菜鸟。 1.实现思路 思路&#xff1a;通过创建匿名管道&#xff0c;来实现父子进程之间的通信 注1&#xff1a;父写&#xff0c;子读 注2&#xff1a;匿名管道只能用来进行具有血管关系的进程…...

Qt基于等待条件QWaitCondition实现的任务队列模型示例

核心概念 Qt中的QWaitCondition是一个用于多线程同步的类&#xff0c;允许线程在某些条件满足时唤醒其他等待的线程。它通常与QMutex配合使用&#xff0c;协调线程之间的执行顺序&#xff0c;适用于生产者-消费者模型、任务队列调度等场景。 ​wait()&#xff1a;使当前线程进…...

微服务即时通信系统---(六)语音识别子服务

目录 功能设计 模块划分 业务接口/功能示意图 服务实现流程思想 服务代码实现 编写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了 链接&#xff1a;c9cc270e6961c17c.dmg官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 鹅选一 附上大佬写的教程&#xff1a;MAMP PRO教程 - 牛奔 - 博客园 更新一下&#xff0c;2-27 昨天已经可以使用php7.4了&#xff0c;我就在想能…...

大模型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. 压缩列表&#xff08;Ziplist&#xff09;2. 跳跃列表&#xff08;SkipList&#xff09;3. 动态转换机制 二、应用场景三、持久化1、 RDB 持久化2、 AOF 持久化3、 混合持久化&#xff08;RDB AOF&#xff09;4、 RDB和AOF的对比…...

如何用 Python 进行机器学习

文章目录 前言1. 环境准备Python安装选择Python开发环境安装必要库 2. 数据收集与加载3. 数据探索与可视化4. 数据预处理5. 模型选择与训练6. 模型评估7. 模型调优8. 模型部署 前言 使用 Python 进行机器学习一般可以按照以下步骤进行&#xff0c;下面将详细介绍每个步骤及对应…...

《Effective Objective-C》阅读笔记(下)

目录 内存管理 理解引用计数 引用计数工作原理 自动释放池 保留环 以ARC简化引用计数 使用ARC时必须遵循的方法命名规则 变量的内存管理语义 ARC如何清理实例变量 在dealloc方法中只释放引用并解除监听 编写“异常安全代码”时留意内存管理问题 以弱引用避免保留环 …...

解释Promise的工作原理及其状态

Promise的工作原理及其状态 1. 什么是Promise&#xff1f; Promise是JavaScript中的一种用于处理异步操作的对象。它代表一个可能在未来某个时间点完成的操作&#xff0c;并且可以有三种状态&#xff1a;待定&#xff08;pending&#xff09;、已解决&#xff08;fulfilled&a…...

SHELL32!ILCombine函数分析之连接两个idl

SHELL32!ILCombine函数分析之连接两个idl 第一部分&#xff1a; STDAPI_(LPITEMIDLIST) ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) { // Let me pass in NULL pointers if (!pidl1) { if (!pidl2) { return NULL; …...

es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片?

Elasticsearch 生产集群部署架构及面试解析 在后端面试中&#xff0c;Elasticsearch&#xff08;ES&#xff09;是一个经常被问到的技术点&#xff0c;尤其是涉及到 生产环境的部署架构。面试官往往希望通过这个问题来验证你是否有真正的生产经验&#xff0c;而不仅仅是玩过一…...

Qt跨线程信号槽调用:为什么信号不能像普通函数那样调用

1. 信号与槽机制的基本原理 在 Qt 中&#xff0c;信号与槽机制是一种事件驱动的通信方式&#xff0c;用于对象之间的解耦交互。其关键特点如下&#xff1a; 信号不能直接调用 信号只是一个声明&#xff0c;并没有实际的函数实现。它们通过 emit 关键字在对象内部被触发&…...

ollama和open-webui部署ds

博客地址&#xff1a; ollama和open-webui部署ds 引言 最近&#xff0c;deepseek是越来越火&#xff0c;我也趁着这个机会做了下私有化部署&#xff0c;我这边使用的ollama和 open-webui实现的web版本 ollama 简介 Ollama 是一个开源的工具&#xff0c;专门用于简化机器学…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...