ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/runtime/IBUtils.pas
(Generate patch)

Comparing ibx/trunk/runtime/IBUtils.pas (file contents):
Revision 18 by tony, Sat Dec 28 19:22:24 2013 UTC vs.
Revision 19 by tony, Mon Jul 7 13:00:15 2014 UTC

# Line 52 | Line 52 | const
52    TAB  = #9;
53    NULL_TERMINATOR = #0;
54  
55 +  sqlReservedWords: array [0..166] of string = (
56 +  'ADD','ADMIN','ALL','ALTER','AND','ANY','AS','AT','AVG','BEGIN','BETWEEN','BIGINT','BIT_LENGTH','BLOB','BOTH',
57 + 'BY','CASE','CAST','CHAR','CHAR_LENGTH','CHARACTER','CHARACTER_LENGTH','CHECK','CLOSE','COLLATE','COLUMN',
58 + 'COMMIT','CONNECT','CONSTRAINT','COUNT','CREATE','CROSS','CURRENT','CURRENT_CONNECTION','CURRENT_DATE',
59 + 'CURRENT_ROLE','CURRENT_TIME','CURRENT_TIMESTAMP','CURRENT_TRANSACTION','CURRENT_USER','CURSOR','DATE',
60 + 'DAY','DEC','DECIMAL','DECLARE','DEFAULT','DELETE','DISCONNECT','DISTINCT','DOUBLE','DROP','ELSE','END',
61 + 'ESCAPE','EXECUTE','EXISTS','EXTERNAL','EXTRACT','FETCH','FILTER','FLOAT','FOR','FOREIGN','FROM','FULL',
62 + 'FUNCTION','GDSCODE','GLOBAL','GRANT','GROUP','HAVING','HOUR','IN','INDEX','INNER','INSENSITIVE','INSERT',
63 + 'INT','INTEGER','INTO','IS','JOIN','LEADING','LEFT','LIKE','LONG','LOWER','MAX','MAXIMUM_SEGMENT','MERGE',
64 + 'MIN','MINUTE','MONTH','NATIONAL','NATURAL','NCHAR','NO','NOT','NULL','NUMERIC','OCTET_LENGTH','OF','ON',
65 + 'ONLY','OPEN','OR','ORDER','OUTER','PARAMETER','PLAN','POSITION','POST_EVENT','PRECISION','PRIMARY',
66 + 'PROCEDURE','RDB$DB_KEY','REAL','RECORD_VERSION','RECREATE','RECURSIVE','REFERENCES','RELEASE','RETURNING_VALUES',
67 + 'RETURNS','REVOKE','RIGHT','ROLLBACK','ROW_COUNT','ROWS','SAVEPOINT','SECOND','SELECT','SENSITIVE',
68 + 'SET','SIMILAR','SMALLINT','SOME','SQLCODE','SQLSTATE','START','SUM','TABLE','THEN','TIME',
69 + 'TIMESTAMP','TO','TRAILING','TRIGGER','TRIM','UNION','UNIQUE','UPDATE','UPPER','USER','USING',
70 + 'VALUE','VALUES','VARCHAR','VARIABLE','VARYING','VIEW','WHEN','WHERE','WHILE','WITH','YEAR');
71 +
72   function Max(n1, n2: Integer): Integer;
73   function Min(n1, n2: Integer): Integer;
74   function RandomString(iLength: Integer): String;
# Line 59 | Line 76 | function RandomInteger(iLow, iHigh: Inte
76   function StripString(st: String; CharsToStrip: String): String;
77   function FormatIdentifier(Dialect: Integer; Value: String): String;
78   function FormatIdentifierValue(Dialect: Integer; Value: String): String;
79 + function FormatIdentifierValueNC(Dialect: Integer; Value: String): String;
80   function ExtractIdentifier(Dialect: Integer; Value: String): String;
81   function QuoteIdentifier(Dialect: Integer; Value: String): String;
82 + function QuoteIdentifierIfNeeded(Dialect: Integer; Value: String): String;
83 + function Space2Underscore(s: string): string;
84  
85   implementation
86  
# Line 137 | Line 157 | begin
157    Result := Value;
158   end;
159  
160 + function FormatIdentifierValueNC(Dialect: Integer; Value: String): String;
161 + begin
162 +  Value := Trim(Value);
163 +  if Dialect = 1 then
164 +    Value := AnsiUpperCase(Value)
165 +  else
166 +  begin
167 +    if (Value <> '') and (Value[1] = '"') then
168 +    begin
169 +      Delete(Value, 1, 1);
170 +      Delete(Value, Length(Value), 1);
171 +      Value := AnsiUpperCase(StringReplace (Value, '""', '"', [rfReplaceAll]));
172 +    end
173 +    else
174 +      Value := AnsiUpperCase(Value);
175 +  end;
176 +  Result := Value;
177 + end;
178 +
179   function ExtractIdentifier(Dialect: Integer; Value: String): String;
180   begin
181    Value := Trim(Value);
# Line 156 | Line 195 | begin
195    Result := Value;
196   end;
197  
198 + function IsReservedWord(w: string): boolean;
199 + var i: integer;
200 + begin
201 +     Result := true;
202 +     for i := 0 to Length(sqlReservedWords) - 1 do
203 +         if w = sqlReservedWords[i] then
204 +            Exit;
205 +     Result := false;
206 + end;
207 +
208   function QuoteIdentifier(Dialect: Integer; Value: String): String;
209   begin
210    if Dialect = 1 then
# Line 165 | Line 214 | begin
214    Result := Value;
215   end;
216  
217 < end.
217 > function QuoteIdentifierIfNeeded(Dialect: Integer; Value: String): String;
218 > begin
219 >  if (Dialect = 3) and
220 >    ((AnsiUpperCase(Value) <> Value) or IsReservedWord(Value)) then
221 >     Result := '"' + Value + '"'
222 >  else
223 >    Result := Value
224 > end;
225 >
226 > function Space2Underscore(s: string): string;
227 > var
228 >   k: integer;
229 > begin
230 >     Result := s;
231 >     for k := 1 to Length(s) do
232 >         if not (Result[k] in ['0'..'9','A'..'Z','_','$'])  then
233 >            Result[k] := '_';
234 > end;
235 >
236 >
237 > end.

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines