1010from six import raise_from , iteritems
1111from tempfile import mkstemp , mkdtemp
1212
13- from .enums import NodeStatus , ProcessType
13+ from .enums import \
14+ NodeStatus , \
15+ ProcessType , \
16+ DumpFormat
1417
1518from .cache import cached_initdb
1619
5457 QueryException , \
5558 StartNodeException , \
5659 TimeoutException , \
57- TestgresException
60+ TestgresException , \
61+ BackupException
5862
5963from .logger import TestgresLogger
6064
@@ -803,7 +807,11 @@ def safe_psql(self, query=None, **kwargs):
803807
804808 return out
805809
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 ):
807815 """
808816 Dump database into a file using pg_dump.
809817 NOTE: the file is not removed automatically.
@@ -812,14 +820,27 @@ def dump(self, filename=None, dbname=None, username=None):
812820 filename: database dump taken by pg_dump.
813821 dbname: database name to connect to.
814822 username: database user name.
823+ format: format argument plain/custom/directory/tar.
815824
816825 Returns:
817826 Path to a file containing dump.
818827 """
819828
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
820838 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 )
823844 return fname
824845
825846 # Set default arguments
@@ -833,7 +854,8 @@ def tmpfile():
833854 "-h" , self .host ,
834855 "-f" , filename ,
835856 "-U" , username ,
836- "-d" , dbname
857+ "-d" , dbname ,
858+ "-F" , format .value
837859 ] # yapf: disable
838860
839861 execute_utility (_params , self .utils_log_file )
@@ -845,12 +867,29 @@ def restore(self, filename, dbname=None, username=None):
845867 Restore database from pg_dump's file.
846868
847869 Args:
848- filename: database dump taken by pg_dump.
870+ filename: database dump taken by pg_dump in custom/directory/tar formats .
849871 dbname: database name to connect to.
850872 username: database user name.
851873 """
852874
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 )
854893
855894 @method_decorator (positional_args_hack (['dbname' , 'query' ]))
856895 def poll_query_until (self ,
0 commit comments