From c1c8ac7d7f2358b7cef492fec7e74336548cea84 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Mon, 19 Jan 2015 02:42:34 +0100 Subject: [PATCH] [FIX] dbmanager: backup allow pg_dump custom dump to be larger than diskspace - delete a forgotten print - allow pg_dump custom dumps to be larger than the available disk size, the previous commit allowed dumps to be larger than memory, this one remove this limitation. zip dumps are still limited to by the disk size. --- addons/web/controllers/main.py | 2 +- openerp/service/db.py | 27 +++++++++++++++------------ 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 8bf395dc59b..59e69c36b16 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -733,7 +733,7 @@ class Database(http.Controller): ('Content-Type', 'application/octet-stream; charset=binary'), ('Content-Disposition', content_disposition(filename)), ] - dump_stream = openerp.service.db.dump_db_stream(backup_db, backup_format) + dump_stream = openerp.service.db.dump_db(backup_db, None, backup_format) response = werkzeug.wrappers.Response(dump_stream, headers=headers, direct_passthrough=True) response.set_cookie('fileToken', token) return response diff --git a/openerp/service/db.py b/openerp/service/db.py index a0a4b5e2707..0dbc50e2747 100644 --- a/openerp/service/db.py +++ b/openerp/service/db.py @@ -168,7 +168,10 @@ def dump_db_manifest(cr): return manifest def dump_db(db_name, stream, backup_format='zip'): - """Dump database `db` into file-like object `stream`""" + """Dump database `db` into file-like object `stream` if stream is None + return a file object with the dump """ + + _logger.info('DUMP DB: %s format %s', db_name, backup_format) cmd = ['pg_dump', '--no-owner'] if openerp.tools.config['db_user']: @@ -191,20 +194,20 @@ def dump_db(db_name, stream, backup_format='zip'): json.dump(manifest, fh, indent=4) cmd.insert(-1, '--file=' + os.path.join(dump_dir, 'dump.sql')) openerp.tools.exec_pg_command(*cmd) - openerp.tools.osutil.zip_dir(dump_dir, stream, include_dir=False) + if stream: + openerp.tools.osutil.zip_dir(dump_dir, stream, include_dir=False) + else: + t=tempfile.TemporaryFile() + openerp.tools.osutil.zip_dir(dump_dir, t, include_dir=False) + t.seek(0) + return t else: cmd.insert(-1, '--format=c') - print cmd stdin, stdout = openerp.tools.exec_pg_command_pipe(*cmd) - shutil.copyfileobj(stdout, stream) - - _logger.info('DUMP DB successful: %s', db_name) - -def dump_db_stream(db_name, backup_format='zip'): - t=tempfile.TemporaryFile() - dump_db(db_name, t, backup_format) - t.seek(0) - return t + if stream: + shutil.copyfileobj(stdout, stream) + else: + return stdout def exp_restore(db_name, data, copy=False): data_file = tempfile.NamedTemporaryFile(delete=False)