package org.basex.build;
import java.io.*;
import org.basex.data.*;
import org.basex.io.*;
import org.basex.util.*;
/**
* This class creates a database instance in main memory.
* The storage layout is described in the {@link Data} class.
*
* @author BaseX Team 2005-17, BSD License
* @author Christian Gruen
*/
public final class MemBuilder extends Builder {
/** Data reference. */
private MemData data;
/** Debug counter. */
private int c;
/**
* Constructor.
* @param name name of database
* @param parse parser
*/
public MemBuilder(final String name, final Parser parse) {
super(name, parse);
}
/**
* Builds a main memory database instance.
* @param input input
* @return data database instance
* @throws IOException I/O exception
*/
public static MemData build(final IO input) throws IOException {
return build(Parser.xmlParser(input));
}
/**
* Builds a main memory database instance.
* @param parser parser
* @return data database instance
* @throws IOException I/O exception
*/
public static MemData build(final Parser parser) throws IOException {
return build(parser.source.dbName(), parser);
}
/**
* Builds a main memory database instance with the specified name.
* @param name name of database
* @param parser parser
* @return data database instance
* @throws IOException I/O exception
*/
public static MemData build(final String name, final Parser parser) throws IOException {
return new MemBuilder(name, parser).build();
}
@Override
public MemData build() throws IOException {
dataClip();
return data;
}
@Override
public DataClip dataClip() throws IOException {
init();
meta.assign(parser);
try {
parse();
} finally {
if(data.meta.updindex) data.idmap.finish(data.meta.lastid);
}
return new DataClip(data);
}
/**
* Initializes the builder.
*/
public void init() {
data = new MemData(path, nspaces, parser.options);
meta = data.meta;
meta.name = dbName;
elemNames = data.elemNames;
attrNames = data.attrNames;
path.data(data);
}
/**
* Returns the data reference.
* @return data reference
*/
public Data data() {
return data;
}
@Override
protected void addDoc(final byte[] value) {
data.doc(0, value);
data.insert(meta.size);
}
@Override
protected void addElem(final int dist, final int nameId, final int asize, final int uriId,
final boolean ne) {
data.elem(dist, nameId, asize, asize, uriId, ne);
data.insert(meta.size);
if(Prop.debug && (c++ & 0x7FFFF) == 0) Util.err(".");
}
@Override
protected void addAttr(final int nameId, final byte[] value, final int dist, final int uriId) {
data.attr(dist, nameId, value, uriId);
data.insert(meta.size);
}
@Override
protected void addText(final byte[] value, final int dist, final byte kind) {
data.text(dist, value, kind);
data.insert(meta.size);
}
@Override
protected void setSize(final int pre, final int size) {
data.size(pre, Data.ELEM, size);
}
}