Sub Class_Globals
Private xui As XUI
Public sqllib As SQL
End Sub
Public Sub Initialize(folder As String,dbname As String, make As Boolean, reset As Boolean)
#If B4J
xui.SetDataFolder(folder)
#End If
If reset = True Then
File.Delete(xui.DefaultFolder,dbname) ' remove db for testing
End If
If File.Exists(xui.DefaultFolder,dbname) = False Then
#If B4J
sqllib.InitializeSQLite(xui.DefaultFolder,dbname,make)
#Else
sqllib.Initialize(xui.DefaultFolder,dbname,make)
#End If
Else
#If B4J
sqllib.InitializeSQLite(xui.DefaultFolder,dbname,make)
#Else
sqllib.Initialize(xui.DefaultFolder,dbname,make)
#End If
End If
Return
End Sub
Public Sub select_query(sql As String) As ResultSet
Private rs As ResultSet = sqllib.ExecQuery(sql)
Return rs
End Sub
Public Sub select_query_prepared(sql As String, values() As String) As ResultSet
Private rs As ResultSet = sqllib.ExecQuery2(sql,values)
Return rs
End Sub
Public Sub action_query(sql As String, values As List)
sqllib.BeginTransaction
Try
sqllib.ExecNonQuery2(sql,values)
sqllib.TransactionSuccessful
Catch
Log(LastException.Message)
End Try
sqllib.EndTransaction
Return
End Sub
Public Sub get_last_rowid(table As String) As Int
Private rowid As Int = sqllib.ExecQuerySingleResult("SELECT max(rowid) FROM " & table)
Return rowid
End Sub
Public Sub get_num_rows(table As String) As Int
Private numrows As Int = sqllib.ExecQuerySingleResult("SELECT count(*) FROM " & table)
Return numrows
End Sub
Public Sub table_exists(table As String) As Boolean
Private rs As ResultSet = sqllib.ExecQuery2("SELECT name FROM sqlite_master WHERE type='table' AND name=?",Array As String(table))
If rs.RowCount > 0 Then
Return True
Else
Return False
End If
End Sub
public Sub get_tablenames As List
' get all tables (sqlite_schema or sqlite_master)
'Select name from sqlite_schema
'where type ='table' AND name NOT LIKE 'sqlite_%';
Dim lst As List
lst.Initialize
Private rs As ResultSet = sqllib.ExecQuery("SELECT name FROM sqlite_master WHERE type ='table' AND name NOT LIKE 'sqlite_%'")
Do While rs.NextRow
lst.Add(rs.GetString("name"))
Loop
Return lst
End Sub
public Sub get_fieldnames(table As String) As List
Dim lst As List
lst.Initialize
lst.Add("rowid")
Private rs As ResultSet = sqllib.ExecQuery("PRAGMA table_info(" & table & ")")
Do While rs.NextRow
' some fieldnames may contain non alphabetic charaters so enclose them in []
lst.Add("[" & rs.GetString("name") & "]")
'Log(rs.GetString("cid") & " " & rs.GetString("name") & " " & rs.GetString("type"))
Loop
'Log(lst)
Return lst
End Sub
public Sub get_fieldtypes(table As String) As List
Dim lst As List
lst.Initialize
lst.Add("rowid")
Private rs As ResultSet = sqllib.ExecQuery("PRAGMA table_info(" & table & ")")
Do While rs.NextRow
lst.Add(rs.GetString("type"))
'Log(rs.GetString("cid") & " " & rs.GetString("name") & " " & rs.GetString("type"))
Loop
Return lst
End Sub
Public Sub get_structure(table As String) As ResultSet
Dim lst As List
lst.Initialize
Private rs As ResultSet = sqllib.ExecQuery("PRAGMA table_info(" & table & ")")
Return rs
End Sub
Public Sub add_record(tablename As String, valuelst As List)
Dim fldlst As List = get_fieldnames(tablename)
Private sql As String = "INSERT INTO " & tablename & "("
For i = 1 To fldlst.Size-1 ' fldlst.get(0) = rowid
If i < fldlst.Size-1 Then
sql = sql & fldlst.Get(i) & ","
Else
sql = sql & fldlst.Get(i) & ")"
End If
Next
sql = sql & " VALUES ("
For i = 1 To fldlst.Size-1
If i < fldlst.Size-1 Then
sql = sql & "?,"
Else
sql = sql & "?)"
End If
Next
action_query(sql,valuelst)
End Sub
Public Sub change_record(tablename As String, valuelst As List,rowid As Int)
Dim fldlst As List = get_fieldnames(tablename)
Private sql As String = "UPDATE " & tablename & " SET "
For i = 1 To fldlst.Size-1 ' fldlst.get(0) = rowid
If i < fldlst.Size-1 Then
sql = sql & fldlst.Get(i) & " = ?, "
Else
sql = sql & fldlst.Get(i) & " = ? WHERE rowid = " & rowid
End If
Next
action_query(sql,valuelst)
End Sub
Public Sub change_field_content(tablename As String, valuelst As List,rowid As Int,fldname As String)
Private sql As String = "UPDATE " & tablename & " SET "
sql = sql & fldname & " = ? WHERE rowid = " & rowid
action_query(sql,valuelst)
End Sub
Public Sub remove_record(tablename As String,rowid As Int)
Private sql As String = "DELETE FROM " & tablename & " WHERE rowid = ?"
Private lst As List = Array As String(rowid)
action_query(sql,lst)
End Sub
Public Sub select_all_records(tablename As String, orderfld As String) As ResultSet
'Private sql As String = "SELECT rowid, name, reference FROM category ORDER BY name"
Dim fldlst As List = get_fieldnames(tablename)
Private sql As String = "SELECT "
For i = 0 To fldlst.Size-1 ' fldlst.get(0) = rowid
'Log(fldlst.Get(i))
If i < fldlst.Size-1 Then
sql = sql & fldlst.Get(i) & ","
Else
sql = sql & fldlst.Get(i) & ""
End If
Next
sql = sql & " FROM " & tablename
If orderfld <> "" Then
sql = sql & " ORDER BY " & orderfld
End If
Private rs1 As ResultSet = select_query(sql)
Return rs1
End Sub
Public Sub find_record(tablename As String, rowid As Int) As ResultSet
Dim fldlst As List = get_fieldnames(tablename)
Private sql As String = "SELECT "
For i = 0 To fldlst.Size-1 ' fldlst.get(0) = rowid
If i < fldlst.Size-1 Then
sql = sql & fldlst.Get(i) & ","
Else
sql = sql & fldlst.Get(i) & " FROM " & tablename & " WHERE rowid = ?"
End If
Next
Private fldarr() As String = Array As String(rowid)
Private rs1 As ResultSet = select_query_prepared(sql,fldarr)
Return rs1
End Sub
Public Sub export_database(dbname As String, exportfolder As String, importfolder As String,newname As String)
'sqllib.Close
If File.Exists(File.DirInternal, dbname) = True Then
Dim inpstr As InputStream = File.OpenInput(File.DirInternal, dbname)
Dim outstr As OutputStream = File.OpenOutput(exportfolder, newname,False)
File.Copy2(inpstr,outstr)
outstr.Close
' copy to import folder to preserve the changes
Dim inpstr As InputStream = File.OpenInput(File.DirInternal, dbname)
Dim outstr2 As OutputStream = File.OpenOutput(importfolder, newname,False)
File.Copy2(inpstr,outstr2)
outstr2.Close
End If
End Sub
Public Sub import_database(dbname As String,importfolder As String)
Dim inpstr As InputStream = File.OpenInput(importfolder, dbname)
Dim outstr As OutputStream = File.OpenOutput(File.DirInternal, dbname,False)
File.Copy2(inpstr,outstr)
outstr.Close
End Sub