/* Copyright (C) 2003-2011 JabRef contributors.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General public static License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General public static License for more details.
You should have received a copy of the GNU General public static License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package net.sf.jabref.sql.exporter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import net.sf.jabref.Util;
import net.sf.jabref.sql.DBStrings;
import net.sf.jabref.sql.SQLUtil;
/**
*
* @author ifsteinm.
*
* Jan 20th Extends DBExporter to provide features specific for MySQL
* Created after a refactory on SQLUtil
*
*/
public class MySQLExporter extends DBExporter {
private static MySQLExporter instance = null;
private MySQLExporter() {
}
/**
*
* @return The singleton instance of the MySQLExporter
*/
public static MySQLExporter getInstance() {
if (instance == null)
instance = new MySQLExporter();
return instance;
}
@Override
public Connection connectToDB(DBStrings dbstrings) throws Exception {
this.dbStrings = dbstrings;
String url = SQLUtil.createJDBCurl(dbstrings, false);
String drv = "com.mysql.jdbc.Driver";
Class.forName(drv).newInstance();
Connection conn = DriverManager.getConnection(url,
dbstrings.getUsername(), dbstrings.getPassword());
SQLUtil.processQuery(conn, "CREATE DATABASE IF NOT EXISTS `"
+ dbStrings.getDatabase() + "`");
SQLUtil.processQuery(conn, "USE `" + dbStrings.getDatabase() + "`");
return conn;
}
/**
* Generates SQLnecessary to create all tables in a MySQL database, and
* writes it to appropriate output.
*
* @param out
* The output (PrintStream or Connection) object to which the DML
* should be written.
*/
@Override
protected void createTables(Object out) throws SQLException {
SQLUtil.processQuery(
out,
"CREATE TABLE IF NOT EXISTS jabref_database ( \n"
+ "database_id INT UNSIGNED NOT NULL AUTO_INCREMENT, \n"
+ "database_name VARCHAR(64) NOT NULL, \n"
+ "md5_path VARCHAR(32) NOT NULL, \n"
+ "PRIMARY KEY (database_id)\n );");
SQLUtil.processQuery(
out,
"CREATE TABLE IF NOT EXISTS entry_types ( \n"
+ "entry_types_id INT UNSIGNED NOT NULL AUTO_INCREMENT, \n"
+ "label TEXT, \n"
+ SQLUtil.fieldsAsCols(SQLUtil.getAllFields(),
" VARCHAR(3) DEFAULT NULL") + ", \n"
+ "PRIMARY KEY (entry_types_id) \n" + ");");
SQLUtil.processQuery(
out,
"CREATE TABLE IF NOT EXISTS entries ( \n"
+ "entries_id INTEGER NOT NULL AUTO_INCREMENT, \n"
+ "jabref_eid VARCHAR("
+ Util.getMinimumIntegerDigits()
+ ") DEFAULT NULL, \n"
+ "database_id INT UNSIGNED, \n"
+ "entry_types_id INT UNSIGNED DEFAULT NULL, \n"
+ "cite_key VARCHAR(100) DEFAULT NULL, \n"
+ SQLUtil.fieldsAsCols(SQLUtil.getAllFields(),
" TEXT DEFAULT NULL")
+ ",\n"
+ "PRIMARY KEY (entries_id), \n"
+ "INDEX(entry_types_id), \n"
+ "FOREIGN KEY (entry_types_id) REFERENCES entry_types(entry_types_id), \n"
+ "FOREIGN KEY (database_id) REFERENCES jabref_database(database_id) \n);");
SQLUtil.processQuery(
out,
"CREATE TABLE IF NOT EXISTS strings ( \n"
+ "strings_id INTEGER NOT NULL AUTO_INCREMENT, \n"
+ "label VARCHAR(100) DEFAULT NULL, \n"
+ "content VARCHAR(200) DEFAULT NULL, \n"
+ "database_id INT UNSIGNED, \n"
+ "FOREIGN KEY (database_id) REFERENCES jabref_database(database_id), \n"
+ "PRIMARY KEY (strings_id) \n" + ");");
SQLUtil.processQuery(out, "CREATE TABLE IF NOT EXISTS group_types ( \n"
+ "group_types_id INTEGER NOT NULL AUTO_INCREMENT, \n"
+ "label VARCHAR(100) DEFAULT NULL, \n"
+ "PRIMARY KEY (group_types_id) \n" + ");");
SQLUtil.processQuery(
out,
"CREATE TABLE IF NOT EXISTS groups ( \n"
+ "groups_id INTEGER NOT NULL AUTO_INCREMENT, \n"
+ "group_types_id INTEGER DEFAULT NULL, \n"
+ "label VARCHAR(100) DEFAULT NULL, \n"
+ "database_id INT UNSIGNED, \n"
+ "parent_id INTEGER DEFAULT NULL, \n"
+ "search_field VARCHAR(100) DEFAULT NULL, \n"
+ "search_expression VARCHAR(200) DEFAULT NULL, \n"
+ "case_sensitive BOOL DEFAULT NULL, \n"
+ "reg_exp BOOL DEFAULT NULL, \n"
+ "hierarchical_context INTEGER DEFAULT NULL, \n"
+ "FOREIGN KEY (database_id) REFERENCES jabref_database(database_id), \n"
+ "PRIMARY KEY (groups_id) \n" + ");");
SQLUtil.processQuery(
out,
"CREATE TABLE IF NOT EXISTS entry_group ( \n"
+ "entries_id INTEGER NOT NULL AUTO_INCREMENT, \n"
+ "groups_id INTEGER DEFAULT NULL, \n"
+ "INDEX(entries_id), \n"
+ "INDEX(groups_id), \n"
+ "FOREIGN KEY (entries_id) REFERENCES entries(entries_id) ON DELETE CASCADE, \n"
+ "FOREIGN KEY (groups_id) REFERENCES groups(groups_id), \n"
+ "PRIMARY KEY (groups_id, entries_id) \n" + ");");
}
}