package org.basex.core.cmd; import static org.basex.core.Text.*; import java.io.FileNotFoundException; import java.io.IOException; import org.basex.build.DirParser; import org.basex.core.BaseXException; import org.basex.core.Context; import org.basex.core.Command; import org.basex.core.Prop; import org.basex.core.User; import org.basex.core.Commands.CmdPerm; import org.basex.data.Data; import org.basex.data.MetaData; import org.basex.io.IO; import org.basex.util.Util; /** * Evaluates the 'checks' command, opens an existing database or * creates a new one. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public final class Check extends Command { /** * Default constructor. * @param path file path */ public Check(final String path) { super(STANDARD, path); } @Override protected boolean run() { // close existing database new Close().run(context); // get path and database name final String path = args[0]; final String name = IO.get(path).dbname(); // choose OPEN if user has no create permissions, or if database exists final boolean create = context.user.perm(User.CREATE); final Command cmd = !create || MetaData.found(path, name, mprop) ? new Open(name) : new CreateDB(name, path); // execute command final boolean ok = cmd.run(context); final String msg = cmd.info().trim(); return ok ? info(msg) : error(msg); } /** * Opens the specified database; if it does not exist, create a new * database instance. * @param ctx database context * @param path document path * @return data reference * @throws IOException I/O exception */ public static synchronized Data check(final Context ctx, final String path) throws IOException { // choose OPEN if user has no create permissions, or if database exists final boolean create = ctx.user.perm(User.CREATE); final IO io = IO.get(path); final String name = io.dbname(); // check if database is already opened final Data data = ctx.pin(name); if(data != null) { final IO in = IO.get(data.meta.original); final boolean found = !data.meta.original.isEmpty() && in.eq(io) && io.timeStamp() == in.timeStamp(); if(found && ctx.perm(User.READ, data.meta)) return data; Close.close(data, ctx); if(found) throw new BaseXException(PERM_NEEDED_X, CmdPerm.READ); } // choose OPEN if user has no create permissions, or if database exists if(!create || MetaData.found(path, name, ctx.mprop)) return Open.open(name, ctx); // check if file exists if(!io.exists()) throw new FileNotFoundException( Util.info(FILE_NOT_FOUND_X, io)); // if force flag is set to false, create a main memory instance if(!ctx.prop.is(Prop.FORCECREATE)) return CreateDB.mainMem(io, ctx); // otherwise, create a persistent database instance final DirParser dp = new DirParser(io, ctx.prop, ctx.mprop.dbpath(name)); return CreateDB.create(name, dp, ctx); } }