⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 log.java

📁 hsql是很有名的嵌入式数据库
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* Copyright (c) 1995-2000, The Hypersonic SQL Group.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * Neither the name of the Hypersonic SQL Group nor the names of its
 * contributors may be used to endorse or promote products derived from this
 * software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP,
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * This software consists of voluntary contributions made by many individuals 
 * on behalf of the Hypersonic SQL Group.
 *
 *
 * For work added by the HSQL Development Group:
 *
 * Copyright (c) 2001-2005, The HSQL Development Group
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * Neither the name of the HSQL Development Group nor the names of its
 * contributors may be used to endorse or promote products derived from this
 * software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */


package org.hsqldb.persist;import java.io.File;import java.io.IOException;import org.hsqldb.Database;import org.hsqldb.HsqlException;import org.hsqldb.NumberSequence;import org.hsqldb.Session;import org.hsqldb.Table;import org.hsqldb.Trace;import org.hsqldb.lib.FileAccess;import org.hsqldb.lib.HashMap;import org.hsqldb.lib.Iterator;import org.hsqldb.lib.ZipUnzipFile;import org.hsqldb.scriptio.ScriptReaderBase;import org.hsqldb.scriptio.ScriptWriterBase;// fredt@users 20020215 - patch 1.7.0 by fredt// to move operations on the database.properties files to new// class HsqlDatabaseProperties// fredt@users 20020220 - patch 488200 by xclayl@users - throw exception// throw addded to all methods relying on file io// fredt@users 20020221 - patch 513005 by sqlbob@users (RMP)// fredt@users 20020405 - patch 1.7.0 by fredt - no change in db location// because important information about the database is now stored in the// *.properties file, all database files should be in the same folder as the// *.properties file// tony_lai@users 20020820 - export hsqldb.log_size to .properties file// tony_lai@users 20020820 - changes to shutdown compact to save memory// fredt@users 20020910 - patch 1.7.1 by Nitin Chauhan - code improvements// fredt@users 20021208 - ongoing revamp// fredt@users 20021212 - do not rewrite the *.backup file if the *.data// file has not been updated in the current session.// boucherb@users 20030510 - patch 1.7.2 consolidated all periodic database// tasks in one timed task queue// fredt@users - 20050102 patch 1.8.0 - refactoring and clearer separation of concerns/** *  This class is responsible for managing the database files. An HSQLDB database *  consists of a .properties file, a .script file (contains an SQL script), *  a .data file (contains data of cached tables) a .backup file *  and a .log file.<p> *  When using TEXT tables, a data source for each table is also present.<p> * *  Notes on OpenOffice.org integration. * *  A Storage API is used when HSQLDB is integrated into OpenOffice.org. All *  file operations on the 4 main files are performed by OOo, which integrates *  the contents of these files into its database file. The script format is *  always TEXT in this case. * * Extensively rewritten and extended in successive versions of HSQLDB. * * @author Thomas Mueller (Hypersonic SQL Group) * @author fredt@users. * @version 1.8.0 * @since Hypersonic SQL */public class Log {    private HsqlDatabaseProperties properties;    private String                 fileName;    private Database               database;    private FileAccess             fa;    private ScriptWriterBase       dbLogWriter;    private String                 scriptFileName;    private String                 cacheFileName;    private String                 backupFileName;    private String                 logFileName;    private boolean                filesReadOnly;    private long                   maxLogSize;    private int                    writeDelay;    private int                    scriptFormat;    private DataFileCache          cache;    Log(Database db) throws HsqlException {        database   = db;        fa         = db.getFileAccess();        fileName   = db.getPath();        properties = db.getProperties();    }    /**     * When opening a database, the hsqldb.compatible_version property is     * used to determine if this version of the engine is equal to or greater     * than the earliest version of the engine capable of opening that     * database.<p>     *     * @throws  HsqlException     */    void open() throws HsqlException {        // Allows the user to set log size in the properties file.        int logMegas = properties.getIntegerProperty(            HsqlDatabaseProperties.hsqldb_log_size, 0);        maxLogSize = logMegas * 1024 * 1024;        scriptFormat = properties.getIntegerProperty(            HsqlDatabaseProperties.hsqldb_script_format,            ScriptWriterBase.SCRIPT_TEXT_170);        writeDelay     = properties.getDefaultWriteDelay();        filesReadOnly  = database.isFilesReadOnly();        scriptFileName = fileName + ".script";        logFileName    = fileName + ".log";        cacheFileName  = fileName + ".data";        backupFileName = fileName + ".backup";        int state = properties.getDBModified();        switch (state) {            case HsqlDatabaseProperties.FILES_MODIFIED :                deleteNewAndOldFiles();                restoreBackup();                processScript();                processDataFile();                processLog();                close(false);                if (cache != null) {                    cache.open(filesReadOnly);                }                reopenAllTextCaches();                break;            case HsqlDatabaseProperties.FILES_NOT_MODIFIED :                /**                 * if startup is after a SHUTDOWN SCRIPT and there are CACHED                 * or TEXT tables, perform a checkpoint so that the .script                 * file no longer contains CACHED or TEXT table rows.                 */                processScript();                if (isAnyCacheModified()) {                    close(false);                    if (cache != null) {                        cache.open(filesReadOnly);                    }                    reopenAllTextCaches();                }                break;            case HsqlDatabaseProperties.FILES_NEW :                break;        }        openLog();        if (!filesReadOnly) {            properties.setDBModified(HsqlDatabaseProperties.FILES_MODIFIED);        }    }    /**     * Close all the database files. If script argument is true, no .data     * or .backup file will remain and the .script file will contain all the     * data of the cached tables as well as memory tables.     *     * This is not used for filesReadOnly databases which use shutdown.     */    void close(boolean script) throws HsqlException {        closeLog();        deleteNewAndOldFiles();        // create '.script.new'        writeScript(script);        closeAllTextCaches(script);        if (cache != null) {            cache.close(!script);            cache.postClose(!script);        }        // oj@openoffice.org - changed to file access api        try {            fa.renameElement(scriptFileName + ".new", scriptFileName);            fa.removeElement(logFileName);        } catch (IOException e) {            database.logger.appLog.logContext(e);        }        properties.setProperty(HsqlDatabaseProperties.db_version,                               HsqlDatabaseProperties.THIS_VERSION);        properties.setProperty(            HsqlDatabaseProperties.hsqldb_compatible_version,            HsqlDatabaseProperties.FIRST_COMPATIBLE_VERSION);        // set this one last to save the props        properties.setDBModified(HsqlDatabaseProperties.FILES_NOT_MODIFIED);    }    /**     * Fast counterpart to close(). Does not perform a checkpoint or a backup     * of the .data file.     */    void shutdown() throws HsqlException {        synchLog();        if (cache != null) {            cache.close(false);        }        closeAllTextCaches(false);        closeLog();    }    /**     * Deletes the leftovers from any previous unfinished operations.     */    void deleteNewAndOldFiles() {        try {            fa.removeElement(cacheFileName + ".old");            fa.removeElement(cacheFileName + ".new");            fa.removeElement(backupFileName + ".new");            fa.removeElement(scriptFileName + ".new");        } catch (IOException e) {            database.logger.appLog.logContext(e);        }    }    /**     * Checks all the caches and returns true if the modified flag is set for any     */    boolean isAnyCacheModified() {        if (cache != null && cache.isFileModified()) {            return true;        }        return isAnyTextCacheModified();    }    /**     * Performs checkpoint including pre and post operations. Returns to the     * same state as before the checkpoint.     */    void checkpoint(boolean defrag) throws HsqlException {        if (filesReadOnly) {            return;        }        closeLog();        closeAllTextCaches(false);        reopenAllTextCaches();        if (cache != null) {            if (forceDefrag()) {                defrag = true;            }            if (defrag) {                try {                    cache.defrag();                } catch (Exception e) {                    cache.close(true);                    cache.postClose(true);                    cache.open(false);                }            } else {                cache.close(true);                cache.postClose(true);                cache.open(false);            }        }        writeScript(false);        try {            fa.renameElement(scriptFileName + ".new", scriptFileName);            fa.removeElement(logFileName);        } catch (IOException e) {            database.logger.appLog.logContext(e);        }        properties.setDBModified(HsqlDatabaseProperties.FILES_MODIFIED);        if (dbLogWriter == null) {            return;        }        openLog();        Session[] sessions = database.sessionManager.getAllSessions();        try {            for (int i = 0; i < sessions.length; i++) {                Session session = sessions[i];                if (session.isAutoCommit() == false) {                    dbLogWriter.writeLogStatement(                        session, session.getAutoCommitStatement());                }            }        } catch (IOException e) {            throw Trace.error(Trace.FILE_IO_ERROR, logFileName);        }    }    /**     * Returns true if lost space is above the threshold     */    boolean forceDefrag() {        long megas = properties.getIntegerProperty(            HsqlDatabaseProperties.hsqldb_defrag_limit, 200);        long defraglimit = megas * 1024 * 1024;        return cache.freeBlocks.getLostBlocksSize() > defraglimit;    }    /**     *

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -