001: /**
002: * Objective Database Abstraction Layer (ODAL)
003: * Copyright (c) 2004, The ODAL Development Group
004: * All rights reserved.
005: * For definition of the ODAL Development Group please refer to LICENCE.txt file
006: *
007: * Distributable under LGPL license.
008: * See terms of license at gnu.org.
009: */package com.completex.objective.components.persistency.core.impl;
010:
011: import com.completex.objective.components.log.Log;
012: import com.completex.objective.components.persistency.OdalPersistencyException;
013: import com.completex.objective.components.persistency.Parameters;
014: import com.completex.objective.components.persistency.Record;
015: import com.completex.objective.components.persistency.State;
016: import com.completex.objective.components.persistency.UpdateQueryBuilder;
017: import com.completex.objective.components.persistency.transact.Transaction;
018:
019: import java.sql.SQLException;
020: import java.util.List;
021:
022: /**
023: * @author Gennady Krizhevsky
024: */
025: public class UpdateQueryBuilderImpl implements UpdateQueryBuilder {
026:
027: private boolean bindNulls;
028:
029: public UpdateQueryBuilderImpl(boolean bindNulls) {
030: this .bindNulls = bindNulls;
031: }
032:
033: public StringBuffer getUpdateSqlHeader(String tableName) {
034: return new StringBuffer("UPDATE ").append(tableName).append(
035: " SET ");
036: }
037:
038: public int addToHeaderUpdateBuffer(Transaction transaction,
039: int countUpdated, StringBuffer update, Record record,
040: int fieldIndex, boolean supportKeyUpdate,
041: AddToUpdateBufferPlugin addToUpdateBufferPlugin, Log log,
042: boolean complexDirty) throws SQLException {
043: if (addToUpdateBufferPlugin != null) {
044: addToUpdateBufferPlugin.beforeAddToUpdateBuffer(
045: transaction, record, fieldIndex, complexDirty);
046: }
047: if (considerDirtyForUpdate(record, fieldIndex,
048: supportKeyUpdate, log)) {
049: if (countUpdated > 0) {
050: update.append(", ");
051: }
052: // String placeHolder = record.getObject(fieldIndex) != null ? "? " : "NULL";
053: String placeHolder = BasicDatabasePersistencyImpl
054: .resolveModifyPlaceHolder(record, fieldIndex,
055: bindNulls);
056: update.append(record.getColumn(fieldIndex).getColumnName())
057: .append("=").append(placeHolder);
058: countUpdated++;
059: }
060: return countUpdated;
061: }
062:
063: public boolean considerDirtyForUpdate(Record record,
064: int fieldIndex, boolean supportKeyUpdate, Log log)
065: throws OdalPersistencyException {
066: validateModifiedPk(record, fieldIndex, supportKeyUpdate);
067: return record.isFieldDirty(fieldIndex)
068: || record.isForceModify();
069: }
070:
071: private boolean isPrimaryKey(Record record, int i) {
072: return record.getColumn(i).isPrimaryKey();
073: }
074:
075: protected void validateModifiedPk(Record record, int i,
076: boolean supportKeyUpdate) throws OdalPersistencyException {
077: if (State.isInitialized(record) && record.isFieldDirty(i)
078: && isPrimaryKey(record, i) && !supportKeyUpdate) {
079: throw new OdalPersistencyException(
080: "Found modified primary key while persistency configured w/o key update support");
081: }
082: }
083:
084: public Parameters primaryKeyValues(Record record) {
085: List keys = record.getPrimaryKey();
086: return keyValues(keys, record);
087: }
088:
089: public Parameters optLockKeyValues(Record record) {
090: List keys = record.getOptLockKey();
091: return keyValues(keys, record);
092: }
093:
094: public Parameters keyValues(List keys, Record record) {
095: Parameters parameters = new Parameters(keys.size());
096: boolean initialized = State.isInitialized(record);
097: for (int i = 0; i < keys.size(); i++) {
098: int columnIndex = ((Integer) keys.get(i)).intValue();
099: if (initialized) {
100: Object originalObject = record
101: .getOriginalObject(columnIndex);
102: parameters.add(record.getColumn(columnIndex).getType(),
103: originalObject);
104: } else {
105: parameters.add(record.getColumn(columnIndex).getType(),
106: record.getObject(columnIndex));
107: }
108: }
109: return parameters;
110: }
111:
112: boolean isBindNulls() {
113: return bindNulls;
114: }
115:
116: void setBindNulls(boolean bindNulls) {
117: this.bindNulls = bindNulls;
118: }
119:
120: }
|