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

📄 databasescript.java

📁 hsqldb是100%java实现的数据库,是一个开放源代码的JAVA数据库 l 具有标准的SQL语法和JAVA接口 l HSQLDB可以自由使用和分发 l 非常简洁和快速的
💻 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;import org.hsqldb.HsqlNameManager.HsqlName;import org.hsqldb.lib.HashMap;import org.hsqldb.lib.HashMappedList;import org.hsqldb.lib.HsqlArrayList;import org.hsqldb.lib.IntValueHashMap;import org.hsqldb.lib.Iterator;import org.hsqldb.lib.StringConverter;/** * Script generation. * * The core functionality of this class was inherited from Hypersonic and * extensively rewritten and extended in successive versions of HSQLDB.<p> * * @author Thomas Mueller (Hypersonic SQL Group) * @author fredt@users * @version 1.8.0 * @since 1.7.0 */public class DatabaseScript {    /**     * Returns the DDL and all other statements for the database excluding     * INSERT and SET <tablename> READONLY statements.     * cachedData == true indicates that SET <tablename> INDEX statements should     * also be included.     *     * This class should not have any dependencies on metadata reporting.     */    public static Result getScript(Database database, boolean indexRoots) {        Iterator it;        Result   r = Result.newSingleColumnResult("COMMAND", Types.VARCHAR);        r.metaData.tableNames[0] = "SYSTEM_SCRIPT";        // collation for database        if (database.collation.name != null) {            String name =                StringConverter.toQuotedString(database.collation.name, '"',                                               true);            addRow(r, "SET DATABASE COLLATION " + name);        }        // Role definitions        it = database.getGranteeManager().getRoleNames().iterator();        String role;        while (it.hasNext()) {            role = (String) it.next();            // ADMIN_ROLE_NAME is not persisted            if (!GranteeManager.DBA_ADMIN_ROLE_NAME.equals(role)) {                addRow(r, "CREATE ROLE " + role);            }        }        // aliases        HashMap h       = database.getAliasMap();        HashMap builtin = Library.getAliasMap();        it = h.keySet().iterator();        while (it.hasNext()) {            String alias  = (String) it.next();            String java   = (String) h.get(alias);            String biJava = (String) builtin.get(alias);            if (biJava != null && biJava.equals(java)) {                continue;            }            StringBuffer buffer = new StringBuffer(64);            buffer.append(Token.T_CREATE).append(' ').append(                Token.T_ALIAS).append(' ');            buffer.append(alias);            buffer.append(" FOR \"");            buffer.append(java);            buffer.append('"');            addRow(r, buffer.toString());        }        addSchemaStatements(database, r, indexRoots);        // rights for classes, tables and views        addRightsStatements(database, r);        if (database.logger.hasLog()) {            int     delay  = database.logger.getWriteDelay();            boolean millis = delay < 1000;            if (millis) {                if (delay != 0 && delay < 20) {                    delay = 20;                }            } else {                delay /= 1000;            }            String statement = "SET WRITE_DELAY " + delay                               + (millis ? " MILLIS"                                         : "");            addRow(r, statement);        }        return r;    }    static void addSchemaStatements(Database database, Result r,                                    boolean indexRoots) {        Iterator schemas = database.schemaManager.userSchemaNameIterator();        while (schemas.hasNext()) {            String schemaKey = (String) schemas.next();            HsqlName schema =                database.schemaManager.toSchemaHsqlName(schemaKey);            HashMappedList tTable =                database.schemaManager.getTables(schema.name);            HsqlArrayList forwardFK = new HsqlArrayList();            // schema creation            {                String ddl = getSchemaCreateDDL(database, schema);                addRow(r, ddl);            }            // sequences            /*                     CREATE SEQUENCE <name>                     [AS {INTEGER | BIGINT}]                     [START WITH <value>]                     [INCREMENT BY <value>]             */            Iterator it =                database.schemaManager.sequenceIterator(schema.name);            while (it.hasNext()) {                NumberSequence seq = (NumberSequence) it.next();                StringBuffer   a   = new StringBuffer(128);                a.append(Token.T_CREATE).append(' ');                a.append(Token.T_SEQUENCE).append(' ');                a.append(seq.getName().statementName).append(' ');                a.append(Token.T_AS).append(' ');                a.append(Types.getTypeString(seq.getType())).append(' ');                a.append(Token.T_START).append(' ');                a.append(Token.T_WITH).append(' ');                a.append(seq.peek()).append(' ');                if (seq.getIncrement() != 1) {                    a.append(Token.T_INCREMENT).append(' ');                    a.append(Token.T_BY).append(' ');                    a.append(seq.getIncrement()).append(' ');                }                addRow(r, a.toString());            }            // tables            for (int i = 0, tSize = tTable.size(); i < tSize; i++) {                Table t = (Table) tTable.get(i);                if (t.isView()) {                    continue;                }                StringBuffer a = new StringBuffer(128);                getTableDDL(database, t, i, forwardFK, false, a);                addRow(r, a.toString());                // indexes for table                for (int j = 1; j < t.getIndexCount(); j++) {                    Index index = t.getIndex(j);                    if (HsqlName.isReservedIndexName(index.getName().name)) {                        // the following are autocreated with the table                        // indexes for primary keys                        // indexes for unique constraints                        // own table indexes for foreign keys                        continue;                    }                    a = new StringBuffer(64);                    a.append(Token.T_CREATE).append(' ');                    if (index.isUnique()) {                        a.append(Token.T_UNIQUE).append(' ');                    }                    a.append(Token.T_INDEX).append(' ');                    a.append(index.getName().statementName);                    a.append(' ').append(Token.T_ON).append(' ');                    a.append(t.getName().statementName);                    int[] col = index.getColumns();                    int   len = index.getVisibleColumns();                    getColumnList(t, col, len, a);                    addRow(r, a.toString());                }                // readonly for TEXT tables only                if (t.isText() && t.isDataReadOnly()) {                    a = new StringBuffer(64);                    a.append(Token.T_SET).append(' ').append(                        Token.T_TABLE).append(' ');                    a.append(t.getName().statementName);                    a.append(' ').append(Token.T_READONLY).append(' ').append(                        Token.T_TRUE);                    addRow(r, a.toString());                }                // data source                String dataSource = getDataSource(t);                if (dataSource != null) {                    addRow(r, dataSource);                }                // header                String header = getDataSourceHeader(t);                if (!indexRoots && header != null) {                    addRow(r, header);                }                // triggers                int numTrigs = TriggerDef.NUM_TRIGS;                for (int tv = 0; tv < numTrigs; tv++) {                    HsqlArrayList trigVec = t.triggerLists[tv];                    if (trigVec == null) {                        continue;                    }                    int trCount = trigVec.size();                    for (int k = 0; k < trCount; k++) {                        a = ((TriggerDef) trigVec.get(k)).getDDL();                        addRow(r, a.toString());                    }                }            }            // forward referencing foreign keys            for (int i = 0, tSize = forwardFK.size(); i < tSize; i++) {                Constraint   c = (Constraint) forwardFK.get(i);                StringBuffer a = new StringBuffer(128);                a.append(Token.T_ALTER).append(' ').append(                    Token.T_TABLE).append(' ');                a.append(c.getRef().getName().statementName);                a.append(' ').append(Token.T_ADD).append(' ');                getFKStatement(c, a);                addRow(r, a.toString());            }            // SET <tablename> INDEX statements            Session sysSession = database.sessionManager.getSysSession();            for (int i = 0, tSize = tTable.size(); i < tSize; i++) {                Table t = (Table) tTable.get(i);                if (indexRoots && t.isIndexCached()                        &&!t.isEmpty(sysSession)) {                    addRow(r, getIndexRootsDDL((Table) tTable.get(i)));                }            }            // RESTART WITH <value> statements            for (int i = 0, tSize = tTable.size(); i < tSize; i++) {                Table t = (Table) tTable.get(i);                if (!t.isTemp()) {                    String ddl = getIdentityUpdateDDL(t);                    addRow(r, ddl);                }            }            // views            for (int i = 0, tSize = tTable.size(); i < tSize; i++) {                Table t = (Table) tTable.get(i);                if (t.isView()) {                    View         v = (View) tTable.get(i);                    StringBuffer a = new StringBuffer(128);                    a.append(Token.T_CREATE).append(' ').append(                        Token.T_VIEW).append(' ');                    a.append(v.getName().statementName).append(' ').append(                        '(');                    int count = v.getColumnCount();                    for (int j = 0; j < count; j++) {                        a.append(v.getColumn(j).columnName.statementName);                        if (j < count - 1) {                            a.append(',');                        }                    }                    a.append(')').append(' ').append(Token.T_AS).append(' ');                    a.append(v.getStatement());                    addRow(r, a.toString());                }            }        }    }    static String getIdentityUpdateDDL(Table t) {        if (t.identityColumn == -1) {            return "";        } else {            String tablename = t.getName().statementName;            String colname =                t.getColumn(t.identityColumn).columnName.statementName;            long         idval = t.identitySequence.peek();            StringBuffer a     = new StringBuffer(128);            a.append(Token.T_ALTER).append(' ').append(Token.T_TABLE).append(                ' ').append(tablename).append(' ').append(                Token.T_ALTER).append(' ').append(Token.T_COLUMN).append(                ' ').append(colname).append(' ').append(                Token.T_RESTART).append(' ').append(Token.T_WITH).append(                ' ').append(idval);            return a.toString();        }    }    static String getIndexRootsDDL(Table t) {        StringBuffer a = new StringBuffer(128);        a.append(Token.T_SET).append(' ').append(Token.T_TABLE).append(' ');        a.append(t.getName().statementName);        a.append(' ').append(Token.T_INDEX).append('\'');        a.append(t.getIndexRoots());        a.append('\'');        return a.toString();    }

⌨️ 快捷键说明

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