據(jù)印象,firefox4版本之前開始就向w3c組織提交了收集到的大量的針對(duì)IndexedDB規(guī)范的重要反饋資料,并且在firefox4中開始予以支持。至于類型,火狐內(nèi)置的數(shù)據(jù)庫是sqlite,純...

創(chuàng)新互聯(lián)于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元懷安做網(wǎng)站,已為上家服務(wù),為懷安各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
create?table?t
(
id?int,
sqlite?varchar(2000)
)
insert?into?t(id?,sqlite?)?values?(1,'你好SQL');
insert?into?t(id?,sqlite?)?values?(2,'再見地球');
insert?into?t(id?,sqlite?)?values?(3,'創(chuàng)世紀(jì)Genisis');
insert?into?t(id?,sqlite?)?values?(4,'SELECT語句');
insert?into?t(id?,sqlite?)?values?(5,'SELECT');
CREATE??FUNCTION?[dbo].[fz]
(
@s?varchar(2000)?=''
)
returns?varchar(2000)
as
begin
?if?ascii(@s)?is?null
?return?''
IF?ascii(left(@s,1))123
begin
declare?@i?int
set?@i?=?1
declare?@ss?varchar(100)
set?@ss?=SUBSTRING?(@s,@i,1)?
while?(ASCII?(@ss)123)
begin
set?@i=@i+1
set?@ss=SUBSTRING?(@s,@i,1)
end
return??substring(@s,1,@i-1)
end?
IF?ascii(left(@s,1))=123?and?ascii(left(@s,1))0
BEGIN
declare?@j?int
set?@j?=?1
declare?@sa?varchar(1000)
set?@sa?=SUBSTRING?(@s,@j,1)?
while?(ASCII?(@sa)=123)
begin
set?@j=@j+1
set?@sa=SUBSTRING?(@s,@j,1)
end
return?substring(@s,1,@j-1)
end
return?@s
end
go
select?ID,sqlite,dbo.fz(sqlite)?as?漢字部分,REPLACE?(sqlite,dbo.fz(sqlite),'')?英文部分?from?t
Cgo 使得Go程序能夠調(diào)用C代碼. cgo讀入一個(gè)用特別的格式寫的Go語言源文件, 輸出Go和C程序, 使得C程序能打包到Go語言的程序包中.
舉例說明一下. 下面是一個(gè)Go語言包, 包含了兩個(gè)函數(shù) -- Random 和 Seed -- 是C語言庫中random和srandom函數(shù)的馬甲.
package rand
/*
#include stdlib.h
*/ import "C" func Random() int { return int(C.random()) } func Seed(i int) { C.srandom(C.uint(i)) }
我們來看一下這里都有什么內(nèi)容. 開始是一個(gè)包的導(dǎo)入語句.
rand包導(dǎo)入了"C"包, 但你會(huì)發(fā)現(xiàn)在Go的標(biāo)準(zhǔn)庫里沒有這個(gè)包. 那是因?yàn)镃是一個(gè)"偽包", 一個(gè)為cgo引入的特殊的包名, 它是C命名空間的一個(gè)引用.
rand 包包含4個(gè)到C包的引用: 調(diào)用 C.random和C.srandom, 類型轉(zhuǎn)換 C.uint(i)還有引用語句.
Random函數(shù)調(diào)用libc中的random函數(shù), 然后回返結(jié)果. 在C中, random返回一個(gè)C類型的長(zhǎng)整形值, cgo把它輪換為C.long. 這個(gè)值必需轉(zhuǎn)換成Go的類型, 才能在Go程序中使用. 使用一個(gè)常見的Go類型轉(zhuǎn)換:
func Random() int { return int(C.random()) }
這是一個(gè)等價(jià)的函數(shù), 使用了一個(gè)臨時(shí)變量來進(jìn)行類型轉(zhuǎn)換:
func Random() int { var r C.long = C.random() return int(r) }
Seed函數(shù)則相反. 它接受一個(gè)Go語言的int類型, 轉(zhuǎn)換成C語言的unsigned int類型, 然后傳遞給C的srandom函數(shù).
func Seed(i int) { C.srandom(C.uint(i)) }
需要注意的是, cgo中的unsigned int類型寫為C.uint; cgo的文檔中有完整的類型列表.
這個(gè)例子中還有一個(gè)細(xì)節(jié)我們沒有說到, 那就是導(dǎo)入語句上面的注釋.
/*
#include stdlib.h
*/ import "C"
Cgo可以識(shí)別這個(gè)注釋, 并在編譯C語言程序的時(shí)候?qū)⑺?dāng)作一個(gè)頭文件來處理. 在這個(gè)例子中, 它只是一個(gè)include語句, 然而其實(shí)它可以是使用有效的C語言代碼. 這個(gè)注釋必需緊靠在import "C"這個(gè)語句的上面, 不能有空行, 就像是文檔注釋一樣.
Strings and things
與Go語言不同, C語言中沒有顯式的字符串類型. 字符串在C語言中是一個(gè)以0結(jié)尾的字符數(shù)組.
Go和C語言中的字符串轉(zhuǎn)換是通過C.CString, C.GoString,和C.GoStringN這些函數(shù)進(jìn)行的. 這些轉(zhuǎn)換將得到字符串類型的一個(gè)副本.
下一個(gè)例子是實(shí)現(xiàn)一個(gè)Print函數(shù), 它使用C標(biāo)準(zhǔn)庫中的fputs函數(shù)把一個(gè)字符串寫到標(biāo)準(zhǔn)輸出上:
package print // #include stdio.h // #include stdlib.h import "C" import "unsafe" func Print(s string) { cs := C.CString(s) C.fputs(cs, (*C.FILE)(C.stdout)) C.free(unsafe.Pointer(cs)) }
在C程序中進(jìn)行的內(nèi)存分配是不能被Go語言的內(nèi)存管理器感知的. 當(dāng)你使用C.CString創(chuàng)建一個(gè)C字符串時(shí)(或者其它類型的C語言內(nèi)存分配), 你必需記得在使用完后用C.free來釋放它.
調(diào)用C.CString將返回一個(gè)指向字符數(shù)組開始處的指錯(cuò), 所以在函數(shù)退出前我們把它轉(zhuǎn)換成一個(gè)unsafe.Pointer(Go中與C的void 等價(jià)的東西), 使用C.free來釋放分配的內(nèi)存. 一個(gè)慣用法是在分配內(nèi)存后緊跟一個(gè)defer(特別是當(dāng)這段代碼比較復(fù)雜的時(shí)候), 這樣我們就有了下面這個(gè)Print函數(shù):
func Print(s string) { cs := C.CString(s) defer C.free(unsafe.Pointer(cs)) C.fputs(cs, (*C.FILE)(C.stdout)) }
構(gòu)建 cgo 包
如果你使用goinstall, 構(gòu)建cgo包就比較容易了, 只要調(diào)用像平常一樣使用goinstall命令, 它就能自動(dòng)識(shí)別這個(gè)特殊的import "C", 然后自動(dòng)使用cgo來編譯這些文件.
如果你想使用Go的Makefiles來構(gòu)建, 那在CGOFILES變量中列出那些要用cgo處理的文件, 就像GOFILES變量包含一般的Go源文件一樣.
rand包的Makefile可以寫成下面這樣:
include $(GOROOT)/src/Make.inc
TARG=goblog/rand
CGOFILES=\ rand.go\ include $(GOROOT)/src/Make.pkg
然后輸入gomake開始構(gòu)建.
更多 cgo 的資源
cgo的文檔中包含了關(guān)于C偽包的更多詳細(xì)的說明, 以及構(gòu)建過程. Go代碼樹中的cgo的例子給出了更多更高級(jí)的用法.
一個(gè)簡(jiǎn)單而又符合Go慣用法的基于cgo的包是Russ Cox寫的gosqlite. 而Go語言的網(wǎng)站上也列出了更多的的cgo包.
最后, 如果你對(duì)于cgo的內(nèi)部是怎么運(yùn)作這個(gè)事情感到好奇的話, 去看看運(yùn)行時(shí)包的cgocall.c文件的注釋吧.
SQLite是ANSI-C的源代碼。在使用之前必須要編譯成機(jī)器碼。這篇文章是用于各種編譯SQLite方法的指南。
這篇文章不包含編譯SQLite的每個(gè)步驟的反饋,那樣可能會(huì)困難因?yàn)槊糠N開發(fā)場(chǎng)景都不同。所以這篇文章描述和闡述了編譯Sqlite的原則。典型的編譯命令已經(jīng)作為例子提供了,以期望應(yīng)用開發(fā)者能夠使用這些例子作為完成他們自己定制的編譯過程的的一個(gè)指南。換句話說,這篇文章提供了想法和見解,而不是交鑰匙的解決方法。
融合VS單獨(dú)源文件
Sqlite是由超過一百個(gè)c源碼文件以及眾多的目錄下的腳本構(gòu)建的。Sqlite的實(shí)現(xiàn)是純粹的ANSI-C,但是許多C語言源代碼文件是由輔助的C程序生成或者轉(zhuǎn)換來的,并且AWK,SED和TCL腳本會(huì)融合到完成的sqlite庫中。對(duì)Sqlite構(gòu)建需要的C程序和轉(zhuǎn)換和創(chuàng)建C語言源碼是一個(gè)復(fù)雜的過程。
為了簡(jiǎn)化這些,sqlite也通過一個(gè)預(yù)打包的合并后的源碼文件:sqlite3.c。這個(gè)合并文件是一個(gè)ANSI-C源碼實(shí)現(xiàn)整個(gè)SQLite庫的唯一文件。合并后的文件更容易處理。所有的東西都包含在這一個(gè)文件里,所以很容易進(jìn)入一個(gè)更大的C或者C++程序的源碼樹。所有的代碼生成和轉(zhuǎn)換步驟都已經(jīng)實(shí)現(xiàn)了,因此沒有輔助的C程序需要去配置和變異,也沒有腳本需要去運(yùn)行。并且,因此所有哭都包含在一個(gè)翻譯單元,編譯器可以做更多高級(jí)的優(yōu)化從而提升5%到10%的性能。因?yàn)檫@些原因,融合后的源碼文件sqlite3.c對(duì)所有程序來講都是值得推薦的。
推薦所有的應(yīng)用程序使用融合文件。
直接從單獨(dú)的源碼文件中構(gòu)建sqlite當(dāng)然可以,但是并不推薦。對(duì)一些特殊的應(yīng)用程序,可能需要修改構(gòu)建程序去處理使用那些從網(wǎng)站上下載的預(yù)構(gòu)建的源碼文件不能完成的情況。對(duì)于這些情況,推薦構(gòu)建和使用一個(gè)定制過的合并文件。換句話說,即使一個(gè)工程需要以單獨(dú)的源碼文件構(gòu)建sqlite,仍然推薦使用一個(gè)融合后的源碼文件作為一個(gè)中間步驟。
編譯命令行接口(CLI)
構(gòu)建命令行接口需要三個(gè)源碼文件:
sqlite3.c:Sqlite融合的源碼文件
sqlite3.h:匹配sqlite3.c以及定義sqlite的c語言接口的頭文件
shell.c:命令行接口程序本身。這個(gè)c源碼文件包含一個(gè)main()的例程和每輪循環(huán)的用戶輸入的提示符并將輸入傳給sqlite數(shù)據(jù)庫引擎用于處理。
所有的上述源碼的三個(gè)文件都被包含在下載頁面的amalgamation tarball中。
為了構(gòu)建CLI,簡(jiǎn)單的將這三個(gè)文件放置在相同的目錄下然后一起編譯他們。用MSVC:
cl shell.c sqlite3.c -Fesqlite3.exe
在unix系統(tǒng)上(或者在windows上用cygwin或者mingw+msys)典型的命令會(huì)有些像這樣:
gcc shell.c sqlite3.c -lpthread -ldl
為了SQLite線程安全,需要pthreads庫。但是因?yàn)镃LI是一個(gè)單線程的,我們可以指示SQLite構(gòu)建一個(gè)非線程安全的庫并因此護(hù)綠pthreads庫:
gcc -DSQLITE_THREADSAFE=0 shell.c sqlite3.c -ldl
-ldl庫是在支持動(dòng)態(tài)裝載時(shí)需要,例如sqlite3_load_extension() 接口和load_extension()
SQL function。如果這些特性都不要求,那么我們也可以使用SQLITE_OMIT_LOAD_EXTENSION編譯時(shí)間選項(xiàng)忽略他們。
gcc -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION shell.c sqlite3.c
有人可能想要提供其他的編譯時(shí)間選項(xiàng)(compile-time options),例如SQLITE_ENABLE_FTS3去全文本搜索或者SQLITE_ENABLE_RTREE用于R*樹搜索引擎擴(kuò)展。而有人將正常指定一些編譯優(yōu)化開關(guān)。(預(yù)編譯的CLI可以從選擇sqlite網(wǎng)站上使用“-Os”下載下來)有無數(shù)種可能的變數(shù)在這里。
關(guān)鍵點(diǎn)在這里:構(gòu)建CLI需要編譯一起兩個(gè)C語言文件。shell.c文件包含入口的定義和用戶輸入的loop,而sqlite融合文件sqlite3.c包含完整的sqlite庫的實(shí)現(xiàn)。
編譯TCL接口
sqlite的tcl接口是一個(gè)小的模塊被添加到一般的融合文件中。結(jié)果是一個(gè)新的融合后的源碼文件,稱之為“tclsqlite3.c”。這個(gè)源碼文件是生成一個(gè)可以使用TCL
load命令去加載到一個(gè)標(biāo)準(zhǔn)的tclsh或者wish中,或者隨著sqlite構(gòu)建成功生成一個(gè)單獨(dú)唯一的tclsh的共享庫所需要的。一個(gè)tcl的融合的副本被包含在下載頁的TEA
tarball中作為一個(gè)文件。
為了生成一個(gè)linux上的sqlite的TCL-loadable庫,下面的命令需要滿足:
gcc -o libtclsqlite3.so -shared tclsqlite3.c -lpthread -ldl -ltcl
不幸的是構(gòu)建Mac OS X 和 Windows的共享庫并不是如此簡(jiǎn)單。對(duì)于這些平臺(tái)最好使用包含在TEA tarball中的configure腳本和makefile.
為了生成一個(gè)單獨(dú)的tclsh,可以用于sqlite靜態(tài)鏈接,使用如下的編譯器調(diào)用:
gcc -DTCLSH=1 tclsqlite3.c -ltcl -lpthread -ldl -lz -lm
這里的技巧是-DTCLSH=1選項(xiàng)。sqlite的TCL接口模塊包含一個(gè)main的過程,用于初始化一個(gè)TCL解釋器并在以-DTCLSH=1編譯后進(jìn)入到一個(gè)命令行l(wèi)oop。上述命令可以工作在Linux和Mac
OS X,雖然有時(shí)可能需要依賴于平臺(tái)調(diào)整庫選項(xiàng)以及編譯的TCL的哪一個(gè)版本。
構(gòu)建融合文件
下載頁提供的sqlite融合文件的版本對(duì)大多數(shù)用戶來說是足夠的。然而,一些工程可能想要或者需要構(gòu)建他們自己的融合文件。一個(gè)常見的構(gòu)建一個(gè)定制的融合文件的理由是為了使用特定的compile-time options來定制sqlite庫。回想sqlite融合文件中包含了許多C代碼由輔助程序和腳本生成。許多的編譯時(shí)間選項(xiàng)影響這一成圣代碼而且必須在融合文件組裝前提供給代碼生成器。這一系列必須傳給代碼生成器的編譯時(shí)間相關(guān)的選項(xiàng)會(huì)使得sqlite的發(fā)布版本各不相同,但是在寫這邊文章的時(shí)候,代碼生成器需要知道的這組選項(xiàng)包括:
SQLITE_ENABLE_UPDATE_DELETE_LIMIT
SQLITE_OMIT_ALTERTABLE
SQLITE_OMIT_ANALYZE
SQLITE_OMIT_ATTACH
SQLITE_OMIT_AUTOINCREMENT
SQLITE_OMIT_CAST
SQLITE_OMIT_COMPOUND_SELECT
SQLITE_OMIT_EXPLAIN
SQLITE_OMIT_FOREIGN_KEY
SQLITE_OMIT_PRAGMA
SQLITE_OMIT_REINDEX
SQLITE_OMIT_SUBQUERY
SQLITE_OMIT_TEMPDB
SQLITE_OMIT_TRIGGER
SQLITE_OMIT_VACUUM
SQLITE_OMIT_VIEW
SQLITE_OMIT_VIRTUALTABLE
為了構(gòu)建一個(gè)定制的融合文件,先下載原始的獨(dú)立源碼文件到一個(gè)unix或者類unix開發(fā)平臺(tái)。確定獲取的原始源碼文件不是“預(yù)編譯過的源文件”。任何人都可以通過到下載頁或者直接從configuration management system.獲取完整的一套原始源碼文件。
假設(shè)sqlite源碼樹被存在一個(gè)名為“sqlite”的目錄下。計(jì)劃構(gòu)建一個(gè)平行目錄下的名為“bld”的融合文件。首先通過運(yùn)行sqlite源碼樹種的configure腳本運(yùn)行或者通過制作一份源碼樹頂層的的makfile模板的一份,來構(gòu)建一個(gè)合適的makefile.然后手動(dòng)編輯這個(gè)Makfile去包含需要的編譯時(shí)間相關(guān)的選項(xiàng)。最終運(yùn)行:
make sqlite3.c
在windows上使用MSVC:
nmake /f Makefile.msc sqlite3.c
sqlite3.c的make
target會(huì)自動(dòng)構(gòu)造一般的“sqlite3.c”合并的源碼文件,以及它的頭文件“sqlite3.h”,和包含TCL接口的融合源碼文件“tclsqlite3.c”。之后,需要的文件可以被拷貝到文件目錄下然后根據(jù)上述勾勒的過程編譯。
構(gòu)建一個(gè)windows的動(dòng)態(tài)鏈接庫DLL
為了在windows構(gòu)建一個(gè)sqlite的dll使用,首先獲取對(duì)應(yīng)的融合過的源碼文件,sqlit3.c和sqlite.h。這些可以從SQLite website上下載或者和上述告知的一樣去定制生成。
使用工作目錄下的源碼文件,一個(gè)dll可以在msvc中使用如下命令生成:
cl sqlite3.c -link -dll -out:sqlite3.dll
上述命令需要運(yùn)行在msvc的MSVC Native Tools Command
Prompt.如何你已經(jīng)在機(jī)器上安裝了msvc,你可能有多個(gè)版本的這種命令提示符,針對(duì)于x86和x64的自帶構(gòu)建的,或者交叉編譯到ARM的。依賴要求的DLL去使用對(duì)應(yīng)合適的命令提示符工具。
如果使用MinGW編譯器,命令是這樣的:
gcc -shared sqlite3.c -o sqlite3.dll
注意MinGW只生成32位的dll。另有一個(gè)分開的MinGW64工程可以用來生成64位的dll??梢酝茢嗥涿钚姓Z法是類似的。需要注意的是最近的MSVC的版本生成的DLLs可能不能工作到WinXP或者更早版本的windows上。因此為了最大限度的兼容你的生成的dll,推薦MinGW。一個(gè)好的經(jīng)驗(yàn)法則是使用MinGW去生成32位的dlls,使用msvc去生成64位的dlls。
go/src/go-cve-dictionary-master
# mv subcommands-master /opt/go/src/subcommands
# mv net-master /opt/go/src/net
# mv go-sqlite3-master /opt/go/src/go-sqlite3
都放到了go/src目錄下了,我還修改了go-cve-dictionary-master/main.go文件內(nèi)容,如下所示:
import (
"flag"
"fmt"
"os"
"golang.org/x/net/context" 改為 “context”
"github.com/google/subcommands" 改為 subcommands
"github.com/kotakanbe/go-cve-dictionary/commands" 改為 go-cve-dictionary/commands
"github.com/kotakanbe/go-cve-dictionary/version" 改為 go-cve-dictionary/version
_ "github.com/mattn/go-sqlite3" 改為 go-sqlite3
)
執(zhí)行 # go install go-cve-dictionary-master 錯(cuò)誤如下:
can't load package: /opt/go/src/go-cve-dictionary-master/main.go:14:2: non-standard import "github.com/mattn/go-sqlite3" in standard package "go-cve-dictionary-master"
go-cve-dictionary-master/main.go:11:2: cannot find package "go-cve-dictionary/commands" in any of:
/opt/go/src/vendor/go-cve-dictionary/commands (vendor tree)
/opt/go/src/go-cve-dictionary/commands (from $GOROOT)
/root/go/src/go-cve-dictionary/commands (from $GOPATH)
go-cve-dictionary-master/main.go:12:2: cannot find package "go-cve-dictionary/version" in any of:
/opt/go/src/vendor/go-cve-dictionary/version (vendor tree)
/opt/go/src/go-cve-dictionary/version (from $GOROOT)
/root/go/src/go-cve-dictionary/version (from $GOPATH)
subcommands/subcommands.go:29:2: cannot find package "golang.org/x/net/context" in any of:
/opt/go/src/vendor/golang.org/x/net/context (vendor tree)
/opt/go/src/golang.org/x/net/context (from $GOROOT)
/root/go/src/golang.org/x/net/context (from $GOPATH
SQLite數(shù)據(jù)庫通常存儲(chǔ)在單個(gè)普通磁盤文件中。但是,在某些情況下,數(shù)據(jù)庫可能存儲(chǔ)在內(nèi)存中。
強(qiáng)制SQLite數(shù)據(jù)庫單純的存在于內(nèi)存中的最常用方法是使用特殊文件名“ :memory: ” 打開數(shù)據(jù)庫。換句話說,不是將真實(shí)磁盤文件的名稱傳遞給sqlite3_open(),sqlite3_open16()或 sqlite3_open_v2()函數(shù)之一,而是傳入字符串“:memory:”。例如:
調(diào)用此接口完成后,不會(huì)打開任何磁盤文件。而是在內(nèi)存中創(chuàng)建一個(gè)新的數(shù)據(jù)庫。數(shù)據(jù)庫連接關(guān)閉后,數(shù)據(jù)庫就不再存在。每一個(gè)memory數(shù)據(jù)庫彼此不同。因此,打開兩個(gè)數(shù)據(jù)庫連接,每個(gè)數(shù)據(jù)庫連接的文件名為“:memory:”,將創(chuàng)建兩個(gè)獨(dú)立的內(nèi)存數(shù)據(jù)庫。
特殊文件名“:memory:”可用于允許數(shù)據(jù)庫文件名的任何位置。例如,它可以被用作 文件名 中的ATTACH命令:
請(qǐng)注意,為了應(yīng)用特殊的“:memory:”名稱并創(chuàng)建純內(nèi)存數(shù)據(jù)庫,文件名中不能有其他文本。因此,可以通過添加路徑名在文件中創(chuàng)建基于磁盤的數(shù)據(jù)庫,如下所示: "./:memory:"。
使用URI文件名時(shí),特殊的“:memory:”文件名也可以使用。例如:
要么,
如果使用URI文件名打開內(nèi)存數(shù)據(jù)庫,則允許它們使用共享緩存。如果使用未加修飾的“:memory:”名稱來指定內(nèi)存數(shù)據(jù)庫,那么該數(shù)據(jù)庫始終具有專用高速緩存,并且僅對(duì)最初打開它的數(shù)據(jù)庫連接可見。但是,可以通過兩個(gè)或多個(gè)數(shù)據(jù)庫連接打開相同的內(nèi)存數(shù)據(jù)庫,如下所示:
要么,
這允許單獨(dú)的數(shù)據(jù)庫連接共享相同的內(nèi)存數(shù)據(jù)庫。當(dāng)然,共享內(nèi)存數(shù)據(jù)庫的所有數(shù)據(jù)庫連接都需要在同一個(gè)進(jìn)程中。當(dāng)數(shù)據(jù)庫的最后一個(gè)連接關(guān)閉時(shí),將自動(dòng)刪除數(shù)據(jù)庫并回收內(nèi)存。
如果在單個(gè)進(jìn)程中需要兩個(gè)或多個(gè)不同同時(shí)可共享的內(nèi)存數(shù)據(jù)庫,則mode = memory查詢參數(shù)可與URI文件名一起使用以創(chuàng)建命名的內(nèi)存數(shù)據(jù)庫:
要么,
當(dāng)以這種方式命名內(nèi)存數(shù)據(jù)庫時(shí),它將僅與使用完全相同名稱的另一個(gè)連接共享其緩存。
當(dāng)傳遞給sqlite3_open()或 ATTACH的數(shù)據(jù)庫文件的名稱是空字符串時(shí),則會(huì)創(chuàng)建一個(gè)新的臨時(shí)文件來保存數(shù)據(jù)庫。
每次都會(huì)創(chuàng)建一個(gè)不同的臨時(shí)文件,因此就像使用特殊的“:memory:”字符串一樣,兩個(gè)到臨時(shí)數(shù)據(jù)庫的數(shù)據(jù)庫連接都有自己的私有數(shù)據(jù)庫。創(chuàng)建它們的連接關(guān)閉時(shí),將自動(dòng)刪除臨時(shí)數(shù)據(jù)庫。
即使為每個(gè)臨時(shí)數(shù)據(jù)庫分配了磁盤文件,實(shí)際上臨時(shí)數(shù)據(jù)庫通常駐留在內(nèi)存中的pager緩存中,因此“:memory:”創(chuàng)建的純內(nèi)存數(shù)據(jù)庫與臨時(shí)數(shù)據(jù)庫之間的差別很小。由空文件名創(chuàng)建。唯一的區(qū)別是“:memory:”數(shù)據(jù)庫必須始終保留在內(nèi)存中,而如果數(shù)據(jù)庫變大或SQLite受到內(nèi)存壓力,臨時(shí)數(shù)據(jù)庫的某些部分可能會(huì)刷新到磁盤。
前面的段落描述了默認(rèn)SQLite配置下臨時(shí)數(shù)據(jù)庫的行為。如果需要,應(yīng)用程序可以使用 temp_store編譯指示和SQLITE_TEMP_STORE編譯時(shí)參數(shù)來強(qiáng)制臨時(shí)數(shù)據(jù)庫表現(xiàn)為純內(nèi)存數(shù)據(jù)庫。
分享名稱:包含sqlite純go語言的詞條
本文URL:http://www.yijiale78.com/article12/hcsedc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、定制網(wǎng)站、App開發(fā)、企業(yè)建站、自適應(yīng)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)