def dump(archive, calc_id=0, user=None): """ Dump the openquake database and all the complete calculations into a zip file. In a multiuser installation must be run as administrator. """ t0 = time.time() assert archive.endswith('.zip'), archive getfnames = 'select ds_calc_dir || ".hdf5" from job where ?A' param = dict(status='complete') if calc_id: param['id'] = calc_id if user: param['user_name'] = user fnames = [f for f, in db(getfnames, param) if os.path.exists(f)] zipfiles(fnames, archive, 'w', safeprint) pending_jobs = db('select id, status, description from job ' 'where status="executing"') if pending_jobs: safeprint('WARNING: there were calculations executing during the dump,' ' they have been not copied') for job_id, status, descr in pending_jobs: safeprint('%d %s %s' % (job_id, status, descr)) # this also checks that the copied db is not corrupted smart_save(db.path, archive, calc_id) dt = time.time() - t0 safeprint('Archived %d calculations into %s in %d seconds' % (len(fnames), archive, dt))