@@ -411,7 +411,8 @@ def __init__(self, *, user: str=None, password: str=None, role: str=None,
411
411
config : str = None , auth_plugin_list : str = None , session_time_zone : str = None ,
412
412
set_db_replica : ReplicaMode = None , set_bind : str = None ,
413
413
decfloat_round : DecfloatRound = None ,
414
- decfloat_traps : List [DecfloatTraps ]= None
414
+ decfloat_traps : List [DecfloatTraps ]= None ,
415
+ parallel_workers : int = None
415
416
):
416
417
# Available options:
417
418
# AuthClient, WireCryptPlugin, Providers, ConnectionTimeout, WireCrypt,
@@ -482,6 +483,8 @@ def __init__(self, *, user: str=None, password: str=None, role: str=None,
482
483
self .db_sql_dialect : Optional [int ] = db_sql_dialect
483
484
#: Character set for the database [db create only]
484
485
self .db_charset : Optional [str ] = db_charset
486
+ #: Number of parallel workers
487
+ self .parallel_workers : int = parallel_workers
485
488
def clear (self ) -> None :
486
489
"""Clear all information.
487
490
"""
@@ -586,6 +589,8 @@ def parse_buffer(self, buffer: bytes) -> None:
586
589
elif tag == DPBItem .DECFLOAT_TRAPS :
587
590
self .decfloat_traps = [DecfloatTraps (v .strip ())
588
591
for v in dpb .get_string ().split (',' )]
592
+ elif tag == DPBItem .PARALLEL_WORKERS :
593
+ self .parallel_workers = dpb .get_int ()
589
594
def get_buffer (self , * , for_create : bool = False ) -> bytes :
590
595
"""Create DPB from stored information.
591
596
"""
@@ -637,6 +642,8 @@ def get_buffer(self, *, for_create: bool = False) -> bytes:
637
642
if self .decfloat_traps is not None :
638
643
dpb .insert_string (DPBItem .DECFLOAT_TRAPS , ',' .join (e .value for e in
639
644
self .decfloat_traps ))
645
+ if self .parallel_workers is not None :
646
+ dpb .insert_int (DPBItem .PARALLEL_WORKERS , self .parallel_workers )
640
647
if for_create :
641
648
if self .page_size is not None :
642
649
dpb .insert_int (DPBItem .PAGE_SIZE , self .page_size )
@@ -2118,7 +2125,8 @@ def connect(database: str, *, user: str=None, password: str=None, role: str=None
2118
2125
config = db_config .config .value , auth_plugin_list = auth_plugin_list ,
2119
2126
session_time_zone = session_time_zone , set_bind = db_config .set_bind .value ,
2120
2127
decfloat_round = db_config .decfloat_round .value ,
2121
- decfloat_traps = db_config .decfloat_traps .value )
2128
+ decfloat_traps = db_config .decfloat_traps .value ,
2129
+ parallel_workers = db_config .parallel_workers .value )
2122
2130
return __make_connection (False , dsn , db_config .utf8filename .value , dpb .get_buffer (),
2123
2131
db_config .sql_dialect .value , charset , crypt_callback )
2124
2132
@@ -4222,7 +4230,7 @@ def backup(self, *, database: FILESPEC, backup: Union[FILESPEC, Sequence[FILESPE
4222
4230
callback : CB_OUTPUT_LINE = None , stats : str = None ,
4223
4231
verbose : bool = False , verbint : int = None , skip_data : str = None ,
4224
4232
include_data : str = None , keyhoder : str = None , keyname : str = None ,
4225
- crypt : str = None ) -> None :
4233
+ crypt : str = None , parallel_workers : int = None ) -> None :
4226
4234
"""Request logical (GBAK) database backup. **(ASYNC service)**
4227
4235
4228
4236
Arguments:
@@ -4240,6 +4248,7 @@ def backup(self, *, database: FILESPEC, backup: Union[FILESPEC, Sequence[FILESPE
4240
4248
keyholder: Keyholder name [Firebird 4]
4241
4249
keyname: Key name [Firebird 4]
4242
4250
crypt: Encryption specification [Firebird 4]
4251
+ parallel_workers: Number of parallel workers [Firebird 5]
4243
4252
"""
4244
4253
if isinstance (backup , (str , Path )):
4245
4254
backup = [backup ]
@@ -4267,6 +4276,8 @@ def backup(self, *, database: FILESPEC, backup: Union[FILESPEC, Sequence[FILESPE
4267
4276
spb .insert_string (SrvBackupOption .KEYNAME , keyname )
4268
4277
if crypt is not None :
4269
4278
spb .insert_string (SrvBackupOption .CRYPT , crypt )
4279
+ if parallel_workers is not None :
4280
+ spb .insert_int (SrvBackupOption .PARALLEL_WORKERS , parallel_workers )
4270
4281
spb .insert_int (SPBItem .OPTIONS , flags )
4271
4282
if verbose :
4272
4283
spb .insert_tag (SPBItem .VERBOSE )
@@ -4287,7 +4298,7 @@ def restore(self, *, backup: Union[FILESPEC, Sequence[FILESPEC]],
4287
4298
page_size : int = None , buffers : int = None ,
4288
4299
access_mode : DbAccessMode = DbAccessMode .READ_WRITE , include_data : str = None ,
4289
4300
keyhoder : str = None , keyname : str = None , crypt : str = None ,
4290
- replica_mode : ReplicaMode = None ) -> None :
4301
+ replica_mode : ReplicaMode = None , parallel_workers : int = None ) -> None :
4291
4302
"""Request database restore from logical (GBAK) backup. **(ASYNC service)**
4292
4303
4293
4304
Arguments:
@@ -4309,6 +4320,7 @@ def restore(self, *, backup: Union[FILESPEC, Sequence[FILESPEC]],
4309
4320
keyname: Key name [Firebird 4]
4310
4321
crypt: Encryption specification [Firebird 4]
4311
4322
replica_mode: Replica mode for restored database [Firebird 4]
4323
+ parallel_workers: Number of parallel workers [Firebird 5]
4312
4324
"""
4313
4325
if isinstance (backup , (str , Path )):
4314
4326
backup = [backup ]
@@ -4346,6 +4358,8 @@ def restore(self, *, backup: Union[FILESPEC, Sequence[FILESPEC]],
4346
4358
spb .insert_string (SrvRestoreOption .CRYPT , crypt )
4347
4359
if replica_mode is not None :
4348
4360
spb .insert_int (SrvRestoreOption .REPLICA_MODE , replica_mode .value )
4361
+ if parallel_workers is not None :
4362
+ spb .insert_int (SrvRestoreOption .PARALLEL_WORKERS , parallel_workers )
4349
4363
spb .insert_int (SPBItem .OPTIONS , flags )
4350
4364
if verbose :
4351
4365
spb .insert_tag (SPBItem .VERBOSE )
@@ -4725,24 +4739,27 @@ def bring_online(self, *, database: FILESPEC, mode: OnlineMode=OnlineMode.NORMAL
4725
4739
spb .insert_bytes (SrvPropertiesOption .ONLINE_MODE , bytes ([mode ]))
4726
4740
self ._srv ()._svc .start (spb .get_buffer ())
4727
4741
self ._srv ().wait ()
4728
- def sweep (self , * , database : FILESPEC , role : str = None ) -> None :
4742
+ def sweep (self , * , database : FILESPEC , role : str = None , parallel_workers : int = None ) -> None :
4729
4743
"""Perform database sweep operation.
4730
4744
4731
4745
Arguments:
4732
4746
database: Database specification or alias.
4733
4747
role: SQL ROLE name passed to gfix.
4748
+ parallel_workers: Number of parallel workers [Firebird 5]
4734
4749
"""
4735
4750
self ._srv ()._reset_output ()
4736
4751
with a .get_api ().util .get_xpb_builder (XpbKind .SPB_START ) as spb :
4737
4752
spb .insert_tag (ServerAction .REPAIR )
4738
4753
spb .insert_string (SPBItem .DBNAME , str (database ), encoding = self ._srv ().encoding )
4739
4754
if role is not None :
4740
4755
spb .insert_string (SPBItem .SQL_ROLE_NAME , role , encoding = self ._srv ().encoding )
4756
+ if parallel_workers is not None :
4757
+ spb .insert_int (SrvRepairOption .PARALLEL_WORKERS , parallel_workers )
4741
4758
spb .insert_int (SPBItem .OPTIONS , SrvRepairFlag .SWEEP_DB )
4742
4759
self ._srv ()._svc .start (spb .get_buffer ())
4743
4760
self ._srv ().wait ()
4744
4761
def repair (self , * , database : FILESPEC , flags : SrvRepairFlag = SrvRepairFlag .REPAIR ,
4745
- role : str = None ) -> bytes :
4762
+ role : str = None ) -> None :
4746
4763
"""Perform database repair operation. **(SYNC service)**
4747
4764
4748
4765
Arguments:
@@ -4903,7 +4920,7 @@ def rollback_limbo_transaction(self, *, database: FILESPEC, transaction_id: int)
4903
4920
self ._srv ()._svc .start (spb .get_buffer ())
4904
4921
self ._srv ()._read_all_binary_output ()
4905
4922
4906
- class ServerDbServices (ServerDbServices3 ):
4923
+ class ServerDbServices4 (ServerDbServices3 ):
4907
4924
"""Database-related actions and services [Firebird 4+].
4908
4925
"""
4909
4926
def nfix_database (self , * , database : FILESPEC , role : str = None ,
@@ -4942,6 +4959,26 @@ def set_replica_mode(self, *, database: FILESPEC, mode: ReplicaMode, role: str=N
4942
4959
self ._srv ()._svc .start (spb .get_buffer ())
4943
4960
self ._srv ().wait ()
4944
4961
4962
+ class ServerDbServices (ServerDbServices4 ):
4963
+ """Database-related actions and services [Firebird 5+].
4964
+ """
4965
+ def upgrade (self , * , database : FILESPEC ) -> bytes :
4966
+ """Perform database repair operation. **(SYNC service)**
4967
+
4968
+ Arguments:
4969
+ database: Database specification or alias.
4970
+ flags: Repair flags.
4971
+ role: SQL ROLE name passed to gfix.
4972
+ """
4973
+ self ._srv ()._reset_output ()
4974
+ with a .get_api ().util .get_xpb_builder (XpbKind .SPB_START ) as spb :
4975
+ spb .insert_tag (ServerAction .REPAIR )
4976
+ spb .insert_string (SPBItem .DBNAME , str (database ), encoding = self ._srv ().encoding )
4977
+ spb .insert_int (SPBItem .OPTIONS , SrvRepairFlag .UPGRADE_DB )
4978
+ self ._srv ()._svc .start (spb .get_buffer ())
4979
+ self ._srv ().wait ()
4980
+
4981
+
4945
4982
class ServerUserServices (ServerServiceProvider ):
4946
4983
"""User-related actions and services.
4947
4984
"""
@@ -5457,8 +5494,12 @@ def database(self) -> Union[ServerDbServices3, ServerDbServices]:
5457
5494
"""Access to various database-related actions and services.
5458
5495
"""
5459
5496
if self .__dbsvc is None :
5460
- cls = ServerDbServices if self ._engine_version () >= 4.0 \
5461
- else ServerDbServices3
5497
+ if self ._engine_version () >= 5.0 :
5498
+ cls = ServerDbServices
5499
+ elif self ._engine_version () == 4.0 :
5500
+ cls = ServerDbServices4
5501
+ else :
5502
+ cls = ServerDbServices3
5462
5503
self .__dbsvc = cls (self )
5463
5504
return self .__dbsvc
5464
5505
@property
0 commit comments