unit uDASQLiteInterfaces; {----------------------------------------------------------------------------} { Data Abstract Library - Core Library } { } { compiler: Delphi 6 and up, Kylix 3 and up } { platform: Win32, Linux } { } { (c)opyright RemObjects Software. all rights reserved. } { } { Using this code requires a valid license of the Data Abstract } { which can be obtained at http://www.remobjects.com. } {----------------------------------------------------------------------------} {$I DataAbstract.inc} interface uses uDAInterfaces, uDAEngine, uROClasses; type { IDASQLiteConnection For identification purposes Implemented by all SQLite connections } IDASQLiteConnection = interface(IDAConnection) ['{C6249278-7BBB-4E4F-849B-A9AA7C9ACD66}'] end; TDASQLiteDriver = class(TDAEDriver) protected function GetDefaultConnectionType(const AuxDriver: string): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF} end; TDASQLiteConnection = class(TDAEConnection, IDAFileBasedDatabase, IDASQLiteConnection) protected procedure DoGetTableNames(out List: IROStrings); override; procedure DoGetStoredProcedureNames(out List: IROStrings); override; procedure DoGetViewNames(out List: IROStrings); override; function IdentifierNeedsQuoting(const iIdentifier: string): boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF} //IDAFileBasedDatabase function GetFileExtensions: IROStrings; end; function SQLite_GetFileExtensions: IROStrings; procedure SQLite_GetObjectNames(Query: IDADataset;AList: IROStrings; AObjectType: TDAObjecttype); function SQLite_IdentifierNeedsQuoting(const iIdentifier: string): boolean; const SQLite_DriverType = 'SQLite'; implementation uses SysUtils; var sqlite_reservedwords : array of string; function SQLite_GetFileExtensions: IROStrings; begin Result := TROStrings.Create; result.Add('*.SQB;*.DB3;*.DB;*.DBB;SQLite Database (*.sqb,*.db3,*.db,*.dbb)'); result.Add('*.*;All files (*.*)'); end; procedure SQLite_GetObjectNames(Query: IDADataset;AList: IROStrings; AObjectType: TDAObjecttype); begin try case AObjectType of dotTable: Query.SQL := 'SELECT name FROM sqlite_master WHERE type="table" ORDER BY name'; dotView: Query.SQL := 'SELECT name FROM sqlite_master WHERE type="view" ORDER BY name'; dotProcedure: Exit; else end; Query.Open; while not Query.EOF do begin AList.Add(Trim(Query.Fields[0].AsString)); Query.Next; end; finally Query:=nil; end; end; function SQLite_IdentifierNeedsQuoting(const iIdentifier: string): boolean; begin result := TestIdentifier(iIdentifier, sqlite_reservedwords); end; { TDASQLiteDriver } function TDASQLiteDriver.GetDefaultConnectionType( const AuxDriver: string): string; begin Result:= SQLite_DriverType; end; { TDASQLiteConnection } procedure TDASQLiteConnection.DoGetStoredProcedureNames(out List: IROStrings); begin inherited; SQLite_GetObjectNames(GetDatasetClass.Create(Self),List,dotProcedure); end; procedure TDASQLiteConnection.DoGetTableNames(out List: IROStrings); begin inherited; SQLite_GetObjectNames(GetDatasetClass.Create(Self),List,dotTable); end; procedure TDASQLiteConnection.DoGetViewNames(out List: IROStrings); begin inherited; SQLite_GetObjectNames(GetDatasetClass.Create(Self),List,dotView); end; function TDASQLiteConnection.GetFileExtensions: IROStrings; begin Result:=SQLite_GetFileExtensions; end; function TDASQLiteConnection.IdentifierNeedsQuoting( const iIdentifier: string): boolean; begin Result := inherited IdentifierNeedsQuoting(iIdentifier) or SQLite_IdentifierNeedsQuoting(iIdentifier); end; procedure sqlite_InitializeReservedWords; begin SetLength(sqlite_reservedwords,113); // sorted with TStringList.Sort (bds2007) sqlite_reservedwords[0] := 'ABORT'; sqlite_reservedwords[1] := 'ADD'; sqlite_reservedwords[2] := 'AFTER'; sqlite_reservedwords[3] := 'ALL'; sqlite_reservedwords[4] := 'ALTER'; sqlite_reservedwords[5] := 'ANALYZE'; sqlite_reservedwords[6] := 'AND'; sqlite_reservedwords[7] := 'AS'; sqlite_reservedwords[8] := 'ASC'; sqlite_reservedwords[9] := 'ATTACH'; sqlite_reservedwords[10] := 'AUTOINCREMENT'; sqlite_reservedwords[11] := 'BEFORE'; sqlite_reservedwords[12] := 'BEGIN'; sqlite_reservedwords[13] := 'BETWEEN'; sqlite_reservedwords[14] := 'BY'; sqlite_reservedwords[15] := 'CASCADE'; sqlite_reservedwords[16] := 'CASE'; sqlite_reservedwords[17] := 'CAST'; sqlite_reservedwords[18] := 'CHECK'; sqlite_reservedwords[19] := 'COLLATE'; sqlite_reservedwords[20] := 'COMMIT'; sqlite_reservedwords[21] := 'CONFLICT'; sqlite_reservedwords[22] := 'CONSTRAINT'; sqlite_reservedwords[23] := 'CREATE'; sqlite_reservedwords[24] := 'CROSS'; sqlite_reservedwords[25] := 'CURRENT_DATE'; sqlite_reservedwords[26] := 'CURRENT_TIME'; sqlite_reservedwords[27] := 'CURRENT_TIMESTAMP'; sqlite_reservedwords[28] := 'DATABASE'; sqlite_reservedwords[29] := 'DEFAULT'; sqlite_reservedwords[30] := 'DEFERRABLE'; sqlite_reservedwords[31] := 'DEFERRED'; sqlite_reservedwords[32] := 'DELETE'; sqlite_reservedwords[33] := 'DESC'; sqlite_reservedwords[34] := 'DETACH'; sqlite_reservedwords[35] := 'DISTINCT'; sqlite_reservedwords[36] := 'DROP'; sqlite_reservedwords[37] := 'EACH'; sqlite_reservedwords[38] := 'ELSE'; sqlite_reservedwords[39] := 'END'; sqlite_reservedwords[40] := 'ESCAPE'; sqlite_reservedwords[41] := 'EXCEPT'; sqlite_reservedwords[42] := 'EXCLUSIVE'; sqlite_reservedwords[43] := 'EXPLAIN'; sqlite_reservedwords[44] := 'FAIL'; sqlite_reservedwords[45] := 'FOR'; sqlite_reservedwords[46] := 'FOREIGN'; sqlite_reservedwords[47] := 'FROM'; sqlite_reservedwords[48] := 'FULL'; sqlite_reservedwords[49] := 'GLOB'; sqlite_reservedwords[50] := 'GROUP'; sqlite_reservedwords[51] := 'HAVING'; sqlite_reservedwords[52] := 'IF'; sqlite_reservedwords[53] := 'IGNORE'; sqlite_reservedwords[54] := 'IMMEDIATE'; sqlite_reservedwords[55] := 'IN'; sqlite_reservedwords[56] := 'INDEX'; sqlite_reservedwords[57] := 'INITIALLY'; sqlite_reservedwords[58] := 'INNER'; sqlite_reservedwords[59] := 'INSERT'; sqlite_reservedwords[60] := 'INSTEAD'; sqlite_reservedwords[61] := 'INTERSECT'; sqlite_reservedwords[62] := 'INTO'; sqlite_reservedwords[63] := 'IS'; sqlite_reservedwords[64] := 'ISNULL'; sqlite_reservedwords[65] := 'JOIN'; sqlite_reservedwords[66] := 'KEY'; sqlite_reservedwords[67] := 'LEFT'; sqlite_reservedwords[68] := 'LIKE'; sqlite_reservedwords[69] := 'LIMIT'; sqlite_reservedwords[70] := 'MATCH'; sqlite_reservedwords[71] := 'NATURAL'; sqlite_reservedwords[72] := 'NOT'; sqlite_reservedwords[73] := 'NOTNULL'; sqlite_reservedwords[74] := 'NULL'; sqlite_reservedwords[75] := 'OF'; sqlite_reservedwords[76] := 'OFFSET'; sqlite_reservedwords[77] := 'ON'; sqlite_reservedwords[78] := 'OR'; sqlite_reservedwords[79] := 'ORDER'; sqlite_reservedwords[80] := 'OUTER'; sqlite_reservedwords[81] := 'PLAN'; sqlite_reservedwords[82] := 'PRAGMA'; sqlite_reservedwords[83] := 'PRIMARY'; sqlite_reservedwords[84] := 'QUERY'; sqlite_reservedwords[85] := 'RAISE'; sqlite_reservedwords[86] := 'REFERENCES'; sqlite_reservedwords[87] := 'REINDEX'; sqlite_reservedwords[88] := 'RENAME'; sqlite_reservedwords[89] := 'REPLACE'; sqlite_reservedwords[90] := 'RESTRICT'; sqlite_reservedwords[91] := 'RIGHT'; sqlite_reservedwords[92] := 'ROLLBACK'; sqlite_reservedwords[93] := 'ROW'; sqlite_reservedwords[94] := 'SELECT'; sqlite_reservedwords[95] := 'SET'; sqlite_reservedwords[96] := 'TABLE'; sqlite_reservedwords[97] := 'TEMP'; sqlite_reservedwords[98] := 'TEMPORARY'; sqlite_reservedwords[99] := 'THEN'; sqlite_reservedwords[100] := 'TO'; sqlite_reservedwords[101] := 'TRANSACTION'; sqlite_reservedwords[102] := 'TRIGGER'; sqlite_reservedwords[103] := 'UNION'; sqlite_reservedwords[104] := 'UNIQUE'; sqlite_reservedwords[105] := 'UPDATE'; sqlite_reservedwords[106] := 'USING'; sqlite_reservedwords[107] := 'VACUUM'; sqlite_reservedwords[108] := 'VALUES'; sqlite_reservedwords[109] := 'VIEW'; sqlite_reservedwords[110] := 'VIRTUAL'; sqlite_reservedwords[111] := 'WHEN'; sqlite_reservedwords[112] := 'WHERE'; end; initialization sqlite_InitializeReservedWords; finalization sqlite_reservedwords := nil; end.