/** * */ package webctdbexport.jdbc; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.LinkedList; import java.util.List; 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.test.TestRepository; import webctdbexport.tools.DumpUtils; import webctdbexport.utils.DbUtils; //import webctdbexport.utils.MoodleRepository; /** Dump whole database ?! * * @author cmg * */ public class DumpAll { private static final String DONE_FILE = "done.ts"; private static final long MAX_FILE_SIZE = 0; //1000000; static Logger logger = Logger.getLogger(DumpAll.class.getName()); /** * @param args */ public static void main(String[] args) { if (args.length!=3) { System.err.println("Usage: <jdbc.properties> <outputdir> <filedir"); 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); } Connection conn = JdbcUtils.getConnection(args[0]); try { dumpAll(conn, outputdir, filedir, null); } catch (Exception e) { logger.log(Level.SEVERE, "Error", e); } finally { try { conn.close(); } catch (Throwable ignore) {} } } static void dumpAll(Connection conn, File outputdir, File filedir, File oldoutputdir) throws JSONException, SQLException, IOException { logger.log(Level.INFO, "output folders to "+outputdir); // institutions... JSONObject listing = MoodleRepository.getListingForRoot(conn); JSONObject permissions = MoodleRepository.getPermissionsForPath(conn, "/"); DumpUtils.writeResponse(listing, outputdir, permissions!=null); if (permissions!=null) DumpUtils.writePermissions(permissions, outputdir); List<JSONObject> items = new LinkedList<JSONObject>(); DumpUtils.addItems(items, listing, "/"); processItems(conn, items, outputdir, filedir, oldoutputdir); logger.log(Level.INFO,"DumpAll complete"); } /** * * @param conn * @param items * @param outputdir * @param filedir * @param oldoutputdir If not null, then existing outputdir to base this on * @throws JSONException * @throws IOException * @throws SQLException */ static void processItems(Connection conn, List<JSONObject> items, File outputdir, File filedir, File oldoutputdir) throws JSONException, IOException, SQLException { while(items.size()>0) { JSONObject item = items.remove(0); if (item.has(MoodleRepository.SOURCE)) { String url = item.getString(MoodleRepository.SOURCE); long size = -1; if (item.has(MoodleRepository.SIZE)) { size = item.getLong(MoodleRepository.SIZE); } if (item.has(MoodleRepository.WEBCT_TYPE) && DbUtils.URL_TYPE.equals(item.getString(MoodleRepository.WEBCT_TYPE))) System.out.println("Skip link: "+url); else if (MAX_FILE_SIZE>0 && size>MAX_FILE_SIZE) { System.out.println("Skip large file "+item.getString(MoodleRepository.TITLE)+" source="+url+", "+size+" bytes"); } else { System.out.println("dump file "+item.getString(MoodleRepository.TITLE)+" source="+url); JSONObject fileInfo = MoodleRepository.getFileInfo(conn, url, filedir, outputdir, oldoutputdir); if (fileInfo!=null) { File itemdir = new File(outputdir+url); itemdir.mkdir(); DumpUtils.writeFileInfo(fileInfo, itemdir, filedir); //System.out.println("=> "+f); } } } else if(item.has(MoodleRepository.PATH)) { String path = item.getString(MoodleRepository.PATH); File itemdir = new File(outputdir+path); String title = item.getString(MoodleRepository.TITLE); File donefile = new File(itemdir, DONE_FILE); if (donefile.exists()) { System.out.println("Skip completed folder "+title+" path="+path); } else { System.out.println("dump folder "+title+" path="+path); // TODO fix me JSONObject itemlisting = MoodleRepository.getListingForPath(conn, path, true, true); itemdir.mkdirs(); boolean hasPermissions = false; JSONObject permissions = null; if (new File(itemdir, "permissions.json").exists()) // don't remake permissions hasPermissions = true; else { permissions = MoodleRepository.getPermissionsForPath(conn, path); hasPermissions = permissions!=null; } DumpUtils.writeResponse(itemlisting, itemdir, hasPermissions); DumpUtils.addItems(items, itemlisting, path); if (permissions!=null) DumpUtils.writePermissions(permissions, itemdir); } } else if (item.has(DumpUtils.DONE)) { String path = item.getString(DumpUtils.DONE); File doneFile = new File(outputdir+path+DONE_FILE); System.out.println("Done "+path+" ("+doneFile+")"); doneFile.createNewFile(); } } } }