docs: 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))