📄 database.java
字号:
t2.addConstraint(new Constraint(Constraint.MAIN,t2,t,col2,col));
}
private void addIndexOn(Tokenizer c,Channel channel,String name,
Table t,boolean unique) throws SQLException {
int col[]=processColumnList(c,t);
createIndex(channel,t,col,name,unique);
}
private void processCreateTable(Tokenizer c,Channel channel,
boolean cached) throws SQLException {
Table t;
String sToken=c.getName();
if(cached && lLog!=null) {
t=new Table(this,true,sToken,true);
} else {
t=new Table(this,true,sToken,false);
}
c.getThis("(");
int primarykeycolumn=-1;
int column=0;
boolean constraint=false;
while(true) {
boolean identity=false;
sToken=c.getString();
if(sToken.equals("CONSTRAINT")
|| sToken.equals("PRIMARY")
|| sToken.equals("FOREIGN")) {
c.back();
constraint=true;
break;
}
String sColumn=sToken;
int iType=Column.getTypeNr(c.getString());
if(iType==Column.VARCHAR && bIgnoreCase) {
iType=Column.VARCHAR_IGNORECASE;
}
sToken=c.getString();
if(iType==Column.DOUBLE && sToken.equals("PRECISION")) {
sToken=c.getString();
}
if(sToken.equals("(")) {
// overread length
do {
sToken=c.getString();
} while(!sToken.equals(")"));
sToken=c.getString();
}
boolean nullable=true;
if(sToken.equals("NULL")) {
sToken=c.getString();
} else if(sToken.equals("NOT")) {
c.getThis("NULL");
nullable=false;
sToken=c.getString();
}
if(sToken.equals("IDENTITY")) {
identity=true;
Trace.check(primarykeycolumn==-1,Trace.SECOND_PRIMARY_KEY,sColumn);
sToken=c.getString();
primarykeycolumn=column;
}
if(sToken.equals("PRIMARY")) {
c.getThis("KEY");
Trace.check(identity || primarykeycolumn==-1,
Trace.SECOND_PRIMARY_KEY,sColumn);
primarykeycolumn=column;
sToken=c.getString();
}
t.addColumn(sColumn,iType,nullable,identity);
if(sToken.equals(")")) {
break;
}
if(!sToken.equals(",")) {
throw Trace.error(Trace.UNEXPECTED_TOKEN,sToken);
}
column++;
}
if(primarykeycolumn!=-1) {
t.createPrimaryKey(primarykeycolumn);
} else {
t.createPrimaryKey();
}
if(constraint) {
int i=0;
while(true) {
sToken=c.getString();
String name="SYSTEM_CONSTRAINT"+i;
i++;
if(sToken.equals("CONSTRAINT")) {
name=c.getString();
sToken=c.getString();
}
if(sToken.equals("PRIMARY")) {
c.getThis("KEY");
addIndexOn(c,channel,name,t,true);
} else if(sToken.equals("FOREIGN")) {
c.getThis("KEY");
addForeignKeyOn(c,channel,name,t);
}
sToken=c.getString();
if(sToken.equals(")")) {
break;
}
if(!sToken.equals(",")) {
throw Trace.error(Trace.UNEXPECTED_TOKEN,sToken);
}
}
}
channel.commit();
linkTable(t);
}
private Result processDrop(Tokenizer c,Channel channel)
throws SQLException {
channel.checkReadWrite();
channel.checkAdmin();
String sToken=c.getString();
if(sToken.equals("TABLE")) {
dropTable(c.getString());
channel.commit();
} else if(sToken.equals("USER")) {
aAccess.dropUser(c.getStringToken());
} else if(sToken.equals("INDEX")) {
sToken=c.getString();
if(!c.wasLongName()) {
throw Trace.error(Trace.UNEXPECTED_TOKEN,sToken);
}
String table=c.getLongNameFirst();
String index=c.getLongNameLast();
Table t=getTable(table,channel);
t.checkDropIndex(index);
Table tn=t.moveDefinition(index);
tn.moveData(t);
dropTable(table);
linkTable(tn);
channel.commit();
} else {
throw Trace.error(Trace.UNEXPECTED_TOKEN,sToken);
}
return new Result();
}
private Result processGrantOrRevoke(Tokenizer c,Channel channel,
boolean grant) throws SQLException {
channel.checkReadWrite();
channel.checkAdmin();
int right=0;
String sToken;
do {
String sRight=c.getString();
right|=Access.getRight(sRight);
sToken=c.getString();
} while(sToken.equals(","));
if(!sToken.equals("ON")) {
throw Trace.error(Trace.UNEXPECTED_TOKEN,sToken);
}
String table=c.getString();
if(table.equals("CLASS")) {
// object is saved as 'CLASS "java.lang.Math"'
// tables like 'CLASS "xy"' should not be created
table+=" \""+c.getString()+"\"";
} else {
getTable(table,channel); // to make sure the table exists
}
c.getThis("TO");
String user=c.getStringToken();
String command;
if(grant) {
aAccess.grant(user,table,right);
command="GRANT";
} else {
aAccess.revoke(user,table,right);
command="REVOKE";
}
return new Result();
}
private Result processConnect(Tokenizer c,Channel channel)
throws SQLException {
c.getThis("USER");
String username=c.getStringToken();
c.getThis("PASSWORD");
String password=c.getStringToken();
User user=aAccess.getUser(username,password);
channel.commit();
channel.setUser(user);
return new Result();
}
private Result processSet(Tokenizer c,Channel channel)
throws SQLException {
String sToken=c.getString();
if(sToken.equals("PASSWORD")) {
channel.checkReadWrite();
channel.setPassword(c.getStringToken());
} else if(sToken.equals("READONLY")) {
channel.commit();
channel.setReadOnly(processTrueOrFalse(c));
} else if(sToken.equals("LOGSIZE")) {
channel.checkAdmin();
int i=Integer.parseInt(c.getString());
if(lLog!=null) {
lLog.setLogSize(i);
}
} else if(sToken.equals("IGNORECASE")) {
channel.checkAdmin();
bIgnoreCase=processTrueOrFalse(c);
} else if(sToken.equals("MAXROWS")) {
int i=Integer.parseInt(c.getString());
channel.setMaxRows(i);
} else if(sToken.equals("AUTOCOMMIT")) {
channel.setAutoCommit(processTrueOrFalse(c));
} else if(sToken.equals("TABLE")) {
channel.checkReadWrite();
channel.checkAdmin();
Table t=getTable(c.getString(),channel);
c.getThis("INDEX");
c.getString();
t.setIndexRoots((String)c.getAsValue());
} else if(sToken.equals("REFERENCIAL_INTEGRITY")
|| sToken.equals("REFERENTIAL_INTEGRITY")) {
channel.checkAdmin();
bReferentialIntegrity=processTrueOrFalse(c);
} else if(sToken.equals("WRITE_DELAY")) {
channel.checkAdmin();
boolean delay=processTrueOrFalse(c);
if(lLog!=null) {
lLog.setWriteDelay(delay);
}
} else {
throw Trace.error(Trace.UNEXPECTED_TOKEN,sToken);
}
return new Result();
}
private boolean processTrueOrFalse(Tokenizer c) throws SQLException {
String sToken=c.getString();
if(sToken.equals("TRUE")) {
return true;
} else if(sToken.equals("FALSE")) {
return false;
} else {
throw Trace.error(Trace.UNEXPECTED_TOKEN,sToken);
}
}
private Result processCommit(Tokenizer c,Channel channel)
throws SQLException {
String sToken=c.getString();
if(!sToken.equals("WORK")) {
c.back();
}
channel.commit();
return new Result();
}
private Result processRollback(Tokenizer c,Channel channel)
throws SQLException {
String sToken=c.getString();
if(!sToken.equals("WORK")) {
c.back();
}
channel.rollback();
return new Result();
}
public void finalize() {
try {
close(0);
} catch(SQLException e) {
// it's too late now
}
}
private void close(int type) throws SQLException {
if(lLog==null) {
return;
}
lLog.stop();
if(type==-1) {
lLog.shutdown();
} else if(type==0) {
lLog.close(false);
} else if(type==1) {
lLog.close(true);
}
lLog=null;
bShutdown=true;
}
private Result processShutdown(Tokenizer c,Channel channel)
throws SQLException {
channel.checkAdmin();
String token=c.getString();
if(token.equals("IMMEDIATELY")) {
close(-1);
} else if(token.equals("COMPACT")) {
close(1);
} else {
c.back();
close(0);
}
return new Result();
}
private Result processCheckpoint(Channel channel) throws SQLException {
channel.checkAdmin();
if(lLog!=null) {
lLog.checkpoint();
}
return new Result();
}
private void dropTable(String name) throws SQLException {
for(int i=0;i<tTable.size();i++) {
Table o=(Table)tTable.elementAt(i);
if(o.getName().equals(name)) {
tTable.removeElementAt(i);
return;
}
}
throw Trace.error(Trace.TABLE_NOT_FOUND,name);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -