/**
*
*/
package edu.washington.cs.publickey.storage.sql.mysql;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @author isdal
*
*/
class TablesMySQL {
public final static String USER_TABLE = "CREATE TABLE users " + "(" + "user_id BIGINT NOT NULL AUTO_INCREMENT," + "net SMALLINT NOT NULL," + "net_uid VARBINARY(20) NOT NULL, " + "last_seen DATE NOT NULL, " + "PRIMARY KEY (user_id)" + ") ENGINE=InnoDB";
public final static String USER_TABLE_DROP = "DROP TABLE users";
public final static String USER_TABLE_NET_NET_UID_INDEX = "CREATE UNIQUE INDEX net_net_uid_idx ON users" + "(net,net_uid)";
public final static String KEYS_TABLE = "CREATE TABLE pubkeys " + "(" + "user_id BIGINT NOT NULL, last_seen DATE NOT NULL, " + "pubkey_nick VARCHAR(255) NOT NULL," + "pubkey_sha1 VARBINARY(20) NOT NULL," + "pubkey BLOB NOT NULL," + "FOREIGN KEY (user_id) " + "REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE RESTRICT" + ") ENGINE=InnoDB";
public final static String KEYS_TABLE_USER_ID_INDEX = "CREATE INDEX key_user_id_idx ON pubkeys" + "(user_id)";
public final static String KEYS_TABLE_LAST_SEEN_INDEX = "CREATE INDEX key_last_seen_idx ON pubkeys" + "(last_seen)";
public final static String KEYS_TABLE_KEY_INDEX = "CREATE INDEX key_pubkey_id_idx ON pubkeys" + "(pubkey_sha1)";
public final static String KEYS_TABLE_USER_ID_KEY_INDEX = "CREATE INDEX key_user_pubkey_id_idx ON pubkeys" + "(user_id,pubkey_sha1)";
public final static String KEYS_TABLE_DROP = "DROP TABLE pubkeys";
public final static String FRIENDS_TABLE = "CREATE TABLE friends " + "(" + "user_id BIGINT NOT NULL, " + "friend_id BIGINT NOT NULL, " + "FOREIGN KEY (user_id) " + "REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE RESTRICT, " + "FOREIGN KEY (friend_id) " + "REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE RESTRICT " + ") ENGINE=InnoDB";
public final static String FRIENDS_TABLE_UID_INDEX = "CREATE INDEX friends_uid_idx ON friends" + "(user_id)";
public final static String FRIENDS_TABLE_FID_INDEX = "CREATE INDEX friends_fid_idx ON friends" + "(friend_id)";
public final static String FRIENDS_TABLE_UID_FID_INDEX = "CREATE UNIQUE INDEX friends_uid_fid_idx ON friends" + "(user_id,friend_id)";
public final static String FRIENDS_TABLE_DROP = "DROP TABLE friends";
public static void createTables(Connection conn, boolean dropIfExists) throws SQLException {
Statement s = conn.createStatement();
// if drop, from the tables
if (dropIfExists) {
try {
s.execute(FRIENDS_TABLE_DROP);
System.out.println("dropped table: friends");
} catch (Exception e) {
if (e.getMessage().equals("Unknown table 'friends'")) {
System.out.println("friends table not found");
} else {
e.printStackTrace();
}
}
try {
s.execute(KEYS_TABLE_DROP);
System.out.println("dropped table: pubkeys");
} catch (Exception e) {
if (e.getMessage().equals("Unknown table 'pubkeys'")) {
System.out.println("pubkeys table not found");
} else {
e.printStackTrace();
}
}
try {
s.execute(USER_TABLE_DROP);
System.out.println("dropped table: users");
} catch (Exception e) {
if (e.getMessage().equals("Unknown table 'users'")) {
System.out.println("friends table not found");
} else {
e.printStackTrace();
}
}
}
/*
* create the tables
*/
TablesMySQL.createUsersTable(s);
TablesMySQL.createKeysTable(s);
TablesMySQL.createFriendsTable(s);
s.close();
conn.commit();
}
private static void createUsersTable(Statement s) throws SQLException {
try {
s.execute(TablesMySQL.USER_TABLE);
s.execute(USER_TABLE_NET_NET_UID_INDEX);
System.out.println("Created table users");
} catch (SQLException e) {
if (e.getMessage().equals("Table 'users' already exists")) {
} else {
throw e;
}
}
}
private static void createKeysTable(Statement s) throws SQLException {
try {
s.execute(KEYS_TABLE);
s.execute(KEYS_TABLE_USER_ID_INDEX);
s.execute(KEYS_TABLE_KEY_INDEX);
s.execute(KEYS_TABLE_USER_ID_KEY_INDEX);
s.execute(KEYS_TABLE_LAST_SEEN_INDEX);
System.out.println("Created table pubkeys");
} catch (SQLException e) {
if (e.getMessage().equals("Table 'pubkeys' already exists")) {
} else {
throw e;
}
}
}
private static void createFriendsTable(Statement s) throws SQLException {
try {
s.execute(TablesMySQL.FRIENDS_TABLE);
s.execute(FRIENDS_TABLE_UID_INDEX);
s.execute(FRIENDS_TABLE_FID_INDEX);
s.execute(FRIENDS_TABLE_UID_FID_INDEX);
System.out.println("Created table friends");
} catch (SQLException e) {
if (e.getMessage().equals("Table 'friends' already exists")) {
} else {
throw e;
}
}
}
}