/**
*
*/
package webctdbexport.jdbc;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.hibernate.Session;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import webctdbexport.db.LearningContext;
import webctdbexport.jdbc.model.Person;
import webctdbexport.test.TestRepository;
import webctdbexport.tools.DumpUtils;
import webctdbexport.utils.DbUtils;
//import webctdbexport.utils.MoodleRepository;
/** Dump all users and their own file areas in whole database (and ALL contexts if all),
* avoiding unnecessary downloads if a prior dump is available.
*
* @author cmg
*
*/
public class DumpIncremental {
private static final String DONE_FILE = "done.ts";
static Logger logger = Logger.getLogger(DumpIncremental.class.getName());
/**
* @param args
*/
public static void main(String[] args) {
if (args.length<4) {
System.err.println("Usage: <jdbc.properties> <outputdir> <filedir> <oldoutputdir> [usernames...]");
System.exit(-1);
}
File outputdir = new File(args[1]);
if (!outputdir.exists() || !outputdir.canWrite() || !outputdir.isDirectory()) {
logger.log(Level.SEVERE, "Output directory does not exist or is not writable: "+outputdir);
System.exit(-1);
}
File filedir = new File(args[2]);
if (!filedir.exists() || !filedir.canWrite() || !filedir.isDirectory()) {
logger.log(Level.SEVERE, "File directory does not exist or is not writable: "+filedir);
System.exit(-1);
}
File oldoutputdir = new File(args[3]);
if (oldoutputdir.exists()) {
if (oldoutputdir.canRead() && oldoutputdir.isDirectory()) {
logger.log(Level.INFO, "Attempting incremental dump based on "+oldoutputdir);
}
else {
logger.log(Level.SEVERE, "Old output directory is not a directory or not readable: "+oldoutputdir);
System.exit(-1);
}
}
else {
logger.log(Level.WARNING, "Doing non-incremental dump: oldoutputdir does not exist: "+oldoutputdir);
oldoutputdir = null;
}
Connection conn = JdbcUtils.getConnection(args[0]);
int returncode = 0;
try {
boolean dumpAll = true;
logger.log(Level.INFO, "output folders to "+outputdir);
List<BigDecimal> personIds = DumpUsers.getPersonIds(args, 4, conn);
if (args.length>4) {
dumpAll = false;
}
for (BigDecimal personId : personIds) {
// no extrapermissions
DumpUsers.dumpUser(conn, personId, outputdir, filedir, null, oldoutputdir);
}
logger.log(Level.INFO, "Done all users");
if (dumpAll)
{
DumpAll.dumpAll(conn, outputdir, filedir, oldoutputdir);
}
} catch (Exception e) {
logger.log(Level.SEVERE, "Error", e);
returncode = -2;
}
finally {
try { conn.close(); } catch (Throwable ignore) {}
}
logger.log(Level.INFO,"Exiting with code "+returncode);
System.exit(returncode);
}
}