📄 scriptcommand.java
字号:
/*
* Copyright 2004-2008 H2 Group. Licensed under the H2 License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.command.dml;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Comparator;
import org.h2.command.Parser;
import org.h2.constant.SysProperties;
import org.h2.constraint.Constraint;
import org.h2.engine.Comment;
import org.h2.engine.Constants;
import org.h2.engine.Database;
import org.h2.engine.DbObject;
import org.h2.engine.FunctionAlias;
import org.h2.engine.Right;
import org.h2.engine.Role;
import org.h2.engine.Session;
import org.h2.engine.Setting;
import org.h2.engine.User;
import org.h2.engine.UserAggregate;
import org.h2.engine.UserDataType;
import org.h2.expression.ExpressionColumn;
import org.h2.index.Cursor;
import org.h2.index.Index;
import org.h2.message.Message;
import org.h2.result.LocalResult;
import org.h2.result.Row;
import org.h2.schema.Constant;
import org.h2.schema.Schema;
import org.h2.schema.Sequence;
import org.h2.schema.TriggerObject;
import org.h2.table.Column;
import org.h2.table.PlanItem;
import org.h2.table.Table;
import org.h2.util.AutoCloseInputStream;
import org.h2.util.ByteUtils;
import org.h2.util.FileUtils;
import org.h2.util.IOUtils;
import org.h2.util.MathUtils;
import org.h2.util.ObjectArray;
import org.h2.util.StringUtils;
import org.h2.value.Value;
import org.h2.value.ValueLob;
import org.h2.value.ValueString;
/**
* This class represents the statement
* SCRIPT
*/
public class ScriptCommand extends ScriptBase {
private boolean passwords;
private boolean data;
private boolean settings;
private boolean drop;
private boolean simple;
private LocalResult result;
private byte[] lineSeparator;
private byte[] buffer;
private boolean tempLobTableCreated;
private int nextLobId;
private int lobBlockSize = Constants.IO_BUFFER_SIZE;
private static final String TEMP_LOB_FILENAME = "system_temp_lob.db";
public ScriptCommand(Session session) {
super(session);
}
public boolean isQuery() {
return true;
}
// TODO lock all tables for 'script' command
public void setData(boolean data) {
this.data = data;
}
public void setPasswords(boolean passwords) {
this.passwords = passwords;
}
public void setSettings(boolean settings) {
this.settings = settings;
}
public void setLobBlockSize(long blockSize) {
this.lobBlockSize = MathUtils.convertLongToInt(blockSize);
}
public void setDrop(boolean drop) {
this.drop = drop;
}
public LocalResult queryMeta() throws SQLException {
LocalResult result = createResult();
result.done();
return result;
}
private LocalResult createResult() {
ObjectArray cols = new ObjectArray();
cols.add(new ExpressionColumn(session.getDatabase(), new Column("SCRIPT", Value.STRING)));
return new LocalResult(session, cols, 1);
}
public LocalResult query(int maxrows) throws SQLException {
session.getUser().checkAdmin();
reset();
try {
result = createResult();
deleteStore();
openOutput();
if (out != null) {
buffer = new byte[Constants.IO_BUFFER_SIZE];
}
Database db = session.getDatabase();
if (settings) {
ObjectArray settings = db.getAllSettings();
for (int i = 0; i < settings.size(); i++) {
Setting setting = (Setting) settings.get(i);
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);
}
ObjectArray users = db.getAllUsers();
for (int i = 0; i < users.size(); i++) {
User user = (User) users.get(i);
add(user.getCreateSQL(passwords, true), false);
}
ObjectArray roles = db.getAllRoles();
for (int i = 0; i < roles.size(); i++) {
Role role = (Role) roles.get(i);
add(role.getCreateSQL(), false);
}
ObjectArray schemas = db.getAllSchemas();
for (int i = 0; i < schemas.size(); i++) {
Schema schema = (Schema) schemas.get(i);
add(schema.getCreateSQL(), false);
}
ObjectArray datatypes = db.getAllUserDataTypes();
for (int i = 0; i < datatypes.size(); i++) {
UserDataType datatype = (UserDataType) datatypes.get(i);
if (drop) {
add(datatype.getDropSQL(), false);
}
add(datatype.getCreateSQL(), false);
}
ObjectArray constants = db.getAllSchemaObjects(DbObject.CONSTANT);
for (int i = 0; i < constants.size(); i++) {
Constant constant = (Constant) constants.get(i);
add(constant.getCreateSQL(), false);
}
ObjectArray functionAliases = db.getAllFunctionAliases();
for (int i = 0; i < functionAliases.size(); i++) {
FunctionAlias alias = (FunctionAlias) functionAliases.get(i);
if (drop) {
add(alias.getDropSQL(), false);
}
add(alias.getCreateSQL(), false);
}
ObjectArray aggregates = db.getAllAggregates();
for (int i = 0; i < aggregates.size(); i++) {
UserAggregate agg = (UserAggregate) aggregates.get(i);
if (drop) {
add(agg.getDropSQL(), false);
}
add(agg.getCreateSQL(), false);
}
ObjectArray tables = db.getAllSchemaObjects(DbObject.TABLE_OR_VIEW);
// sort by id, so that views are after tables and views on views
// after the base views
tables.sort(new Comparator() {
public int compare(Object o1, Object o2) {
Table t1 = (Table) o1;
Table t2 = (Table) o2;
return t1.getId() - t2.getId();
}
});
for (int i = 0; i < tables.size(); i++) {
Table table = (Table) tables.get(i);
table.lock(session, false, false);
String sql = table.getCreateSQL();
if (sql == null) {
// null for metadata tables
continue;
}
if (drop) {
add(table.getDropSQL(), false);
}
}
ObjectArray sequences = db.getAllSchemaObjects(DbObject.SEQUENCE);
for (int i = 0; i < sequences.size(); i++) {
Sequence sequence = (Sequence) sequences.get(i);
if (drop) {
add(sequence.getDropSQL(), false);
}
add(sequence.getCreateSQL(), false);
}
for (int i = 0; i < tables.size(); i++) {
Table table = (Table) tables.get(i);
table.lock(session, false, false);
String sql = table.getCreateSQL();
if (sql == null) {
// null for metadata tables
continue;
}
String tableType = table.getTableType();
add(sql, false);
if (Table.TABLE.equals(tableType)) {
if (table.canGetRowCount()) {
String rowcount = "-- " + table.getRowCount(session) + " = SELECT COUNT(*) FROM "
+ table.getSQL();
add(rowcount, false);
}
if (data) {
PlanItem plan = table.getBestPlanItem(session, null);
Index index = plan.getIndex();
Cursor cursor = index.find(session, null, null);
Column[] columns = table.getColumns();
StringBuffer buff = new StringBuffer();
buff.append("INSERT INTO ");
buff.append(table.getSQL());
buff.append('(');
for (int j = 0; j < columns.length; j++) {
if (j > 0) {
buff.append(", ");
}
buff.append(Parser.quoteIdentifier(columns[j].getName()));
}
buff.append(") VALUES");
if (!simple) {
buff.append('\n');
}
buff.append('(');
String ins = buff.toString();
buff = null;
while (cursor.next()) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -