10
10
from six import raise_from , iteritems
11
11
from tempfile import mkstemp , mkdtemp
12
12
13
- from .enums import NodeStatus , ProcessType
13
+ from .enums import \
14
+ NodeStatus , \
15
+ ProcessType , \
16
+ DumpFormat
14
17
15
18
from .cache import cached_initdb
16
19
54
57
QueryException , \
55
58
StartNodeException , \
56
59
TimeoutException , \
57
- TestgresException
60
+ TestgresException , \
61
+ BackupException
58
62
59
63
from .logger import TestgresLogger
60
64
@@ -803,7 +807,11 @@ def safe_psql(self, query=None, **kwargs):
803
807
804
808
return out
805
809
806
- def dump (self , filename = None , dbname = None , username = None ):
810
+ def dump (self ,
811
+ filename = None ,
812
+ dbname = None ,
813
+ username = None ,
814
+ format = DumpFormat .Plain ):
807
815
"""
808
816
Dump database into a file using pg_dump.
809
817
NOTE: the file is not removed automatically.
@@ -812,14 +820,27 @@ def dump(self, filename=None, dbname=None, username=None):
812
820
filename: database dump taken by pg_dump.
813
821
dbname: database name to connect to.
814
822
username: database user name.
823
+ format: format argument plain/custom/directory/tar.
815
824
816
825
Returns:
817
826
Path to a file containing dump.
818
827
"""
819
828
829
+ # Check arguments
830
+ if not isinstance (format , DumpFormat ):
831
+ try :
832
+ format = DumpFormat (format )
833
+ except ValueError :
834
+ msg = 'Invalid format "{}"' .format (format )
835
+ raise BackupException (msg )
836
+
837
+ # Generate tmpfile or tmpdir
820
838
def tmpfile ():
821
- fd , fname = mkstemp (prefix = TMP_DUMP )
822
- os .close (fd )
839
+ if format == DumpFormat .Directory :
840
+ fname = mkdtemp (prefix = TMP_DUMP )
841
+ else :
842
+ fd , fname = mkstemp (prefix = TMP_DUMP )
843
+ os .close (fd )
823
844
return fname
824
845
825
846
# Set default arguments
@@ -833,7 +854,8 @@ def tmpfile():
833
854
"-h" , self .host ,
834
855
"-f" , filename ,
835
856
"-U" , username ,
836
- "-d" , dbname
857
+ "-d" , dbname ,
858
+ "-F" , format .value
837
859
] # yapf: disable
838
860
839
861
execute_utility (_params , self .utils_log_file )
@@ -845,12 +867,29 @@ def restore(self, filename, dbname=None, username=None):
845
867
Restore database from pg_dump's file.
846
868
847
869
Args:
848
- filename: database dump taken by pg_dump.
870
+ filename: database dump taken by pg_dump in custom/directory/tar formats .
849
871
dbname: database name to connect to.
850
872
username: database user name.
851
873
"""
852
874
853
- self .psql (filename = filename , dbname = dbname , username = username )
875
+ # Set default arguments
876
+ dbname = dbname or default_dbname ()
877
+ username = username or default_username ()
878
+
879
+ _params = [
880
+ get_bin_path ("pg_restore" ),
881
+ "-p" , str (self .port ),
882
+ "-h" , self .host ,
883
+ "-U" , username ,
884
+ "-d" , dbname ,
885
+ filename
886
+ ] # yapf: disable
887
+
888
+ # try pg_restore if dump is binary formate, and psql if not
889
+ try :
890
+ execute_utility (_params , self .utils_log_name )
891
+ except ExecUtilException :
892
+ self .psql (filename = filename , dbname = dbname , username = username )
854
893
855
894
@method_decorator (positional_args_hack (['dbname' , 'query' ]))
856
895
def poll_query_until (self ,
0 commit comments