package com.g414.haildb;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.g414.haildb.impl.jna.HailDB;
import com.sun.jna.Pointer;
public class Tuple {
protected final List<ColumnDef> columns;
protected Pointer tupl;
private volatile boolean deleted = false;
public Tuple(Pointer tupl, List<ColumnDef> columns) {
this.tupl = tupl;
this.columns = columns;
}
public Map<String, Object> valueMap() {
if (deleted) {
throw new IllegalStateException("tuple already deleted!");
}
Map<String, Object> values = new LinkedHashMap<String, Object>(
this.columns.size());
for (ColumnDef def : this.columns) {
values.put(def.getName(), this.getValue(def));
}
return Collections.unmodifiableMap(values);
}
public void clear() {
if (deleted) {
throw new IllegalStateException("tuple is deleted!");
}
tupl = HailDB.ib_tuple_clear(tupl);
}
public void delete() {
if (deleted) {
throw new IllegalStateException("tuple is deleted!");
}
if (tupl != null && !tupl.equals(Pointer.NULL)) {
deleted = true;
HailDB.ib_tuple_delete(tupl);
}
}
private Object getValue(ColumnDef def) {
switch (def.getType()) {
case BINARY:
case VARBINARY:
case BLOB:
return TupleStorage.loadBytes(this, def.getIndex());
case CHAR:
case CHAR_ANYCHARSET:
case VARCHAR:
case VARCHAR_ANYCHARSET:
return TupleStorage.loadString(this, def.getIndex());
case INT:
return TupleStorage.loadInteger(this, def.getIndex(),
def.getLength(),
!def.getAttrs().contains(ColumnAttribute.UNSIGNED));
default:
throw new IllegalArgumentException("unsupported datatype: "
+ def.getType());
}
}
}