/**
*
*/
package edu.washington.cs.publickey.storage.sql.derby;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @author isdal
*
*/
class TablesDerby {
public final static String USER_TABLE = "CREATE TABLE publickey.users " + "(" + "user_id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY," + "net SMALLINT NOT NULL," + "net_uid VARCHAR(20) FOR BIT DATA NOT NULL, " + "last_seen DATE NOT NULL, " + "PRIMARY KEY (user_id)" + ")";
public final static String USER_TABLE_DROP = "DROP TABLE publickey.users";
public final static String USER_TABLE_NET_NET_UID_INDEX = "CREATE UNIQUE INDEX net_net_uid_idx ON publickey.users" + "(net,net_uid)";
public final static String KEYS_TABLE = "CREATE TABLE publickey.pubkeys " + "(" + "user_id BIGINT NOT NULL, last_seen DATE NOT NULL, " + " pubkey_nick VARCHAR(255) NOT NULL," + "pubkey_sha1 VARCHAR(20) FOR BIT DATA NOT NULL," + "pubkey BLOB NOT NULL," + "FOREIGN KEY (user_id) " + "REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE RESTRICT" + ")";
public final static String KEYS_TABLE_USER_ID_INDEX = "CREATE INDEX key_user_id_idx ON publickey.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 publickey.pubkeys" + "(pubkey_sha1)";
public final static String KEYS_TABLE_USER_ID_KEY_INDEX = "CREATE INDEX key_user_pubkey_id_idx ON publickey.pubkeys" + "(user_id,pubkey_sha1)";
public final static String KEYS_TABLE_DROP = "DROP TABLE publickey.pubkeys";
public final static String FRIENDS_TABLE = "CREATE TABLE publickey.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 " + ")";
public final static String FRIENDS_TABLE_UID_INDEX = "CREATE INDEX friends_uid_idx ON publickey.friends" + "(user_id)";
public final static String FRIENDS_TABLE_FID_INDEX = "CREATE INDEX friends_fid_idx ON publickey.friends" + "(friend_id)";
public final static String FRIENDS_TABLE_UID_FID_INDEX = "CREATE UNIQUE INDEX friends_uid_fid_idx ON publickey.friends" + "(user_id,friend_id)";
public final static String FRIENDS_TABLE_DROP = "DROP TABLE publickey.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 (SQLException e) {
if (e.getMessage().equals("'DROP TABLE' cannot be performed on " + "'PUBLICKEY.FRIENDS' " + "because it does not exist.") || e.getMessage().equals("Schema 'PUBLICKEY' does not exist")) {
System.out.println("friends table not found");
} else {
e.printStackTrace();
}
}
try {
s.execute(KEYS_TABLE_DROP);
System.out.println("dropped table: pubkeys");
} catch (SQLException e) {
if (e.getMessage().equals("'DROP TABLE' cannot be performed on " + "'PUBLICKEY.FRIENDS' " + "because it does not exist.") || e.getMessage().equals("Schema 'PUBLICKEY' does not exist")) {
System.out.println("friends table not found");
} else {
e.printStackTrace();
}
}
try {
s.execute(USER_TABLE_DROP);
System.out.println("dropped table: users");
} catch (SQLException e) {
if (e.getMessage().equals("'DROP TABLE' cannot be performed on " + "'PUBLICKEY.FRIENDS' " + "because it does not exist.") || e.getMessage().equals("Schema 'PUBLICKEY' does not exist")) {
System.out.println("friends table not found");
} else {
e.printStackTrace();
}
}
}
/*
* create the tables
*/
TablesDerby.createUsersTable(s);
TablesDerby.createKeysTable(s);
TablesDerby.createFriendsTable(s);
s.close();
conn.commit();
}
private static void createUsersTable(Statement s) throws SQLException {
try {
s.execute(TablesDerby.USER_TABLE);
s.execute(USER_TABLE_NET_NET_UID_INDEX);
System.out.println("Created table users");
} catch (SQLException e) {
if (e.getMessage().equals("Table/View 'USERS' already exists in Schema 'PUBLICKEY'.")) {
} 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);
System.out.println("Created table pubkeys");
} catch (SQLException e) {
if (e.getMessage().equals("Table/View 'PUBKEYS' already exists in Schema 'PUBLICKEY'.")) {
} else {
throw e;
}
}
}
private static void createFriendsTable(Statement s) throws SQLException {
try {
s.execute(TablesDerby.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/View 'FRIENDS' already exists in Schema 'PUBLICKEY'.")) {
} else {
throw e;
}
}
}
}