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;
}
}