/* ----------------------------------------------------------------------------- This source file is part of OpenSpace3D For the latest info, see http://www.openspace3d.com Copyright (c) 2018 I-maginer This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA, or go to http://www.gnu.org/copyleft/lesser.txt ----------------------------------------------------------------------------- */ struct PSQLiteQuery = [ PSQLIQ_sName : S, PSQLIQ_sQuery : S, PSQLIQ_sOutput : S ] mkSQLiteQuery;; struct PlugSQLite = [ PSQLI_inst : PInstance, PSQLI_sName : S, PSQLI_bMem : I, PSQLI_sInitSql : S, PSQLI_db : ObjSqlite, PSQLI_lQuery : [[S PSQLiteQuery] r1], PSQLI_bUtf8 : I ] mkPlugSQLite;; /* //Tests _sqliteExec obstr.PSQLI_db "SELECT * FROM myTable"; _sqliteExec obstr.PSQLI_db "CREATE TABLE `NewTable` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL, `value` TEXT NOT NULL);"; let _sqliteExecResult obstr.PSQLI_db "SELECT * FROM myTable" -> lraw in while (lraw != nil) do ( addLogMessage ">> raw"; let hd lraw -> lfield in while (lfield != nil) do ( let hd lfield -> [n v] in addLogMessage strcatn "Name: "::n::" > Value: "::v::nil; set lfield = tl lfield; ); set lraw = tl lraw; ); */ fun deleteOb(inst, obstr)= _sqliteClose obstr.PSQLI_db; 0;; fun writeData(obstr, data)= if (obstr.PSQLI_bUtf8) then strtoutf8 data else data;; fun readData(obstr, data)= if (obstr.PSQLI_bUtf8) then utf8tostr data else data;; fun cbExecQuery(inst, from, action, param, rep, obstr)= let _sqliteExecResult obstr.PSQLI_db (writeData obstr param) -> lraw in while (lraw != nil) do ( //addLogMessage ">> raw"; let hd lraw -> lfield in let "" -> out in ( while (lfield != nil) do ( let hd lfield -> [n v] in ( if ((strlen out) == 0) then set out = v else set out = strcatn out::" "::v::nil; //addLogMessage strcatn "Name: "::n::" > Value: "::v::nil; ); set lfield = tl lfield; ); SendPluginEvent inst "Result" (readData obstr out) nil; ); set lraw = tl lraw; ); 0;; fun cbExecThisQuery(inst, from, action, param, rep, obstr, qstr)= // replace $0, $1.. and %var% let _DMSreadParam param qstr.PSQLIQ_sQuery -> squery in let _sqliteExecResult obstr.PSQLI_db (writeData obstr squery) -> lraw in let if (strfindi "$" qstr.PSQLIQ_sOutput 0) == nil then 0 else 1 -> template in while (lraw != nil) do ( //addLogMessage ">> raw"; let hd lraw -> lfield in let if (template) then qstr.PSQLIQ_sOutput else "" -> out in ( while (lfield != nil) do ( let hd lfield -> [n v] in ( if (template) then ( set out = strreplace out (strcat "$" n) v; ) else ( if ((strlen out) == 0) then set out = v else set out = strcatn out::" "::v::nil; ); //addLogMessage strcatn "Name: "::n::" > Value: "::v::nil; ); set lfield = tl lfield; ); SendPluginEvent inst (strcat "Result " qstr.PSQLIQ_sName) (readData obstr out) nil; ); set lraw = tl lraw; ); 0;; fun loadQueries(inst, obstr)= let nil -> l in let nil -> query in let 0 -> i in ( while ((set query = getPluginInstanceParam inst (strcat "queryName" (itoa i))) != nil) do ( let getPluginInstanceParam inst (strcat "querySql" (itoa i)) -> sql in let getPluginInstanceParam inst (strcat "queryOut" (itoa i)) -> out in let mkSQLiteQuery[query sql out] -> qstr in ( set l = [query qstr]::l; PluginRegisterAction inst (strcat "Exec " query) mkfun6 mkfun7 @cbExecThisQuery qstr obstr; ); set i = i + 1; ); set obstr.PSQLI_lQuery = revertlist l; );; fun loadDb(inst, from, action, param, rep, obstr)= if ((param == nil) || (!strcmp param "")) then nil else set obstr.PSQLI_sName = param; if (obstr.PSQLI_db == nil) then nil else ( _sqliteClose obstr.PSQLI_db; set obstr.PSQLI_db = nil; ); //init database let 0 -> newdb in //create an empty file if needed for a new database, so _storepack succeed let if (((_checkpack obstr.PSQLI_sName) == nil) && !obstr.PSQLI_bMem) then (_storepack "" obstr.PSQLI_sName; set newdb = 1;) else nil -> _ in //copy db from android assets to user partition let if ((_platform == SCOL_PLATFORM_ANDROID) && ((_checkpack obstr.PSQLI_sName) != nil)) then _storepack (_getpack _checkpack obstr.PSQLI_sName) obstr.PSQLI_sName else nil -> _ in let if (obstr.PSQLI_bMem) then _sqliteOpenMemory _channel else _sqliteOpenFile _channel _checkpack obstr.PSQLI_sName -> db in ( set obstr.PSQLI_db = db; //call the db creation script only when it's a new one if (!newdb && !obstr.PSQLI_bMem) then nil else ( //addLogMessage strcat "init: " obstr.PSQLI_sInitSql; _sqliteExec obstr.PSQLI_db (writeData obstr obstr.PSQLI_sInitSql); ); ); SendPluginEvent inst "Database loaded" nil nil; 0;; fun newOb(inst)= let getPluginInstanceParam inst "dbname" -> dbname in let atoi (getPluginInstanceParam inst "dbmem") -> dbmem in let if (dbmem == nil) then 0 else dbmem -> dbmem in let if ((dbname == nil) || (!strcmp dbname "")) then 1 else dbmem -> dbmem in let getPluginInstanceParam inst "initsql" -> initsql in let if (initsql == nil) then "" else initsql -> initsql in let atoi getPluginInstanceParam inst "dbutf8" -> dbutf8 in let if (dbutf8 == nil) then 0 else dbutf8 -> dbutf8 in let mkPlugSQLite [inst dbname dbmem initsql nil nil dbutf8] -> obstr in ( loadQueries inst obstr; PluginRegisterAction inst "Change database" mkfun6 @loadDb obstr; PluginRegisterAction inst "Exec" mkfun6 @cbExecQuery obstr; loadDb inst nil nil nil nil obstr; setPluginInstanceCbDel inst mkfun2 @deleteOb obstr; ); 0;; fun IniPlug(file)= PlugRegister @newOb nil; setPluginEditor @dynamicedit; 0;;