package org.basex.query.up.primitives;
import static org.basex.query.util.Err.*;
import static org.basex.util.Token.*;
import java.io.IOException;
import org.basex.data.Data;
import org.basex.io.IOFile;
import org.basex.query.QueryException;
import org.basex.query.func.Function;
import org.basex.query.item.Item;
import org.basex.util.InputInfo;
import org.basex.util.Util;
import org.basex.util.hash.TokenObjMap;
/**
* Update primitive for the {@link Function#_DB_STORE} function.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class DBStore extends UpdatePrimitive {
/** Keys. */
private final TokenObjMap<Item> map = new TokenObjMap<Item>();
/**
* Constructor.
* @param d data
* @param path target path
* @param it item to be stored
* @param info input info
*/
public DBStore(final Data d, final byte[] path, final Item it,
final InputInfo info) {
super(PrimitiveType.DBSTORE, -1, d, info);
map.add(path, it);
}
@Override
public void merge(final UpdatePrimitive p) {
final DBStore put = (DBStore) p;
for(final byte[] path : put.map) {
map.add(path, put.map.get(path));
}
}
@Override
public void apply() throws QueryException {
for(final byte[] path : map) {
try {
final IOFile file = data.meta.binary(string(path));
if(file == null) UPDBPUTERR.thrw(input, path);
new IOFile(file.dir()).md();
file.write(map.get(path).input(input));
} catch(final IOException ex) {
Util.debug(ex);
UPDBPUTERR.thrw(input, path);
}
}
}
@Override
public int size() {
return map.size();
}
}