0 Members and 1 Guest are viewing this topic.
oohh! thats stupid.. so no other apps can access the same data?
Quote from: DorkeyDear on July 27, 2009, 06:45:26 pmoohh! thats stupid.. so no other apps can access the same data?Umm. the database file is a normal .sqlite one. Any program that uses SQLITE can open it up and "connect" to the database and read/write to it. At the same time, too.
- Tab - - Tab -MyFirstColumn MySecondColumn MyLastColumnOfMyFirstRow // First row, index = 0MyFirstColumInMySecondRow MySecondColumn MyThirdColumn // Second row, index = 1
var MyColumnObject: TMySSQL_Column;begin SelectColumn(MyTableObject, 0, 1, MyColumnObject);end;
const MySSQL_PATH = './tables/';type TMySSQL_Column = record Offset: word; Value: string; end; TMySSQL_Row = record Columns: array of TMySSQL_Column; Data: string; Cached: boolean; end; TMySSQL_Table = record Rows: array of TMySSQL_Row; Name, Exception: string; Modified, Linked: boolean; end;function GetTypeOF(Value: variant): string;begin case VarType(Value) of 3 : Result:= IntToStr(Value); 5 : Result:= FloatToStr(Value); 11 : Result:= iif(Value, 'true', 'false'); 256: Result:= Value; end;end;function AryVntToAryStr(const AryVnt: array of variant): array of string;var i: integer;begin Result:= []; SetArrayLength(Result, GetArrayLength(AryVnt)); for i:= 0 to GetArrayLength(Result) - 1 do begin Result[i]:= AryVnt[i]; end;end;function Implode(const Source: array of string; const Delimiter: string): string;var i: integer;begin Result:= ''; for i:= 0 to GetArrayLength(Source) - 1 do begin Result:= Result + Source[i] + Delimiter; end;end;function ExplodeRow(Source: string; const Delimiter: string): array of TMySSQL_Row;var x, y, l: integer; b: word;begin l:= length(Delimiter); b:= length(Source); Source:= Source + Delimiter; Result:= []; repeat x:= Pos(Delimiter, Source); SetArrayLength(Result, y + 1); Result[y].Data:= Copy(Source, 1, x - 1); y:= y + 1; Delete(Source, 1, x + l - 1); until (x = 0); SetArrayLength(Result, iif(b = 0, y - 2, y - 1));end;function ReadFromFile(const Path, Filename: string): string;begin Result:= ReadFile(Path + Filename); Result:= Copy(Result, 0, length(Result) - 2);end;function RowExists(const Table: TMySSQL_Table; const Row: word): boolean;begin Result:= GetArrayLength(Table.Rows) - 1 >= Row;end;function ColumnCached(var Table: TMySSQL_Table; const Row, Column: word): boolean;begin if (RowExists(Table, Row)) then begin Result:= GetArrayLength(Table.Rows[Row].Columns) - 1 >= Column; end;end;procedure OnErrorOccur(var Table: TMySSQL_Table; const Method, Message: string);begin Table.Exception:= ' [*] [Error] MySSQL -> (' + Method + '): ' + Message;end;function DumpCacheRow(var Table: TMySSQL_Table; const Row: word): boolean;var Cache: string; i: integer;begin if (not(RowExists(Table, Row))) then begin exit; end; if (Table.Rows[Row].Cached) then begin Cache:= ''; for i:= 0 to GetArrayLength(Table.Rows[Row].Columns) - 1 do begin Cache:= Cache + Table.Rows[Row].Columns[i].Value + #9 ; end; Table.Rows[Row].Data:= Cache; Result:= true; end else begin OnErrorOccur(Table, 'DumpCacheRow', 'Row (' + IntToStr(Row) + ') does not exist'); end;end;procedure DumpCacheTable(var Table: TMySSQL_Table);var i: integer;begin for i:= 0 to GetArrayLength(Table.Rows) - 1 do begin DumpCacheRow(Table, i); end;end;procedure UncacheRow(var Table: TMySSQL_Table; const Row: word);begin if (DumpCacheRow(Table, Row)) then begin Table.Rows[Row].Columns:= []; Table.Rows[Row].Cached:= false; end;end;function SaveTable(var Table: TMySSQL_Table): boolean;var Rows: string; i: integer;begin if (Table.Linked) then begin Rows:= ''; DumpCacheTable(Table); for i:= 0 to GetArrayLength(Table.Rows) - 1 do begin Rows:= Rows + #13#10 + Table.Rows[i].Data; end; Delete(Rows, 1, 2); WriteFile(MySSQL_PATH + Table.Name + '.myssql', Rows); Table.Modified:= false; Result:= true; end else begin OnErrorOccur(Table, 'SaveTable', 'Table is not linked'); end;end;function LoadTable(var Table: TMySSQL_Table; const Tablename: string): boolean;begin if (FileExists(MySSQL_PATH + Tablename + '.myssql')) then begin Table.Rows:= ExplodeRow(ReadFromFile(MySSQL_PATH, Tablename + '.myssql'), #13#10); Table.Name:= Tablename; Table.Linked:= true; Table.Modified:= false; Table.Exception:= ''; Result:= true; end else begin OnErrorOccur(Table, 'LoadTable', 'Unable to load table "' + Tablename + '"'); end;end;function UnloadTable(var Table: TMySSQL_Table): boolean;begin if (Table.Linked) then begin if (Table.Modified) then begin SaveTable(Table); end; Table.Rows:= []; Table.Linked:= false; Table.Name:= ''; Table.Exception:= ''; Result:= true; end else begin OnErrorOccur(Table, 'UnloadTable', 'Table is not linked'); end;end;function CreateTable(var Table: TMySSQL_Table; const Tablename: string): boolean;begin WriteFile(MySSQL_PATH + Tablename + '.myssql', ''); if (LoadTable(Table, Tablename)) then begin Result:= true; end else begin OnErrorOccur(Table, 'CreateTable', 'Unable to create table "' + Tablename + '"'); end;end;procedure DestroyTable(var Table: TMySSQL_Table);begin Table.Rows:= []; Table.Linked:= false; Table.Name:= ''; Table.Exception:= '';end;function CreateRow(var Table: TMySSQL_Table; const Columns: array of variant): word;begin Result:= GetArrayLength(Table.Rows); SetArrayLength(Table.Rows, Result + 1); Table.Rows[Result].Data:= Implode(AryVnttoAryStr(Columns), #9); Table.Modified:= true;end;function DestroyRow(var Table: TMySSQL_Table; const Row: word): boolean;var HIndex: integer;begin if (RowExists(Table, Row)) then begin HIndex:= GetArrayLength(Table.Rows) - 1; if (HIndex <> Row) then begin Table.Rows[Row]:= Table.Rows[HIndex]; end; SetArrayLength(Table.Rows, iif(HIndex > 0, HIndex, 0)); Table.Modified:= true; Result:= true; end else begin OnErrorOccur(Table, 'DestroyRow', 'Row (' + IntToStr(Row) + ') does not exist'); end;end;function FetchColumn(var Table: TMySSQL_Table; const Row, Column: word; var DummyC: TMySSQL_Column): boolean;var Source: string; TPos: integer; x, c: word;begin if (not(RowExists(Table, Row))) then begin exit; end; Source:= Table.Rows[Row].Data; c:= 1; for x:= 0 to Column do begin Delete(Source, 1, TPos); c:= c + TPos; TPos:= Pos(#9, Source); end; if (TPos > 0) then begin DummyC.Value:= Copy(Source, 1, Pos(#9, Source) - 1); DummyC.Offset:= c; Result:= true; end;end;function FetchRowByColumn(var Table: TMySSQL_Table; const Column: word; const Value: variant): integer;var C: TMySSQL_Column; i: integer;begin Result:= -1; for i:= 0 to GetArrayLength(Table.Rows) - 1 do begin if ((FetchColumn(Table, i, Column, C) = true) and (C.Value = Value)) then begin Result:= i; break; end; end;end;function CacheRow(var Table: TMySSQL_Table; const Row: word): boolean;var C: TMySSQL_Column; i, x: word;begin if (RowExists(Table, Row)) then begin if (not(Table.Rows[Row].Cached)) then begin while (FetchColumn(Table, Row, i, C) = true) do begin SetArrayLength(Table.Rows[Row].Columns, x + 1); Table.Rows[Row].Columns[x]:= C; x:= x + 1; i:= i + 1; end; Table.Rows[Row].Cached:= true; Result:= true; end; end else begin OnErrorOccur(Table, 'CacheRow', 'Row (' + IntToStr(Row) + ') does not exist'); end;end;function SetColumn(var Table: TMySSQL_Table; const Row, Column: word; const Value: variant): boolean;var C: TMySSQL_Column; Cached: boolean;begin if (RowExists(Table, Row)) then begin Cached:= Table.Rows[Row].Cached; UnCacheRow(Table, Row); if (FetchColumn(Table, Row, Column, C)) then begin Delete(Table.Rows[Row].Data, C.Offset, Length(C.Value)); Insert(GetTypeOF(Value), Table.Rows[Row].Data, C.Offset); Table.Modified:= true; Result:= true; end else begin OnErrorOccur(Table, 'SetColumn', 'Out of row range (' + IntToStr(Row) + '/' + IntToStr(Column) + ')'); end; if (Cached) then begin CacheRow(Table, Row); end; end else begin OnErrorOccur(Table, 'SetColumn', 'Row (' + IntToStr(Row) + ') does not exist'); end;end;function CFetchColumn(var Table: TMySSQL_Table; const Row, Column: word): string;begin if (ColumnCached(Table, Row, Column)) then begin Result:= Table.Rows[Row].Columns[Column].Value; end else begin OnErrorOccur(Table, 'CFetchColumn', 'Column (' + IntToStr(Column) + ') is not cached'); end;end;function CSetColumn(var Table: TMySSQL_Table; const Row, Column: word; const Value: variant): boolean;begin if (ColumnCached(Table, Row, Column)) then begin Table.Rows[Row].Columns[Column].Value:= GetTypeOF(Value); Table.Modified:= true; Result:= true; end else begin OnErrorOccur(Table, 'CSetColumn', 'Column (' + IntToStr(Column) + ') is not cached'); end;end;function CIncColumn(var Table: TMySSQL_Table; const Row, Column: word; const Increase: extended): boolean;var Value: string;begin if (ColumnCached(Table, Row, Column)) then begin Value:= CFetchColumn(Table, Row, Column); if (RegExpMatch('^-?(\d+|\d+.?\d+)$', Value)) then begin Table.Rows[Row].Columns[Column].Value:= FloatToStr(StrToFloat(Value) + Increase); Table.Modified:= true; Result:= true; end else begin OnErrorOccur(Table, 'CIncColumn', 'Column (' + IntToStr(Column) + ') represents no numeric value'); end; end else begin OnErrorOccur(Table, 'CIncColumn', 'Column (' + IntToStr(Column) + ') is not cached'); end;end;function AppendColumn(var Table: TMySSQL_Table; const Row: word; const Value: variant): boolean;var Cached: boolean;begin if (RowExists(Table, Row)) then begin Cached:= Table.Rows[Row].Cached; UncacheRow(Table, Row); Table.Rows[Row].Data:= Table.Rows[Row].Data + GetTypeOF(Value) + #9; if (Cached) then begin CacheRow(Table, Row); end; Table.Modified:= true; Result:= true; end else begin OnErrorOccur(Table, 'AppendColumn', 'Row (' + IntToStr(Row) + ') does not exist'); end;end;
- Added a global variable Cached for each row to save whether the row is cached or not- Slightly improved the Implode function- Renamed DumpCache to DumpCacheRow and applied minor code improvements Also added a new error message in case the row which ought to be dumped does not exit- Added DumpCacheTable which dumbs all cached rows to the first table layer- Modified UncacheRow to correspond with DumpCacheRow- Modified SaveTable to make it compatible with DumpCacheRow- Added a new procedure DestroyTable which "destroys" a MySSQL_Table object- Fixed DestroyRow, so it does not delete a wrong row- Renamed SelectColumn to FetchColumn- Renamed SelectRowByColumnValue to FetchColumnByRow- SetColumn is now synchronized with cached rows "synchronous 2 layer principle"- CacheRow will not longer recache a row if the row has already been cached- Renamed CSelectColumn to CFetchColumn- AppendColumn is now synchronized with cached rows