使用SQLite擴展函數來定義自己的函數
使用C/C++操作sqlite數據庫進行GIS數據轉換時,sqlite不能在sql中定義枚舉量和常量。當程序設計中需要很多枚舉量的時候,比如道路表中道路類型列就是枚舉量:0表示高速,1表示國道,2表示省道,3表示縣道等,又不能在sql中定義這些枚舉量,我們該怎么解決呢?
通過搜索引擎知道sqlite可以讓用戶自己擴展sql函數,感覺可以使用sqlite擴展函數來解決這個問題。sqlite擴展sql函數的方法和步驟:首先按sqlite擴展函數的原型定義自己的函數,然后使用sqlite3_create_function注冊到sqlite中,然后就可以在sql中使用自己定義的函數了,就跟使用預定義好的sqlite核心函數一樣。
例如,我們可以把高速類型定義成一個擴展函數,這個函數返回0:
- static void fun_ROAD_TYPE_HIGHWAY( sqlite3_context * context, int argc, sqlite3_value ** value ) { sqlite3_result_int64( context, 0 ); };
然后把它注冊到sqlite中,注冊名為ROAD_TYPE_HIGHWAY:
- sqlite3_create_function( db, "ROAD_TYPE_HIGHWAY", 0, SQLITE_ANY, 0, fun_ROAD_TYPE_HIGHWAY, 0, 0 )
注冊完后我們就可以在sql語句中通過注冊名ROAD_TYPE_HIGHWAY來使用這個函數了,如:選出所有高速的sql可以寫成select * from road_table where road_type = ROAD_TYPE_HIGHWAY(),這樣是不是好多了。
由于GIS數據庫中的枚舉量居多,如果每個都要手工寫個函數并注冊,這肯定是一個超級體力活,所以用perl寫了一個根據c/c++頭文件生成sqlite擴展函數的小程序:http://files.cnblogs.com/adgnat/sqlitefungen.7z
程序使用方法:
1.確保安裝了perl5和vc。
2.下載程序并解壓。
3.打開cmd.exe,并進入程序(sqlitefungen)目錄。
4.運行vcvars32.bat初始化VC編譯環境。
5.執行自動生成腳本:perl sqlitefungen.perl mydb.h,mydb.h可以換成自己定義的頭文件。
6.執行完后頭文件目錄下將生成一個同名的dll文件,你可以在sqlite3.exe中使用.load命令或sql中使用load_extension函數來加載該dll,加載后就可以使用dll中定義的擴展函數了。
關于SQLite擴展函數的知識就介紹到這里,希望看完之后您能有所收獲,因為您的收獲就是我***的快樂!
【編輯推薦】