Skip to content

Commit 221df4f

Browse files
authored
Merge pull request #32 from Fenimorkin/pg_dump
adding key -F to pg_dump
2 parents e9d2a40 + bb88d6e commit 221df4f

File tree

4 files changed

+71
-18
lines changed

4 files changed

+71
-18
lines changed

setup.py

100644100755
File mode changed.

testgres/enums.py

+11
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,14 @@ def from_process(process):
8585

8686
# default
8787
return ProcessType.Unknown
88+
89+
90+
class DumpFormat(Enum):
91+
"""
92+
Available dump formats
93+
"""
94+
95+
Plain = 'plain'
96+
Custom = 'custom'
97+
Directory = 'directory'
98+
Tar = 'tar'

testgres/node.py

+47-8
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010
from six import raise_from, iteritems
1111
from tempfile import mkstemp, mkdtemp
1212

13-
from .enums import NodeStatus, ProcessType
13+
from .enums import \
14+
NodeStatus, \
15+
ProcessType, \
16+
DumpFormat
1417

1518
from .cache import cached_initdb
1619

@@ -54,7 +57,8 @@
5457
QueryException, \
5558
StartNodeException, \
5659
TimeoutException, \
57-
TestgresException
60+
TestgresException, \
61+
BackupException
5862

5963
from .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,

tests/test_simple.py

+13-10
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ def removing(f):
6767
finally:
6868
if os.path.isfile(f):
6969
os.remove(f)
70+
elif os.path.isdir(f):
71+
rmtree(f, ignore_errors=True)
7072

7173

7274
class TestgresTests(unittest.TestCase):
@@ -426,16 +428,17 @@ def test_dump(self):
426428
with get_new_node().init().start() as node1:
427429

428430
node1.execute(query_create)
429-
430-
# take a new dump
431-
with removing(node1.dump()) as dump:
432-
with get_new_node().init().start() as node2:
433-
# restore dump
434-
self.assertTrue(os.path.isfile(dump))
435-
node2.restore(filename=dump)
436-
437-
res = node2.execute(query_select)
438-
self.assertListEqual(res, [(1, ), (2, )])
431+
for format in ['plain', 'custom', 'directory', 'tar']:
432+
with removing(node1.dump(format=format)) as dump:
433+
with get_new_node().init().start() as node3:
434+
if format == 'directory':
435+
self.assertTrue(os.path.isdir(dump))
436+
else:
437+
self.assertTrue(os.path.isfile(dump))
438+
# restore dump
439+
node3.restore(filename=dump)
440+
res = node3.execute(query_select)
441+
self.assertListEqual(res, [(1, ), (2, )])
439442

440443
def test_users(self):
441444
with get_new_node().init().start() as node:

0 commit comments

Comments
 (0)