mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-22 11:49:42 +02:00
* Added TFBAdmin component from Ludo Brands (bug 22012)
git-svn-id: trunk@21276 -
This commit is contained in:
parent
62a91ef626
commit
3296858f44
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -2023,6 +2023,7 @@ packages/fcl-db/src/sqldb/fpmake.inc svneol=native#text/plain
|
|||||||
packages/fcl-db/src/sqldb/fpmake.pp svneol=native#text/plain
|
packages/fcl-db/src/sqldb/fpmake.pp svneol=native#text/plain
|
||||||
packages/fcl-db/src/sqldb/interbase/Makefile svneol=native#text/plain
|
packages/fcl-db/src/sqldb/interbase/Makefile svneol=native#text/plain
|
||||||
packages/fcl-db/src/sqldb/interbase/Makefile.fpc svneol=native#text/plain
|
packages/fcl-db/src/sqldb/interbase/Makefile.fpc svneol=native#text/plain
|
||||||
|
packages/fcl-db/src/sqldb/interbase/fbadmin.pp svneol=native#text/plain
|
||||||
packages/fcl-db/src/sqldb/interbase/fpmake.inc svneol=native#text/plain
|
packages/fcl-db/src/sqldb/interbase/fpmake.inc svneol=native#text/plain
|
||||||
packages/fcl-db/src/sqldb/interbase/fpmake.pp svneol=native#text/plain
|
packages/fcl-db/src/sqldb/interbase/fpmake.pp svneol=native#text/plain
|
||||||
packages/fcl-db/src/sqldb/interbase/ibconnection.pp svneol=native#text/plain
|
packages/fcl-db/src/sqldb/interbase/ibconnection.pp svneol=native#text/plain
|
||||||
|
@ -541,6 +541,16 @@ begin
|
|||||||
AddUnit('dbconst');
|
AddUnit('dbconst');
|
||||||
AddUnit('bufdataset');
|
AddUnit('bufdataset');
|
||||||
end;
|
end;
|
||||||
|
T:=P.Targets.AddUnit('fbadmin.pp', SqldbConnectionOSes);
|
||||||
|
T.ResourceStrings:=true;
|
||||||
|
with T.Dependencies do
|
||||||
|
begin
|
||||||
|
AddUnit('sqldb');
|
||||||
|
AddUnit('db');
|
||||||
|
AddUnit('dbconst');
|
||||||
|
AddUnit('bufdataset');
|
||||||
|
AddUnit('ibconnection');
|
||||||
|
end;
|
||||||
T:=P.Targets.AddUnit('memds.pp');
|
T:=P.Targets.AddUnit('memds.pp');
|
||||||
T.ResourceStrings:=true;
|
T.ResourceStrings:=true;
|
||||||
with T.Dependencies do
|
with T.Dependencies do
|
||||||
|
767
packages/fcl-db/src/sqldb/interbase/fbadmin.pp
Normal file
767
packages/fcl-db/src/sqldb/interbase/fbadmin.pp
Normal file
@ -0,0 +1,767 @@
|
|||||||
|
unit FBAdmin;
|
||||||
|
|
||||||
|
{ Interbase/Firebird Administration using the service manager
|
||||||
|
|
||||||
|
Copyright (C) 2012 Ludo Brands
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Library General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
option) any later version with the following modification:
|
||||||
|
|
||||||
|
As a special exception, the copyright holders of this library give you
|
||||||
|
permission to link this library with independent modules to produce an
|
||||||
|
executable, regardless of the license terms of these independent modules,and
|
||||||
|
to copy and distribute the resulting executable under terms of your choice,
|
||||||
|
provided that you also meet, for each linked independent module, the terms
|
||||||
|
and conditions of the license of that module. An independent module is a
|
||||||
|
module which is not derived from or based on this library. If you modify
|
||||||
|
this library, you may extend this exception to your version of the library,
|
||||||
|
but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
|
exception statement from your version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
}
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
{$Define LinkDynamically}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils,
|
||||||
|
{$IfDef LinkDynamically}
|
||||||
|
ibase60dyn,
|
||||||
|
{$Else}
|
||||||
|
ibase60,
|
||||||
|
{$EndIf}
|
||||||
|
IBConnection;
|
||||||
|
|
||||||
|
type
|
||||||
|
TIBBackupOption=(IBBkpVerbose,IBBkpIgnoreChecksums,IBBkpIgnoreLimbo,IBBkpMetadataOnly,
|
||||||
|
IBBkpNoGarbageCollect,IBBkpOldDescriptions,IBBkpNonTransportable,IBBkpConvert);
|
||||||
|
TIBBackupOptions= set of TIBBackupOption;
|
||||||
|
TIBRestoreOption=(IBResVerbose,IBResDeactivateIdx,IBResNoShadow,IBResNoValidity,
|
||||||
|
IBResOneAtaTime,IBResReplace,IBResCreate,IBResUseAllSpace,IBResAMReadOnly,IBResAMReadWrite);
|
||||||
|
TIBRestoreOptions= set of TIBRestoreOption;
|
||||||
|
TServiceProtocol=(IBSPLOCAL,IBSPTCPIP,IBSPNETBEUI,IBSPNAMEDPIPE);
|
||||||
|
TIBOnOutput= procedure(Sender: TObject; msg: string; IBAdminAction: string) of object;
|
||||||
|
|
||||||
|
{ TFBAdmin }
|
||||||
|
|
||||||
|
TFBAdmin=class(TComponent)
|
||||||
|
private
|
||||||
|
FErrorCode: longint;
|
||||||
|
FErrorMsg: string;
|
||||||
|
FHost: string;
|
||||||
|
FOnOutput: TIBOnOutput;
|
||||||
|
FOutput: TStringList;
|
||||||
|
FPassword: string;
|
||||||
|
FPort: word;
|
||||||
|
FProtocol: TServiceProtocol;
|
||||||
|
FServerImplementation: string;
|
||||||
|
FServerLockDir: string;
|
||||||
|
FServerMsgDir: string;
|
||||||
|
FServerRootDir: string;
|
||||||
|
FServerSecDBDir: string;
|
||||||
|
FServerVersion: string;
|
||||||
|
FStatus: array [0..19] of ISC_STATUS;
|
||||||
|
FSvcHandle: isc_svc_handle;
|
||||||
|
FUseExceptions: boolean;
|
||||||
|
FUser: string;
|
||||||
|
function CheckConnected(ProcName: string):boolean;
|
||||||
|
procedure CheckError(ProcName : string; Status : PISC_STATUS);
|
||||||
|
function GetDBInfo:boolean;
|
||||||
|
function GetIBLongint(buffer:string; var bufptr:integer):longint;overload;
|
||||||
|
function GetIBString(buffer:string; var bufptr:integer):string;overload;
|
||||||
|
function GetOutput(IBAdminAction:string):boolean;
|
||||||
|
function IBParamSerialize(isccode:byte;value:string):string;
|
||||||
|
procedure IBRaiseError(GDSErrorCode:Longint; const msg : string; const args : array of const);
|
||||||
|
function IBSPBParamSerialize(isccode:byte;value:string):string;
|
||||||
|
function IBSPBParamSerialize(isccode:byte;value:longint):string;
|
||||||
|
function MakeBackupOptions(options:TIBBackupOptions):longint;
|
||||||
|
function MakeRestoreOptions(options:TIBRestoreOptions):longint;
|
||||||
|
|
||||||
|
public
|
||||||
|
constructor Create(AOwner: TComponent); override;
|
||||||
|
destructor Destroy; override;
|
||||||
|
//Connect to service manage. Specify User,Password and, for remote databases,
|
||||||
|
//Host and, if not standard, Port
|
||||||
|
function Connect:boolean;
|
||||||
|
//Disconnect from service manager. Done automatically when destroying component
|
||||||
|
function DisConnect:boolean;
|
||||||
|
//Backup database to a single file on the server.
|
||||||
|
//Include IBBkpVerbose in Options to get progress feedback through the OnOutput Handler
|
||||||
|
function Backup(Database,Filename:string;Options:TIBBackupOptions;RoleName:string=''):boolean;
|
||||||
|
//Backup database to multiple files with length FileSize on the server.
|
||||||
|
//Filenames is the list of filenames to use. The last file specified has no size limit.
|
||||||
|
//Include IBBkpVerbose in Options to get progress feedback through the OnOutput Handler
|
||||||
|
function BackupMultiFile(Database:string;Filenames:TStrings;FileSize:longint;
|
||||||
|
Options:TIBBackupOptions;RoleName:string=''):boolean;
|
||||||
|
//Restore database from a single file on the server.
|
||||||
|
//Include IBResReplace to restore in and existing database or IBResCreate
|
||||||
|
//to create a a new one.
|
||||||
|
//Include IBResVerbose in Options to get progress feedback through the OnOutput Handler
|
||||||
|
function Restore(Database,Filename:string;Options:TIBRestoreOptions;RoleName:string=''):boolean;
|
||||||
|
//Restore database from multiple files on the server.
|
||||||
|
//Filenames is the list of files to use.
|
||||||
|
//Include IBResReplace to restore in and existing database or IBResCreate
|
||||||
|
//to create a a new one.
|
||||||
|
//Include IBResVerbose in Options to get progress feedback through the OnOutput Handler
|
||||||
|
function RestoreMultiFile(Database:string;Filenames:TStrings;
|
||||||
|
Options:TIBRestoreOptions;RoleName:string=''):boolean;
|
||||||
|
//Add a new user.
|
||||||
|
function AddUser(UserName,Password:string;RoleName:string='';
|
||||||
|
GroupName:string='';FirstName:string='';MiddleName:string='';
|
||||||
|
LastName:string='';UserID: longint = 0; GroupID: longint = 0):boolean;
|
||||||
|
//Modify an existing user.
|
||||||
|
function ModifyUser(UserName,Password:string;RoleName:string='';
|
||||||
|
GroupName:string='';FirstName:string='';MiddleName:string='';
|
||||||
|
LastName:string='';UserID: longint = 0; GroupID: longint = 0):boolean;
|
||||||
|
//Delete an existing user.
|
||||||
|
function DeleteUser(UserName:string;RoleName:string=''):boolean;
|
||||||
|
//Get the details of an existing user.
|
||||||
|
function GetUser(UserName:string;var GroupName,FirstName,MiddleName,
|
||||||
|
LastName:string;var UserID, GroupID: longint):boolean;
|
||||||
|
//Get the list of all users
|
||||||
|
function GetUsers(Users:TStrings):boolean;
|
||||||
|
//Get database server log file
|
||||||
|
function GetDatabaseLog:boolean;
|
||||||
|
//Database server version
|
||||||
|
property ServerVersion:string read FServerVersion;
|
||||||
|
//Implementation string of the database server
|
||||||
|
property ServerImplementation:string read FServerImplementation;
|
||||||
|
//Setting of $FIREBIRD or $INTERBASE
|
||||||
|
property ServerRootDir:string read FServerRootDir;
|
||||||
|
//Setting of $FIREBIRD_LCK or $INTERBASE_LCK
|
||||||
|
property ServerLockDir:string read FServerLockDir;
|
||||||
|
//Setting of $FIREBIRD_MSG or $INTERBASE_MSG
|
||||||
|
property ServerMsgDir:string read FServerMsgDir;
|
||||||
|
//Path to the security database in use by the server
|
||||||
|
property ServerSecDBDir:string read FServerSecDBDir;
|
||||||
|
published
|
||||||
|
//User name to connect to service manager
|
||||||
|
property User: string read FUser write FUser;
|
||||||
|
//User name to connect to service manager
|
||||||
|
property Password: string read FPassword write FPassword;
|
||||||
|
//Database Host
|
||||||
|
property Host: string read FHost write FHost;
|
||||||
|
//Database Port, Default:3050
|
||||||
|
property Port: word read FPort write FPort default 3050;
|
||||||
|
//Protocol used to connect to service manager. One of:
|
||||||
|
//IBSPLOCAL: Host and port ignored
|
||||||
|
//IBSPTCPIP: Connectoct to Host:Port
|
||||||
|
//IBSPNETBEUI: Connect to \\Host\
|
||||||
|
//IBSPNAMEDPIPE: Connect to //Host/
|
||||||
|
property Protocol: TServiceProtocol read FProtocol write FProtocol;
|
||||||
|
//Errorcode returned in status vector or 0 for TFBAdmin errors
|
||||||
|
property ErrorCode:longint read FErrorCode;
|
||||||
|
//Errormsg returned in status vector or by TFBAdmin
|
||||||
|
property ErrorMsg:string read FErrorMsg;
|
||||||
|
//Raise exceptions when error encounterd. Default: false
|
||||||
|
property UseExceptions:boolean read FUseExceptions write FUseExceptions;
|
||||||
|
//Service output messages
|
||||||
|
//Result from Backup and Restore operations and GetLog
|
||||||
|
property Output:TStringList read FOutput;
|
||||||
|
//Event handler for Service output messages
|
||||||
|
//Used in Backup and Restore operations and GetLog
|
||||||
|
property OnOutput: TIBOnOutput read FOnOutput write FOnOutput;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
resourcestring
|
||||||
|
SErrNotConnected = '%s : %s : Not connected.';
|
||||||
|
SErrError = '%s : %s : %s';
|
||||||
|
SErrConnected = '%s : Connect : Already connected.';
|
||||||
|
SErrRestoreOptionsError = '%s : Restore : Nothing to do. Specify IBResReplace or IBResCreate in Options.';
|
||||||
|
SErrRestoreMultiOptionsError = '%s : RestoreMultiFile : Nothing to do. Specify IBResReplace or IBResCreate in Options.';
|
||||||
|
SErrUserDoesNotExist = '%s : GetUser : User does not exist.';
|
||||||
|
SErrUserInvalidReply = '%s : GetUser : Invalid reply (%d).';
|
||||||
|
SErrUsersInvalidReply = '%s : GetUsers : Invalid reply (%d).';
|
||||||
|
|
||||||
|
{ TFBAdmin }
|
||||||
|
|
||||||
|
function TFBAdmin.IBParamSerialize(isccode: byte; value: string): string;
|
||||||
|
begin
|
||||||
|
result:=chr(isccode)+chr(Length(value))+value;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TFBAdmin.IBRaiseError(GDSErrorCode: Longint; const msg: string;
|
||||||
|
const args: array of const);
|
||||||
|
var
|
||||||
|
E:EIBDatabaseError;
|
||||||
|
begin
|
||||||
|
FErrorMsg:=format(msg,args);
|
||||||
|
FErrorCode:=GDSErrorCode;
|
||||||
|
if FUseExceptions then
|
||||||
|
begin
|
||||||
|
E := EIBDatabaseError.Create(FErrorMsg);
|
||||||
|
E.GDSErrorCode := GDSErrorCode;
|
||||||
|
Raise E;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFBAdmin.IBSPBParamSerialize(isccode: byte; value: string): string;
|
||||||
|
begin
|
||||||
|
result:=chr(isccode)+chr(Length(value) and $ff)+chr((Length(value)shr 8) and $ff)+value;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFBAdmin.IBSPBParamSerialize(isccode: byte; value: longint): string;
|
||||||
|
begin
|
||||||
|
result:=chr(isccode)+chr(value and $ff)+chr((value shr 8) and $ff)
|
||||||
|
+chr((value shr 16) and $ff)+chr((value shr 24) and $ff);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFBAdmin.MakeBackupOptions(options: TIBBackupOptions): longint;
|
||||||
|
begin
|
||||||
|
result:=0;
|
||||||
|
if IBBkpConvert in Options then
|
||||||
|
result:=result or isc_spb_bkp_convert;
|
||||||
|
if IBBkpIgnoreChecksums in Options then
|
||||||
|
result:=result or isc_spb_bkp_ignore_checksums;
|
||||||
|
if IBBkpIgnoreLimbo in Options then
|
||||||
|
result:=result or isc_spb_bkp_ignore_limbo;
|
||||||
|
if IBBkpMetadataOnly in Options then
|
||||||
|
result:=result or isc_spb_bkp_metadata_only;
|
||||||
|
if IBBkpNoGarbageCollect in Options then
|
||||||
|
result:=result or isc_spb_bkp_no_garbage_collect;
|
||||||
|
if IBBkpNonTransportable in Options then
|
||||||
|
result:=result or isc_spb_bkp_non_transportable;
|
||||||
|
if IBBkpOldDescriptions in Options then
|
||||||
|
result:=result or isc_spb_bkp_old_descriptions;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFBAdmin.MakeRestoreOptions(options: TIBRestoreOptions): longint;
|
||||||
|
begin
|
||||||
|
result:=0;
|
||||||
|
if IBResCreate in Options then
|
||||||
|
result:=result or isc_spb_res_create;
|
||||||
|
if IBResDeactivateIdx in Options then
|
||||||
|
result:=result or isc_spb_res_deactivate_idx;
|
||||||
|
if IBResNoShadow in Options then
|
||||||
|
result:=result or isc_spb_res_no_shadow;
|
||||||
|
if IBResNoValidity in Options then
|
||||||
|
result:=result or isc_spb_res_no_validity;
|
||||||
|
if IBResOneAtaTime in Options then
|
||||||
|
result:=result or isc_spb_res_one_at_a_time;
|
||||||
|
if IBResReplace in Options then
|
||||||
|
result:=result or isc_spb_res_replace;
|
||||||
|
if IBResUseAllSpace in Options then
|
||||||
|
result:=result or isc_spb_res_use_all_space;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TFBAdmin.CheckConnected(ProcName: string): boolean;
|
||||||
|
begin
|
||||||
|
result:=false;
|
||||||
|
if FSvcHandle=FB_API_NULLHANDLE then
|
||||||
|
begin
|
||||||
|
IBRaiseError(0,SErrNotConnected,[self.Name,ProcName]);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
result:=true;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TFBAdmin.CheckError(ProcName: string; Status: PISC_STATUS);
|
||||||
|
var
|
||||||
|
buf : array [0..1023] of char;
|
||||||
|
Msg : string;
|
||||||
|
Err : longint;
|
||||||
|
|
||||||
|
begin
|
||||||
|
if ((Status[0] = 1) and (Status[1] <> 0)) then
|
||||||
|
begin
|
||||||
|
Err := Status[1];
|
||||||
|
msg := '';
|
||||||
|
while isc_interprete(Buf, @Status) > 0 do
|
||||||
|
Msg := Msg + LineEnding +' -' + StrPas(Buf);
|
||||||
|
IBRaiseError(Err,SErrError,[self.Name,ProcName,Msg]);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFBAdmin.GetDBInfo: boolean;
|
||||||
|
|
||||||
|
function QueryInfo(isc:byte):string;
|
||||||
|
var
|
||||||
|
spb:string;
|
||||||
|
len:integer;
|
||||||
|
begin
|
||||||
|
result:='';
|
||||||
|
spb:=chr(isc);
|
||||||
|
setlength(result,255);
|
||||||
|
if (isc_service_query(@FStatus[0], @FSvcHandle, nil, 0, nil, length(spb),
|
||||||
|
@spb[1],255,@result[1])=0) and (result[1]=chr(isc)) then
|
||||||
|
begin
|
||||||
|
len:=isc_vax_integer(@result[2],2);
|
||||||
|
delete(result,1,3); // remove cmd and len
|
||||||
|
setlength(result,len);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
FServerImplementation:= QueryInfo(isc_info_svc_implementation);
|
||||||
|
FServerLockDir:= QueryInfo(isc_info_svc_get_env_lock);
|
||||||
|
FServerMsgDir:= QueryInfo(isc_info_svc_get_env_msg);
|
||||||
|
FServerRootDir:= QueryInfo(isc_info_svc_get_env);
|
||||||
|
FServerSecDBDir:= QueryInfo(isc_info_svc_user_dbpath);
|
||||||
|
FServerVersion:= QueryInfo(isc_info_svc_server_version);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFBAdmin.GetIBLongint(buffer: string; var bufptr: integer): longint;
|
||||||
|
begin
|
||||||
|
bufptr:=bufptr+1;
|
||||||
|
result:=isc_vax_integer(@Buffer[bufptr], 4);
|
||||||
|
bufptr:=bufptr+4;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFBAdmin.GetIBString(buffer: string; var bufptr: integer): string;
|
||||||
|
var
|
||||||
|
len:integer;
|
||||||
|
begin
|
||||||
|
bufptr:=bufptr+1;
|
||||||
|
len:=isc_vax_integer(@buffer[bufptr], 2);
|
||||||
|
bufptr:=bufptr+2;
|
||||||
|
result:=copy(buffer,bufptr,len);
|
||||||
|
bufptr:=bufptr+len;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFBAdmin.GetOutput(IBAdminAction: string): boolean;
|
||||||
|
var
|
||||||
|
len:integer;
|
||||||
|
buffer:string;
|
||||||
|
spb:string;
|
||||||
|
const
|
||||||
|
BUFFERSIZE=1000;
|
||||||
|
begin
|
||||||
|
len:=0;
|
||||||
|
FOutput.Clear;
|
||||||
|
spb:=chr(isc_info_svc_line);
|
||||||
|
repeat
|
||||||
|
setlength(buffer,BUFFERSIZE);
|
||||||
|
result:=isc_service_query(@FStatus[0], @FSvcHandle, nil, 0, nil, length(spb),
|
||||||
|
@spb[1],BUFFERSIZE,@buffer[1])=0;
|
||||||
|
if not result then
|
||||||
|
begin
|
||||||
|
CheckError('GetOutput',FStatus);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
if buffer[1]=chr(isc_info_svc_line) then
|
||||||
|
begin
|
||||||
|
len:=isc_vax_integer(@buffer[2],2);
|
||||||
|
delete(buffer,1,3); // remove cmd and len
|
||||||
|
setlength(buffer,len);
|
||||||
|
FOutput.Add(buffer);
|
||||||
|
if assigned(FOnOutput) then
|
||||||
|
begin
|
||||||
|
FOnOutput(Self,buffer,IBAdminAction);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
until len=0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TFBAdmin.Create(AOwner: TComponent);
|
||||||
|
begin
|
||||||
|
inherited Create(AOwner);
|
||||||
|
FPort:= 3050;
|
||||||
|
FOutput:=TStringList.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TFBAdmin.Destroy;
|
||||||
|
begin
|
||||||
|
if FSvcHandle<>FB_API_NULLHANDLE then
|
||||||
|
DisConnect;
|
||||||
|
FOutput.Destroy;
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFBAdmin.Connect: boolean;
|
||||||
|
var
|
||||||
|
E:EIBDatabaseError;
|
||||||
|
Service:string;
|
||||||
|
spb:string;
|
||||||
|
begin
|
||||||
|
result:=false;
|
||||||
|
{$IfDef LinkDynamically}
|
||||||
|
result:=InitialiseIBase60<>0;
|
||||||
|
{$EndIf}
|
||||||
|
if FSvcHandle<>FB_API_NULLHANDLE then
|
||||||
|
begin
|
||||||
|
E := EIBDatabaseError.CreateFmt(SErrConnected,[self.Name]);
|
||||||
|
E.GDSErrorCode := 0;
|
||||||
|
Raise E;
|
||||||
|
end;
|
||||||
|
Service:='service_mgr';
|
||||||
|
case FProtocol of
|
||||||
|
IBSPTCPIP:if FPort=3050 then
|
||||||
|
service:=FHost+':'+service
|
||||||
|
else
|
||||||
|
service:=FHost+'/'+IntTostr(FPort)+':'+service;
|
||||||
|
IBSPNETBEUI:service:='\\'+FHost+'\'+service;
|
||||||
|
IBSPNAMEDPIPE:service:='//'+FHost+'/'+service;
|
||||||
|
end;
|
||||||
|
spb:=chr(isc_spb_version)+chr(isc_spb_current_version)+
|
||||||
|
IBParamSerialize(isc_spb_user_name,FUser)+
|
||||||
|
IBParamSerialize(isc_spb_password,FPassword);
|
||||||
|
result:=isc_service_attach(@FStatus[0], 0,PChar(Service), @FSvcHandle,
|
||||||
|
length(spb), @spb[1]) = 0;
|
||||||
|
if not result then
|
||||||
|
CheckError('Connect',FStatus)
|
||||||
|
else
|
||||||
|
GetDBInfo;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFBAdmin.DisConnect: boolean;
|
||||||
|
|
||||||
|
begin
|
||||||
|
result:=CheckConnected('DisConnect');
|
||||||
|
result:= isc_service_detach(@FStatus[0], @FSvcHandle) = 0;
|
||||||
|
if not result then
|
||||||
|
CheckError('DisConnect',FStatus);
|
||||||
|
FSvcHandle:=FB_API_NULLHANDLE;
|
||||||
|
{$IfDef LinkDynamically}
|
||||||
|
ReleaseIBase60;
|
||||||
|
{$EndIf}
|
||||||
|
result:=true;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFBAdmin.Backup(Database, Filename: string; Options: TIBBackupOptions;
|
||||||
|
RoleName: string): boolean;
|
||||||
|
var
|
||||||
|
spb:string;
|
||||||
|
begin
|
||||||
|
result:=CheckConnected('Backup');
|
||||||
|
spb:=chr(isc_action_svc_backup)+IBSPBParamSerialize(isc_spb_dbname,Database)
|
||||||
|
+IBSPBParamSerialize(isc_spb_bkp_file,Filename);
|
||||||
|
if RoleName<>'' then
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_sql_role_name,copy(RoleName,1,31));
|
||||||
|
if IBBkpVerbose in Options then
|
||||||
|
spb:=spb+chr(isc_spb_verbose);
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_options,MakeBackupOptions(Options));
|
||||||
|
result:=isc_service_start(@FStatus[0], @FSvcHandle, nil, length(spb),
|
||||||
|
@spb[1])=0;
|
||||||
|
if not result then
|
||||||
|
begin
|
||||||
|
CheckError('Backup',FStatus);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
if IBBkpVerbose in Options then
|
||||||
|
result:=GetOutput('Backup');
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFBAdmin.BackupMultiFile(Database: string; Filenames: TStrings;
|
||||||
|
FileSize: longint; Options: TIBBackupOptions; RoleName: string): boolean;
|
||||||
|
var
|
||||||
|
spb:string;
|
||||||
|
i:integer;
|
||||||
|
begin
|
||||||
|
result:=CheckConnected('BackupMultiFile');
|
||||||
|
spb:=chr(isc_action_svc_backup)+IBSPBParamSerialize(isc_spb_dbname,Database);
|
||||||
|
for i:=0 to Filenames.Count-1 do
|
||||||
|
begin
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_bkp_file,Filenames[i]);
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_bkp_length,FileSize);
|
||||||
|
end;
|
||||||
|
if RoleName<>'' then
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_sql_role_name,copy(RoleName,1,31));
|
||||||
|
if IBBkpVerbose in Options then
|
||||||
|
spb:=spb+chr(isc_spb_verbose);
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_options,MakeBackupOptions(Options));
|
||||||
|
result:=isc_service_start(@FStatus[0], @FSvcHandle, nil, length(spb),
|
||||||
|
@spb[1])=0;
|
||||||
|
if not result then
|
||||||
|
begin
|
||||||
|
CheckError('BackupMultiFile',FStatus);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
if IBBkpVerbose in Options then
|
||||||
|
result:=GetOutput('BackupMultiFile');
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFBAdmin.Restore(Database, Filename: string;
|
||||||
|
Options: TIBRestoreOptions; RoleName: string): boolean;
|
||||||
|
var
|
||||||
|
spb:string;
|
||||||
|
begin
|
||||||
|
result:=CheckConnected('Restore');
|
||||||
|
if not ((IBResReplace in Options) or (IBResCreate in Options)) then
|
||||||
|
begin
|
||||||
|
result:=false;
|
||||||
|
IBRaiseError(0,SErrRestoreOptionsError,[self.Name]);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
spb:=chr(isc_action_svc_restore)+IBSPBParamSerialize(isc_spb_dbname,Database)
|
||||||
|
+IBSPBParamSerialize(isc_spb_bkp_file,Filename);
|
||||||
|
if RoleName<>'' then
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_sql_role_name,copy(RoleName,1,31));
|
||||||
|
if IBResVerbose in Options then
|
||||||
|
spb:=spb+chr(isc_spb_verbose);
|
||||||
|
if (IBResAMReadOnly in Options) or (IBResAMReadWrite in Options) then
|
||||||
|
begin
|
||||||
|
if (IBResAMReadOnly in Options) then //ReadOnly overrides ReadWrite
|
||||||
|
spb:=spb+chr(isc_spb_res_access_mode)+chr(isc_spb_res_am_readonly)
|
||||||
|
else
|
||||||
|
spb:=spb+chr(isc_spb_res_access_mode)+chr(isc_spb_res_am_readwrite);
|
||||||
|
end;
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_options,MakeRestoreOptions(Options));
|
||||||
|
result:=isc_service_start(@FStatus[0], @FSvcHandle, nil, length(spb),
|
||||||
|
@spb[1])=0;
|
||||||
|
if not result then
|
||||||
|
begin
|
||||||
|
CheckError('Restore',FStatus);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
if IBResVerbose in Options then
|
||||||
|
result:=GetOutput('Restore');
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TFBAdmin.RestoreMultiFile(Database: string; Filenames: TStrings;
|
||||||
|
Options: TIBRestoreOptions; RoleName: string): boolean;
|
||||||
|
var
|
||||||
|
spb:string;
|
||||||
|
i:integer;
|
||||||
|
begin
|
||||||
|
result:=CheckConnected('RestoreMultiFile');
|
||||||
|
if not ((IBResReplace in Options) or (IBResCreate in Options)) then
|
||||||
|
begin
|
||||||
|
result:=false;
|
||||||
|
IBRaiseError(0,SErrRestoreMultiOptionsError,[self.Name]);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
spb:=chr(isc_action_svc_restore)+IBSPBParamSerialize(isc_spb_dbname,Database);
|
||||||
|
for i:=0 to Filenames.Count-1 do
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_bkp_file,Filenames[i]);
|
||||||
|
if RoleName<>'' then
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_sql_role_name,copy(RoleName,1,31));
|
||||||
|
if IBResVerbose in Options then
|
||||||
|
spb:=spb+chr(isc_spb_verbose);
|
||||||
|
if (IBResAMReadOnly in Options) or (IBResAMReadWrite in Options) then
|
||||||
|
begin
|
||||||
|
if (IBResAMReadOnly in Options) then //ReadOnly overrides ReadWrite
|
||||||
|
spb:=spb+chr(isc_spb_res_access_mode)+chr(isc_spb_res_am_readonly)
|
||||||
|
else
|
||||||
|
spb:=spb+chr(isc_spb_res_access_mode)+chr(isc_spb_res_am_readwrite);
|
||||||
|
end;
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_options,MakeRestoreOptions(Options));
|
||||||
|
result:=isc_service_start(@FStatus[0], @FSvcHandle, nil, length(spb),
|
||||||
|
@spb[1])=0;
|
||||||
|
if not result then
|
||||||
|
begin
|
||||||
|
CheckError('RestoreMultiFile',FStatus);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
if IBResVerbose in Options then
|
||||||
|
result:=GetOutput('RestoreMultiFile');
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFBAdmin.AddUser(UserName, Password: string; RoleName: string;
|
||||||
|
GroupName: string; FirstName: string; MiddleName: string; LastName: string;
|
||||||
|
UserID: longint; GroupID: longint): boolean;
|
||||||
|
var
|
||||||
|
spb:string;
|
||||||
|
begin
|
||||||
|
result:=CheckConnected('AddUser');
|
||||||
|
spb:=chr(isc_action_svc_add_user)+IBSPBParamSerialize(isc_spb_sec_username,copy(UserName,1,31))+
|
||||||
|
IBSPBParamSerialize(isc_spb_sec_password,copy(Password,1,8));
|
||||||
|
if RoleName<>'' then
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_sql_role_name,copy(RoleName,1,31));
|
||||||
|
if GroupName<>'' then
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_sec_groupname,copy(GroupName,1,31));
|
||||||
|
if FirstName<>'' then
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_sec_firstname,copy(FirstName,1,255));
|
||||||
|
if MiddleName<>'' then
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_sec_middlename,copy(MiddleName,1,255));
|
||||||
|
if LastName<>'' then
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_sec_lastname,copy(LastName,1,255));
|
||||||
|
if UserID<>0 then
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_sec_userid,UserID);
|
||||||
|
if GroupID<>0 then
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_sec_groupid,GroupID);
|
||||||
|
result:=isc_service_start(@FStatus[0], @FSvcHandle, nil, length(spb),
|
||||||
|
@spb[1])=0;
|
||||||
|
if not result then
|
||||||
|
CheckError('AddUser',FStatus);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFBAdmin.ModifyUser(UserName, Password: string; RoleName: string;
|
||||||
|
GroupName: string; FirstName: string; MiddleName: string; LastName: string;
|
||||||
|
UserID: longint; GroupID: longint): boolean;
|
||||||
|
var
|
||||||
|
spb:string;
|
||||||
|
begin
|
||||||
|
result:=CheckConnected('ModifyUser');
|
||||||
|
spb:=chr(isc_action_svc_modify_user)+IBSPBParamSerialize(isc_spb_sec_username,copy(UserName,1,31))+
|
||||||
|
IBSPBParamSerialize(isc_spb_sec_password,copy(Password,1,8));
|
||||||
|
if RoleName<>'' then
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_sql_role_name,copy(RoleName,1,31));
|
||||||
|
if GroupName<>'' then
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_sec_groupname,copy(GroupName,1,31));
|
||||||
|
if FirstName<>'' then
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_sec_firstname,copy(FirstName,1,255));
|
||||||
|
if MiddleName<>'' then
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_sec_middlename,copy(MiddleName,1,255));
|
||||||
|
if LastName<>'' then
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_sec_lastname,copy(LastName,1,255));
|
||||||
|
if UserID<>0 then
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_sec_userid,UserID);
|
||||||
|
if GroupID<>0 then
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_sec_groupid,GroupID);
|
||||||
|
result:=isc_service_start(@FStatus[0], @FSvcHandle, nil, length(spb),
|
||||||
|
@spb[1])=0;
|
||||||
|
if not result then
|
||||||
|
CheckError('ModifyUser',FStatus);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFBAdmin.DeleteUser(UserName: string; RoleName: string): boolean;
|
||||||
|
var
|
||||||
|
spb:string;
|
||||||
|
begin
|
||||||
|
result:=CheckConnected('DeleteUser');
|
||||||
|
spb:=chr(isc_action_svc_delete_user)+IBSPBParamSerialize(isc_spb_sec_username,copy(UserName,1,31));
|
||||||
|
if RoleName<>'' then
|
||||||
|
spb:=spb+IBSPBParamSerialize(isc_spb_sql_role_name,copy(RoleName,1,31));
|
||||||
|
result:=isc_service_start(@FStatus[0], @FSvcHandle, nil, length(spb),
|
||||||
|
@spb[1])=0;
|
||||||
|
if not result then
|
||||||
|
CheckError('DeleteUser',FStatus);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFBAdmin.GetUser(UserName: string; var GroupName, FirstName,
|
||||||
|
MiddleName, LastName: string; var UserID, GroupID: longint): boolean;
|
||||||
|
var
|
||||||
|
spb:string;
|
||||||
|
buffer:string;
|
||||||
|
bufptr:integer;
|
||||||
|
const
|
||||||
|
BUFFERSIZE=1000;
|
||||||
|
begin
|
||||||
|
result:=CheckConnected('GetUser');
|
||||||
|
spb:=chr(isc_action_svc_display_user)+IBSPBParamSerialize(isc_spb_sec_username,copy(UserName,1,31));
|
||||||
|
result:=isc_service_start(@FStatus[0], @FSvcHandle, nil, length(spb),
|
||||||
|
@spb[1])=0;
|
||||||
|
if not result then
|
||||||
|
begin
|
||||||
|
CheckError('GetUser',FStatus);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
//retrieve result
|
||||||
|
spb:=chr(isc_info_svc_get_users);
|
||||||
|
setlength(buffer,BUFFERSIZE);
|
||||||
|
result:=isc_service_query(@FStatus[0], @FSvcHandle, nil, 0, nil, length(spb),
|
||||||
|
@spb[1],BUFFERSIZE,@buffer[1])=0;
|
||||||
|
if not result then
|
||||||
|
begin
|
||||||
|
CheckError('GetUser',FStatus);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
bufptr:=4;
|
||||||
|
if buffer[1]=chr(isc_info_svc_get_users) then
|
||||||
|
begin
|
||||||
|
if buffer[bufptr]=chr(isc_info_end) then
|
||||||
|
begin
|
||||||
|
result:=false;
|
||||||
|
IBRaiseError(0,SErrUserDoesNotExist,[self.Name]);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
while buffer[bufptr]<>chr(isc_info_end) do
|
||||||
|
begin
|
||||||
|
case buffer[bufptr] of
|
||||||
|
chr(isc_spb_sec_username):GetIBString(buffer,bufptr); //trash result
|
||||||
|
chr(isc_spb_sec_groupname):GroupName:=GetIBString(buffer,bufptr);
|
||||||
|
chr(isc_spb_sec_firstname):FirstName:=GetIBString(buffer,bufptr);
|
||||||
|
chr(isc_spb_sec_middlename):MiddleName:=GetIBString(buffer,bufptr);
|
||||||
|
chr(isc_spb_sec_lastname):LastName:=GetIBString(buffer,bufptr);
|
||||||
|
chr(isc_spb_sec_userid):UserID:=GetIBLongint(buffer,bufptr);
|
||||||
|
chr(isc_spb_sec_groupid):GroupID:=GetIBLongint(buffer,bufptr);
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
result:=false;
|
||||||
|
IBRaiseError(0,SErrUserInvalidReply,[self.Name,ord(buffer[bufptr])]);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFBAdmin.GetUsers(Users: TStrings): boolean;
|
||||||
|
var
|
||||||
|
spb:string;
|
||||||
|
buffer:string;
|
||||||
|
bufptr:integer;
|
||||||
|
const
|
||||||
|
BUFFERSIZE=1000;
|
||||||
|
begin
|
||||||
|
result:=CheckConnected('GetUsers');
|
||||||
|
spb:=chr(isc_action_svc_display_user);
|
||||||
|
result:=isc_service_start(@FStatus[0], @FSvcHandle, nil, length(spb),
|
||||||
|
@spb[1])=0;
|
||||||
|
if not result then
|
||||||
|
begin
|
||||||
|
CheckError('GetUsers',FStatus);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
//retrieve result
|
||||||
|
spb:=chr(isc_info_svc_get_users);
|
||||||
|
setlength(buffer,BUFFERSIZE);
|
||||||
|
result:=isc_service_query(@FStatus[0], @FSvcHandle, nil, 0, nil, length(spb),
|
||||||
|
@spb[1],BUFFERSIZE,@buffer[1])=0;
|
||||||
|
if not result then
|
||||||
|
begin
|
||||||
|
CheckError('GetUsers',FStatus);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
bufptr:=4;
|
||||||
|
Users.Clear;
|
||||||
|
if buffer[1]=chr(isc_info_svc_get_users) then
|
||||||
|
begin
|
||||||
|
while buffer[bufptr]<>chr(isc_info_end) do
|
||||||
|
begin
|
||||||
|
case buffer[bufptr] of
|
||||||
|
chr(isc_spb_sec_username):Users.Add(GetIBString(buffer,bufptr));
|
||||||
|
chr(isc_spb_sec_groupname),
|
||||||
|
chr(isc_spb_sec_firstname),
|
||||||
|
chr(isc_spb_sec_middlename),
|
||||||
|
chr(isc_spb_sec_lastname):GetIBString(buffer,bufptr); //trash result
|
||||||
|
chr(isc_spb_sec_userid),
|
||||||
|
chr(isc_spb_sec_groupid):GetIBLongint(buffer,bufptr); //trash result
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
result:=false;
|
||||||
|
IBRaiseError(0,SErrUsersInvalidReply,[self.Name,ord(buffer[bufptr])]);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TFBAdmin.GetDatabaseLog: boolean;
|
||||||
|
var
|
||||||
|
spb:string;
|
||||||
|
begin
|
||||||
|
result:=CheckConnected('GetLogFile');
|
||||||
|
spb:=chr(isc_action_svc_get_ib_log);
|
||||||
|
result:=isc_service_start(@FStatus[0], @FSvcHandle, nil, length(spb),
|
||||||
|
@spb[1])=0;
|
||||||
|
if not result then
|
||||||
|
begin
|
||||||
|
CheckError('GetLogFile',FStatus);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
result:=GetOutput('GetLogFile');
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
@ -9,3 +9,7 @@ Targets.DefaultDir:='db/sqldb/interbase';
|
|||||||
Targets.DefaultOS:=[win32,openbsd,netbsd,freebsd,darwin,linux,haiku];
|
Targets.DefaultOS:=[win32,openbsd,netbsd,freebsd,darwin,linux,haiku];
|
||||||
T:=Targets.AddUnit('ibconnection');
|
T:=Targets.AddUnit('ibconnection');
|
||||||
T.ResourceStrings:=True;
|
T.ResourceStrings:=True;
|
||||||
|
T:=Targets.AddUnit('fbadmin');
|
||||||
|
T.Dependencies.Add('ibconnection');
|
||||||
|
T.ResourceStrings:=True;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user