package org.basex.core.cmd; import static org.basex.core.Text.*; import java.io.FileNotFoundException; import java.io.IOException; import org.basex.core.Commands.CmdPerm; import org.basex.core.BaseXException; import org.basex.core.Context; import org.basex.core.Command; import org.basex.core.User; import org.basex.data.Data; import org.basex.data.DiskData; import org.basex.data.MetaData; import org.basex.util.Util; /** * Evaluates the 'open' command and opens a database. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public final class Open extends Command { /** * Default constructor. * @param path database name and optional path */ public Open(final String path) { super(STANDARD, path); } @Override protected boolean run() { // close existing database new Close().run(context); // split database name and path String db = args[0]; final int i = db.indexOf('/'); String path = null; if(i != -1) { path = db.substring(i + 1); db = db.substring(0, i); } if(!MetaData.validName(db, false)) return error(NAME_INVALID_X, db); try { final Data data = open(db, context); context.openDB(data, path); if(data.meta.oldindex) info(H_INDEX_FORMAT); if(data.meta.corrupt) info(DB_CORRUPT); return info(DB_OPENED_X, db, perf); } catch(final IOException ex) { Util.debug(ex); final String msg = ex.getMessage(); return msg.isEmpty() ? error(DB_NOT_OPENED_X, db) : error(msg); } } @Override public boolean newData(final Context ctx) { new Close().run(ctx); return true; } /** * Opens the specified database. * @param name name of database * @param ctx database context * @return data reference * @throws IOException I/O exception */ public static Data open(final String name, final Context ctx) throws IOException { Data data = ctx.pin(name); if(data == null) { // check if document exists if(!ctx.mprop.dbexists(name)) throw new FileNotFoundException(Util.info(DB_NOT_FOUND_X, name)); data = new DiskData(name, ctx); ctx.pin(data); } // check permissions if(ctx.perm(User.READ, data.meta)) return data; Close.close(data, ctx); throw new BaseXException(PERM_NEEDED_X, CmdPerm.READ); } }