--- ibx/trunk/runtime/IBDatabase.pas 2016/07/16 12:25:48 42 +++ ibx/trunk/runtime/IBDatabase.pas 2016/09/22 17:10:15 43 @@ -187,11 +187,9 @@ type FUserNames: TStringList; FDataSets: TList; FLoginCalled: boolean; - FCharSetSizes: array of integer; - FCharSetNames: array of RawByteString; FDefaultCharSetName: RawByteString; + FDefaultCharSetID: integer; {$IFDEF HAS_ANSISTRING_CODEPAGE} - FCodePages: array of TSystemCodePage; FDefaultCodePage: TSystemCodePage; {$ENDIF} FUseDefaultSystemCodePage: boolean; @@ -209,7 +207,6 @@ type function GetTransaction(Index: Integer): TIBTransaction; function GetTransactionCount: Integer; function Login(var aDatabaseName: string): Boolean; - procedure LoadCharSetInfo; procedure SetDatabaseName(const Value: TIBFileName); procedure SetDBParamByDPB(const Idx: Integer; Value: String); procedure SetDBParams(Value: TStrings); @@ -267,6 +264,7 @@ type property Transactions[Index: Integer]: TIBTransaction read GetTransaction; property InternalTransaction: TIBTransaction read FInternalTransaction; property DefaultCharSetName: RawByteString read FDefaultCharSetName; + property DefaultCharSetID: integer read FDefaultCharSetID; {$IFDEF HAS_ANSISTRING_CODEPAGE} property DefaultCodePage: TSystemCodePage read FDefaultCodePage; {$ENDIF} @@ -460,14 +458,8 @@ type procedure DoAfterDelete(Sender: TObject); virtual; 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: RawByteString; - {$IFDEF HAS_ANSISTRING_CODEPAGE} - function GetCodePage(CharSetID: integer): TSystemCodePage; - function GetDefaultCodePage: TSystemCodePage; - {$ENDIF} + function GetDefaultCharSetID: cardinal; procedure HandleException(Sender: TObject); procedure SetCursor; procedure RestoreCursor; @@ -641,11 +633,9 @@ begin if Connected then InternalClose(False); FDBSQLDialect := 1; - SetLength(FCharSetSizes,0); - SetLength(FCharSetNames,0); FDefaultCharSetName := ''; + FDefaultCharSetID := 0; {$IFDEF HAS_ANSISTRING_CODEPAGE} - SetLength(FCodePages,0); FDefaultCodePage := CP_NONE; {$ENDIF} end; @@ -842,46 +832,6 @@ begin SQLObjects[i].DoAfterDatabaseDisconnect; end; -procedure TIBDataBase.LoadCharSetInfo; -var Query: TIBSQL; - i: integer; -begin - if not FInternalTransaction.Active then - FInternalTransaction.StartTransaction; - Query := TIBSQL.Create(self); - try - Query.Database := Self; - Query.Transaction := FInternalTransaction; - 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); - {$IFDEF HAS_ANSISTRING_CODEPAGE} - SetLength(FCodePages, Query.FieldByName('RDB$CHARACTER_SET_ID').AsInteger + 1); - {$ENDIF} - 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] := - Trim(Query.FieldByName('RDB$CHARACTER_SET_NAME').AsString); - {$IFDEF HAS_ANSISTRING_CODEPAGE} - FCodePages[Query.FieldByName('RDB$CHARACTER_SET_ID').AsInteger] := - IBGetCodePage(Trim(Query.FieldByName('RDB$CHARACTER_SET_NAME').AsString)); - {$ENDIF} - Query.Next; - until Query.EOF; - end; - finally - Query.free; - FInternalTransaction.Commit; - end; -end; - procedure TIBDataBase.CheckStreamConnect; var i: integer; @@ -1040,9 +990,7 @@ var sqlcode: Long; IBErrorCode: Long; status_vector: PISC_STATUS; - {$ifdef WINDOWS} - acp: uint; - {$endif} + CharSetID: integer; begin CheckInactive; CheckDatabaseName; @@ -1061,25 +1009,18 @@ begin TempDBParams.Assign(FDBParams); if UseDefaultSystemCodePage then begin - {$ifdef WINDOWS} - acp := GetACP; {$IFDEF HAS_ANSISTRING_CODEPAGE} - TempDBParams.Values['lc_ctype'] := IBGetCharacterSetName(acp); - FDefaultCodePage := IBGetCodePage(AnsiUpperCase(TempDBParams.Values['lc_ctype'])); - {$ELSE} - if (acp >= 1250) and (acp <= 1258) then - TempDBParams.Values['lc_ctype'] := Format('WIN%d',[acp]) + {$ifdef WINDOWS} + if TFirebirdCharacterSets.CodePage2CharSetID(GetACP,CharSetID) then + TempDBParams.Values['lc_ctype'] := TFirebirdCharacterSets.GetCharsetName(CharSetID) else - TempDBParams.Values['lc_ctype'] :='UTF8'; - {$ENDIF} {$else} - {$IFDEF HAS_ANSISTRING_CODEPAGE} - TempDBParams.Values['lc_ctype'] := IBGetCharacterSetName(DefaultSystemCodePage); - FDefaultCodePage := IBGetCodePage(AnsiUpperCase(TempDBParams.Values['lc_ctype'])); - {$ELSE} - TempDBParams.Values['lc_ctype'] :='UTF8'; - {$ENDIF} + if TFirebirdCharacterSets.CodePage2CharSetID(DefaultSystemCodePage,CharSetID) then + TempDBParams.Values['lc_ctype'] := TFirebirdCharacterSets.GetCharsetName(CharSetID) + else {$endif} + {$ENDIF} + TempDBParams.Values['lc_ctype'] :='UTF8'; end; {Opportunity to override defaults} for i := 0 to FSQLObjects.Count - 1 do @@ -1088,7 +1029,11 @@ begin SQLObjects[i].DoBeforeDatabaseConnect(TempDBParams,aDBName); end; FDefaultCharSetName := AnsiUpperCase(TempDBParams.Values['lc_ctype']); - + if FDefaultCharSetName <> '' then + TFirebirdCharacterSets.CharSetName2CharSetID(FDefaultCharSetName,FDefaultCharSetID); + {$IFDEF HAS_ANSISTRING_CODEPAGE} + TFirebirdCharacterSets.CharSetID2CodePage(FDefaultCharSetID,FDefaultCodePage); + {$ENDIF} { Generate a new DPB if necessary } if (FDBParamsChanged or (TempDBParams.Text <> FDBParams.Text)) then begin @@ -1143,7 +1088,6 @@ begin end; if not (csDesigning in ComponentState) then MonitorHook.DBConnect(Self); - LoadCharSetInfo; end; procedure TIBDataBase.RemoveSQLObject(Idx: Integer); @@ -2094,57 +2038,16 @@ begin inherited Destroy; end; -function TIBBase.GetCharSetSize(CharSetID: integer): integer; -begin - if (CharSetID >= 0) and (CharSetID < Length(Database.FCharSetSizes)) then - Result := Database.FCharSetSizes[CharSetID] - else - 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: RawByteString; begin Result := Database.FDefaultCharSetName; end; -{$IFDEF HAS_ANSISTRING_CODEPAGE} -function TIBBase.GetCodePage(CharSetID: integer): TSystemCodePage; -begin - if (CharSetID >= 0) and (CharSetID < Length(Database.FCodePages)) then - Result := Database.FCodePages[CharSetID] - else - Result := CP_NONE; {Unknown character set} -end; - -function TIBBase.GetDefaultCodePage: TSystemCodePage; +function TIBBase.GetDefaultCharSetID: cardinal; begin - Result := Database.FDefaultCodePage; + Result := Database.DefaultCharSetID; end; -{$ENDIF} - procedure TIBBase.HandleException(Sender: TObject); begin if assigned(Database) then