--- ibx/trunk/runtime/IBDatabase.pas 2015/07/18 12:30:52 34 +++ ibx/trunk/runtime/IBDatabase.pas 2016/01/26 14:38:47 35 @@ -183,6 +183,7 @@ type FDataSets: TList; FLoginCalled: boolean; FCharSetSizes: array of integer; + FCharSetNames: array of string; procedure EnsureInactive; function GetDBSQLDialect: Integer; function GetSQLDialect: Integer; @@ -443,6 +444,9 @@ type procedure DoAfterInsert(Sender: TObject); virtual; procedure DoAfterPost(Sender: TObject); virtual; function GetCharSetSize(CharSetID: integer): integer; + function GetDefaultCharSetSize: integer; + function GetCharSetName(CharSetID: integer): string; + function GetDefaultCharSetName: string; procedure HandleException(Sender: TObject); procedure SetCursor; procedure RestoreCursor; @@ -630,6 +634,7 @@ begin InternalClose(False); FDBSQLDialect := 1; SetLength(FCharSetSizes,0); + SetLength(FCharSetNames,0); end; procedure TIBDataBase.CreateDatabase; @@ -834,17 +839,20 @@ begin try Query.Database := Self; Query.Transaction := FInternalTransaction; - Query.SQL.Text := 'Select RDB$CHARACTER_SET_ID, RDB$BYTES_PER_CHARACTER ' + + Query.SQL.Text := 'Select RDB$CHARACTER_SET_ID, RDB$BYTES_PER_CHARACTER, RDB$CHARACTER_SET_NAME ' + 'From RDB$CHARACTER_SETS Order by 1 DESC'; {do not localize} Query.Prepare; Query.ExecQuery; if not Query.EOF then begin SetLength(FCharSetSizes,Query.FieldByName('RDB$CHARACTER_SET_ID').AsInteger + 1); + SetLength(FCharSetNames,Query.FieldByName('RDB$CHARACTER_SET_ID').AsInteger + 1); for i := 0 to Length(FCharSetSizes) - 1 do FCharSetSizes[i] := 1; repeat FCharSetSizes[Query.FieldByName('RDB$CHARACTER_SET_ID').AsInteger] := Query.FieldByName('RDB$BYTES_PER_CHARACTER').AsInteger; + FCharSetNames[Query.FieldByName('RDB$CHARACTER_SET_ID').AsInteger] := + Query.FieldByName('RDB$CHARACTER_SET_NAME').AsString; Query.Next; until Query.EOF; end; @@ -1022,7 +1030,7 @@ begin try TempDBParams.Assign(FDBParams); aDBName := FDBName; - {Opportuning to override defaults} + {Opportunity to override defaults} for i := 0 to FSQLObjects.Count - 1 do begin if FSQLObjects[i] <> nil then @@ -2023,6 +2031,33 @@ begin Result := 1; {Unknown character set} end; +function TIBBase.GetDefaultCharSetSize: integer; +var DefaultCharSetName: string; + i: integer; +begin + DefaultCharSetName := GetDefaultCharSetName; + Result := 4; {worse case} + for i := 0 to Length(Database.FCharSetSizes) - 1 do + if Database.FCharSetNames[i] = DefaultCharSetName then + begin + Result := Database.FCharSetSizes[i]; + break; + end; +end; + +function TIBBase.GetCharSetName(CharSetID: integer): string; +begin + if (CharSetID >= 0) and (CharSetID < Length(Database.FCharSetNames)) then + Result := Database.FCharSetNames[CharSetID] + else + Result := ''; {Unknown character set} +end; + +function TIBBase.GetDefaultCharSetName: string; +begin + Result := AnsiUpperCase(Database.Params.Values['lc_ctype']); +end; + procedure TIBBase.HandleException(Sender: TObject); begin if assigned(Database) then