unit uDAMacroProcessors; {----------------------------------------------------------------------------} { 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 uDAEngine; (* Macros: -------------------- Date -------------------- Returns the current date from the server Syntax: {Date()} Example: SELECT * FROM Table WHERE OrderDate>{Date()} Parameters: this macro has no parameters -------------------- Time -------------------- Returns the current time from the server Syntax: {Time()} Example: SELECT * FROM Table WHERE OrderDate>{Time()} Parameters: this macro has no parameters -------------------- DateTime -------------------- Returns the current datetime from the server Syntax: {DateTime()} Example: SELECT * FROM Table WHERE OrderDate>{DateTime()} Parameters: this macro has no parameters -------------------- AddTime -------------------- Returns a new datetime value based on adding an interval to the specified date. Not all databases support this macro. Syntax: {AddTime(, , )} Example: SELECT * FROM Table WHERE OrderDate>{AddTime(Date(), 2, day)} Parameters: : a valid date : number of days, weeks, etc as per next parameter : day, week, year, hour, min, sec -------------------- FormatDateTime -------------------- Formats the specified datetime to the datetime format used by the database Syntax: {FormatDateTime()} Example: SELECT * FROM Table WHERE OrderDate>{FormatDateTime('12/22/2003 15:22:34.123')} Parameters: : a string expression representing a data in format MM/DD/YYYY HH24:MM:SS.MS -------------------- FormatDate -------------------- Formats the specified date to the date format used by the database Syntax: {FormatDateTime()} Example: SELECT * FROM Table WHERE OrderDate>{FormatDate('12/22/2003')} Parameters: : a string expression representing a data in format MM/DD/YYYY -------------------- Length -------------------- Returns the length of the given string Syntax: {Length()} Example: SELECT * FROM Table WHERE {Length(CustomerID)}>3 Parameters: : a text string -------------------- LowerCase -------------------- Converts the given string to lower case Syntax: {LowerCase()} Example: SELECT * FROM Table WHERE {LowerCase(CustomerID)}='alfki' Parameters: : a text string -------------------- UpperCase -------------------- Converts the given string to upper case Syntax: {UpperCase()} Example: SELECT * FROM Table WHERE {UpperCase(CustomerID)}='ALFKI' Parameters: : a text string -------------------- TrimLeft -------------------- Removes the leading spaces from a string Syntax: {TrimLeft()} Example: SELECT * FROM Table WHERE {TrimLeft(CustomerID)}='ALFKI' Parameters: : a text string -------------------- TrimRight -------------------- Removes the trailing spaces from a string Syntax: {TrimRight()} Example: SELECT * FROM Table WHERE {TrimRight(CustomerID)}='ALFKI' Parameters: : a text string -------------------- Copy -------------------- Returns characters starting from from Syntax: {Copy(, , )} Example: SELECT * FROM Table WHERE OrderDate>{Date()} Parameters: : a field name or a string : the position from where to start copying : the number of characters to copy -------------------- NoLockHint -------------------- Returns (NOLOCK) for MSSQL server and empty string for other databases Syntax: {NoLockHint} Example: SELECT * FROM Table {NoLockHint} *) type { TDAMSSQLMacroProcessor } TDAMSSQLMacroProcessor = class(TDASQLMacroProcessor) protected function DateTime(Sender: TObject; const Parameters: array of string): string; override; function AddTime(Sender: TObject; const Parameters: array of string): string; override; function Length(Sender: TObject; const Parameters: array of string): string; override; function LowerCase(Sender: TObject; const Parameters: array of string): string; override; function UpperCase(Sender: TObject; const Parameters: array of string): string; override; function TrimLeft(Sender: TObject; const Parameters: array of string): string; override; function TrimRight(Sender: TObject; const Parameters: array of string): string; override; function Copy(Sender: TObject; const Parameters: array of string): string; override; function Nolock(Sender: TObject; const Parameters: array of string): string; override; public constructor Create; end; TMSSQLMacroProcessor = TDAMSSQLMacroProcessor; { TDAIBMacroProcessor } TDAIBMacroProcessor = class(TDASQLMacroProcessor) protected function DateTime(Sender: TObject; const Parameters: array of string): string; override; function AddTime(Sender: TObject; const Parameters: array of string): string; override; function Length(Sender: TObject; const Parameters: array of string): string; override; function LowerCase(Sender: TObject; const Parameters: array of string): string; override; function UpperCase(Sender: TObject; const Parameters: array of string): string; override; function TrimLeft(Sender: TObject; const Parameters: array of string): string; override; function TrimRight(Sender: TObject; const Parameters: array of string): string; override; function Copy(Sender: TObject; const Parameters: array of string): string; override; function Nolock(Sender: TObject; const Parameters: array of string): string; override; public constructor Create; end; TIBMacroProcessor = TDAIBMacroProcessor; { TDAOracleMacroProcessor } TDAOracleMacroProcessor = class(TDASQLMacroProcessor) function DateTime(Sender: TObject; const Parameters: array of string): string; override; function AddTime(Sender: TObject; const Parameters: array of string): string; override; function Length(Sender: TObject; const Parameters: array of string): string; override; function LowerCase(Sender: TObject; const Parameters: array of string): string; override; function UpperCase(Sender: TObject; const Parameters: array of string): string; override; function TrimLeft(Sender: TObject; const Parameters: array of string): string; override; function TrimRight(Sender: TObject; const Parameters: array of string): string; override; function Copy(Sender: TObject; const Parameters: array of string): string; override; function FormatDate(Sender: TObject; const Parameters: array of string): string; override; function FormatDateTime(Sender: TObject; const Parameters: array of string): string; override; function Nolock(Sender: TObject; const Parameters: array of string): string; override; public constructor Create; end; TOracleMacroProcessor = TDAOracleMacroProcessor; { TDADBISAMMacroProcessor } TDADBISAMMacroProcessor = class(TDASQLMacroProcessor) function DateTime(Sender: TObject; const Parameters: array of string): string; override; function AddTime(Sender: TObject; const Parameters: array of string): string; override; function Length(Sender: TObject; const Parameters: array of string): string; override; function LowerCase(Sender: TObject; const Parameters: array of string): string; override; function UpperCase(Sender: TObject; const Parameters: array of string): string; override; function TrimLeft(Sender: TObject; const Parameters: array of string): string; override; function TrimRight(Sender: TObject; const Parameters: array of string): string; override; function Copy(Sender: TObject; const Parameters: array of string): string; override; function Nolock(Sender: TObject; const Parameters: array of string): string; override; public constructor Create; end; TDBISAMMacroProcessor = TDADBISAMMacroProcessor; implementation uses SysUtils; { TDAMSSQLMacroProcessor } constructor TDAMSSQLMacroProcessor.Create; begin inherited Create('yyyy-mm-dd', 'yyyy-mm-dd hh:nn:ss.zzz', FALSE, '@'); end; function TDAMSSQLMacroProcessor.AddTime(Sender: TObject; const Parameters: array of string): string; begin result := Format('dateadd(%s, %s, %s)', [Parameters[2], Parameters[1], Parameters[0]]); end; function TDAMSSQLMacroProcessor.Copy(Sender: TObject; const Parameters: array of string): string; begin result := Format('substring(%s, %s, %s)', [Parameters[0], Parameters[1], Parameters[2]]); end; function TDAMSSQLMacroProcessor.DateTime(Sender: TObject; const Parameters: array of string): string; begin result := 'GetDate()'; end; function TDAMSSQLMacroProcessor.Length(Sender: TObject; const Parameters: array of string): string; begin result := 'len(' + Parameters[0] + ')' end; function TDAMSSQLMacroProcessor.LowerCase(Sender: TObject; const Parameters: array of string): string; begin result := 'lower(' + Parameters[0] + ')' end; function TDAMSSQLMacroProcessor.TrimLeft(Sender: TObject; const Parameters: array of string): string; begin result := 'ltrim(' + Parameters[0] + ')' end; function TDAMSSQLMacroProcessor.TrimRight(Sender: TObject; const Parameters: array of string): string; begin result := 'rtrim(' + Parameters[0] + ')' end; function TDAMSSQLMacroProcessor.UpperCase(Sender: TObject; const Parameters: array of string): string; begin result := 'upper(' + Parameters[0] + ')' end; function TDAMSSQLMacroProcessor.Nolock(Sender: TObject; const Parameters: array of string): string; begin result := ' (NOLOCK) '; end; { TDAIBMacroProcessor } constructor TDAIBMacroProcessor.Create; begin inherited Create('yyyy-mm-dd', 'yyyy-mm-dd hh:mm:ss.zzz', FALSE); end; function TDAIBMacroProcessor.AddTime(Sender: TObject; const Parameters: array of string): string; begin result := '???' end; function TDAIBMacroProcessor.Copy(Sender: TObject; const Parameters: array of string): string; begin result := Format('substring(%s from %s for %s)', [Parameters[0], Parameters[1], Parameters[2]]); end; function TDAIBMacroProcessor.DateTime(Sender: TObject; const Parameters: array of string): string; begin result := '(select current_timestamp from rdb$database)'; end; function TDAIBMacroProcessor.Length(Sender: TObject; const Parameters: array of string): string; begin result := Format('char_length(%s)', [Parameters[0]]); end; function TDAIBMacroProcessor.LowerCase(Sender: TObject; const Parameters: array of string): string; begin result := 'lower(' + Parameters[0] + ')' end; function TDAIBMacroProcessor.TrimLeft(Sender: TObject; const Parameters: array of string): string; begin result := 'trim ( leading from ' + Parameters[0] + ')' end; function TDAIBMacroProcessor.TrimRight(Sender: TObject; const Parameters: array of string): string; begin result := 'trim ( trailing from ' + Parameters[0] + ')' end; function TDAIBMacroProcessor.UpperCase(Sender: TObject; const Parameters: array of string): string; begin result := 'upper(' + Parameters[0] + ')' end; function TDAIBMacroProcessor.Nolock(Sender: TObject; const Parameters: array of string): string; begin result := ''; end; { TDAOracleMacroProcessor } constructor TDAOracleMacroProcessor.Create; begin inherited Create('MM/DD/YYYY', 'MM/DD/YYYY HH:MM:SS.ZZZ', FALSE); end; function TDAOracleMacroProcessor.FormatDate(Sender: TObject; const Parameters: array of string): string; begin result := StringReplace('TO_DATE(''' + Parameters[0] + ''', ''MM/DD/YYYY'')', '''''', '''', [rfReplaceAll]); end; function TDAOracleMacroProcessor.FormatDateTime(Sender: TObject; const Parameters: array of string): string; begin result := StringReplace('TO_DATE(''' + Parameters[0] + ''', ''MM/DD/YYYY HH24:MI:SS.FF3'')', '''''', '''', [rfReplaceAll]); end; function TDAOracleMacroProcessor.AddTime(Sender: TObject; const Parameters: array of string): string; begin result := Parameters[0] + '+'; if SameText(Parameters[2], 'DAY') then result := result + Parameters[1] else if SameText(Parameters[2], 'WEEK') then result := result + Parameters[1] + '*7' else if SameText(Parameters[2], 'YEAR') then result := result + Parameters[1] + '*365' else if SameText(Parameters[2], 'HOUR') then result := result + Parameters[1] + '/24' else if SameText(Parameters[2], 'MIN') then result := result + Parameters[1] + '/1440' else if SameText(Parameters[2], 'SEC') then result := result + Parameters[1] + '/86400'; end; function TDAOracleMacroProcessor.Copy(Sender: TObject; const Parameters: array of string): string; begin result := Format('SUBSTR(%s, %s, %s)', [Parameters[0], Parameters[1], Parameters[2]]); end; function TDAOracleMacroProcessor.DateTime(Sender: TObject; const Parameters: array of string): string; begin result := 'SYSDATE' end; function TDAOracleMacroProcessor.Length(Sender: TObject; const Parameters: array of string): string; begin result := Format('LENGTH(%s)', [Parameters[0]]); end; function TDAOracleMacroProcessor.LowerCase(Sender: TObject; const Parameters: array of string): string; begin result := Format('LOWER(%s)', [Parameters[0]]); end; function TDAOracleMacroProcessor.TrimLeft(Sender: TObject; const Parameters: array of string): string; begin result := Format('TRIM(%s)', [Parameters[0]]); end; function TDAOracleMacroProcessor.TrimRight(Sender: TObject; const Parameters: array of string): string; begin result := Format('TRIM(%s)', [Parameters[0]]); end; function TDAOracleMacroProcessor.UpperCase(Sender: TObject; const Parameters: array of string): string; begin result := Format('UPPER(%s)', [Parameters[0]]); end; function TDAOracleMacroProcessor.Nolock(Sender: TObject; const Parameters: array of string): string; begin result := ''; end; { TDADBISAMMacroProcessor } constructor TDADBISAMMacroProcessor.Create; begin inherited Create('MM/DD/YYYY', 'MM/DD/YYYY HH:MM:SS.ZZZ', FALSE); end; function TDADBISAMMacroProcessor.AddTime(Sender: TObject; const Parameters: array of string): string; begin result := Parameters[0] + '+'; if SameText(Parameters[2], 'DAY') then result := result + Parameters[1] else if SameText(Parameters[2], 'WEEK') then result := result + Parameters[1] + '*7' else if SameText(Parameters[2], 'YEAR') then result := result + Parameters[1] + '*365' else if SameText(Parameters[2], 'HOUR') then result := result + Parameters[1] + '/24' else if SameText(Parameters[2], 'MIN') then result := result + Parameters[1] + '/1440' else if SameText(Parameters[2], 'SEC') then result := result + Parameters[1] + '/86400'; end; function TDADBISAMMacroProcessor.Copy(Sender: TObject; const Parameters: array of string): string; begin result := Format('SUBSTRING(%s FROM %s FOR %s)', [Parameters[0], Parameters[1], Parameters[2]]); end; function TDADBISAMMacroProcessor.DateTime(Sender: TObject; const Parameters: array of string): string; begin result := 'CURRENT_TIMESTAMP' end; function TDADBISAMMacroProcessor.Length(Sender: TObject; const Parameters: array of string): string; begin result := Format('LENGTH(%s)', [Parameters[0]]); end; function TDADBISAMMacroProcessor.LowerCase(Sender: TObject; const Parameters: array of string): string; begin result := Format('LOWER(%s)', [Parameters[0]]); end; function TDADBISAMMacroProcessor.TrimLeft(Sender: TObject; const Parameters: array of string): string; begin result := Format('TRIM(LEADING '' '' FROM %s)', [Parameters[0]]); end; function TDADBISAMMacroProcessor.TrimRight(Sender: TObject; const Parameters: array of string): string; begin result := Format('TRIM(TRAILING '' '' FROM %s)', [Parameters[0]]); end; function TDADBISAMMacroProcessor.UpperCase(Sender: TObject; const Parameters: array of string): string; begin result := Format('UPPER(%s)', [Parameters[0]]); end; function TDADBISAMMacroProcessor.Nolock(Sender: TObject; const Parameters: array of string): string; begin result := ''; end; end.