Jaysyn904 5914ed2ab5 Updated Release Archive
Updated Release Archive.  Fixed Mage-killer prereqs.  Removed old LETO & ConvoCC related files.  Added organized spell scroll store.  Fixed Gloura spellbook. Various TLK fixes.  Reorganized Repo.  Removed invalid user folders. Added DocGen back in.
2023-08-22 10:00:21 -04:00

266 lines
11 KiB
Java

package prc.utils;
import prc.autodoc.*;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import static prc.Main.spinner;
import static prc.Main.verbose;
public final class SQLMaker {
private SQLMaker() {
}
private static BufferedWriter sql;
private static String q = "";
private static boolean mysql = false;
private static boolean sqlite = true;
/**
* The main method, as usual.
*
* @param args do I really need to explain this?
* @throws Exception this is a simple tool, just let all failures blow up
*/
public static void main(String[] args) throws Exception {
if (args.length == 0 || args[0].equals("--help") || args[0].equals("-?"))
readMe();
String dir = args[0];
if (args.length >= 1 && args[1].equalsIgnoreCase("MySQL")) {
q = "`";
mysql = true;
sqlite = false;
}
// Create the output stream
File target = new File("out.sql");
// Clean up old version if necessary
if (target.exists()) {
if (verbose) System.out.println("Deleting previous version of " + target.getName());
target.delete();
}
target.createNewFile();
// Allocate output buffer of 1Mb
sql = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(target)), 0xFFFFF);
//setup the transaction
if (sqlite)
sql.append("BEGIN IMMEDIATE;\n");
//optimize for windows
if (sqlite)
sql.append("PRAGMA page_size=4096;\n");
//delete any preexsiting tables
sql.append("DROP TABLE IF EXISTS " + q + "prc_cached2da" + q + ";\n" +
"DROP TABLE IF EXISTS " + q + "prc_cached2da_appearance" + q + ";\n" +
"DROP TABLE IF EXISTS " + q + "prc_cached2da_classes" + q + ";\n" +
"DROP TABLE IF EXISTS " + q + "prc_cached2da_cls_feat" + q + ";\n" +
"DROP TABLE IF EXISTS " + q + "prc_cached2da_feat" + q + ";\n" +
"DROP TABLE IF EXISTS " + q + "prc_cached2da_ireq" + q + ";\n" +
"DROP TABLE IF EXISTS " + q + "prc_cached2da_item_to_ireq" + q + ";\n" +
"DROP TABLE IF EXISTS " + q + "prc_cached2da_portraits" + q + ";\n" +
"DROP TABLE IF EXISTS " + q + "prc_cached2da_racialtypes" + q + ";\n" +
"DROP TABLE IF EXISTS " + q + "prc_cached2da_soundset" + q + ";\n" +
"DROP TABLE IF EXISTS " + q + "prc_cached2da_spells" + q + ";\n"
);
//create a few tables
sql.append(
/*
"CREATE TABLE "+q+"prc_cached2da_ireq"+q+" (" +
""+q+"rowid"+q+" integer DEFAULT -1, " +
""+q+"file"+q+" varchar(20) DEFAULT '_', " +
""+q+"LABEL"+q+" varchar(255) DEFAULT '_', " +
""+q+"ReqType"+q+" varchar(255) DEFAULT '_', " +
""+q+"ReqParam1"+q+" varchar(255) DEFAULT '_', " +
""+q+"ReqParam2"+q+" varchar(255) DEFAULT '_');\n" +
*/
"CREATE TABLE " + q + "prc_cached2da_cls_feat" + q + " (" +
"" + q + "rowid" + q + " integer DEFAULT -1, " +
"" + q + "file" + q + " varchar(20) DEFAULT '_', " +
"" + q + "FeatLabel" + q + " varchar(255) DEFAULT '_', " +
"" + q + "FeatIndex" + q + " varchar(255) DEFAULT '_', " +
"" + q + "List" + q + " varchar(255) DEFAULT '_', " +
"" + q + "GrantedOnLevel" + q + " varchar(255) DEFAULT '_', " +
"" + q + "OnMenu" + q + " varchar(255) DEFAULT '_');\n" +
"CREATE TABLE " + q + "prc_cached2da" + q + " (" +
"" + q + "file" + q + " varchar(20) DEFAULT '_', " +
"" + q + "columnid" + q + " varchar(255) DEFAULT '_', " +
"" + q + "rowid" + q + " integer DEFAULT -1, " +
"" + q + "data" + q + " varchar(255) DEFAULT '_');\n"
);
File[] files = new File(dir).listFiles();
for (int i = 0; i < files.length; i++)
addFileToSQL(files[i]);
//create some indexs
sql.append("CREATE UNIQUE INDEX " + q + "spellsrowindex" + q + " ON " + q + "prc_cached2da_spells" + q + " (" + q + "rowid" + q + ");\n" +
"CREATE UNIQUE INDEX " + q + "featrowindex" + q + " ON " + q + "prc_cached2da_feat" + q + " (" + q + "rowid" + q + ");\n" +
"CREATE INDEX " + q + "clsfeatindex" + q + " ON " + q + "prc_cached2da_cls_feat" + q + " (" + q + "file" + q + ", " + q + "FeatIndex" + q + ");\n" +
"CREATE UNIQUE INDEX " + q + "appearrowindex" + q + " ON " + q + "prc_cached2da_appearance" + q + " (" + q + "rowid" + q + ");\n" +
"CREATE UNIQUE INDEX " + q + "portrrowindex" + q + " ON " + q + "prc_cached2da_portraits" + q + " (" + q + "rowid" + q + ");\n" +
"CREATE UNIQUE INDEX " + q + "soundsrowindex" + q + " ON " + q + "prc_cached2da_soundset" + q + " (" + q + "rowid" + q + ");\n" +
//"CREATE UNIQUE INDEX "+q+"datanameindex"+q+" ON "+q+"prc_data"+q+" ("+q+"name"+q+");\n" +
"CREATE UNIQUE INDEX " + q + "cachedindex" + q + " ON " + q + "prc_cached2da" + q + " (" + q + "file" + q + ", " + q + "columnid" + q + ", " + q + "rowid" + q + ");\n"
//"CREATE INDEX "+q+"ireqfileindex"+q+" ON "+q+"prc_cached2da_ireq"+q+" ("+q+"file"+q+");\n" +
//"CREATE UNIQUE INDEX "+q+"refrindex"+q+" ON "+q+"prc_cached2da_item_to_ireq"+q+" ("+q+"L_RESREF"+q+", "+q+"rowid"+q+");\n"
);
//complete the transaction
if (sqlite)
sql.append("COMMIT;\n");
sql.flush();
sql.close();
}
private static void readMe() {
System.out.println("Usage:\n" +
"\tjava 2datosql precacher2das\n" +
"\n" +
"This application is designed to take all the 2DA\n" +
"files in the directory and output a SQL\n" +
"file for them"
);
System.exit(0);
}
private static void addFileToSQL(File file) throws Exception {
String filename = file.getAbsolutePath();
Data_2da data = Data_2da.load2da(filename, true);
//remove path and extension from filename
filename = file.getName();
filename = filename.substring(0, filename.length() - 4);
//tell the user what were doing
if (verbose) System.out.print("Making SQL from " + filename + " ");
//specific files get their own tables
if (filename.matches("feat")
|| filename.matches("spells")
|| filename.matches("portraits")
|| filename.matches("soundset")
|| filename.matches("appearance")
|| filename.matches("portraits")
|| filename.matches("classes")
|| filename.matches("racialtypes"))
//|| filename.matches("item_to_ireq"))
{
//output the table creation
addSQLForSingleTable(data, filename);
}
//some groups get specific matches
else if (filename.matches("cls_feat_[^ ]*")) {
addSQLForGroupedTable(data, filename, "cls_feat");
}
/*
else if(filename.matches("ireq_[^ ]*")){
addSQLForGroupedTable(data, filename, "ireq");
}
*/
//everything else goes in the same table
else {
addSQLForGeneralTable(data, filename);
}
//tell user finished that table
if (verbose) System.out.println("- Done");
// Force garbage collection
System.gc();
}
/*
* Below are the three functions that produce SQL for adding
* to each of the 3 table types.
*/
private static void addSQLForSingleTable(Data_2da data, String filename) throws Exception {
StringBuilder entry;
entry = new StringBuilder("CREATE TABLE " + q + "prc_cached2da_" + filename + q + " (" + q + "rowid" + q + " integer");
String[] labels = data.getLabels();
for (int i = 0; i < labels.length; i++) {
entry.append(", " + q + labels[i] + q + " varchar(255) DEFAULT '_'");
}
entry.append(");");
sql.append(entry + "\n");
//put the data in
for (int row = 0; row < data.getEntryCount(); row++) {
entry = new StringBuilder("INSERT INTO " + q + "prc_cached2da_" + filename + q);
//entry +=" (rowid";
//for(int i = 0 ; i < labels.length ; i++){
// entry += ", "+labels[i];
//}
//entry += ")"
entry.append(" VALUES (" + row);
for (int column = 0; column < labels.length; column++) {
entry.append(", ");
String value = data.getEntry(labels[column], row);
if (value == "****")
value = "";
entry.append("'" + value + "'");
if (verbose) spinner.spin();
}
entry.append(");");
sql.append(entry + "\n");
}
}
private static void addSQLForGroupedTable(Data_2da data, String filename, String tablename) throws Exception {
String[] labels = data.getLabels();
StringBuilder entry;
for (int row = 0; row < data.getEntryCount(); row++) {
entry = new StringBuilder("INSERT INTO " + q + "prc_cached2da_" + tablename + q);
//entry +="(rowid";
//for(int i = 0 ; i < labels.length ; i++){
// entry += ", "+labels[i];
//}
//entry += ", file)";
entry.append(" VALUES (" + row);
entry.append(", '" + filename + "'");
for (int column = 0; column < labels.length; column++) {
entry.append(", ");
String value = data.getEntry(labels[column], row);
if (value == "****")
value = "";
entry.append("'" + value + "'");
if (verbose) spinner.spin();
}
entry.append(");");
sql.append(entry + "\n");
}
}
private static void addSQLForGeneralTable(Data_2da data, String filename) throws Exception {
String[] labels = data.getLabels();
StringBuilder entry;
for (int row = 0; row < data.getEntryCount(); row++) {
for (int column = 0; column < labels.length; column++) {
entry = new StringBuilder("INSERT INTO " + q + "prc_cached2da" + q + " VALUES ('" + filename + "', '" + labels[column] + "', " + row + ", ");
String value = data.getEntry(labels[column], row);
if (value == "****")
value = "";
entry.append("'" + value + "'");
entry.append(");");
sql.append(entry + "\n");
if (verbose) spinner.spin();
}
}
}
}