package org.basex.build;
import java.io.IOException;
import org.basex.core.Prop;
import org.basex.data.Data;
import org.basex.data.MemData;
import org.basex.data.MetaData;
import org.basex.io.IO;
/**
* This class creates a database instance in main memory.
* The storage layout is described in the {@link Data} class.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class MemBuilder extends Builder {
/** Data reference. */
private MemData data;
/**
* Constructor.
* @param nm name of database
* @param parse parser
* @param pr properties
*/
public MemBuilder(final String nm, final Parser parse, final Prop pr) {
super(nm, parse, pr);
}
/**
* Builds the main memory database instance without database name.
* @param parser parser
* @param prop properties
* @return data database instance
* @throws IOException I/O exception
*/
public static MemData build(final Parser parser, final Prop prop)
throws IOException {
return build(parser.src.name(), parser, prop);
}
/**
* Builds a main memory database instance.
* @param name name of database
* @param parser parser
* @param prop properties
* @return data database instance
* @throws IOException I/O exception
*/
public static MemData build(final String name, final Parser parser,
final Prop prop) throws IOException {
return new MemBuilder(name, parser, prop).build();
}
@Override
public MemData build() throws IOException {
data = new MemData(null, null, path, ns, prop);
final MetaData md = data.meta;
md.name = name;
// all contents will be indexed in main memory mode
md.createtext = true;
md.createattr = true;
md.textindex = true;
md.attrindex = true;
md.pathindex = md.createpath;
final IO file = parser.src;
md.original = file != null ? file.path() : "";
md.filesize = file != null ? file.length() : 0;
md.time = file != null ? file.timeStamp() : System.currentTimeMillis();
parse(md, data.tagindex, data.atnindex);
data.init();
path.finish(data);
return data;
}
@Override
public void close() throws IOException {
parser.close();
}
@Override
protected void addDoc(final byte[] value) {
data.doc(meta.size, 0, value);
data.insert(meta.size);
}
@Override
protected void addElem(final int dist, final int nm, final int asize,
final int uri, final boolean ne) {
data.elem(dist, nm, asize, asize, uri, ne);
data.insert(meta.size);
}
@Override
protected void addAttr(final int nm, final byte[] value, final int dist,
final int uri) {
data.attr(meta.size, dist, nm, value, uri, false);
data.insert(meta.size);
}
@Override
protected void addText(final byte[] value, final int dist, final byte kind) {
data.text(meta.size, dist, value, kind);
data.insert(meta.size);
}
@Override
protected void setSize(final int pre, final int size) {
data.size(pre, Data.ELEM, size);
}
}