Search in sources :

Example 1 with ValueDataType

use of org.h2.mvstore.db.ValueDataType 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)

Aggregations

MetaRecord (org.h2.engine.MetaRecord)1 MVStore (org.h2.mvstore.MVStore)1 TransactionStore (org.h2.mvstore.db.TransactionStore)1 ValueDataType (org.h2.mvstore.db.ValueDataType)1 SimpleRow (org.h2.result.SimpleRow)1 Value (org.h2.value.Value)1 ValueArray (org.h2.value.ValueArray)1