📄 constraintparser.java
字号:
package jnicli;
/**
* Constraints format:
* <pre>
* constraints ::= constraint{',' constraint}
* constraint ::= field-name [index-constraint] [unique-constraint] [references-constraint] [autoincrement-constraint]
* index-constraint ::= 'using' ['thick'] ['case_insensitive'] 'index'
* unique-constraint ::= 'unique'
* autoincrement-constraint ::= 'autoincrement'
* references-constraint ::= 'references' table-name ['(' inverse-field ')']
* </pre>
*/
class ConstraintParser {
int pos;
String constraints;
String[] fields;
String[] inverseFields;
String[] referencedTables;
int[] constraintMasks;
String getToken() {
int p = pos;
int len = constraints.length();
while (p < len && Character.isWhitespace(constraints.charAt(p))) {
p += 1;
}
if (p == len) {
return null;
}
if (Character.isJavaIdentifierStart(constraints.charAt(p))) {
int start = p;
while (++p < len && (Character.isJavaIdentifierPart(constraints.charAt(p))
|| (constraints.charAt(p)=='.')));
String tkn = constraints.substring(start, p);
pos = p;
return tkn;
} else {
pos += 1;
return constraints.substring(p, p+1);
}
}
ConstraintParser(String fields[], String constraints) {
this.fields = fields;
this.constraints = constraints;
referencedTables = new String[fields.length];
constraintMasks = new int[fields.length];
parse();
}
void parse() {
String tkn;
constraintLoop:
while ((tkn = getToken()) != null) {
for (int i = 0; i < fields.length; i++) {
if (tkn.equals(fields[i])) {
tkn = getToken();
while (tkn != null) {
if (tkn.equals(",")) {
continue constraintLoop;
} else if (tkn.equals("using")) {
while (!"index".equals(tkn = getToken())) {
if ("thick".equals(tkn)) {
constraintMasks[i] |= THICK;
} else if ("case_insensitive".equals(tkn)) {
constraintMasks[i] |= CASE_INSENSITIVE;
} else {
throw new CliException("Unknown index constraint '" + tkn + "'");
}
}
constraintMasks[i] |= INDEXED;
} else if (tkn.equals("unique")) {
constraintMasks[i] |= UNIQUE;
} else if (tkn.equals("autoincrement")) {
constraintMasks[i] |= AUTOINCREMENT;
} else if (tkn.equals("references")) {
tkn = getToken();
if (tkn == null) {
throw new CliException("Referenced table name expected");
}
referencedTables[i] = tkn;
tkn = getToken();
if ("(".equals(tkn)) {
tkn = getToken();
if (tkn == null) {
throw new CliException("Inverse field name expected");
}
inverseFields[i] = tkn;
tkn = getToken();
if (!")".equals(tkn)) {
throw new CliException("')' expected");
}
tkn = getToken();
}
continue;
} else {
throw new CliException("Unknown constraint '" + tkn + "'");
}
tkn = getToken();
}
return;
}
}
throw new CliException("Constrained field '" + tkn + "' not found in class");
}
}
static final int INDEXED = 2;
static final int CASE_INSENSITIVE = 8;
static final int UNIQUE = 16;
static final int AUTOINCREMENT = 32;
static final int THICK = 64;
String[] getReferencedTables() {
return referencedTables;
}
String[] getInverseFields() {
return inverseFields;
}
int[] getConstraintMasks() {
return constraintMasks;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -