package org.basex.core.cmd; import static org.basex.core.Text.*; import static org.basex.data.DataText.*; import java.io.IOException; import java.util.regex.Pattern; import org.basex.core.Context; import org.basex.core.Command; import org.basex.core.User; import org.basex.data.MetaData; import org.basex.io.IO; import org.basex.io.IOFile; import org.basex.io.in.DataInput; import org.basex.util.Table; import org.basex.util.list.StringList; import org.basex.util.list.TokenList; /** * Evaluates the 'list' command and shows all available databases. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public final class List extends Command { /** Pattern to extract the database name from a backup file name. */ private static final Pattern PA = Pattern.compile(IO.DATEPATTERN + IO.ZIPSUFFIX + '$'); /** * Default constructor. */ public List() { super(STANDARD); } @Override protected boolean run() throws IOException { final Table table = new Table(); table.description = DATABASES; final boolean create = context.user.perm(User.CREATE); table.header.add(T_NAME); table.header.add(RESOURCES); table.header.add(SIZE); if(create) table.header.add(INPUT_PATH); for(final String name : list(context)) { DataInput di = null; String file = null; long size = 0; int docs = 0; final MetaData meta = new MetaData(name, context); try { di = new DataInput(meta.dbfile(DATAINF)); meta.read(di); size = meta.dbsize(); docs = meta.ndocs; if(context.perm(User.READ, meta)) file = meta.original; } catch(final IOException ex) { file = ERROR; } finally { if(di != null) try { di.close(); } catch(final IOException ex) { } } // count number of raw files final IOFile dir = new IOFile(mprop.dbpath(name), M_RAW); final int bin = dir.descendants().size(); // create entry if(file != null) { final TokenList tl = new TokenList(4); tl.add(name); tl.add(docs + bin); tl.add(size); if(create) tl.add(file); table.contents.add(tl); } } table.sort(); out.println(table.finish()); return true; } /** * Returns a list of all databases. * @param ctx database context * @return list of databases */ public static StringList list(final Context ctx) { return list(ctx, false); } /** * Returns a list of all databases and (optionally) backed up databases. * @param ctx database context * @param backups include backups in the list * @return list of databases */ public static StringList list(final Context ctx, final boolean backups) { final StringList db = new StringList(); for(final IOFile f : ctx.mprop.dbpath().children()) { String name = f.name(); if(backups && name.endsWith(IO.ZIPSUFFIX)) { name = dbname(name); if(!db.contains(name)) db.add(name); } else if(f.isDir() && !name.startsWith(".")) { db.add(name); } } db.sort(false, true); return db; } /** * Extracts the name of a database from its backup file. * @param s name of backup file * @return name of database */ private static String dbname(final String s) { return PA.split(s)[0]; } }