docs: def engine(log_file, no_distribute, yes, config_file, make_html_report,
             upgrade_db, db_version, what_if_I_upgrade, run,
             list_hazard_calculations, list_risk_calculations,
             delete_calculation, delete_uncompleted_calculations,
             hazard_calculation_id, list_outputs, show_log,
             export_output, export_outputs, exports='',
             log_level='info', reuse_hazard=False):
      """
      Run a calculation using the traditional command line API
      """
      if not run:
          # configure a basic logging
          logs.init()
  
      if config_file:
          config.read(os.path.abspath(os.path.expanduser(config_file)),
                      soft_mem_limit=int, hard_mem_limit=int, port=int,
                      multi_user=valid.boolean, multi_node=valid.boolean)
  
      if no_distribute:
          os.environ['OQ_DISTRIBUTE'] = 'no'
  
      # check if the datadir exists
      datadir = datastore.get_datadir()
      if not os.path.exists(datadir):
          os.makedirs(datadir)
  
      dbserver.ensure_on()
      # check if we are talking to the right server
      err = dbserver.check_foreign()
      if err:
          sys.exit(err)
  
      if upgrade_db:
          msg = logs.dbcmd('what_if_I_upgrade', 'read_scripts')
          if msg.startswith('Your database is already updated'):
              pass
          elif yes or confirm('Proceed? (y/n) '):
              logs.dbcmd('upgrade_db')
          sys.exit(0)
  
      if db_version:
          safeprint(logs.dbcmd('db_version'))
          sys.exit(0)
  
      if what_if_I_upgrade:
          safeprint(logs.dbcmd('what_if_I_upgrade', 'extract_upgrade_scripts'))
          sys.exit(0)
  
      # check if the db is outdated
      outdated = logs.dbcmd('check_outdated')
      if outdated:
          sys.exit(outdated)
  
      # hazard or hazard+risk
      if hazard_calculation_id == -1:
          # get the latest calculation of the current user
          hc_id = get_job_id(hazard_calculation_id, getpass.getuser())
      elif hazard_calculation_id:
          # make it possible to use calculations made by another user
          hc_id = get_job_id(hazard_calculation_id)
      else:
          hc_id = None
      if run:
          log_file = os.path.expanduser(log_file) \
              if log_file is not None else None
          job_inis = [os.path.expanduser(f) for f in run]
          if len(job_inis) == 1 and not hc_id:
              # init logs before calling get_oqparam
              logs.init('nojob', getattr(logging, log_level.upper()))
              # not using logs.handle that logs on the db
              oq = readinput.get_oqparam(job_inis[0])
              smart_run(job_inis[0], oq, log_level, log_file,
                        exports, reuse_hazard)
              return
          for i, job_ini in enumerate(job_inis):
              open(job_ini, 'rb').read()  # IOError if the file does not exist
              job_id = run_job(job_ini, log_level, log_file,
                               exports, hazard_calculation_id=hc_id)
              if not hc_id:  # use the first calculation as base for the others
                  hc_id = job_id
      # hazard
      elif list_hazard_calculations:
          for line in logs.dbcmd(
                  'list_calculations', 'hazard', getpass.getuser()):
              safeprint(line)
      elif delete_calculation is not None:
          del_calculation(delete_calculation, yes)
      # risk
      elif list_risk_calculations:
          for line in logs.dbcmd('list_calculations', 'risk', getpass.getuser()):
              safeprint(line)
  
      # export
      elif make_html_report:
          safeprint('Written %s' % make_report(make_html_report))
          sys.exit(0)
  
      elif list_outputs is not None:
          hc_id = get_job_id(list_outputs)
          for line in logs.dbcmd('list_outputs', hc_id):
              safeprint(line)
      elif show_log is not None:
          hc_id = get_job_id(show_log)
          for line in logs.dbcmd('get_log', hc_id):
              safeprint(line)
  
      elif export_output is not None:
          output_id, target_dir = export_output
          dskey, calc_id, datadir = logs.dbcmd('get_output', int(output_id))
          for line in core.export_output(
                  dskey, calc_id, datadir, os.path.expanduser(target_dir),
                  exports or 'csv,xml'):
              safeprint(line)
  
      elif export_outputs is not None:
          job_id, target_dir = export_outputs
          hc_id = get_job_id(job_id)
          for line in core.export_outputs(
                  hc_id, os.path.expanduser(target_dir), exports or 'csv,xml'):
              safeprint(line)
  
      elif delete_uncompleted_calculations:
          logs.dbcmd('delete_uncompleted_calculations', getpass.getuser())
  
      else:
          engine.parentparser.prog = 'oq engine'
          engine.parentparser.print_usage()