package mediawiki.task.config.pdata; import java.io.File; import java.io.FileNotFoundException; import java.io.PrintStream; import mediawiki.info.Article; import mediawiki.info.Language; import mediawiki.info.wikibase.Entity; import mediawiki.info.wikibase.Property; import mediawiki.info.wikibase.snaks.DateSnak; import mediawiki.info.wikibase.snaks.ItemSnak; public class DummyDatabaseTracker implements PersondataTracker { private File path; private int bunchsize; private int bunchcounter = 0; private int bunchindex = 0; private PrintStream printer = null; public DummyDatabaseTracker(File path, int bunchsize) { this.path = path; if(bunchsize <= 0) throw new IllegalArgumentException("bunchsize has to be bigger than zero"); this.bunchsize = bunchsize; } private void printLine(String line) throws FileNotFoundException { if(printer == null) { printer = new PrintStream(path.getAbsolutePath()+"/persondata"+bunchindex+".sql"); }else if(bunchcounter >= bunchsize) { printer.flush(); printer.close(); bunchindex++; bunchcounter = 0; printer = new PrintStream(path.getAbsolutePath()+"/persondata"+bunchindex+".sql"); } printer.println(line); bunchcounter++; } private void prepareAndPrintLine(String sql, Object...objects) throws FileNotFoundException { for(Object o : objects) { sql = sql.replaceFirst("\\?", o == null ? "null" : "'"+escapeString(o.toString())+"'"); } printLine(sql); } @Override public void trackAlias(Article article, Entity item, Language language, String alias) throws Exception { prepareAndPrintLine("INSERT INTO aliases (`entity`,`article`,`language`,`value`) VALUES (?, ?, ?, ?);", item == null ? null : item.getID(), article.getTitle(), language.getName(), alias ); } @Override public void trackDescription(Article article, Entity item, Language language, String description, boolean conflict) throws Exception { prepareAndPrintLine("INSERT INTO descriptions (`entity`,`article`,`language`,`value`) VALUES (?, ?, ?, ?);", item == null ? null : item.getID(), article.getTitle(), language.getName(), description ); } @Override public void trackPlace(Article article, Entity item, Property property, ItemSnak snak, boolean conflict) throws Exception { prepareAndPrintLine("INSERT INTO claims (`entity`,`article`,`property`,`claim`) VALUES (?, ?, ?, ?);", item == null ? null : item.getID(), article.getTitle(), "P"+property.getID(), snak.toClaimRepresentation().toString() ); } @Override public void trackDate(Article article, Entity item, Property property, DateSnak snak, boolean conflict) throws Exception { prepareAndPrintLine("INSERT INTO claims (`entity`,`article`,`property`,`claim`) VALUES (?, ?, ?, ?);", item == null ? null : item.getID(), article.getTitle(), "P"+property.getID(), snak.toClaimRepresentation().toString() ); } @Override public void trackUnparsable(Article article, Entity item, Property property, String value) throws Exception { prepareAndPrintLine("INSERT INTO unparsable (`entity`,`article`,`property`,`value`) VALUES (?, ?, ?, ?);", item == null ? null : item.getID(), article.getTitle(), "P"+property.getID(), value ); } private static String escapeString(String s) { String clean_string = s; clean_string = clean_string.replaceAll("\\\\", "\\\\\\\\"); clean_string = clean_string.replaceAll("\\n","\\\\n"); clean_string = clean_string.replaceAll("\\r", "\\\\r"); clean_string = clean_string.replaceAll("\\t", "\\\\t"); clean_string = clean_string.replaceAll("\\00", "\\\\0"); clean_string = clean_string.replaceAll("\\'", "\\\\'"); clean_string = clean_string.replaceAll("\\\"", "\\\\\""); return clean_string; } }