Author: michiel
Date: 2009-09-10 01:05:20 +0200 (Thu, 10 Sep 2009)
New Revision: 38545
Modified:
mmbase/trunk/core/src/main/java/org/mmbase/storage/implementation/database/DatabaseStorageManager.java
Log:
assertions, some other detilas
Modified:
mmbase/trunk/core/src/main/java/org/mmbase/storage/implementation/database/DatabaseStorageManager.java
===================================================================
---
mmbase/trunk/core/src/main/java/org/mmbase/storage/implementation/database/DatabaseStorageManager.java
2009-09-09 23:02:45 UTC (rev 38544)
+++
mmbase/trunk/core/src/main/java/org/mmbase/storage/implementation/database/DatabaseStorageManager.java
2009-09-09 23:05:20 UTC (rev 38545)
@@ -49,7 +49,9 @@
private static final Logger log =
Logging.getLoggerInstance(DatabaseStorageManager.class);
+ private static final Logger valuesLogger =
Logging.getLoggerInstance("org.mmbase.QUERIES.VALUES");
+
private static final Blob BLOB_SHORTED = new InputStreamBlob(null, -1);
private static final CharTransformer UNICODE_ESCAPER = new
org.mmbase.util.transformers.UnicodeEscaper();
@@ -135,9 +137,9 @@
}
- protected final void logQuery(String query, long startTime) {
+ protected final boolean logQuery(String query, long startTime) {
long duration = System.nanoTime() - startTime;
- getFactory().logQuery(query, duration);
+ return getFactory().logQuery(query, duration);
}
// javadoc is inherited
@@ -964,10 +966,14 @@
nodeNumber = createKey();
node.setValue(MMObjectBuilder.FIELD_NUMBER, nodeNumber);
}
+ assert node.getNumber() > 0;
+ assert node.getIntValue("otype") > 0;
+
MMObjectBuilder builder = node.getBuilder();
// precommit call, needed to convert or add things before a save
// Should be done in MMObjectBuilder
builder.preCommit(node);
+
create(node, builder);
unloadShortedFields(node, builder);
typeCache.put(nodeNumber, builder.getNumber());
@@ -1016,7 +1022,7 @@
fieldValues.append('?');
}
- protected void create(MMObjectNode node, List<CoreField> createFields,
String tablename) {
+ protected void create(MMObjectNode node, final List<CoreField>
createFields, String tablename) {
// Create a String that represents the fields and values to be used in
the insert.
StringBuilder fieldNames = null;
StringBuilder fieldValues = null;
@@ -1043,17 +1049,18 @@
if (log.isDebugEnabled()) {
log.debug("insert field values " + fieldNames + " " + fieldValues);
}
- if (fields.size() > 0) {
- Scheme scheme = factory.getScheme(Schemes.INSERT_NODE,
Schemes.INSERT_NODE_DEFAULT);
- 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()) + " using query " + query,
se);
- } finally {
- releaseActiveConnection();
- }
+
+ assert fields.size() > 0;
+ assert node.getNumber() > 0;
+ Scheme scheme = factory.getScheme(Schemes.INSERT_NODE,
Schemes.INSERT_NODE_DEFAULT);
+ 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()) + " using query " + query, se);
+ } finally {
+ releaseActiveConnection();
}
}
@@ -1130,7 +1137,7 @@
try {
setValue(ps, fieldNumber + 1, node, field);
} catch (StorageException e) {
- SQLException sqle = new SQLException(node.toString() + "/" +
field + " " + e.getMessage());
+ SQLException sqle = new SQLException(node.toString() + "/" +
field.getName() + " " + e.getMessage());
sqle.initCause(e);
throw sqle;
}
@@ -1138,8 +1145,15 @@
long startTime = getLogStartTime();
ps.executeUpdate();
ps.close();
- logQuery(query, startTime);
-
+ boolean logged = logQuery(query, startTime);
+ if (logged) {
+ StringBuilder values = new StringBuilder();
+ for (CoreField field : fields) {
+ values.append("\n");
+ values.append(field.getName() + ":" +
node.getStringValue(field.getName()));
+ }
+ valuesLogger.info(values);
+ }
}
// javadoc is inherited
@@ -1413,7 +1427,7 @@
protected void setNodeValue(PreparedStatement statement, int index, Object
nodeValue, CoreField field, MMObjectNode node) throws StorageException,
SQLException {
if (!setNullValue(statement, index, nodeValue, field,
java.sql.Types.INTEGER)) {
if (nodeValue == null && field.isNotNull()) {
- throw new StorageException("The NODE field with name " +
field.getClass() + " " + field.getName() + " of type " +
field.getParent().getTableName() + " can not be NULL.");
+ throw new StorageException("The NODE field with " +
field.getClass() + " " + field.getName() + " of type " +
field.getParent().getTableName() + " can not be NULL.");
}
int nodeNumber;
if (nodeValue instanceof MMObjectNode) {
@@ -1687,10 +1701,25 @@
}
protected void setNodeTypeLeaveRelations(MMObjectNode node,
MMObjectBuilder buil) throws StorageException {
- delete(node, node.getOldBuilder());
+
+ assert node.getIntValue("otype") > 0;
+ assert node.getNumber() > 0;
+
+ MMObjectBuilder oldBuilder = node.getOldBuilder();
+ // delete from database but do not delete blobs on disk
+ /*
+
+ String tablename = (String) factory.getStorageIdentifier(oldBuilder);
+ delete(node, oldBuilder, new ArrayList<CoreField>(), tablename);
+ */
+ delete(node, oldBuilder);
+
+ assert node.getIntValue("otype") > 0;
+
+
typeCache.remove(node.getNumber());
- MMObjectBuilder oldBuilder = node.getOldBuilder();
+
log.service("Recreating " + node + " " + (oldBuilder == null ? "NULL"
: oldBuilder.getTableName()) + " -> " + buil.getTableName());
createWithoutEvent(node);
}
@@ -1721,6 +1750,7 @@
// nothing wrong.
return bul.getNumber();
} catch (SQLException sqe) {
+ log.warn(sqe);
if (! wasinTransaction) {
rollback();
} else {
@@ -1732,7 +1762,7 @@
/**
* Delete a node from a specific builder
- * This method makes it easier to implement relational databses, where you
may need to remove the node
+ * This method makes it easier to implement relational databases, where
you may need to remove the node
* in more than one builder.
* Call this method for all involved builders if you use a relational
database.
* @param node The node to delete
@@ -1749,10 +1779,18 @@
}
}
String tablename = (String) factory.getStorageIdentifier(builder);
+ assert node.getIntValue("otype") > 0;
+ assert node.getNumber() > 0;
delete(node, builder, blobFileField, tablename);
+ assert node.getIntValue("otype") > 0;
+ assert node.getNumber() > 0;
+
}
- protected void delete(MMObjectNode node, MMObjectBuilder builder,
List<CoreField> blobFileField, String tablename) {
+ protected void delete(final MMObjectNode node, final MMObjectBuilder
builder, final List<CoreField> blobFileField, final String tablename) {
+ assert node.getIntValue("otype") > 0;
+ assert node.getNumber() > 0;
+
try {
Scheme scheme = factory.getScheme(Schemes.DELETE_NODE,
Schemes.DELETE_NODE_DEFAULT);
String query = scheme.format(this, tablename,
builder.getField("number"), node);
@@ -1790,6 +1828,9 @@
} catch (SQLException se) {
throw new StorageException(se);
} finally {
+ assert node.getIntValue("otype") > 0;
+ assert node.getNumber() > 0;
+
releaseActiveConnection();
}
}
@@ -1927,13 +1968,11 @@
String id =
(String)factory.getStorageIdentifier(field);
value = getValue(result, result.findColumn(id),
field, true);
}
- if (value == null) {
- node.storeValue(field.getName(), null);
- } else {
- node.storeValue(field.getName(), value);
- }
+ node.storeValue(field.getName(), value);
}
}
+ assert node.getNumber() > 0;
+ assert node.getIntValue("otype") > 0;
// clear the changed signal on the node
node.clearChanged();
return;
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs