package org.basex.core.cmd; import static org.basex.core.Text.*; import org.basex.core.MainProp; import org.basex.core.CommandBuilder; import org.basex.core.Command; import org.basex.core.Context; import org.basex.core.User; import org.basex.core.Commands.Cmd; import org.basex.core.Commands.CmdAlter; import org.basex.data.MetaData; /** * Evaluates the 'alter database' command and renames a database. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public final class AlterDB extends Command { /** States if current database was closed. */ private boolean closed; /** * Default constructor. * @param db database * @param name new name */ public AlterDB(final String db, final String name) { super(User.CREATE, db, name); } @Override protected boolean run() { final String db = args[0]; final String name = args[1]; // check if names are valid if(!MetaData.validName(db, false)) return error(NAME_INVALID_X, db); if(!MetaData.validName(name, false)) return error(NAME_INVALID_X, name); // database does not exist if(!mprop.dbexists(db)) return error(DB_NOT_FOUND_X, db); // target database exists already if(mprop.dbexists(name)) return error(DB_EXISTS_X, name); // close database if it's currently opened and not opened by others if(!closed) closed = close(context, db); // check if database is still pinned if(context.pinned(db)) return error(DB_PINNED_X, db); // try to alter database return alter(db, name, mprop) && (!closed || new Open(name).run(context)) ? info(DB_RENAMED_X, db, name) : error(DB_NOT_RENAMED_X, db); } /** * Renames the specified database. * @param db database name * @param dbnew new database name * @param pr database properties * @return success flag */ public static synchronized boolean alter(final String db, final String dbnew, final MainProp pr) { return pr.dbpath(db).rename(pr.dbpath(dbnew)); } @Override public boolean newData(final Context ctx) { closed = close(ctx, args[0]); return closed; } @Override public void build(final CommandBuilder cb) { cb.init(Cmd.ALTER + " " + CmdAlter.DB).args(); } }