Code: Select all
EnableExplicit
UseSQLiteDatabase()
UseMySQLDatabase()
#SQLITE_DB = 10
#MYSQL_DB = 11
Structure dbColumn
ColumnIndex.i
ColumnName.s
ColumnType.i
ColumnSize.i
EndStructure
Macro FixApostrophe(Text)
ReplaceString(ReplaceString(Text, "'", "''"), "\", "\\")
EndMacro
Procedure CheckDatabaseUpdate(Database, Query$)
Protected Result = DatabaseUpdate(Database, Query$)
If Result = 0
Debug DatabaseError()
Debug Query$
EndIf
ProcedureReturn Result
EndProcedure
Procedure MapDatabaseFields(hDB, Map dbFields.dbColumn())
Protected TotalCols
Protected CurrField
Protected sFldName.s
TotalCols = (DatabaseColumns(hDB) - 1)
For CurrField = 0 To TotalCols
sFldName = UCase(DatabaseColumnName(hDB, CurrField))
AddMapElement(dbFields(), sFldName)
dbFields()\ColumnIndex = CurrField
dbFields()\ColumnName = sFldName
dbFields()\ColumnType = DatabaseColumnType(hDB, CurrField)
dbFields()\ColumnSize = DatabaseColumnSize(hDB, CurrField)
Next
EndProcedure
Procedure.s FixNumbers(Text.s, FieldNo, Map dbFields.dbColumn())
Protected Result$ = Text
ForEach dbFields()
With dbFields()
If (\ColumnIndex = FieldNo)
Select \ColumnType
Case #PB_Database_Long, #PB_Database_Float, #PB_Database_Double, #PB_Database_Quad
If (Len(Text) = 0)
Result$ = "0"
EndIf
Default
Result$ = Text
EndSelect
Break
EndIf
EndWith
Next
ProcedureReturn Result$
EndProcedure
Procedure MigrateDBFromSQLite2MySQL(SQLiteDB$, MySQLDB$, MySQLUser$, MySQLPwd$, List Tables.s())
Protected Query$
Protected Table$
Protected PreFix$
Protected Record$
Protected hFile
Protected i
Protected SQLFile$
Protected Command$
Protected String$
Protected IsBLOB = #False
Protected Result = #False
;~ Protected NewList Tables.s()
Protected NewList Commands.s()
Protected NewMap dbFields.dbColumn()
Debug ElapsedMilliseconds()
If (OpenDatabase(#MYSQL_DB, MySQLDB$, MySQLUser$, MySQLPwd$, #PB_Database_MySQL))
If (OpenDatabase(#SQLITE_DB, SQLiteDB$, "", "", #PB_Database_SQLite))
DatabaseQuery(#MYSQL_DB, "SET NAMES 'utf8'")
FinishDatabaseQuery(#MYSQL_DB)
DatabaseQuery(#MYSQL_DB, "SET CHARACTER SET 'utf8'")
FinishDatabaseQuery(#MYSQL_DB)
If (ListSize(Tables()) = 0)
If DatabaseQuery(#MYSQL_DB, "SHOW TABLES;")
;~ Get all tables from database
While NextDatabaseRow(#MYSQL_DB)
Table$ = GetDatabaseString(#MYSQL_DB, 0)
AddElement(Tables())
Tables() = Table$
Debug Table$
Wend
FinishDatabaseQuery(#MYSQL_DB)
EndIf
EndIf
SQLFile$ = GetPathPart(SQLiteDB$) + "_SQLite2MySQL_" + FormatDate("%yyyy-%mm-%dd-%hh-%ii-%ss", Date()) + ".sql"
hFile = CreateFile(#PB_Any, SQLFile$)
;~ Get all fields and attributes from each table
ForEach Tables()
;~ Delete any previous record
AddElement(Commands())
Commands() = "DELETE FROM " + Tables() + ";"
Debug Tables()
PreFix$ = "INSERT INTO `" + Tables() + "` ("
If (DatabaseQuery(#SQLITE_DB, "SELECT * FROM " + Tables() + " LIMIT 1;"))
;~ Map the table definition
ClearMap(dbFields())
MapDatabaseFields(#SQLITE_DB, dbFields())
For i = 0 To (DatabaseColumns(#SQLITE_DB) - 1)
PreFix$ + "`" + DatabaseColumnName(#SQLITE_DB, i) + "`, "
Next
PreFix$ = Mid(PreFix$, 1, Len(PreFix$)-2) + ") VALUES("
FinishDatabaseQuery(#SQLITE_DB)
;~ Get all records
If (DatabaseQuery(#SQLITE_DB, "SELECT * FROM " + Tables() + ";"))
While NextDatabaseRow(#SQLITE_DB)
Record$ = ""
For i = 0 To (DatabaseColumns(#SQLITE_DB) - 1)
String$ = FixApostrophe(FixNumbers(GetDatabaseString(#SQLITE_DB, i), i, dbFields.dbColumn()))
Record$ + "'" + String$ + "', "
Next
Record$ = Mid(Record$, 1, Len(Record$)-2) + ");"
;~ Add to commands
AddElement(Commands())
Commands() = PreFix$ + Record$
;~ Debug Commands()
WriteStringN(hFile, PreFix$ + Record$)
Wend
FinishDatabaseQuery(#SQLITE_DB)
EndIf
EndIf
Next
CloseFile(hFile)
Debug ElapsedMilliseconds()
Debug ListSize(Commands())
;~ Write Data to database
CheckDatabaseUpdate(#MYSQL_DB, "BEGIN;")
;hFile = ReadFile(#PB_Any, SQLFile$)
;~ If (hFile)
;~ While Eof(hFile) = 0
;~ Command$ = ReadString(hFile)
;~ CheckDatabaseUpdate(#MYSQL_DB, ReFixEnter(Command$))
;~ Wend
;~ CloseFile(hFile)
;~ EndIf
ForEach Commands()
CheckDatabaseUpdate(#MYSQL_DB, Commands())
Next
CheckDatabaseUpdate(#MYSQL_DB, "COMMIT;")
CloseDatabase(#SQLITE_DB)
CloseDatabase(#MYSQL_DB)
EndIf
EndIf
EndProcedure
Define NewList Tables.s()
AddElement(Tables()): Tables() = "Invoices"
MigrateDBFromSQLite2MySQL("thanos.db", "host=localhost port=3306 dbname='test'", "root", "", Tables())