On 7-11-2011 8:23, Reinier Olislagers wrote:
> 2. You can apparently load the spatialite (and dependencies) dll/so as
> an extension to SQLite, with a statement like [3]
> select load_extension('libspatialite-4.dll');
> However, it seems you have to enable the extension load mechanism first
> using the C API [2]:
> int sqlite3_enable_load_extension(sqlite3 *db, int onoff);
> (onoff==1 to turn extension loading on)

Attached diff (against fixes_2_6) seems to work for letting SQLite load
the libspatialite extension, e.g. using this in my Lazarus FormCreate event:
// Try to load extensions
DBConnection.DatabaseName:='osm.sqlite';
DBConnection.Open;
DBConnection.LoadExtension('libspatialite-4.dll');
//Note: we need an open db before doing this

Now I'm getting an error message saying that libfreexl-1.dll can't be
found, apparently an Excel reader library required by spatialite...
I'm going to ask the spatialite guys for clarification on this...

I'll upload the diff as a patch unless somebody has objections/a better
implementation...

Thanks,

Reinier
Index: packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp
===================================================================
--- packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp     (revision 19599)
+++ packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp     (working copy)
@@ -89,6 +89,7 @@
     constructor Create(AOwner : TComponent); override;
     function GetInsertID: int64;
     procedure GetFieldNames(const TableName : string; List :  TStrings); 
override;
+    procedure LoadExtension(LibraryFile: string);
   published
     property Options: TSqliteOptions read FOptions write SetOptions;
   end;
@@ -883,6 +884,24 @@
   GetDBInfo(stColumns,TableName,'name',List);
 end;
 
+procedure Tsqlite3connection.LoadExtension(Libraryfile: String);
+var
+  LoadResult: integer;
+begin
+  CheckConnected; //Apparently we need a connection before we can load 
extensions.
+  try
+    LoadResult:=SQLITE_ERROR; //Default to failed
+    sqlite3_enable_load_extension(fhandle, 1); //Make sure we are allowed to 
load
+    LoadResult:=sqlite3_load_extension(fhandle, PChar(LibraryFile), nil, nil); 
//Actually load extension
+    if LoadResult=SQLITE_ERROR then
+      begin
+      DatabaseError('LoadExtension: failed to load SQLite extension (SQLite 
returned an error while loading).',Self);
+      end;
+  except
+    DatabaseError('LoadExtension: failed to load SQLite extension.',Self);
+  end;
+end;
+
 procedure TSQLite3Connection.setoptions(const avalue: tsqliteoptions);
 begin
  if avalue <> foptions then 
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to