📄 databasescript.java
字号:
static String getSchemaCreateDDL(Database database, HsqlName schemaName) { StringBuffer ab = new StringBuffer(128); ab.append(Token.T_CREATE).append(' '); ab.append(Token.T_SCHEMA).append(' '); ab.append(schemaName.statementName).append(' '); ab.append(Token.T_AUTHORIZATION).append(' '); ab.append(GranteeManager.DBA_ADMIN_ROLE_NAME); return ab.toString(); } static void getTableDDL(Database database, Table t, int i, HsqlArrayList forwardFK, boolean useSchema, StringBuffer a) { a.append(Token.T_CREATE).append(' '); if (t.isTemp) { a.append(Token.T_GLOBAL).append(' '); a.append(Token.T_TEMPORARY).append(' '); } if (t.isText()) { a.append(Token.T_TEXT).append(' '); } else if (t.isCached()) { a.append(Token.T_CACHED).append(' '); } else { a.append(Token.T_MEMORY).append(' '); } a.append(Token.T_TABLE).append(' '); if (useSchema) { a.append(t.getName().schema.statementName).append('.'); } a.append(t.getName().statementName); a.append('('); int columns = t.getColumnCount(); int[] pk = t.getPrimaryKey(); HsqlName pkName = null; Constraint pkConst = t.getPrimaryConstraint(); if (pkConst != null &&!pkConst.getName().isReservedIndexName()) { pkName = pkConst.getName(); } for (int j = 0; j < columns; j++) { Column column = t.getColumn(j); String colname = column.columnName.statementName; a.append(colname); a.append(' '); String sType = Types.getTypeString(column.getType()); a.append(sType); // append the size and scale if > 0 boolean hasSize = false; if (column.getType() == Types.TIMESTAMP) { if (column.getSize() != 6) { hasSize = true; } } else { hasSize = column.getSize() > 0; } if (hasSize) { a.append('('); a.append(column.getSize()); if (column.getScale() > 0) { a.append(','); a.append(column.getScale()); } a.append(')'); } String defaultString = column.getDefaultDDL(); if (defaultString != null) { a.append(' ').append(Token.T_DEFAULT).append(' '); a.append(defaultString); } if (j == t.getIdentityColumn()) { a.append(" GENERATED BY DEFAULT AS IDENTITY(START WITH "); a.append(column.identityStart); if (column.identityIncrement != 1) { a.append(Token.T_COMMA).append(Token.T_INCREMENT).append( ' ').append(Token.T_BY).append(' '); a.append(column.identityIncrement); } a.append(")"); } if (!column.isNullable()) { a.append(' ').append(Token.T_NOT).append(' ').append( Token.T_NULL); } if ((pk.length == 1) && (j == pk[0]) && pkName == null) { a.append(' ').append(Token.T_PRIMARY).append(' ').append( Token.T_KEY); } if (j < columns - 1) { a.append(','); } } if (pk.length > 1 || (pk.length == 1 && pkName != null)) { a.append(','); if (pkName != null) { a.append(Token.T_CONSTRAINT).append(' '); a.append(pkName.statementName).append(' '); } a.append(Token.T_PRIMARY).append(' ').append(Token.T_KEY); getColumnList(t, pk, pk.length, a); } Constraint[] v = t.getConstraints(); for (int j = 0, vSize = v.length; j < vSize; j++) { Constraint c = v[j]; switch (c.getType()) { case Constraint.UNIQUE : a.append(',').append(Token.T_CONSTRAINT).append(' '); a.append(c.getName().statementName); a.append(' ').append(Token.T_UNIQUE); int[] col = c.getMainColumns(); getColumnList(c.getMain(), col, col.length, a); break; case Constraint.FOREIGN_KEY : // forward referencing FK Table maintable = c.getMain(); int maintableindex = database.schemaManager.getTableIndex(maintable); if (maintableindex > i) { forwardFK.add(c); } else { a.append(','); getFKStatement(c, a); } break; case Constraint.CHECK : try { a.append(',').append(Token.T_CONSTRAINT).append(' '); a.append(c.getName().statementName); a.append(' ').append(Token.T_CHECK).append('('); a.append(c.core.check.getDDL()); a.append(')'); } catch (HsqlException e) { // should not throw as it is already tested OK } break; } } a.append(')'); if (t.onCommitPreserve) { a.append(' ').append(Token.T_ON).append(' '); a.append(Token.T_COMMIT).append(' ').append(Token.T_PRESERVE); a.append(' ').append(Token.T_ROWS); } } /** * Generates the SET TABLE <tablename> SOURCE <string> statement for a * text table; */ static String getDataSource(Table t) { String dataSource = t.getDataSource(); if (dataSource == null) { return null; } boolean isDesc = t.isDescDataSource(); 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_SOURCE).append(' ').append('"'); a.append(dataSource); a.append('"'); if (isDesc) { a.append(' ').append(Token.T_DESC); } return a.toString(); } /** * Generates the SET TABLE <tablename> SOURCE HEADER <string> statement for a * text table; */ static String getDataSourceHeader(Table t) { String header = t.getHeader(); if (header == null) { return null; } 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_SOURCE).append(' '); a.append(Token.T_HEADER).append(' '); a.append(header); return a.toString(); } /** * Generates the column definitions for a table. */ private static void getColumnList(Table t, int[] col, int len, StringBuffer a) { a.append('('); for (int i = 0; i < len; i++) { a.append(t.getColumn(col[i]).columnName.statementName); if (i < len - 1) { a.append(','); } } a.append(')'); } /** * Generates the foreign key declaration for a given Constraint object. */ private static void getFKStatement(Constraint c, StringBuffer a) { a.append(Token.T_CONSTRAINT).append(' '); a.append(c.getName().statementName); a.append(' ').append(Token.T_FOREIGN).append(' ').append(Token.T_KEY); int[] col = c.getRefColumns(); getColumnList(c.getRef(), col, col.length, a); a.append(' ').append(Token.T_REFERENCES).append(' '); a.append(c.getMain().getName().statementName); col = c.getMainColumns(); getColumnList(c.getMain(), col, col.length, a); if (c.getDeleteAction() != Constraint.NO_ACTION) { a.append(' ').append(Token.T_ON).append(' ').append( Token.T_DELETE).append(' '); a.append(getFKAction(c.getDeleteAction())); } if (c.getUpdateAction() != Constraint.NO_ACTION) { a.append(' ').append(Token.T_ON).append(' ').append( Token.T_UPDATE).append(' '); a.append(getFKAction(c.getUpdateAction())); } } /** * Returns the foreign key action rule. */ private static String getFKAction(int action) { switch (action) { case Constraint.CASCADE : return Token.T_CASCADE; case Constraint.SET_DEFAULT : return Token.T_SET + ' ' + Token.T_DEFAULT; case Constraint.SET_NULL : return Token.T_SET + ' ' + Token.T_NULL; default : return Token.T_NO + ' ' + Token.T_ACTION; } } /** * Adds a script line to the result. */ private static void addRow(Result r, String sql) { if (sql == null || sql.length() == 0) { return; } String[] s = new String[1]; s[0] = sql; r.add(s); } /** * Generates the GRANT statements for grantees. * * When views is true, generates rights for views only. Otherwise generates * rights for tables and classes. * * Does not generate script for: * * grant on builtin classes to public * grant select on system tables * */ private static void addRightsStatements(Database dDatabase, Result r) { StringBuffer a; HashMappedList userlist = dDatabase.getUserManager().getUsers(); Iterator users = userlist.values().iterator(); GranteeManager gm = dDatabase.getGranteeManager(); Iterator grantees = gm.getGrantees().iterator(); for (; users.hasNext(); ) { User u = (User) users.next(); String name = u.getName(); // PUBLIC user is not persisted. (However, his // grants/revokes are). _SYSTEM user not in user list. if (!name.equals(Token.T_PUBLIC)) { addRow(r, u.getCreateUserDDL()); } } // grantees has ALL Users and Roles, incl. hidden and reserved ones. // Therefore, we filter out the non-persisting ones. for (; grantees.hasNext(); ) { Grantee g = (Grantee) grantees.next(); String name = g.getName(); // _SYSTEM user, DBA Role grants/revokes not persisted if (name.equals("_SYSTEM") || name.equals("DBA")) { continue; } String roleString = g.allRolesString(); if (roleString != null) { addRow(r, "GRANT " + roleString + " TO " + name); } IntValueHashMap rightsmap = g.getRights(); if (rightsmap == null) { continue; } Iterator dbobjects = rightsmap.keySet().iterator(); while (dbobjects.hasNext()) { Object nameobject = dbobjects.next(); int right = rightsmap.get(nameobject, 0); a = new StringBuffer(64); a.append(Token.T_GRANT).append(' '); a.append(GranteeManager.getRightsList(right)); a.append(' ').append(Token.T_ON).append(' '); if (nameobject instanceof String) { if (nameobject.equals("java.lang.Math") || nameobject.equals("org.hsqldb.Library")) { continue; } a.append("CLASS \""); a.append((String) nameobject); a.append('\"'); } else { HsqlName hsqlname = (HsqlName) nameobject; // assumes all non String objects are table names Table table = dDatabase.schemaManager.findUserTable(null, hsqlname.name, hsqlname.schema.name); // either table != null or is system table if (table != null) { a.append(hsqlname.schema.statementName).append( '.').append(hsqlname.statementName); } else { continue; } } a.append(' ').append(Token.T_TO).append(' '); a.append(g.getName()); addRow(r, a.toString()); } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -