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

Lines changed: 11 additions & 0 deletions
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

Lines changed: 47 additions & 8 deletions
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

Lines changed: 13 additions & 10 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy