[H-Lib] SQLite()

许多实用脚本和封装函数, 可以让您编写脚本更加便捷高效

Moderators: tmplinshi, arcticir

Post Reply
arcticir
Posts: 694
Joined: 17 Nov 2013, 11:32

[H-Lib] SQLite()

Post by arcticir » 25 Oct 2014, 04:10

熟悉 Class_SQLiteDB的可以直接使用这个库,功能和使用方法一样。
DB := new SQLiteDB--箭头--DB:=SQLite()

对比 Class_SQLiteDB,速度更快,加载DLL时不会出错(Class_SQLiteDB,如果多个脚本同时加载同一SQLite3.DLL有时会出错。
当然代码更加简洁。90行代码。
二进制读写部分没有加进去,有需要的回复。

需要自定义的有两个部分。
1,SQLite3.DLL路径
2,FuncRules.ini 路径。这个INI我专门用于记载DLL的调用约定。FuncRules() 最好单独保存,多个H版DLL库,从这里读取调用约定。

调用约定来自 HotKeyIt


Code: Select all

SQLite(b:="",f:=""){
	IfNotExist % h:=SubStr(b,1,InStr(b,"\","",0))
		FileCreateDir, % h
	return h:=New SQLite(b,f)
}

Class SQLite{
	__New(b,options:=""){
		This.h		:=h:=MemoryLoadLibrary(A_ScriptDir "\Attached\Dll\sqlite3.dll")
		,This.initialize	:=DynaCall(MemoryGetProcAddress(h,"sqlite3_initialize"),"i=")
		,This.open		:=DynaCall(MemoryGetProcAddress(h,"sqlite3_open"),"i==at*")
		,This.config		:=DynaCall(MemoryGetProcAddress(h,"sqlite3_config"),"i=ittt")

		If options {
			If IsObject(options.1)
			{
			for k,v in options
				this.config(v*)
			} 
			else if IsObject(options)
				this.config(options*)
			else 
				this.config(options)
		}
		if b
		This.opendb(b)
	}


	opendb(b){
		static f:=FuncRules("sqlite"),s:=FuncRules("sqliteParam")
		This.open(This.Path:=b,d),This.hd:=This.d:=d

		for i,n in f
		{
			If b && s.HasKey(i)
			{
				m:=[n]
				Loop % StrLen(RegExReplace(n,"i)\*|u|p|\=|\s|\t"))-1
					If A_Index>1
						m.Insert(A_Index)
				(m.MaxIndex()=1?m:=n:m.Insert(1))
				This[i]:=DynaCall(MemoryGetProcAddress(This.h,"sqlite3_" i),m,d)
			} 
			else
			This[i]:=DynaCall(MemoryGetProcAddress(This.h,"sqlite3_" i),n)
		}
		This.ExecF:=This.Exec,This.Exec:=This.Execx

	}


	GetTable(d, ByRef f:=""){
		If  This.get_table(&d:=This.utf8(d),h,getvar(Rows:=0),getvar(Cols:=0),error)
			return 0,StrGet(error,"UTF-8"),This.free(error)
		f:={ColumnCount:Cols,RowCount:Rows,Rows:b:=[],ColumnNames :Names:=[],HasNames:True},Offset := 0

		Loop, % Cols
			Names[i:=StrGet(NumGet(h+0,Offset,"UPtr"),"UTF-8")]:=A_Index,Names[A_Index]:=i,Offset+=A_PtrSize
		Loop, % Rows
		{
			b[A_Index]:=n:=[]
			Loop, % Cols
				n[A_Index] := StrGet(NumGet(h+0, Offset, "UPtr"), "UTF-8"),Offset += A_PtrSize
		}
		This.free_table(h)
		Return f
	}

	Execx(d){
		This.ExecF(&d:=This.utf8(d))
	}

	Utf8(f){
	      VarSetCapacity(d, StrPut(f,"UTF-8"), 0)
	      StrPut(f, &d, "UTF-8")
	      Return d
	   }

	__Delete(){
		This.shutdown(),This.close(),MemoryFreeLibrary(This.h)
	}
}

IsLite(ByRef f){
	if InStr(f, "'")
		StringReplace,f,f,','', All
	return f
}

FuncRules(d){
	f:=[]
	IniRead, b, % A_ScriptDir "\Default\FuncRules.ini", FuncRules, % d,%A_Space%
	Loop,Parse,b,|
		((h:=InStr(A_LoopField,":")) ? f[SubStr(A_LoopField,1,h-1)]:=SubStr(A_LoopField, h+1) : f[A_LoopField]:="")
	Return f
}

Code: Select all

[FuncRules]
sqlite = aggregate_context:t==ti|auto_extension:i==t|bind_blob:i==titit|bind_double:i==tid|bind_int:i==tii|bind_int64:i==ti6|bind_null:i==ti|bind_text:i==tiait|bind_text16:i==titit|bind_value:i==tit|bind_zeroblob:i==tii|bind_parameter_count:i==t|bind_parameter_index:i==tt|bind_parameter_name:a==ti|blob_bytes:i==t|blob_open:i==ttaa6it*|blob_close:i==t|blob_read:i==ttii|blob_reopen:i==t6|blob_write:i==ttii|busy_handler:i==ttt|busy_timeout:i==ti|changes:i==t|clear_bindings:i==t|close:i==t|close_v2:i==t|collation_needed:i==ttt|collation_needed16:i==ttt|column_blob:t==ti|column_bytes:i==ti|column_bytes16:i==ti|column_double:d==ti|column_int:i==ti|column_int64:6==ti|column_text:a==ti|column_text16:t==ti|column_type:i==ti|column_value:t==ti|column_count:i==t|column_decltype:a==ti|column_decltype16:t==ti|column_name:a==ti|column_name16:t==ti|commit_hook:t==ttt|rollback_hook:t==ttt|compileoption_used:i==a|compileoption_get:a==i|complete:i==a|complete16:i==t|context_db_handle:t==t|create_collation:i==ttitt|create_collation_v2:i==ttittt|create_collation16:i==ttitt|create_function:i==ttiitttt|create_function16:i==ttiitttt|create_function_v2:i==ttiitttt|create_module:i==tttt|create_module_v2:i==ttttt|data_count:i==t|db_config:i==tittt|db_filename:a==tt|db_mutex:t==t|db_handle:t==t|db_readonly:i==tt|db_release_memory:i==t|db_status:i==tititi|declare_vtab:i==tt|enable_load_extension:i==ti|enable_shared_cache:i==i|errcode:i==t|extended_errcode:i==t|errmsg:a==t|errmsg16:t==t|exec:i==ttttt*|extended_result_codes:i==ti|file_control:i==ttit|finalize:i==t|malloc:t==i|realloc:t==ti|free:t==t|get_table:i==ttt*ttt*|free_table:t==t|get_autocommit:i==t|get_auxdata:t==ti|set_auxdata:t==tittt|shutdown:i==|os_init:i==|os_end:i==|last_insert_rowid:6==t|libversion:a==|sourceid:a==|libversion_number:i==|limit:i==tii|load_extension:i==ttat*|log:t==iattt|memory_used:6==|memory_highwater:6==i|mprintf:a==atttttttttt|vmprintf:a==atttttttttt|snprintf:a==iaatttttttt|vsnprintf:a==iaatttttttt|mutex_alloc:t==i|mutex_free:t==t|mutex_enter:t==t|mutex_try:i==t|mutex_leave:t==t|next_stmt:t==tt|open16:i==at*|open_v2:i==at*ia|overload_function:i==tti|prepare:i==ttit*t*|prepare_v2:i==ttit*t*|prepare16:i==ttit*t*|prepare16_v2:i==ttit*t*|trace:t==ttt|profile:t==ttt|progress_handler:t==titt|randomness:t==it|release_memory:i==i|reset:i==t|reset_auto_extension:t==|result_blob:t==ttit|result_double:t==td|result_error:t==tti|result_error16:t==tti|result_error_toobig:t==t|result_error_nomem:t==t|result_error_code:t==ti|result_int:t==ti|result_int64:t==t6|result_null:t==t|result_text:t==ttit|result_text16:t==ttit|result_text16le:t==ttit|result_text16be:t==ttit|result_value:t==tt|result_zeroblob:t==ti|set_authorizer:i==ttt|sleep:i==i|soft_heap_limit64:6==6|sql:a==t|status:i==itti|step:i==t|stmt_busy:i==t|stmt_readonly:i==t|stmt_status:i==tii|strnicmp:i==aai|stricmp:i==aai|threadsafe:i==|total_changes:i==t|backup_finish:i==t|backup_init:i==t|backup_pagecount:i==t|backup_remaining:i==t|backup_step:i==t

sqliteParam=create_function|create_function16|create_function_v2|create_module|create_module_v2|db_filename|db_readonly|enable_load_extension|errcode|extended_errcode|get_table|load_extension|next_stmt|prepare|prepare_v2|prepare16|prepare16_v2|table_column_metadata|wal_autocheckpoint|wal_checkpoint|wal_checkpoint_v2|sqlite3_blob_open|busy_handler|busy_timeout|changes|close|close_v2|collation_needed|collation_needed16|commit_hook|rollback_hook|create_collation|create_collation_v2|create_collation16|db_config|db_mutex|db_release_memory|db_status|declare_vtab|errmsg|errmsg16|exec|extended_result_codes|file_control|get_autocommit|last_insert_rowid|limit|overload_function|trace|profile|progress_handler|set_authorizer|total_changes|update_hook|vtab_config|wal_hook|interrupt
Post Reply

Return to “脚本函数”