package org.basex.core.cmd;
import static org.basex.core.Commands.*;
import static org.basex.core.Text.*;
import org.basex.core.Command;
import org.basex.core.CommandBuilder;
import org.basex.core.Context;
import org.basex.core.User;
import org.basex.core.Commands.Cmd;
import org.basex.data.MetaData;
import org.basex.io.IO;
import org.basex.io.IOFile;
/**
* Evaluates the 'drop backup' command and deletes backups of a database.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class DropBackup extends Command {
/**
* Default constructor.
* @param name name of database
*/
public DropBackup(final String name) {
super(User.CREATE, name);
}
@Override
protected boolean run() {
if(!MetaData.validName(args[0], true))
return error(NAME_INVALID_X, args[0]);
final String[] dbs = databases(args[0]);
// loop through all databases and drop backups
for(final String db : dbs) {
drop(db.contains("-") ? db : db + '-', context);
}
// if the given argument is not a database name, it could be the name
// of a backup file
if(dbs.length == 0) drop(args[0], context);
return info(BACKUP_DROPPED_X, args[0] + '*' + IO.ZIPSUFFIX);
}
/**
* Drops one or more backups of the specified database.
* @param db database
* @param ctx database context
* @return number of dropped backups
*/
private static int drop(final String db, final Context ctx) {
final IOFile dir = ctx.mprop.dbpath();
int c = 0;
for(final IOFile f : dir.children()) {
final String n = f.name();
if(n.startsWith(db) && n.endsWith(IO.ZIPSUFFIX)) {
if(f.delete()) c++;
}
}
return c;
}
@Override
public void build(final CommandBuilder cb) {
cb.init(Cmd.DROP + " " + CmdDrop.BACKUP).args();
}
}