0 Members and 1 Guest are viewing this topic.
var MyTable: TMySSQL_Table;procedure ActivateServer();begin if (not(CreateTable(MyTable, 'tablename'))) then begin WriteLn('Unable to create a new table, reason: ' + MyTable.Exception); end;end;
var MyTable: TMySSQL_Table;procedure ActivateServer();begin if (not(CreateTable(MyTable, 'tablename'))) then begin WriteLn('Unable to create a new table, reason: ' + MyTable.Exception); end; DestroyTable(MyTable);end;
var MyTable: TMySSQL_Table;procedure ActivateServer();begin if (not(LoadTable(MyTable, 'tablename'))) then begin WriteLn('Failed to load table, reason:' + MyTable.Exception); end;end;
var MyTable: TMySSQL_Table;procedure ActivateServer();begin if (not(LoadTable(MyTable, 'tablename'))) then begin WriteLn('Failed to load table, reason:' + MyTable.Exception); end; if (not(UnloadTable(MyTable))) then begin WriteLn('Could not unload table, reason: ' + MyTable.Exception); end;end;
var MyTable: TMySSQL_Table;procedure ActivateServer();begin if (not(CreateTable(MyTable, 'new_tablename'))) then begin WriteLn('Unable to create a new table, reason: ' + MyTable.Exception); end; if (not(SaveTable(MyTable))) then begin WriteLn('Could not save table, reason: ' + MyTable.Exception); end;end;
var MyTable: TMySSQL_Table;procedure ActivateServer();begin if (not(CreateTable(MyTable, 'tablename'))) then begin WriteLn('Unable to create a new table, reason: ' + MyTable.Exception); end; WriteLn('New row created. Index: ' + IntToStr(CreateRow(MyTable, [20, 'data', 12.5, true])));end;
var MyTable: TMySSQL_Table; MyColumn: TMySSQL_Column; Index: word;procedure ActivateServer();begin if (CreateTable(MyTable, 'accounts')) then begin Index:= CreateRow(MyTable, ['Curry', 'password', true]); if (FetchColumn(MyTable, Index, 0, MyColumn)) then begin WriteLn('Username: ' + MyColumn.Value); // Output: "Username: Curry" end else begin WriteLn('Unable to fetch column, reason: ' + MyTable.Exception); end; end else begin WriteLn('Unable to create a new table, reason: ' + MyTable.Exception); end;end;
var MyTable: TMySSQL_Table; Index: integer;procedure ActivateServer();begin if (CreateTable(MyTable, 'accounts')) then begin CreateRow(MyTable, ['Curry', 'password', true]); Index:= FetchRowByColumn(MyTable, 0, 'Curry'); if (Index > -1) then begin WriteLn('Row index of account Curry: ' + IntToStr(Index)); // Output: "Row index of account Curry: 0" end else begin WriteLn('No row found'); end; end else begin WriteLn('Unable to create a new table, reason: ' + MyTable.Exception); end;end;
var MyTable: TMySSQL_Table; Index: word;procedure ActivateServer();begin if (CreateTable(MyTable, 'animals')) then begin Index:= CreateRow(MyTable, ['dogs', 'cats', 'horses']); if (SetColumn(MyTable, Index, 2, 90)) then begin WriteLn('Column successfully updated'); end else begin WriteLn('Could not update column, reason: ' + MyTable.Exception); end; end else begin WriteLn('Unable to create a new table, reason: ' + MyTable.Exception); end;end;
var MyTable: TMySSQL_Table; Index: word;procedure ActivateServer();begin if (CreateTable(MyTable, 'nature')) then begin Index:= CreateRow(MyTable, ['nature', 'tree']); if (AppendColumn(MyTable, Index, 'flower')) then begin WriteLn('Successfully appended a new column'); end else begin WriteLn('Could not append a new column, reason: ' + MyTable.Exception); end; end else begin WriteLn('Unable to create a new table, reason: ' + MyTable.Exception); end;end;
var MyTable: TMySSQL_Table; Index: word;procedure ActivateServer();begin if (CreateTable(MyTable, 'nature')) then begin Index:= CreateRow(MyTable, ['nature', 'tree', 'flower']); if (CacheRow(MyTable, Index)) then begin WriteLn('Row cached'); // You can now use CFetchColumn, CSetColumnand and CIncColumn to fetch/set columns // or use the alternative syntax, which is not recommended, but for the sake of this script, here it is... WriteLn(MyTable.Rows[Index].Columns[2].Value) // Output: "flower" MyTable.Rows[Index].Columns[2].Value:= 'rose'; WriteLn(MyTable.Rows[Index].Columns[2].Value) // Output: "rose" end else begin WriteLn('Failed to cache row: ' + MyTable.Exception); end; end else begin WriteLn('Unable to create a new table, reason: ' + MyTable.Exception); end;end;
var MyTable: TMySSQL_Table; Index: word;procedure ActivateServer();begin if (CreateTable(MyTable, 'nature')) then begin Index:= CreateRow(MyTable, ['nature', 'tree', 'flower', 'daffodil']); if (CacheRow(MyTable, Index)) then begin WriteLn('Row cached'); // Use CFetchColumn, CSetColumn and CIncColumn here UncacheRow(MyTable, Index); // Using CFetchColumn, CSetColumn and CIncColumn now will result into a MySSQL exception and can be "catched" with MyTable.Exception end else begin WriteLn('Could not cache row, reason: ' + MyTable.Exception); end; end else begin WriteLn('Unable to create a new table, reason: ' + MyTable.Exception); end;end;
var MyTable: TMySSQL_Table; Index: word;procedure ActivateServer();begin if (CreateTable(MyTable, 'nature')) then begin Index:= CreateRow(MyTable, ['nature', 'tree', 'flower', 'daffodil']); if (CacheRow(MyTable, Index)) then begin if (CFetchColumn(MyTable, Index, 0) <> '') then begin WriteLn('Value is: ' + CFetchColumn(MyTable, Index, 0)); // Output: "Value is: nature" end else begin WriteLn('Failed to fetch column, reason: ' + MyTable.Exception); end; UncacheRow(MyTable, Index); end else begin WriteLn('Could not cache row, reason: ' + MyTable.Exception); end; end else begin WriteLn('Unable to create a new table, reason: ' + MyTable.Exception); end;end;
var MyTable: TMySSQL_Table; Index: word;procedure ActivateServer();begin if (CreateTable(MyTable, 'nature')) then begin Index:= CreateRow(MyTable, ['nature', 'tree', 'flower', 'daffodil']); if (CacheRow(MyTable, Index)) then begin CSetColumn(MyTable, Index, 3, 'rose'); if (CFetchColumn(MyTable, Index, 3)) then begin WriteLn('New value is: ' + CFetchColumn(MyTable, Index, 3)); // Output: "New value is: rose" end else begin WriteLn('Failed to fetch column, reason: ' + MyTable.Exception); end; UncacheRow(MyTable, Index); end else begin WriteLn('Could not cache row, reason: ' + MyTable.Exception); end; end else begin WriteLn('Unable to create a new table, reason: ' + MyTable.Exception); end;end;
var MyTable: TMySSQL_Table; Index: word;procedure ActivateServer();begin if (CreateTable(MyTable, 'math')) then begin Index:= CreateRow(MyTable, ['20', 12, '155']); if (CacheRow(MyTable, Index)) then begin CIncColumn(MyTable, Index, 2, 5); if (CFetchColumn(MyTable, Index, 2)) then begin WriteLn('New value is: ' + CFetchColumn(MyTable, Index, 2)); // Output: "New value is: 160" end else begin WriteLn('Failed to fetch column, reason: ' + MyTable.Exception); end; UncacheRow(MyTable, Index); end else begin WriteLn('Could not cache row, reason: ' + MyTable.Exception); end; end;end;
function _RowExists(Row: integer): boolean;begin if (ArrayHigh(database) >= Row) then begin result:= true; end;end;
function _RowExists(Row: integer): boolean;begin result := ArrayHigh(database) >= Row;end;
const _FOLDER_DATABASE = ''; _NAME_DATABASE = 'database.txt';var database: array of string;function IXSplit(const SOURCE: string; Delimiter: string): array of string;var i, x, d: integer; s, b: string;begin d:= length(Delimiter); i:= 1; SetArrayLength(Result, 0); while (i <= length(SOURCE)) do begin s:= Copy(SOURCE, i, d); if (s = Delimiter) then begin SetArrayLength(Result, x + 1); Result[x]:= b; Inc(i, d); Inc(x, 1); b:= ''; end else begin b:= b + Copy(s, 1, 1); Inc(i, 1); end; end; if (b <> '') then begin SetArrayLength(Result, x + 1); Result[x]:= b; end;end;function ReadFromFile(File: string): string;begin Result:= ReadFile(File); Result:= Copy(Result, 0, length(Result) - 2);end;function DoesFileExist(Name: string): boolean;begin if (GetSystem() = 'windows') then begin if (FileExists(Name)) then begin result:= true; end; end else begin if ((FileExists(Name)) or (ReadFromFile(Name) <> '')) then begin result:= true; end; end;end;procedure _LoadDatabase();begin if (DoesFileExist(_FOLDER_DATABASE + _NAME_DATABASE)) then begin database:= IXSplit(ReadFromFile(_FOLDER_DATABASE + _NAME_DATABASE), #13#10); end else begin WriteFile(_FOLDER_DATABASE + _NAME_DATABASE, ''); end;end; procedure _SaveDatabase();var i: integer; b: string;begin for i:= 0 to GetArrayLength(database) - 1 do begin if (Trim(database[i]) <> '') then begin if (b <> '') then begin b:= b + #13#10 + database[i]; end else begin b:= database[i]; end; end; end; SetArrayLength(database, 0); if (b <> '') then begin database:= IXSplit(b, #13#10); end; WriteFile(_FOLDER_DATABASE + _NAME_DATABASE, b);end;function _RowExists(Row: integer): boolean;begin result:= ArrayHigh(database) >= Row;end;function _getColumnInfo(Row, Column: integer): integer;var ch, x, tabs: integer; b: string;begin tabs:= -1; b:= database[Row]; while (tabs <> Column) do begin x:= StrPos(#9, b); if ((x = 0) and (tabs <> Column)) then begin exit; end; Inc(tabs, 1); if (tabs = Column) then begin result:= ch + 1; break; end else begin ch:= ch + x; Delete(b, 1, x); end; end;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; else result:= 'unknown Type'; end;end;procedure _CreateRow(Columns: array of variant);var i, x: integer;begin SetArrayLength(database, GetArrayLength(database) + 1); x:= GetArrayLength(database) - 1; for i:= 0 to GetArrayLength(Columns) - 1 do begin database[x]:= database[x] + GetTypeOF(Columns[i]) + #9; end; _SaveDatabase();end;function _DeleteRow(Row: integer): boolean;begin if (_RowExists(Row)) then begin database[Row]:= ''; _SaveDatabase(); result:= true; end;end;function _UpdateColumn(Row, Column, Increase: integer): string;var pos: integer; data: string;begin if (_RowExists(Row)) then begin pos:= _getColumnInfo(Row, Column); if (pos > 0) then begin data:= GetPiece(database[Row], #9, Column); if (RegExpMatch('^-?\d+$', data)) then begin result:= IntToStr(StrToInt(data) + Increase); Delete(database[Row], pos, length(data)); Insert(result, database[Row], pos); end; end; end;end;function _SetColumn(Row, Column: integer; Value: variant): boolean;var pos: integer; data: string;begin if (_RowExists(Row)) then begin pos:= _getColumnInfo(Row, Column); if (pos > 0) then begin data:= GetPiece(database[Row], #9, Column); Delete(database[Row], pos, length(data)); Insert(GetTypeOF(Value), database[Row], pos); result:= true; end; end;end;function _AppendColumn(Row: integer; Value: string): boolean;begin if (_RowExists(Row)) then begin database[Row]:= database[Row] + Value + #9; result:= true; end;end;procedure ActivateServer();begin _LoadDatabase();end;
string 12 true -22.45
- Implemented a new method to save and delete rows (SwapSQLRowID()), which is much faster than using XSplit Hence it avoids frequent crashes caused by calling XSplit too much Note: Every time a row is deleted you have to refresh your "row pointers" because the new method swaps to RowIDs- Renamed _SaveDatabase() to _SnapDatabase() and cleaned up the code a bit- Renamed Row to RowID for every function which expects this parameter to be passed on
- added OnErrorOccur() function which holds the last error occured in the new variable Exception In case a MySSQL function such as _Update-, _Set-, _Append-, _DeleteColumn wasn't successful you can output the last exception with WriteLn() Example: if (not(_SetColumn(RowID, ColumnID, Value))) then begin WriteLn(Exception); end;- _UpdateColumn() supports now float values and returns a boolean instead of a string- _AppendColumn() supports now variants as value
const MySSQL = 'MySSQL';procedure Initialize();begin CrossFunc([], MySSQL + '._Initialize');end;procedure SelectDatabase(const NAME_DATABASE: string);begin CrossFunc([NAME_DATABASE], MySSQL + '._SelectDatabase');end;procedure SnapDatabase();begin CrossFunc([], MySSQL + '._SnapDatabase');end;function GetColumnItem(RowID, ColumnID: integer): string;begin Result:= CrossFunc([RowID, ColumnID], MySSQL + '._GetColumnItem');end;function CreateRow(ColumnItems: array of variant): integer;begin Result:= CrossFunc([ColumnItems], MySSQL + '._CreateRow');end;function DeleteRow(RowID: integer): boolean;begin Result:= CrossFunc([RowID], MySSQL + '._DeleteRow');end;function UpdateColumn(RowID, ColumnID: integer; Increase: extended): boolean;begin Result:= CrossFunc([RowID, ColumnID, Increase], MySSQL + '._UpdateColumn');end;function SetColumn(RowID, ColumnID: integer; Value: variant): boolean;begin Result:= CrossFunc([RowID, ColumnID, Value], MySSQL + '._SetColumn');end;function AppendColumn(RowID: integer; Value: variant): boolean;begin Result:= CrossFunc([RowID, Value], MySSQL + '._AppendColumn');end;[/code ]
Quick question, where exactly is SQL here (apart from the name) ?
Then it shouldn't be in the name.
Fortunately, in one of the next server releases eC has promised to support SQLITE support, which will render this abomination deprecated.
Quote from: jrgp on July 27, 2009, 10:03:01 amFortunately, in one of the next server releases eC has promised to support SQLITE support, which will render this abomination deprecated.Not really. Those who don't have any SQL database to connect to can still use this as an alternative. This may also be used for those using older versions of Soldat Dedicated Server as well.
Not really. SQLITE doesn't use a database "to connect to." With it, the "database" is all in one local file, which is accessed.
Quote from: jrgp on July 27, 2009, 03:34:23 pmNot really. SQLITE doesn't use a database "to connect to." With it, the "database" is all in one local file, which is accessed.It creates/hosts a database?
SQLite is a software library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine.
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