public void run(ArgParser ap, Logger logger) {
    String[] files = ap.gets("manual");
    if (files != null)
      for (String f : files) {
        Document d = new Elsevier("test", f, null).next();
        if (d != null) System.out.println(d.toString());
        System.out.println();
      }

    String inTable = ap.get("inTable");
    String outTable = ap.get("outTable");

    try {
      Connection inputConn = SQL.connectMySQL(ap, logger, ap.get("inDB", "articles"));
      Statement stmt =
          inputConn.createStatement(
              java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
      stmt.setFetchSize(Integer.MIN_VALUE);
      ResultSet rs = stmt.executeQuery("SELECT doi, xml from " + inTable);
      EProblemIterator epi = new EProblemIterator(rs);
      IteratorBasedMaster<Document> master =
          new IteratorBasedMaster<Document>(epi, ap.getInt("threads", 1), 1000);
      master.startThread();

      Connection outputConn = SQL.connectMySQL(ap, logger, ap.get("outDB", "articles"));
      PreparedStatement pstmt = Document.prepareInsertStatements(outputConn, outTable);

      int report = ap.getInt("report", -1);
      int c = 0;
      int c_null = 0;

      for (Document d : master) {
        if (d != null) d.saveToDB(pstmt);
        else c_null++;

        if (report != -1 && ++c % report == 0)
          logger.info("%t: Processed " + c + " documents (" + c_null + " errors)\n");
      }

    } catch (Exception e) {
      System.err.println(e);
      e.printStackTrace();
      System.exit(-1);
    }
  }