Search in sources :

Example 16 with ValueArray

use of org.h2.value.ValueArray in project h2database by h2database.

the class Recover method dumpMVStoreFile.

private void dumpMVStoreFile(PrintWriter writer, String fileName) {
    writer.println("-- MVStore");
    writer.println("CREATE ALIAS IF NOT EXISTS READ_BLOB FOR \"" + this.getClass().getName() + ".readBlob\";");
    writer.println("CREATE ALIAS IF NOT EXISTS READ_CLOB FOR \"" + this.getClass().getName() + ".readClob\";");
    writer.println("CREATE ALIAS IF NOT EXISTS READ_BLOB_DB FOR \"" + this.getClass().getName() + ".readBlobDb\";");
    writer.println("CREATE ALIAS IF NOT EXISTS READ_CLOB_DB FOR \"" + this.getClass().getName() + ".readClobDb\";");
    writer.println("CREATE ALIAS IF NOT EXISTS READ_BLOB_MAP FOR \"" + this.getClass().getName() + ".readBlobMap\";");
    writer.println("CREATE ALIAS IF NOT EXISTS READ_CLOB_MAP FOR \"" + this.getClass().getName() + ".readClobMap\";");
    resetSchema();
    setDatabaseName(fileName.substring(0, fileName.length() - Constants.SUFFIX_MV_FILE.length()));
    MVStore mv = new MVStore.Builder().fileName(fileName).readOnly().open();
    dumpLobMaps(writer, mv);
    writer.println("-- Meta");
    dumpMeta(writer, mv);
    writer.println("-- Tables");
    TransactionStore store = new TransactionStore(mv);
    try {
        store.init();
    } catch (Throwable e) {
        writeError(writer, e);
    }
    try {
        for (String mapName : mv.getMapNames()) {
            if (!mapName.startsWith("table.")) {
                continue;
            }
            String tableId = mapName.substring("table.".length());
            ValueDataType keyType = new ValueDataType(null, this, null);
            ValueDataType valueType = new ValueDataType(null, this, null);
            TransactionMap<Value, Value> dataMap = store.begin().openMap(mapName, keyType, valueType);
            Iterator<Value> dataIt = dataMap.keyIterator(null);
            boolean init = false;
            while (dataIt.hasNext()) {
                Value rowId = dataIt.next();
                Value[] values = ((ValueArray) dataMap.get(rowId)).getList();
                recordLength = values.length;
                if (!init) {
                    setStorage(Integer.parseInt(tableId));
                    // init the column types
                    for (valueId = 0; valueId < recordLength; valueId++) {
                        String columnName = storageName + "." + valueId;
                        getSQL(columnName, values[valueId]);
                    }
                    createTemporaryTable(writer);
                    init = true;
                }
                StringBuilder buff = new StringBuilder();
                buff.append("INSERT INTO O_").append(tableId).append(" VALUES(");
                for (valueId = 0; valueId < recordLength; valueId++) {
                    if (valueId > 0) {
                        buff.append(", ");
                    }
                    String columnName = storageName + "." + valueId;
                    buff.append(getSQL(columnName, values[valueId]));
                }
                buff.append(");");
                writer.println(buff.toString());
                if (storageId == 0) {
                    try {
                        SimpleRow r = new SimpleRow(values);
                        MetaRecord meta = new MetaRecord(r);
                        schema.add(meta);
                        if (meta.getObjectType() == DbObject.TABLE_OR_VIEW) {
                            String sql = values[3].getString();
                            String name = extractTableOrViewName(sql);
                            tableMap.put(meta.getId(), name);
                        }
                    } catch (Throwable t) {
                        writeError(writer, t);
                    }
                }
            }
        }
        writeSchema(writer);
        writer.println("DROP ALIAS READ_BLOB_MAP;");
        writer.println("DROP ALIAS READ_CLOB_MAP;");
        writer.println("DROP TABLE IF EXISTS INFORMATION_SCHEMA.LOB_BLOCKS;");
    } catch (Throwable e) {
        writeError(writer, e);
    } finally {
        mv.close();
    }
}
Also used : ValueDataType(org.h2.mvstore.db.ValueDataType) MVStore(org.h2.mvstore.MVStore) MetaRecord(org.h2.engine.MetaRecord) TransactionStore(org.h2.mvstore.db.TransactionStore) Value(org.h2.value.Value) SimpleRow(org.h2.result.SimpleRow) ValueArray(org.h2.value.ValueArray)

Example 17 with ValueArray

use of org.h2.value.ValueArray in project h2database by h2database.

the class MVSecondaryIndex method findFirstOrLast.

@Override
public Cursor findFirstOrLast(Session session, boolean first) {
    TransactionMap<Value, Value> map = getMap(session);
    Value key = first ? map.firstKey() : map.lastKey();
    while (true) {
        if (key == null) {
            return new MVStoreCursor(session, Collections.<Value>emptyList().iterator(), null);
        }
        if (((ValueArray) key).getList()[0] != ValueNull.INSTANCE) {
            break;
        }
        key = first ? map.higherKey(key) : map.lowerKey(key);
    }
    ArrayList<Value> list = New.arrayList();
    list.add(key);
    MVStoreCursor cursor = new MVStoreCursor(session, list.iterator(), null);
    cursor.next();
    return cursor;
}
Also used : Value(org.h2.value.Value) ValueArray(org.h2.value.ValueArray)

Example 18 with ValueArray

use of org.h2.value.ValueArray in project h2database by h2database.

the class MVSecondaryIndex method convertToKey.

private ValueArray convertToKey(SearchRow r) {
    if (r == null) {
        return null;
    }
    Value[] array = new Value[keyColumns];
    for (int i = 0; i < columns.length; i++) {
        Column c = columns[i];
        int idx = c.getColumnId();
        Value v = r.getValue(idx);
        if (v != null) {
            array[i] = v.convertTo(c.getType(), -1, null, null, c.getEnumerators());
        }
    }
    array[keyColumns - 1] = ValueLong.get(r.getKey());
    return ValueArray.get(array);
}
Also used : Column(org.h2.table.Column) IndexColumn(org.h2.table.IndexColumn) Value(org.h2.value.Value)

Example 19 with ValueArray

use of org.h2.value.ValueArray in project h2database by h2database.

the class MVSecondaryIndex method remove.

@Override
public void remove(Session session, Row row) {
    ValueArray array = convertToKey(row);
    TransactionMap<Value, Value> map = getMap(session);
    try {
        Value old = map.remove(array);
        if (old == null) {
            throw DbException.get(ErrorCode.ROW_NOT_FOUND_WHEN_DELETING_1, getSQL() + ": " + row.getKey());
        }
    } catch (IllegalStateException e) {
        throw mvTable.convertException(e);
    }
}
Also used : Value(org.h2.value.Value) ValueArray(org.h2.value.ValueArray)

Example 20 with ValueArray

use of org.h2.value.ValueArray in project h2database by h2database.

the class MVSecondaryIndex method addRowsToBuffer.

@Override
public void addRowsToBuffer(List<Row> rows, String bufferName) {
    MVMap<ValueArray, Value> map = openMap(bufferName);
    for (Row row : rows) {
        ValueArray key = convertToKey(row);
        map.put(key, ValueNull.INSTANCE);
    }
}
Also used : Value(org.h2.value.Value) Row(org.h2.result.Row) SearchRow(org.h2.result.SearchRow) ValueArray(org.h2.value.ValueArray)

Aggregations

Value (org.h2.value.Value)21 ValueArray (org.h2.value.ValueArray)17 SearchRow (org.h2.result.SearchRow)5 ValueString (org.h2.value.ValueString)5 Column (org.h2.table.Column)4 Row (org.h2.result.Row)3 ValueTimestamp (org.h2.value.ValueTimestamp)3 BigDecimal (java.math.BigDecimal)2 BigInteger (java.math.BigInteger)2 ResultSet (java.sql.ResultSet)2 ResultSetMetaData (java.sql.ResultSetMetaData)2 SQLException (java.sql.SQLException)2 Database (org.h2.engine.Database)2 IndexColumn (org.h2.table.IndexColumn)2 SimpleResultSet (org.h2.tools.SimpleResultSet)2 CompareMode (org.h2.value.CompareMode)2 ValueLobDb (org.h2.value.ValueLobDb)2 ValueResultSet (org.h2.value.ValueResultSet)2 ValueTime (org.h2.value.ValueTime)2 ValueTimestampTimeZone (org.h2.value.ValueTimestampTimeZone)2