📄 databasescript.java
字号:
/* 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 + -