Search in sources :

Example 26 with Page

use of org.h2.mvstore.Page in project h2database by h2database.

the class Recover method dumpPageStore.

private void dumpPageStore(PrintWriter writer, long pageCount) {
    Data s = Data.create(this, pageSize);
    for (long page = 3; page < pageCount; page++) {
        s = Data.create(this, pageSize);
        seek(page);
        store.readFully(s.getBytes(), 0, pageSize);
        dumpPage(writer, s, page, pageCount);
    }
}
Also used : Data(org.h2.store.Data)

Example 27 with Page

use of org.h2.mvstore.Page in project h2database by h2database.

the class Recover method dumpPageStore.

private void dumpPageStore(String fileName) {
    setDatabaseName(fileName.substring(0, fileName.length() - Constants.SUFFIX_PAGE_FILE.length()));
    PrintWriter writer = null;
    stat = new Stats();
    try {
        writer = getWriter(fileName, ".sql");
        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\";");
        resetSchema();
        store = FileStore.open(null, fileName, remove ? "rw" : "r");
        long length = store.length();
        try {
            store.init();
        } catch (Exception e) {
            writeError(writer, e);
        }
        Data s = Data.create(this, 128);
        seek(0);
        store.readFully(s.getBytes(), 0, 128);
        s.setPos(48);
        pageSize = s.readInt();
        int writeVersion = s.readByte();
        int readVersion = s.readByte();
        writer.println("-- pageSize: " + pageSize + " writeVersion: " + writeVersion + " readVersion: " + readVersion);
        if (pageSize < PageStore.PAGE_SIZE_MIN || pageSize > PageStore.PAGE_SIZE_MAX) {
            pageSize = Constants.DEFAULT_PAGE_SIZE;
            writer.println("-- ERROR: page size; using " + pageSize);
        }
        long pageCount = length / pageSize;
        parents = new int[(int) pageCount];
        s = Data.create(this, pageSize);
        for (long i = 3; i < pageCount; i++) {
            s.reset();
            seek(i);
            store.readFully(s.getBytes(), 0, 32);
            s.readByte();
            s.readShortInt();
            parents[(int) i] = s.readInt();
        }
        int logKey = 0, logFirstTrunkPage = 0, logFirstDataPage = 0;
        s = Data.create(this, pageSize);
        for (long i = 1; ; i++) {
            if (i == 3) {
                break;
            }
            s.reset();
            seek(i);
            store.readFully(s.getBytes(), 0, pageSize);
            CRC32 crc = new CRC32();
            crc.update(s.getBytes(), 4, pageSize - 4);
            int expected = (int) crc.getValue();
            int got = s.readInt();
            long writeCounter = s.readLong();
            int key = s.readInt();
            int firstTrunkPage = s.readInt();
            int firstDataPage = s.readInt();
            if (expected == got) {
                logKey = key;
                logFirstTrunkPage = firstTrunkPage;
                logFirstDataPage = firstDataPage;
            }
            writer.println("-- head " + i + ": writeCounter: " + writeCounter + " log " + key + ":" + firstTrunkPage + "/" + firstDataPage + " crc " + got + " (" + (expected == got ? "ok" : ("expected: " + expected)) + ")");
        }
        writer.println("-- log " + logKey + ":" + logFirstTrunkPage + "/" + logFirstDataPage);
        PrintWriter devNull = new PrintWriter(new OutputStream() {

            @Override
            public void write(int b) {
            // ignore
            }
        });
        dumpPageStore(devNull, pageCount);
        stat = new Stats();
        schema.clear();
        objectIdSet = new HashSet<>();
        dumpPageStore(writer, pageCount);
        writeSchema(writer);
        try {
            dumpPageLogStream(writer, logKey, logFirstTrunkPage, logFirstDataPage, pageCount);
        } catch (IOException e) {
        // ignore
        }
        writer.println("---- Statistics ----");
        writer.println("-- page count: " + pageCount + ", free: " + stat.free);
        long total = Math.max(1, stat.pageDataRows + stat.pageDataEmpty + stat.pageDataHead);
        writer.println("-- page data bytes: head " + stat.pageDataHead + ", empty " + stat.pageDataEmpty + ", rows " + stat.pageDataRows + " (" + (100 - 100L * stat.pageDataEmpty / total) + "% full)");
        for (int i = 0; i < stat.pageTypeCount.length; i++) {
            int count = stat.pageTypeCount[i];
            if (count > 0) {
                writer.println("-- " + getPageType(i) + " " + (100 * count / pageCount) + "%, " + count + " page(s)");
            }
        }
        writer.close();
    } catch (Throwable e) {
        writeError(writer, e);
    } finally {
        IOUtils.closeSilently(writer);
        closeSilently(store);
    }
}
Also used : CRC32(java.util.zip.CRC32) OutputStream(java.io.OutputStream) Data(org.h2.store.Data) IOException(java.io.IOException) DbException(org.h2.message.DbException) SQLException(java.sql.SQLException) IOException(java.io.IOException) PrintWriter(java.io.PrintWriter)

Example 28 with Page

use of org.h2.mvstore.Page in project h2database by h2database.

the class BnfSyntax method getLink.

/**
 * Get the HTML link to the given token.
 *
 * @param bnf the BNF
 * @param token the token
 * @return the HTML link
 */
String getLink(Bnf bnf, String token) {
    RuleHead found = null;
    String key = Bnf.getRuleMapKey(token);
    for (int i = 0; i < token.length(); i++) {
        String test = StringUtils.toLowerEnglish(key.substring(i));
        RuleHead r = bnf.getRuleHead(test);
        if (r != null) {
            found = r;
            break;
        }
    }
    if (found == null) {
        return token;
    }
    String page = "grammar.html";
    if (found.getSection().startsWith("Data Types")) {
        page = "datatypes.html";
    } else if (found.getSection().startsWith("Functions")) {
        page = "functions.html";
    } else if (token.equals("@func@")) {
        return "<a href=\"functions.html\">Function</a>";
    } else if (found.getRule() instanceof RuleFixed) {
        found.getRule().accept(this);
        return html;
    }
    String link = found.getTopic().toLowerCase().replace(' ', '_');
    link = page + "#" + StringUtils.urlEncode(link);
    return "<a href=\"" + link + "\">" + token + "</a>";
}
Also used : RuleFixed(org.h2.bnf.RuleFixed) RuleHead(org.h2.bnf.RuleHead)

Example 29 with Page

use of org.h2.mvstore.Page in project h2database by h2database.

the class MVStore method readPageChunkReferences.

private PageChildren readPageChunkReferences(int mapId, long pos, int parentChunk) {
    if (DataUtils.getPageType(pos) == DataUtils.PAGE_TYPE_LEAF) {
        return null;
    }
    PageChildren r;
    if (cacheChunkRef != null) {
        r = cacheChunkRef.get(pos);
    } else {
        r = null;
    }
    if (r == null) {
        // if possible, create it from the cached page
        if (cache != null) {
            Page p = cache.get(pos);
            if (p != null) {
                r = new PageChildren(p);
            }
        }
        if (r == null) {
            // page was not cached: read the data
            Chunk c = getChunk(pos);
            long filePos = c.block * BLOCK_SIZE;
            filePos += DataUtils.getPageOffset(pos);
            if (filePos < 0) {
                throw DataUtils.newIllegalStateException(DataUtils.ERROR_FILE_CORRUPT, "Negative position {0}; p={1}, c={2}", filePos, pos, c.toString());
            }
            long maxPos = (c.block + c.len) * BLOCK_SIZE;
            r = PageChildren.read(fileStore, pos, mapId, filePos, maxPos);
        }
        r.removeDuplicateChunkReferences();
        if (cacheChunkRef != null) {
            cacheChunkRef.put(pos, r, r.getMemory());
        }
    }
    if (r.children.length == 0) {
        int chunk = DataUtils.getPageChunkId(pos);
        if (chunk == parentChunk) {
            return null;
        }
    }
    return r;
}
Also used : PageChildren(org.h2.mvstore.Page.PageChildren)

Example 30 with Page

use of org.h2.mvstore.Page in project h2database by h2database.

the class MVTableEngine method init.

/**
 * Initialize the MVStore.
 *
 * @param db the database
 * @return the store
 */
public static Store init(final Database db) {
    Store store = db.getMvStore();
    if (store != null) {
        return store;
    }
    byte[] key = db.getFileEncryptionKey();
    String dbPath = db.getDatabasePath();
    MVStore.Builder builder = new MVStore.Builder();
    store = new Store();
    boolean encrypted = false;
    if (dbPath != null) {
        String fileName = dbPath + Constants.SUFFIX_MV_FILE;
        MVStoreTool.compactCleanUp(fileName);
        builder.fileName(fileName);
        builder.pageSplitSize(db.getPageSize());
        if (db.isReadOnly()) {
            builder.readOnly();
        } else {
            // possibly create the directory
            boolean exists = FileUtils.exists(fileName);
            if (exists && !FileUtils.canWrite(fileName)) {
            // read only
            } else {
                String dir = FileUtils.getParent(fileName);
                FileUtils.createDirectories(dir);
            }
        }
        if (key != null) {
            encrypted = true;
            char[] password = new char[key.length / 2];
            for (int i = 0; i < password.length; i++) {
                password[i] = (char) (((key[i + i] & 255) << 16) | ((key[i + i + 1]) & 255));
            }
            builder.encryptionKey(password);
        }
        if (db.getSettings().compressData) {
            builder.compress();
            // use a larger page split size to improve the compression ratio
            builder.pageSplitSize(64 * 1024);
        }
        builder.backgroundExceptionHandler(new UncaughtExceptionHandler() {

            @Override
            public void uncaughtException(Thread t, Throwable e) {
                db.setBackgroundException(DbException.convert(e));
            }
        });
    }
    store.open(db, builder, encrypted);
    db.setMvStore(store);
    return store;
}
Also used : MVStore(org.h2.mvstore.MVStore) FileStore(org.h2.mvstore.FileStore) MVStore(org.h2.mvstore.MVStore) UncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)

Aggregations

CreateTableData (org.h2.command.ddl.CreateTableData)9 Value (org.h2.value.Value)8 Data (org.h2.store.Data)7 Column (org.h2.table.Column)6 Page (org.h2.mvstore.Page)5 IndexColumn (org.h2.table.IndexColumn)5 ResultSet (java.sql.ResultSet)4 SQLException (java.sql.SQLException)4 QueryCancelledException (org.apache.ignite.cache.query.QueryCancelledException)4 DataRegionConfiguration (org.apache.ignite.configuration.DataRegionConfiguration)4 UnsafeMemoryProvider (org.apache.ignite.internal.mem.unsafe.UnsafeMemoryProvider)4 PageMemory (org.apache.ignite.internal.pagemem.PageMemory)4 PageMemoryNoStoreImpl (org.apache.ignite.internal.pagemem.impl.PageMemoryNoStoreImpl)4 DataRegionMetricsImpl (org.apache.ignite.internal.processors.cache.persistence.DataRegionMetricsImpl)4 GridCacheSqlQuery (org.apache.ignite.internal.processors.cache.query.GridCacheSqlQuery)4 Row (org.h2.result.Row)4 Connection (java.sql.Connection)3 ArrayList (java.util.ArrayList)3 CRC32 (java.util.zip.CRC32)3 IgniteCheckedException (org.apache.ignite.IgniteCheckedException)3