📄 database.java
字号:
Table table = (Table) tablesAndViews.get(i);
table.close(systemSession);
}
ObjectArray sequences = getAllSchemaObjects(DbObject.SEQUENCE);
for (int i = 0; i < sequences.size(); i++) {
Sequence sequence = (Sequence) sequences.get(i);
sequence.close();
}
meta.close(systemSession);
indexSummaryValid = true;
}
} catch (SQLException e) {
traceSystem.getTrace(Trace.DATABASE).error("close", e);
}
// remove all session variables
if (persistent) {
try {
ValueLob.removeAllForTable(this, ValueLob.TABLE_ID_SESSION);
} catch (SQLException e) {
traceSystem.getTrace(Trace.DATABASE).error("close", e);
}
}
try {
closeOpenFilesAndUnlock();
} catch (SQLException e) {
traceSystem.getTrace(Trace.DATABASE).error("close", e);
}
traceSystem.getTrace(Trace.DATABASE).info("closed");
traceSystem.close();
if (closeOnExit != null) {
closeOnExit.reset();
try {
Runtime.getRuntime().removeShutdownHook(closeOnExit);
} catch (IllegalStateException e) {
// ignore
} catch (SecurityException e) {
// applets may not do that - ignore
}
closeOnExit = null;
}
Engine.getInstance().close(databaseName);
if (deleteFilesOnDisconnect && persistent) {
deleteFilesOnDisconnect = false;
try {
String directory = FileUtils.getParent(databaseName);
String name = FileUtils.getFileName(databaseName);
DeleteDbFiles.execute(directory, name, true);
} catch (Exception e) {
// ignore (the trace is closed already)
}
}
}
private void stopWriter() {
if (writer != null) {
try {
writer.stopThread();
} catch (SQLException e) {
traceSystem.getTrace(Trace.DATABASE).error("close", e);
}
writer = null;
}
}
private synchronized void closeOpenFilesAndUnlock() throws SQLException {
if (log != null) {
stopWriter();
log.close();
log = null;
}
closeFiles();
if (persistent && lock == null && fileLockMethod != FileLock.LOCK_NO) {
// everything already closed (maybe in checkPowerOff)
// don't delete temp files in this case because
// the database could be open now (even from within another process)
return;
}
if (persistent) {
deleteOldTempFiles();
}
if (systemSession != null) {
systemSession.close();
systemSession = null;
}
if (lock != null) {
lock.unlock();
lock = null;
}
}
private void closeFiles() throws SQLException {
try {
if (fileData != null) {
fileData.close();
fileData = null;
}
if (fileIndex != null) {
fileIndex.close();
fileIndex = null;
}
} catch (SQLException e) {
traceSystem.getTrace(Trace.DATABASE).error("close", e);
}
storageMap.clear();
}
private void checkMetaFree(Session session, int id) throws SQLException {
SearchRow r = meta.getTemplateSimpleRow(false);
r.setValue(0, ValueInt.get(id));
Cursor cursor = metaIdIndex.find(session, r, r);
if (cursor.next()) {
throw Message.getInternalError();
}
}
public synchronized int allocateObjectId(boolean needFresh, boolean dataFile) {
// TODO refactor: use hash map instead of bit field for object ids
needFresh = true;
int i;
if (needFresh) {
i = objectIds.getLastSetBit() + 1;
if ((i & 1) != (dataFile ? 1 : 0)) {
i++;
}
while (storageMap.get(i) != null || objectIds.get(i)) {
i++;
if ((i & 1) != (dataFile ? 1 : 0)) {
i++;
}
}
} else {
i = objectIds.nextClearBit(0);
}
if (SysProperties.CHECK && objectIds.get(i)) {
throw Message.getInternalError();
}
objectIds.set(i);
return i;
}
public ObjectArray getAllSettings() {
return new ObjectArray(settings.values());
}
public ObjectArray getAllUsers() {
return new ObjectArray(users.values());
}
public ObjectArray getAllRoles() {
return new ObjectArray(roles.values());
}
public ObjectArray getAllRights() {
return new ObjectArray(rights.values());
}
public ObjectArray getAllComments() {
return new ObjectArray(comments.values());
}
public ObjectArray getAllSchemas() {
return new ObjectArray(schemas.values());
}
public ObjectArray getAllFunctionAliases() {
return new ObjectArray(functionAliases.values());
}
public ObjectArray getAllAggregates() {
return new ObjectArray(aggregates.values());
}
public ObjectArray getAllUserDataTypes() {
return new ObjectArray(userDataTypes.values());
}
public ObjectArray getAllSchemaObjects(int type) {
ObjectArray list = new ObjectArray();
for (Iterator it = schemas.values().iterator(); it.hasNext();) {
Schema schema = (Schema) it.next();
list.addAll(schema.getAll(type));
}
return list;
}
public String getShortName() {
return databaseShortName;
}
public String getName() {
return databaseName;
}
public LogSystem getLog() {
return log;
}
public Session[] getSessions() {
Session[] list = new Session[sessions.size()];
sessions.toArray(list);
return list;
}
public synchronized void update(Session session, DbObject obj) throws SQLException {
int id = obj.getId();
removeMeta(session, id);
addMeta(session, obj);
}
/**
* Rename a schema object.
*
* @param session the session
* @param obj the object
* @param newName the new name
*/
public synchronized void renameSchemaObject(Session session, SchemaObject obj, String newName) throws SQLException {
obj.getSchema().rename(obj, newName);
updateWithChildren(session, obj);
}
private synchronized void updateWithChildren(Session session, DbObject obj) throws SQLException {
ObjectArray list = obj.getChildren();
Comment comment = findComment(obj);
if (comment != null) {
throw Message.getInternalError();
}
update(session, obj);
// remember that this scans only one level deep!
for (int i = 0; list != null && i < list.size(); i++) {
DbObject o = (DbObject) list.get(i);
if (o.getCreateSQL() != null) {
update(session, o);
}
}
}
/**
* Rename a database object.
*
* @param session the session
* @param obj the object
* @param newName the new name
*/
public synchronized void renameDatabaseObject(Session session, DbObject obj, String newName) throws SQLException {
int type = obj.getType();
HashMap map = getMap(type);
if (SysProperties.CHECK) {
if (!map.containsKey(obj.getName())) {
throw Message.getInternalError("not found: " + obj.getName());
}
if (obj.getName().equals(newName) || map.containsKey(newName)) {
throw Message.getInternalError("object already exists: " + newName);
}
}
int id = obj.getId();
removeMeta(session, id);
map.remove(obj.getName());
obj.rename(newName);
map.put(newName, obj);
updateWithChildren(session, obj);
}
public String createTempFile() throws SQLException {
try {
boolean inTempDir = readOnly;
String name = databaseName;
if (!persistent) {
name = FileSystem.MEMORY_PREFIX + name;
}
return FileUtils.createTempFile(name, Constants.SUFFIX_TEMP_FILE, true, inTempDir);
} catch (IOException e) {
throw Message.convertIOException(e, databaseName);
}
}
private void reserveLobFileObjectIds() throws SQLException {
String prefix = FileUtils.normalize(databaseName) + ".";
String path = FileUtils.getParent(databaseName);
String[] list = FileUtils.listFiles(path);
for (int i = 0; i < list.length; i++) {
String name = list[i];
if (name.endsWith(Constants.SUFFIX_LOB_FILE) && FileUtils.fileStartsWith(name, prefix)) {
name = name.substring(prefix.length());
name = name.substring(0, name.length() - Constants.SUFFIX_LOB_FILE.length());
int dot = name.indexOf('.');
if (dot >= 0) {
String id = name.substring(dot + 1);
int objectId = Integer.parseInt(id);
objectIds.set(objectId);
}
}
}
}
private void deleteOldTempFiles() throws SQLException {
if (emergencyReserve != null) {
emergencyReserve.closeAndDeleteSilently();
emergencyReserve = null;
}
String path = FileUtils.getParent(databaseName);
String prefix = FileUtils.normalize(databaseName);
String[] list = FileUtils.listFiles(path);
for (int i = 0; i < list.length; i++) {
String name = list[i];
if (name.endsWith(Constants.SUFFIX_TEMP_FILE) && FileUtils.fileStartsWith(name, prefix)) {
// can't always delete the files, they may still be open
FileUtils.tryDelete(name);
}
}
}
/**
* Get or create the specified storage object.
*
* @param reader the record reader
* @param id the object id
* @param dataFile true if the data is in the data file
* @return the storage
*/
public Storage getStorage(RecordReader reader, int id, boolean dataFile) {
DiskFile file;
if (dataFile) {
file = fileData;
} else {
file = fileIndex;
}
Storage storage = getStorage(id, file);
storage.setReader(reader);
return storage;
}
public Role findRole(String roleName) {
return (Role) roles.get(roleName);
}
public Schema findSchema(String schemaName) {
return (Schema) schemas.get(schemaName);
}
public Schema getSchema(String schemaName) throws SQLException {
Schema schema = findSchema(schemaName);
if (schema == null) {
throw Message.getSQLException(ErrorCode.SCHEMA_NOT_FOUND_1, schemaName);
}
return schema;
}
public synchronized void removeDatabaseObject(Session session, DbObject obj) throws SQLException {
String objName = obj.getName();
int type = obj.getType();
HashMap map = getMap(type);
if (SysProperties.CHECK && !map.containsKey(objName)) {
throw Message.getInternalError("not found: " + objName);
}
Comment comment = findComment(obj);
if (comment != null) {
removeDatabaseObject(session, comment);
}
int id = obj.getId();
obj.removeChildrenAndResources(session);
map.remove(objName);
removeMeta(session, id);
}
private String getDependentObject(SchemaObject obj) {
switch (obj.getType()) {
case DbObject.COMMENT:
case DbObject.CONSTRAINT:
case DbObject.INDEX:
case DbObject.RIGHT:
case DbObject.TRIGGER:
case DbObject.USER:
return null;
}
ObjectArray list = getAllSchemaObjects(DbObject.TABLE_OR_VIEW);
HashSet set = new HashSet();
for (int i = 0; i < list.size(); i++) {
Table t = (Table) list.get(i);
set.clear();
t.addDependencies(set);
if (set.contains(obj)) {
return t.getSQL();
}
}
return null;
}
private String getFirstInvalidTable(Session session) {
String conflict = null;
try {
ObjectArray list = getAllSchemaObjects(DbObject.TABLE_OR_VIEW);
for (int i = 0; i < list.size(); i++) {
Table t = (Table) list.get(i);
conflict = t.getSQL();
session.prepare(t.getCreateSQL());
}
} catch (SQLException e) {
return conflict;
}
return null;
}
public synchronized void removeSchemaObject(Session session, SchemaObject obj) throws SQLException {
if (obj.getType() == DbObject.TABLE_OR_VIEW) {
Table table = (Table) obj;
if (table.getTemporary() && !table.getGlobalTemporary()) {
session.removeLocalTempTable(table);
return;
}
}
Comment comment = findComment(obj);
if (comment != null) {
removeDatabaseObject(session, comment);
}
obj.getSchema().remove(session, obj);
String invalid;
if (SysProperties.OPTIMIZE_DROP_DEPENDENCIES) {
invalid = getDependentObject(obj);
} else {
invalid = getFirstInvalidTable(session);
}
if (invalid != null) {
obj.getSchema().add(obj);
throw Message.getSQLException(ErrorCode.CANNOT_DROP_2, new String[] { obj.getSQL(), invalid });
}
int id = obj.getId();
obj.removeChildrenAndResources(session);
removeMeta(session, id);
}
public boolean isPersistent() {
return persistent;
}
public TraceSystem getTraceSystem() {
return traceSystem;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -