Automatically add and remove indices and primary key (though it's extremely
unlikely that one would do the latter), automatically remove obsolete columns (might be dangerous, I could be pursuaded to reconsider). git-svn-id: https://samskivert.googlecode.com/svn/trunk@2013 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
+1
-1
@@ -15,7 +15,7 @@ CLASSPATH="$JAVA_HOME/jre/lib/rt.jar"
|
|||||||
for JAR in $ROOT/dist/lib/*.jar; do
|
for JAR in $ROOT/dist/lib/*.jar; do
|
||||||
CLASSPATH=$CLASSPATH:$JAR
|
CLASSPATH=$CLASSPATH:$JAR
|
||||||
done
|
done
|
||||||
CLASSPATH=$ROOT/dist/classes:$CLASSPATH
|
CLASSPATH=$ROOT/dist/classes:$ROOT:$CLASSPATH
|
||||||
export CLASSPATH
|
export CLASSPATH
|
||||||
|
|
||||||
eval $JAVA_VM $JAVA_ARGS "$@"
|
eval $JAVA_VM $JAVA_ARGS "$@"
|
||||||
|
|||||||
-21
@@ -1,21 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# Runs test code
|
|
||||||
|
|
||||||
ROOT=`dirname $0`
|
|
||||||
ROOT=`cd $ROOT/.. ; pwd`
|
|
||||||
|
|
||||||
JAVA_VM="$JAVA_HOME/bin/java"
|
|
||||||
if [ ! -e $JAVA_VM ]; then
|
|
||||||
echo "$0: Cannot find JVM in $JAVA_HOME. Exiting."
|
|
||||||
exit 255
|
|
||||||
fi
|
|
||||||
|
|
||||||
CLASSPATH="$JAVA_HOME/jre/lib/rt.jar"
|
|
||||||
for JAR in $ROOT/dist/lib/*.jar; do
|
|
||||||
CLASSPATH=$CLASSPATH:$JAR
|
|
||||||
done
|
|
||||||
CLASSPATH=$ROOT/tests/dist/classes:$ROOT/dist/classes:$ROOT/tests:$CLASSPATH
|
|
||||||
export CLASSPATH
|
|
||||||
|
|
||||||
eval $JAVA_VM $JAVA_ARGS "$@"
|
|
||||||
@@ -217,18 +217,14 @@ public class DepotMarshaller<T>
|
|||||||
if (entity != null) {
|
if (entity != null) {
|
||||||
for (Index index : entity.indices()) {
|
for (Index index : entity.indices()) {
|
||||||
// TODO: delegate this to a database specific SQL generator
|
// TODO: delegate this to a database specific SQL generator
|
||||||
_declarations.add("INDEX " + index.name() + " " + index.type() +
|
_declarations.add(index.type() + "index " + index.name() +
|
||||||
" (" + StringUtil.join(index.columns(), ", ") + ")");
|
" (" + StringUtil.join(index.columns(), ", ") + ")");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// add the primary key, if we have one
|
// add the primary key, if we have one
|
||||||
if (hasPrimaryKey()) {
|
if (hasPrimaryKey()) {
|
||||||
String[] pkcols = new String[_pkColumns.size()];
|
_declarations.add("PRIMARY KEY (" + getPrimaryKeyColumns() + ")");
|
||||||
for (int ii = 0; ii < pkcols.length; ii ++) {
|
|
||||||
pkcols[ii] = _pkColumns.get(ii).getColumnName();
|
|
||||||
}
|
|
||||||
_declarations.add("PRIMARY KEY (" + StringUtil.join(pkcols, ", ") + ")");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we did not find a schema version field, complain
|
// if we did not find a schema version field, complain
|
||||||
@@ -632,22 +628,10 @@ public class DepotMarshaller<T>
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// otherwise try to migrate the schema
|
||||||
log.info("Migrating " + getTableName() + " from " +
|
log.info("Migrating " + getTableName() + " from " +
|
||||||
currentVersion + " to " + _schemaVersion + "...");
|
currentVersion + " to " + _schemaVersion + "...");
|
||||||
|
|
||||||
// otherwise try to migrate the schema
|
|
||||||
final HashSet<String> columns = new HashSet<String>();
|
|
||||||
ctx.invoke(new Modifier(null) {
|
|
||||||
public int invoke (Connection conn) throws SQLException {
|
|
||||||
DatabaseMetaData meta = conn.getMetaData();
|
|
||||||
ResultSet rs = meta.getColumns(null, null, getTableName(), "%");
|
|
||||||
while (rs.next()) {
|
|
||||||
columns.add(rs.getString("COLUMN_NAME"));
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// run our pre-default-migrations
|
// run our pre-default-migrations
|
||||||
for (EntityMigration migration : _migrations) {
|
for (EntityMigration migration : _migrations) {
|
||||||
if (migration.runBeforeDefault() &&
|
if (migration.runBeforeDefault() &&
|
||||||
@@ -656,10 +640,28 @@ public class DepotMarshaller<T>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// do our "default" migrations magically
|
// enumerate all of the columns now that we've run our pre-migrations
|
||||||
|
final HashSet<String> columns = new HashSet<String>();
|
||||||
|
final HashSet<String> indices = new HashSet<String>();
|
||||||
|
ctx.invoke(new Modifier(null) {
|
||||||
|
public int invoke (Connection conn) throws SQLException {
|
||||||
|
DatabaseMetaData meta = conn.getMetaData();
|
||||||
|
ResultSet rs = meta.getColumns(null, null, getTableName(), "%");
|
||||||
|
while (rs.next()) {
|
||||||
|
columns.add(rs.getString("COLUMN_NAME"));
|
||||||
|
}
|
||||||
|
rs = meta.getIndexInfo(null, null, getTableName(), false, false);
|
||||||
|
while (rs.next()) {
|
||||||
|
indices.add(rs.getString("INDEX_NAME"));
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// add any missing columns
|
||||||
for (String fname : _columnFields) {
|
for (String fname : _columnFields) {
|
||||||
FieldMarshaller fmarsh = _fields.get(fname);
|
FieldMarshaller fmarsh = _fields.get(fname);
|
||||||
if (columns.contains(fmarsh.getColumnName())) {
|
if (columns.remove(fmarsh.getColumnName())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -689,6 +691,43 @@ public class DepotMarshaller<T>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// add or remove the primary key as needed
|
||||||
|
if (hasPrimaryKey() && !indices.remove("PRIMARY")) {
|
||||||
|
String pkdef = "primary key (" + getPrimaryKeyColumns() + ")";
|
||||||
|
log.info("Adding primary key to " + getTableName() + ": " + pkdef);
|
||||||
|
ctx.invoke(new Modifier.Simple("alter table " + getTableName() + " add " + pkdef));
|
||||||
|
|
||||||
|
} else if (!hasPrimaryKey() && indices.remove("PRIMARY")) {
|
||||||
|
log.info("Dropping primary from " + getTableName());
|
||||||
|
ctx.invoke(new Modifier.Simple("alter table " + getTableName() + " drop primary key"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// add any missing indices
|
||||||
|
Entity entity = _pclass.getAnnotation(Entity.class);
|
||||||
|
for (Index index : (entity == null ? new Index[0] : entity.indices())) {
|
||||||
|
if (indices.remove(index.name())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String indexdef = "create " + index.type() + " index " + index.name() +
|
||||||
|
" on " + getTableName() + " (" + StringUtil.join(index.columns(), ", ") + ")";
|
||||||
|
log.info("Adding index: " + indexdef);
|
||||||
|
ctx.invoke(new Modifier.Simple(indexdef));
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove any extra columns
|
||||||
|
for (String column : columns) {
|
||||||
|
log.info("Dropping old column '" + column + "' from " + getTableName());
|
||||||
|
String query = "alter table " + getTableName() + " drop index " + column;
|
||||||
|
ctx.invoke(new Modifier.Simple(query));
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove any extra indices
|
||||||
|
for (String index : indices) {
|
||||||
|
log.info("Dropping old index '" + index + "' from " + getTableName());
|
||||||
|
String query = "alter table " + getTableName() + " drop index " + index;
|
||||||
|
ctx.invoke(new Modifier.Simple(query));
|
||||||
|
}
|
||||||
|
|
||||||
// run our post-default-migrations
|
// run our post-default-migrations
|
||||||
for (EntityMigration migration : _migrations) {
|
for (EntityMigration migration : _migrations) {
|
||||||
if (!migration.runBeforeDefault() &&
|
if (!migration.runBeforeDefault() &&
|
||||||
@@ -706,6 +745,15 @@ public class DepotMarshaller<T>
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected String getPrimaryKeyColumns ()
|
||||||
|
{
|
||||||
|
String[] pkcols = new String[_pkColumns.size()];
|
||||||
|
for (int ii = 0; ii < pkcols.length; ii ++) {
|
||||||
|
pkcols[ii] = _pkColumns.get(ii).getColumnName();
|
||||||
|
}
|
||||||
|
return StringUtil.join(pkcols, ", ");
|
||||||
|
}
|
||||||
|
|
||||||
protected void updateVersion (Connection conn, int version)
|
protected void updateVersion (Connection conn, int version)
|
||||||
throws SQLException
|
throws SQLException
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user