Update of /var/cvs/src/org/mmbase/storage/implementation/database
In directory james.mmbase.org:/tmp/cvs-serv16496
Modified Files:
DatabaseStorageManager.java
Log Message:
made the algorithm to make directories public because I want to reuse it. Plus
a few other details
See also:
http://cvs.mmbase.org/viewcvs/src/org/mmbase/storage/implementation/database
Index: DatabaseStorageManager.java
===================================================================
RCS file:
/var/cvs/src/org/mmbase/storage/implementation/database/DatabaseStorageManager.java,v
retrieving revision 1.212
retrieving revision 1.213
diff -u -b -r1.212 -r1.213
--- DatabaseStorageManager.java 7 Apr 2009 08:23:34 -0000 1.212
+++ DatabaseStorageManager.java 17 Apr 2009 13:29:37 -0000 1.213
@@ -36,9 +36,9 @@
*
* @author Pierre van Rooden
* @since MMBase-1.7
- * @version $Id: DatabaseStorageManager.java,v 1.212 2009/04/07 08:23:34
nklasens Exp $
+ * @version $Id: DatabaseStorageManager.java,v 1.213 2009/04/17 13:29:37
michiel Exp $
*/
-public class DatabaseStorageManager implements StorageManager {
+public class DatabaseStorageManager implements
StorageManager<DatabaseStorageManagerFactory> {
/** Max size of the object type cache */
public static final int OBJ2TYPE_MAX_SIZE = 20000;
@@ -153,8 +153,8 @@
}
// javadoc is inherited
- public void init(StorageManagerFactory factory) throws StorageException {
- this.factory = (DatabaseStorageManagerFactory)factory;
+ public void init(DatabaseStorageManagerFactory factory) throws
StorageException {
+ this.factory = factory;
if (factory.supportsTransactions()) {
transactionIsolation =
((Integer)factory.getAttribute(Attributes.TRANSACTION_ISOLATION_LEVEL)).intValue();
}
@@ -512,8 +512,8 @@
* @throws SQLException when a database error occurs
* @throws StorageException when data is incompatible or the function is
not supported
*/
- protected Object getXMLValue(ResultSet result, int index, CoreField
field, boolean mayShorten) throws StorageException, SQLException {
- return getStringValue(result, index, field, mayShorten);
+ protected org.w3c.dom.Document getXMLValue(ResultSet result, int index,
CoreField field, boolean mayShorten) throws StorageException, SQLException {
+ return Casting.toXML(getStringValue(result, index, field,
mayShorten));
}
@@ -727,25 +727,38 @@
}
}
+
/**
- * Defines how binary (blob) data files must look like.
- * @param node the node the binary data belongs to
- * @param fieldName the name of the binary field
- * @return The File where to store or read the binary data
+ * Appends subdirectories to the beginning of the given StringBuilder.
This is based on the
+ * given (node) number.
+ * This ensures that there are never too many files in one directory.
+ *
+ * @since MMBase-1.9.1
*/
- protected File getBinaryFile(MMObjectNode node, String fieldName) {
- File basePath = factory.getBinaryFileBasePath();
- StringBuilder pathBuffer = new StringBuilder();
- int number = node.getNumber() / 1000;
+ public static StringBuilder appendDirectory(final StringBuilder
pathBuffer, int number, final String separator) {
+ number /= 1000;
while (number > 0) {
int num = number % 100;
pathBuffer.insert(0, num);
if (num < 10) {
pathBuffer.insert(0, 0);
}
- pathBuffer.insert(0, File.separator);
+ pathBuffer.insert(0, separator);
number /= 100;
}
+ return pathBuffer;
+ }
+
+ /**
+ * Defines how binary (blob) data files must look like.
+ * @param node the node the binary data belongs to
+ * @param fieldName the name of the binary field
+ * @return The File where to store or read the binary data
+ */
+ protected File getBinaryFile(MMObjectNode node, String fieldName) {
+ File basePath = factory.getBinaryFileBasePath();
+ StringBuilder pathBuffer = new StringBuilder();
+ appendDirectory(pathBuffer, node.getNumber(), File.separator);
/*
* This method is sometimes called with a node which has a supertype
builder
@@ -976,6 +989,16 @@
create(node, createFields, tablename);
}
+
+ /**
+ * @since MMBase-1.9.1
+ */
+ protected void appendField(StringBuilder fieldNames, StringBuilder
fieldValues, CoreField field) {
+ String fieldName = (String)factory.getStorageIdentifier(field);
+ fieldNames.append(fieldName);
+ fieldValues.append('?');
+ }
+
protected void create(MMObjectNode node, List<CoreField> createFields,
String tablename) {
// Create a String that represents the fields and values to be used in
the insert.
StringBuilder fieldNames = null;
@@ -990,14 +1013,14 @@
} else {
// store the fieldname and the value parameter
fields.add(field);
- String fieldName = (String)factory.getStorageIdentifier(field);
if (fieldNames == null) {
- fieldNames = new StringBuilder(fieldName);
- fieldValues = new StringBuilder("?");
+ fieldNames = new StringBuilder();
+ fieldValues = new StringBuilder();
} else {
- fieldNames.append(',').append(fieldName);
- fieldValues.append(",?");
+ fieldNames.append(',');
+ fieldValues.append(',');
}
+ appendField(fieldNames, fieldValues, field);
}
}
if (log.isDebugEnabled()) {
@@ -1005,12 +1028,12 @@
}
if (fields.size() > 0) {
Scheme scheme = factory.getScheme(Schemes.INSERT_NODE,
Schemes.INSERT_NODE_DEFAULT);
- try {
String query = scheme.format(this, tablename,
fieldNames.toString(), fieldValues.toString());
+ try {
getActiveConnection();
executeUpdateCheckConnection(query, node, fields);
} catch (SQLException se) {
- throw new StorageException(se.getMessage() + " during creation
of " + UNICODE_ESCAPER.transform(node.toString()), se);
+ throw new StorageException(se.getMessage() + " during creation
of " + UNICODE_ESCAPER.transform(node.toString()) + " using query " + query,
se);
} finally {
releaseActiveConnection();
}
@@ -1089,7 +1112,7 @@
CoreField field = fields.get(fieldNumber);
try {
setValue(ps, fieldNumber + 1, node, field);
- } catch (Exception e) {
+ } catch (StorageException e) {
SQLException sqle = new SQLException(node.toString() + "/" +
field + " " + e.getMessage());
sqle.initCause(e);
throw sqle;
@@ -2557,7 +2580,7 @@
log.debug("VERIFY: determining super tables failed,
skipping inheritance consistency tests for " + tableName);
}
}
- Map<String, Map<String, Object>> columns = new HashMap<String,
Map<String, Object>>();
+ final Map<String, Map<String, Object>> columns = new
HashMap<String, Map<String, Object>>();
ResultSet columnsSet = metaData.getColumns(null, null, tableName,
null);
try {
// get column information
@@ -2623,8 +2646,8 @@
}
}
// compare size
- int databaseSize =
((Integer)colInfo.get("COLUMN_SIZE")).intValue();
- int builderFieldSize = field.getMaxLength();
+ final int databaseSize = (Integer)
colInfo.get("COLUMN_SIZE");
+ final int builderFieldSize = field.getMaxLength();
// ignore the size difference for large fields
(generally blobs or memo texts)
// since most databases do not return accurate sizes
for these fields
boolean isBuilderFieldSizeDefined = builderFieldSize
!= -1;
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs