📄 ib_services.pas
字号:
begin
FDatabaseName.Free;
FBackupFile.Free;
inherited Destroy;
end;
procedure TpFIBRestoreService.SetBackupFile(const Value: TStrings);
begin
FBackupFile.Assign(Value);
end;
procedure TpFIBRestoreService.SetDatabaseName(const Value: TStrings);
begin
FDatabaseName.Assign(Value);
end;
{ TpFIBValidationService }
constructor TpFIBValidationService.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
end;
destructor TpFIBValidationService.Destroy;
var
i : Integer;
begin
for i := 0 to High(FLimboTransactionInfo) do
FLimboTransactionInfo[i].Free;
FLimboTransactionInfo := nil;
inherited Destroy;
end;
procedure TpFIBValidationService.FetchLimboTransactionInfo;
var
i, RunLen: Integer;
Value: Char;
begin
ServiceQueryParams := Char(isc_info_svc_limbo_trans);
InternalServiceQuery;
RunLen := 0;
if (OutputBuffer[RunLen] <> Char(isc_info_svc_limbo_trans)) then
FIBError(feOutputParsingError, [nil]);
Inc(RunLen, 3);
for i := 0 to High(FLimboTransactionInfo) do
FLimboTransactionInfo[i].Free;
FLimboTransactionInfo := nil;
i := 0;
while (OutputBuffer[RunLen] <> Char(isc_info_end)) do
begin
if (i >= Length(FLimboTransactionInfo)) then
SetLength(FLimboTransactionInfo, i + 10);
if FLimboTransactionInfo[i] = nil then
FLimboTransactionInfo[i] := TLimboTransactionInfo.Create;
with FLimboTransactionInfo[i] do
begin
if (OutputBuffer[RunLen] = Char(isc_spb_single_tra_id)) then
begin
Inc(RunLen);
MultiDatabase := False;
ID := ParseInteger(RunLen);
{ HostSite := ParseString(RunLen);
if (OutputBuffer[RunLen] <> Char(isc_spb_tra_state)) then
FIBError(feOutputParsingError, [nil]);}
end
else
begin
Inc(RunLen);
MultiDatabase := True;
ID := ParseInteger(RunLen);
HostSite := ParseString(RunLen);
if (OutputBuffer[RunLen] <> Char(isc_spb_tra_state)) then
FIBError(feOutputParsingError, [nil]);
Inc(RunLen);
Value := OutputBuffer[RunLen];
Inc(RunLen);
if (Value = Char(isc_spb_tra_state_limbo)) then
State := LimboState
else
if (Value = Char(isc_spb_tra_state_commit)) then
State := CommitState
else
if (Value = Char(isc_spb_tra_state_rollback)) then
State := RollbackState
else
State := UnknownState;
RemoteSite := ParseString(RunLen);
RemoteDatabasePath := ParseString(RunLen);
Value := OutputBuffer[RunLen];
Inc(RunLen);
if (Value = Char(isc_spb_tra_advise_commit)) then
begin
Advise := CommitAdvise;
Action:= CommitAction;
end
else
if (Value = Char(isc_spb_tra_advise_rollback)) then
begin
Advise := RollbackAdvise;
Action := RollbackAction;
end
else
begin
{ if no advice commit as default }
Advise := UnknownAdvise;
Action:= CommitAction;
end;
end;
Inc (i);
end;
end;
if (i > 0) then
SetLength(FLimboTransactionInfo, i+1);
end;
procedure TpFIBValidationService.FixLimboTransactionErrors;
var
i: Integer;
begin
ServiceStartParams := Char(isc_action_svc_repair);
ServiceStartAddParam (FDatabaseName, SPBConstantValues[isc_spb_dbname]);
if (FGlobalAction = NoGlobalAction) then
begin
i := 0;
while (i<Length(FLimboTransactionInfo)) and(FLimboTransactionInfo[i].ID <> 0) do
begin
if (FLimboTransactionInfo[i].Action = CommitAction) then
ServiceStartAddParam (FLimboTransactionInfo[i].ID, isc_spb_rpr_commit_trans)
else
ServiceStartAddParam (FLimboTransactionInfo[i].ID, isc_spb_rpr_rollback_trans);
Inc(i);
end;
end
else
begin
i := 0;
if (FGlobalAction = CommitGlobal) then
while (i<Length(FLimboTransactionInfo)) and (FLimboTransactionInfo[i].ID <> 0) do
begin
ServiceStartAddParam (FLimboTransactionInfo[i].ID, isc_spb_rpr_commit_trans);
Inc(i);
end
else
while (i<Length(FLimboTransactionInfo)) and(FLimboTransactionInfo[i].ID <> 0) do
begin
ServiceStartAddParam (FLimboTransactionInfo[i].ID, isc_spb_rpr_rollback_trans);
Inc(i);
end;
end;
InternalServiceStart;
end;
function TpFIBValidationService.GetLimboTransactionInfo(index: integer): TLimboTransactionInfo;
begin
if index <= High(FLimboTransactionInfo) then
result := FLimboTransactionInfo[index]
else
result := nil;
end;
function TpFIBValidationService.GetLimboTransactionInfoCount: integer;
begin
Result := High(FLimboTransactionInfo);
end;
procedure TpFIBValidationService.SetDatabaseName(const Value: string);
begin
FDatabaseName := Value;
end;
procedure TpFIBValidationService.SetServiceStartOptions;
var
param: Integer;
begin
Action := isc_action_svc_repair;
if FDatabaseName = '' then
FIBError(feStartParamsError, [nil]);
param := 0;
if (SweepDB in Options) then
param := param or isc_spb_rpr_sweep_db;
if (ValidateDB in Options) then
param := param or isc_spb_rpr_validate_db;
ServiceStartParams := Char(isc_action_svc_repair);
ServiceStartAddParam (FDatabaseName, SPBConstantValues[isc_spb_dbname]);
if param > 0 then
ServiceStartAddParam (param, SPBConstantValues[isc_spb_options]);
param := 0;
if (LimboTransactions in Options) then
param := param or isc_spb_rpr_list_limbo_trans;
if (CheckDB in Options) then
param := param or isc_spb_rpr_check_db;
if (IgnoreChecksum in Options) then
param := param or isc_spb_rpr_ignore_checksum;
if (KillShadows in Options) then
param := param or isc_spb_rpr_kill_shadows;
if (MendDB in Options) then
param := param or isc_spb_rpr_mend_db;
if (ValidateFull in Options) then
begin
param := param or isc_spb_rpr_full;
if not (MendDB in Options) then
param := param or isc_spb_rpr_validate_db;
end;
if param > 0 then
ServiceStartAddParam (param, SPBConstantValues[isc_spb_options]);
end;
{ TpFIBSecurityService }
constructor TpFIBSecurityService.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FModifyParams := [];
end;
destructor TpFIBSecurityService.Destroy;
var
i : Integer;
begin
for i := 0 to High(FUserInfo) do
FUserInfo[i].Free;
FUserInfo := nil;
inherited Destroy;
end;
procedure TpFIBSecurityService.FetchUserInfo;
var
i, RunLen: Integer;
begin
ServiceQueryParams := Char(isc_info_svc_get_users);
InternalServiceQuery;
RunLen := 0;
if (OutputBuffer[RunLen] <> Char(isc_info_svc_get_users)) then
FIBError(feOutputParsingError, [nil]);
Inc(RunLen);
for i := 0 to High(FUserInfo) do
FUserInfo[i].Free;
FUserInfo := nil;
i := 0;
{ Don't have any use for the combined length
so increment past by 2 }
Inc(RunLen, 2);
while (OutputBuffer[RunLen] <> Char(isc_info_end)) do
begin
if (i >= Length(FUSerInfo)) then
SetLength(FUserInfo, i + 10);
if (OutputBuffer[RunLen] <> Char(isc_spb_sec_username)) then
FIBError(feOutputParsingError, [nil]);
Inc(RunLen);
if FUserInfo[i] = nil then
FUserInfo[i] := TUserInfo.Create;
FUserInfo[i].UserName := ParseString(RunLen);
if (OutputBuffer[RunLen] <> Char(isc_spb_sec_firstname)) then
FIBError(feOutputParsingError, [nil]);
Inc(RunLen);
FUserInfo[i].FirstName := ParseString(RunLen);
if (OutputBuffer[RunLen] <> Char(isc_spb_sec_middlename)) then
FIBError(feOutputParsingError, [nil]);
Inc(RunLen);
FUserInfo[i].MiddleName := ParseString(RunLen);
if (OutputBuffer[RunLen] <> Char(isc_spb_sec_lastname)) then
FIBError(feOutputParsingError, [nil]);
Inc(RunLen);
FUserInfo[i].LastName := ParseString(RunLen);
if (OutputBuffer[RunLen] <> Char(isc_spb_sec_userId)) then
FIBError(feOutputParsingError, [nil]);
Inc(RunLen);
FUserInfo[i].UserId := ParseInteger(RunLen);
if (OutputBuffer[RunLen] <> Char(isc_spb_sec_groupid)) then
FIBError(feOutputParsingError, [nil]);
Inc(RunLen);
FUserInfo[i].GroupID := ParseInteger(RunLen);
Inc (i);
end;
if (i > 0) then
SetLength(FUserInfo, i+1);
end;
function TpFIBSecurityService.GetUserInfo(Index: Integer): TUserInfo;
begin
if Index <= High(FUSerInfo) then
result := FUserInfo[Index]
else
result := nil;
end;
function TpFIBSecurityService.GetUserInfoCount: Integer;
begin
Result := High(FUSerInfo);
end;
procedure TpFIBSecurityService.AddUser;
begin
SecurityAction := ActionAddUser;
ServiceStart;
end;
procedure TpFIBSecurityService.DeleteUser;
begin
SecurityAction := ActionDeleteUser;
ServiceStart;
end;
procedure TpFIBSecurityService.DisplayUsers;
begin
SecurityAction := ActionDisplayUser;
ServiceStartParams := Char(isc_action_svc_display_user);
InternalServiceStart;
FetchUserInfo;
end;
procedure TpFIBSecurityService.DisplayUser(UserName: String);
begin
SecurityAction := ActionDisplayUser;
ServiceStartParams := Char(isc_action_svc_display_user);
ServiceStartAddParam (UserName, isc_spb_sec_username);
InternalServiceStart;
FetchUserInfo;
end;
procedure TpFIBSecurityService.ModifyUser;
begin
SecurityAction := ActionModifyUser;
ServiceStart;
end;
procedure TpFIBSecurityService.SetSecurityAction (Value: TSecurityAction);
begin
FSecurityAction := Value;
if Value = ActionDeleteUser then
ClearParams;
end;
procedure TpFIBSecurityService.ClearParams;
begin
FModifyParams := [];
FFirstName := '';
FMiddleName := '';
FLastName := '';
FGroupID := 0;
FUserID := 0;
FPassword := '';
end;
procedure TpFIBSecurityService.SetFirstName (Value: String);
begin
FFirstName := Value;
Include (FModifyParams, ModifyFirstName);
end;
procedure TpFIBSecurityService.SetMiddleName (Value: String);
begin
FMiddleName := Value;
Include (FModifyParams, ModifyMiddleName);
end;
procedure TpFIBSecurityService.SetLastName (Value: String);
begin
FLastName := Value;
Include (FModifyParams, ModifyLastName);
end;
procedure TpFIBSecurityService.SetPassword (Value: String);
begin
FPassword := Value;
Include (FModifyParams, ModifyPassword);
end;
procedure TpFIBSecurityService.SetUserId (Value: Integer);
begin
FUserId := Value;
Include (FModifyParams, ModifyUserId);
end;
procedure TpFIBSecurityService.SetGroupId (Value: Integer);
begin
FGroupId := Value;
Include (FModifyParams, ModifyGroupId);
end;
procedure TpFIBSecurityService.Loaded;
begin
inherited Loaded;
ClearParams;
end;
procedure TpFIBSecurityService.SetServiceStartOptions;
var
Len: UShort;
begin
case FSecurityAction of
ActionAddUser:
begin
Action := isc_action_svc_add_user;
if ( Pos(' ', FUserName) > 0 ) then
FIBError(feStartParamsError, [nil]);
Len := Length(FUserName);
if (Len = 0) then
FIBError(feStartParamsError, [nil]);
ServiceStartParams := Char(isc_action_svc_add_user);
ServiceStartAddParam (FUserName, isc_spb_sec_username);
ServiceStartAddParam (FUserID, isc_spb_sec_userid);
ServiceStartAddParam (FGroupID, isc_spb_sec_groupid);
ServiceStartAddParam (FPassword, isc_spb_sec_password);
ServiceStartAddParam (FFirstName, isc_spb_sec_firstname);
ServiceStartAddParam (FMiddleName, isc_spb_sec_middlename);
ServiceStartAddParam (FLastName, isc_spb_sec_lastname);
ServiceStartAddParam (FSQLRole, SPBConstantValues[isc_spb_sql_role_name]);
end;
ActionDeleteUser:
begin
Action := isc_action_svc_delete_user;
Len := Length(FUserName);
if (Len = 0) then
FIBError(feStartParamsError, [nil]);
ServiceStartParams := Char(isc_action_svc_delete_user);
ServiceStartAdd
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -