Its an amazing trick, this :memory: function, thank you for posting.
Its so fast, you can create your own OLAP System.
Its a pity that its so slowly writing, because I dont know how to use the ".import" SQLite command in PureBasic. Maybe somebody has an idea, because its the fastest way to write DB from memory back into file. As far as I know.
regards
Amnesty
Code: Select all
Structure table
sql.s
name.s
EndStructure
Procedure OpenSQLiteDatabase2Mem(database.l, file.s, user.s, pass.s)
NewList createStatement.table()
source = OpenDatabase(#PB_Any, File, User, Pass, #PB_Database_SQLite)
If source
DatabaseQuery(source, "Select sql, name FROM sqlite_master WHERE type='table'")
While NextDatabaseRow(source)
AddElement(createStatement())
createStatement()\sql = GetDatabaseString(source, 0)
createStatement()\name = GetDatabaseString(source, 1)
Wend
If OpenDatabase(database, ":memory:", "", "", #PB_Database_SQLite)
ForEach createStatement()
DatabaseUpdate(database, createStatement()\sql)
DatabaseQuery(source, "select * from " + createStatement()\name)
columns = DatabaseColumns(source)
While NextDatabaseRow(source)
values.s = ""
For columnNr = 0 To columns - 1
If DatabaseColumnType(source, columnNr) = #PB_Database_String Or DatabaseColumnType(source, columnNr) = 0
values+ "'" + GetDatabaseString(source,columnNr) + "'"
Else
values+ GetDatabaseString(source,columnNr)
EndIf
If columnNr < columns -1
values+ ","
EndIf
Next
DatabaseUpdate(database, "insert into " + createStatement()\name + " values(" + values + ")")
Wend
Next
Else
MessageRequester("Error","Can't open DB.",0)
ProcedureReturn
EndIf
CloseDatabase(source)
Else
MessageRequester("Error","Can't open DB.",0)
ProcedureReturn
EndIf
EndProcedure
Procedure WriteSQLiteDatabase2Disk(source.l, File.s)
NewList createStatement.table()
destinationFile = CreateFile(#PB_Any, File.s)
If file
CloseFile(destinationFile)
Else
MessageRequester("Error","Can't write DB.",0)
ProcedureReturn
EndIf
destinationDB = OpenDatabase(#PB_Any, File, "", "", #PB_Database_SQLite)
If destinationDB
DatabaseQuery(source, "Select sql, name FROM sqlite_master WHERE type='table'")
While NextDatabaseRow(source)
AddElement(createStatement())
createStatement()\sql = GetDatabaseString(source, 0)
createStatement()\name = GetDatabaseString(source, 1)
Wend
ForEach createStatement()
DatabaseUpdate(destinationDB, createStatement()\sql)
DatabaseQuery(source, "select * from " + createStatement()\name)
columns = DatabaseColumns(source)
While NextDatabaseRow(source)
values.s = ""
For columnNr = 0 To columns - 1
If DatabaseColumnType(source, columnNr) = #PB_Database_String Or DatabaseColumnType(source, columnNr) = 0
values+ "'" + GetDatabaseString(source,columnNr) + "'"
Else
values+ GetDatabaseString(source,columnNr)
EndIf
If columnNr < columns -1
values+ ","
EndIf
Next
DatabaseUpdate(destinationDB, "insert into " + createStatement()\name + " values(" + values + ")")
Wend
Next
CloseDatabase(destinationDB)
Else
MessageRequester("Error","Can't open DB.",0)
ProcedureReturn
EndIf
EndProcedure
UseSQLiteDatabase()
OpenSQLiteDatabase2Mem(0,"c:\PureBasic.sqlite","","")
WriteSQLiteDatabase2Disk(0, "c:\purebasic_new.sqlite")