📄 backendjdbc.java
字号:
byte[] entryBytes = rs.getBytes(1);
entry = new Entry(entryBytes);
rs = null;
BackendJDBCConnPool.getInstance().checkIn(dbcon);
} catch (Exception ioe) {
ioe.printStackTrace();
rs = null;
ps = null;
if (dbcon != null) {
BackendJDBCConnPool.getInstance().checkIn(dbcon);
}
}
return entry;
}
public Entry getByID(Long id) {
Entry entry = null;
Connection dbcon = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
dbcon = (Connection)BackendJDBCConnPool.getInstance().checkOut();
ps = dbcon.prepareStatement("SELECT entrydata FROM entry WHERE entryid = ?");
ps.setLong(1,id.longValue());
rs = ps.executeQuery();
rs.next();
byte[] entryBytes = rs.getBytes(1);
entry = new Entry(entryBytes);
rs.close();
ps.close();
BackendJDBCConnPool.getInstance().checkIn(dbcon);
} catch (Exception ioe) {
ioe.printStackTrace();
rs = null;
ps = null;
if (dbcon != null) {
BackendJDBCConnPool.getInstance().checkIn(dbcon);
}
entry = new Entry();
}
return entry;
}
void initialize() {
String entrytable = ServerConfig.getInstance().get(ServerConfig.JAVALDAP_BACKENDJDBC_CREATETABLE) +
" entry (entryid INT, dn VARCHAR(255), base VARCHAR(255), entrydata " +
ServerConfig.getInstance().get(ServerConfig.JAVALDAP_BACKENDJDBC_LONGVARCHAR) +
", creator VARCHAR(255), modifier VARCHAR(255), createstamp VARCHAR(32), modifystamp VARCHAR(32))";
Connection dbcon = null;
try {
dbcon = (Connection)BackendJDBCConnPool.getInstance().checkOut();
Statement s = dbcon.createStatement();
s.execute(entrytable);
s.execute("CREATE INDEX entryindex ON entry (entryid, dn)");
s.execute(ServerConfig.getInstance().get(ServerConfig.JAVALDAP_BACKENDJDBC_CREATETABLE) +
" keytable (keyvalue VARCHAR(64), value VARCHAR(128))");
s.execute("INSERT INTO keytable VALUES ('entryCount','0')");
for (Enumeration indexenum = exactIndexes.elements(); indexenum.hasMoreElements();) {
DirectoryString indexName = (DirectoryString) indexenum.nextElement();
String indexcreate = ServerConfig.getInstance().get(ServerConfig.JAVALDAP_BACKENDJDBC_CREATETABLE) +
" " + indexName + " (entryid int, value varchar(255))";
s.execute(indexcreate);
s.execute("CREATE INDEX " + indexName + "ix ON " + indexName + " (entryid, value)");
}
dbcon.commit();
BackendJDBCConnPool.getInstance().checkIn(dbcon);
} catch (java.sql.SQLException se) {
se.printStackTrace();
try {
dbcon.rollback();
} catch (SQLException sqle) {
sqle.printStackTrace();
}
BackendJDBCConnPool.getInstance().checkIn(dbcon);
} catch (Exception e) {
e.printStackTrace();
BackendJDBCConnPool.getInstance().checkIn(dbcon);
}
}
public void modify(DirectoryString name, Vector changeEntries) throws DirectorySchemaViolation {
Entry entry = null;
try {
entry = getByDN(name);
} catch (DirectoryException de) {
de.printStackTrace();
}
if (entry != null) {
Entry current = (Entry) entry.clone();
Enumeration changeEnum = changeEntries.elements();
while (changeEnum.hasMoreElements()) {
oneChange(current, (EntryChange) changeEnum.nextElement());
}
SchemaChecker.getInstance().checkEntry(current);
Connection dbcon = null;
try {
dbcon = (Connection) BackendJDBCConnPool.getInstance().checkOut();
Statement s = dbcon.createStatement();
// Get the current entry as a byte array
byte[] byteEntry = current.getAsByteArray();
// Update the entrydata for this entry
PreparedStatement ps = dbcon.prepareStatement("UPDATE entry SET entryData = ? WHERE entryid = ?");
ps.setBytes(1,byteEntry);
ps.setLong(2,current.getID());
System.out.println("Changing Entry: " + current.getID());
ps.execute();
// Change indexes
changeEnum = changeEntries.elements();
while (changeEnum.hasMoreElements()) {
EntryChange change = (EntryChange) changeEnum.nextElement();
int changeType = change.getModType();
DirectoryString attr = change.getAttr();
Vector vals = change.getValues();
if (exactIndexes.contains(attr)) {
if (changeType == ModifyRequestSeqOfSeqEnum.ADD) {
Vector oldvals = null;
for (Enumeration enumVals = vals.elements(); enumVals.hasMoreElements();) {
DirectoryString oneVal = (DirectoryString) enumVals.nextElement();
ps = dbcon.prepareStatement("INSERT INTO " + attr + " VALUES (?,?)");
ps.setLong(1,current.getID());
ps.setString(2,oneVal.normalize());
ps.execute();
}
}
if (changeType == ModifyRequestSeqOfSeqEnum.DELETE) {
for (Enumeration enumVals = vals.elements(); enumVals.hasMoreElements();) {
DirectoryString oneVal = (DirectoryString) enumVals.nextElement();
ps = dbcon.prepareStatement("DELETE FROM " + attr + " WHERE entryid = ? AND value = ?");
ps.setLong(1,current.getID());
ps.setString(2,oneVal.normalize());
ps.execute();
}
}
if (changeType == ModifyRequestSeqOfSeqEnum.REPLACE) {
if (entry.containsKey(attr)) {
ps = dbcon.prepareStatement("DELETE FROM " + attr + " WHERE entryid = ?");
ps.setLong(1,current.getID());
ps.execute();
for (Enumeration valsEnum = ((Vector) current.get(attr)).elements(); valsEnum.hasMoreElements();) {
DirectoryString valString = (DirectoryString) valsEnum.nextElement();
ps = dbcon.prepareStatement("INSERT INTO " + attr + " VALUES (?,?)");
ps.setLong(1,current.getID());
ps.setString(2,valString.normalize());
ps.execute();
}
}
}
}
}
dbcon.commit();
BackendJDBCConnPool.getInstance().checkIn(dbcon);
} catch (Exception e) {
e.printStackTrace();
try {
dbcon.rollback();
} catch (SQLException sqle) {
sqle.printStackTrace();
}
BackendJDBCConnPool.getInstance().checkIn(dbcon);
}
}
}
public void oneChange(Entry current, EntryChange change) {
int changeType = change.getModType();
DirectoryString attr = change.getAttr();
Vector vals = change.getValues();
if (changeType == ModifyRequestSeqOfSeqEnum.ADD) {
Vector oldvals = null;
if (!current.containsKey(attr)) {
oldvals = new Vector();
} else {
oldvals = (Vector)current.get(attr);
}
for (Enumeration enumVals = vals.elements(); enumVals.hasMoreElements();) {
Object oneVal = enumVals.nextElement();
if (!oldvals.contains(oneVal)) {
oldvals.addElement(oneVal);
}
}
current.put(attr,oldvals);
}
if (changeType == ModifyRequestSeqOfSeqEnum.DELETE) {
Vector oldvals = null;
if (!current.containsKey(attr)) {
oldvals = new Vector();
} else {
oldvals = (Vector)current.get(attr);
}
for (Enumeration enumVals = vals.elements(); enumVals.hasMoreElements();) {
Object oneVal = enumVals.nextElement();
if (oldvals.contains(oneVal)) {
oldvals.removeElement(oneVal);
}
}
if (oldvals.size() > 0) {
current.put(attr,oldvals);
} else {
current.remove(attr);
}
}
if (changeType == ModifyRequestSeqOfSeqEnum.REPLACE) {
current.put(attr,vals);
}
}
public LDAPResultEnum rename(DirectoryString oldname, DirectoryString newname) {
// Need to implement
/* Entry entry = (Entry)this.datastore.get(oldname);
try {
entry.setName(newname);
} catch (InvalidDNException ide) {
return new LDAPResultEnum(ide.getLDAPErrorCode());
}
this.datastore.put(entry.getName(),entry);
this.datastore.remove(oldname); */
return new LDAPResultEnum(0);
}
private Vector searchExact(DirectoryString base, int scope, String attr, String value, boolean matchValue) {
Vector results = new Vector();
DirectoryString cisAttr = new DirectoryString(attr);
DirectoryString cisValue = null;
if (value != null) {
cisValue = new DirectoryString(value);
}
if (scope == SearchRequestEnum.BASEOBJECT) {
Entry current = null;
try {
current = getByDN(base);
} catch (DirectoryException de) {
de.printStackTrace();
}
if (current != null) {
if (current.containsKey(cisAttr)) {
Vector values = (Vector) current.get(cisAttr);
if (matchValue == false || values.contains(cisValue)) {
results.addElement(new Long(current.getID()));
}
}
}
return results;
}
if (exactIndexes.contains(cisAttr)) {
Connection dbcon = null;
try {
dbcon = (Connection)BackendJDBCConnPool.getInstance().checkOut();
Statement s = dbcon.createStatement();
ResultSet rs = null;
String scopeQuery = null;
if (scope == SearchRequestEnum.WHOLESUBTREE) {
scopeQuery = "entry.base LIKE '%" + base + "'";
} else {
scopeQuery = "entry.base = '" + base + "'";
}
if (matchValue == true) {
rs = s.executeQuery("SELECT DISTINCT entry.entryid from entry," + cisAttr +
" where entry.entryid = " + cisAttr + ".entryid and UPPER(value) = UPPER('" + cisValue +
"') AND " + scopeQuery);
} else {
rs = s.executeQuery("SELECT DISTINCT entry.entryid from entry," + cisAttr +
" where entry.entryid = " + cisAttr + ".entryid AND " + scopeQuery);
}
while (rs.next()) {
Entry current = null;
long entryid = rs.getLong(1);
results.addElement(new Long(entryid));
}
BackendJDBCConnPool.getInstance().checkIn(dbcon);
} catch (Exception e) {
e.printStackTrace();
if (dbcon != null) {
BackendJDBCConnPool.getInstance().checkIn(dbcon);
}
}
return results;
}
return results;
}
private Vector searchSubstring(DirectoryString base, int scope, String attr, String value) {
Vector results = new Vector();
DirectoryString cisAttr = new DirectoryString(attr);
DirectoryString cisValue = null;
if (value != null) {
cisValue = new DirectoryString(value);
}
if (scope == SearchRequestEnum.BASEOBJECT) {
Entry current = null;
try {
current = getByDN(base);
} catch (DirectoryException de) {
de.printStackTrace();
}
if (current != null) {
if (current.containsKey(cisAttr)) {
Vector values = (Vector) current.get(cisAttr);
if (values.contains(cisValue)) {
results.addElement(new Long(current.getID()));
}
}
}
return results;
}
if (exactIndexes.contains(cisAttr)) {
Connection dbcon = null;
try {
dbcon = (Connection)BackendJDBCConnPool.getInstance().checkOut();
Statement s = dbcon.createStatement();
ResultSet rs = null;
String scopeQuery = null;
if (scope == SearchRequestEnum.WHOLESUBTREE) {
scopeQuery = "entry.base LIKE '%" + base + "'";
} else {
scopeQuery = "entry.base = '" + base + "'";
}
rs = s.executeQuery("SELECT DISTINCT entry.entryid FROM entry," + cisAttr +
" WHERE entry.entryid = " + cisAttr + ".entryid AND UPPER(value) LIKE UPPER('" + cisValue + "')" +
" AND " + scopeQuery);
while (rs.next()) {
Entry current = null;
long entryid = rs.getLong(1);
results.addElement(new Long(entryid));
}
BackendJDBCConnPool.getInstance().checkIn(dbcon);
} catch (Exception e) {
e.printStackTrace();
if (dbcon != null) {
BackendJDBCConnPool.getInstance().checkIn(dbcon);
}
}
return results;
}
return results;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -