public ArrayList<DbObject> getChildren() { ArrayList<DbObject> children = New.arrayList(); ArrayList<Index> indexes = getIndexes(); if (indexes != null) { children.addAll(indexes); } if (constraints != null) { children.addAll(constraints); } if (triggers != null) { children.addAll(triggers); } if (sequences != null) { children.addAll(sequences); } if (views != null) { children.addAll(views); } ArrayList<Right> rights = database.getAllRights(); for (Right right : rights) { if (right.getGrantedTable() == this) { children.add(right); } } return children; }
public void removeChildrenAndResources(Session session) { while (views != null && views.size() > 0) { TableView view = views.get(0); views.remove(0); database.removeSchemaObject(session, view); } while (triggers != null && triggers.size() > 0) { TriggerObject trigger = triggers.get(0); triggers.remove(0); database.removeSchemaObject(session, trigger); } while (constraints != null && constraints.size() > 0) { Constraint constraint = constraints.get(0); constraints.remove(0); database.removeSchemaObject(session, constraint); } for (Right right : database.getAllRights()) { if (right.getGrantedTable() == this) { database.removeDatabaseObject(session, right); } } database.removeMeta(session, getId()); // must delete sequences later (in case there is a power failure // before removing the table object) while (sequences != null && sequences.size() > 0) { Sequence sequence = sequences.get(0); sequences.remove(0); if (!isTemporary()) { // only remove if no other table depends on this sequence // this is possible when calling ALTER TABLE ALTER COLUMN if (database.getDependentTable(sequence, this) == null) { database.removeSchemaObject(session, sequence); } } } }
@Override public ResultInterface query(int maxrows) { session.getUser().checkAdmin(); reset(); Database db = session.getDatabase(); if (schemaNames != null) { for (String schemaName : schemaNames) { Schema schema = db.findSchema(schemaName); if (schema == null) { throw DbException.get(ErrorCode.SCHEMA_NOT_FOUND_1, schemaName); } } } try { result = createResult(); deleteStore(); openOutput(); if (out != null) { buffer = new byte[Constants.IO_BUFFER_SIZE]; } if (settings) { for (Setting setting : db.getAllSettings()) { if (setting.getName().equals(SetTypes.getTypeName(SetTypes.CREATE_BUILD))) { // don't add CREATE_BUILD to the script // (it is only set when creating the database) continue; } add(setting.getCreateSQL(), false); } } if (out != null) { add("", true); } for (User user : db.getAllUsers()) { add(user.getCreateSQL(passwords), false); } for (Role role : db.getAllRoles()) { add(role.getCreateSQL(true), false); } for (Schema schema : db.getAllSchemas()) { if (excludeSchema(schema)) { continue; } add(schema.getCreateSQL(), false); } for (UserDataType datatype : db.getAllUserDataTypes()) { if (drop) { add(datatype.getDropSQL(), false); } add(datatype.getCreateSQL(), false); } for (SchemaObject obj : db.getAllSchemaObjects(DbObject.CONSTANT)) { if (excludeSchema(obj.getSchema())) { continue; } Constant constant = (Constant) obj; add(constant.getCreateSQL(), false); } final ArrayList<Table> tables = db.getAllTablesAndViews(false); // sort by id, so that views are after tables and views on views // after the base views Collections.sort( tables, new Comparator<Table>() { @Override public int compare(Table t1, Table t2) { return t1.getId() - t2.getId(); } }); // Generate the DROP XXX ... IF EXISTS for (Table table : tables) { if (excludeSchema(table.getSchema())) { continue; } if (excludeTable(table)) { continue; } if (table.isHidden()) { continue; } table.lock(session, false, false); String sql = table.getCreateSQL(); if (sql == null) { // null for metadata tables continue; } if (drop) { add(table.getDropSQL(), false); } } for (SchemaObject obj : db.getAllSchemaObjects(DbObject.FUNCTION_ALIAS)) { if (excludeSchema(obj.getSchema())) { continue; } if (drop) { add(obj.getDropSQL(), false); } add(obj.getCreateSQL(), false); } for (UserAggregate agg : db.getAllAggregates()) { if (drop) { add(agg.getDropSQL(), false); } add(agg.getCreateSQL(), false); } for (SchemaObject obj : db.getAllSchemaObjects(DbObject.SEQUENCE)) { if (excludeSchema(obj.getSchema())) { continue; } Sequence sequence = (Sequence) obj; if (drop) { add(sequence.getDropSQL(), false); } add(sequence.getCreateSQL(), false); } // Generate CREATE TABLE and INSERT...VALUES int count = 0; for (Table table : tables) { if (excludeSchema(table.getSchema())) { continue; } if (excludeTable(table)) { continue; } if (table.isHidden()) { continue; } table.lock(session, false, false); String createTableSql = table.getCreateSQL(); if (createTableSql == null) { // null for metadata tables continue; } final String tableType = table.getTableType(); add(createTableSql, false); final ArrayList<Constraint> constraints = table.getConstraints(); if (constraints != null) { for (Constraint constraint : constraints) { if (Constraint.PRIMARY_KEY.equals(constraint.getConstraintType())) { add(constraint.getCreateSQLWithoutIndexes(), false); } } } if (Table.TABLE.equals(tableType)) { if (table.canGetRowCount()) { String rowcount = "-- " + table.getRowCountApproximation() + " +/- SELECT COUNT(*) FROM " + table.getSQL(); add(rowcount, false); } if (data) { count = generateInsertValues(count, table); } } final ArrayList<Index> indexes = table.getIndexes(); for (int j = 0; indexes != null && j < indexes.size(); j++) { Index index = indexes.get(j); if (!index.getIndexType().getBelongsToConstraint()) { add(index.getCreateSQL(), false); } } } if (tempLobTableCreated) { add("DROP TABLE IF EXISTS SYSTEM_LOB_STREAM", true); add("CALL SYSTEM_COMBINE_BLOB(-1)", true); add("DROP ALIAS IF EXISTS SYSTEM_COMBINE_CLOB", true); add("DROP ALIAS IF EXISTS SYSTEM_COMBINE_BLOB", true); tempLobTableCreated = false; } // Generate CREATE CONSTRAINT ... final ArrayList<SchemaObject> constraints = db.getAllSchemaObjects(DbObject.CONSTRAINT); Collections.sort( constraints, new Comparator<SchemaObject>() { @Override public int compare(SchemaObject c1, SchemaObject c2) { return ((Constraint) c1).compareTo((Constraint) c2); } }); for (SchemaObject obj : constraints) { if (excludeSchema(obj.getSchema())) { continue; } Constraint constraint = (Constraint) obj; if (excludeTable(constraint.getTable())) { continue; } if (constraint.getTable().isHidden()) { continue; } if (!Constraint.PRIMARY_KEY.equals(constraint.getConstraintType())) { add(constraint.getCreateSQLWithoutIndexes(), false); } } // Generate CREATE TRIGGER ... for (SchemaObject obj : db.getAllSchemaObjects(DbObject.TRIGGER)) { if (excludeSchema(obj.getSchema())) { continue; } TriggerObject trigger = (TriggerObject) obj; if (excludeTable(trigger.getTable())) { continue; } add(trigger.getCreateSQL(), false); } // Generate GRANT ... for (Right right : db.getAllRights()) { Table table = right.getGrantedTable(); if (table != null) { if (excludeSchema(table.getSchema())) { continue; } if (excludeTable(table)) { continue; } } add(right.getCreateSQL(), false); } // Generate COMMENT ON ... for (Comment comment : db.getAllComments()) { add(comment.getCreateSQL(), false); } if (out != null) { out.close(); } } catch (IOException e) { throw DbException.convertIOException(e, getFileName()); } finally { closeIO(); } result.done(); LocalResult r = result; reset(); return r; }