@Override public <R extends UpdatableRecord<R>> int executeDelete(R record) { DeleteQuery<R> delete = deleteQuery(record.getTable()); Tools.addConditions(delete, record, record.getTable().getPrimaryKey().getFieldsArray()); return delete.execute(); }
@Override public <R extends UpdatableRecord<R>> int executeUpdate(R record) { UpdateQuery<R> update = updateQuery(record.getTable()); Tools.addConditions(update, record, record.getTable().getPrimaryKey().getFieldsArray()); update.setRecord(record); return update.execute(); }
/** * Perform an additional SELECT .. FOR UPDATE to check if the underlying * database record has been changed compared to this record. */ private final void checkIfChanged(TableField<R, ?>[] keys) { SelectQuery<R> select = create().selectQuery(getTable()); Tools.addConditions(select, this, keys); // [#1547] MS Access and SQLite doesn't support FOR UPDATE. CUBRID and SQL Server // can emulate it, though! if (!NO_SUPPORT_FOR_UPDATE.contains(create().configuration().dialect().family())) select.setForUpdate(true); R record = select.fetchOne(); if (record == null) throw new DataChangedException("Database record no longer exists"); for (Field<?> field : fields.fields.fields) { Object thisObject = original(field); Object thatObject = record.original(field); if (!StringUtils.equals(thisObject, thatObject)) throw new DataChangedException("Database record has been changed"); } }
@Override public final void refresh(final Field<?>... refreshFields) { SelectQuery<Record> select = create().selectQuery(); select.addSelect(refreshFields); select.addFrom(getTable()); Tools.addConditions(select, this, getPrimaryKey().getFieldsArray()); if (select.execute() == 1) { final AbstractRecord source = (AbstractRecord) select.getResult().get(0); delegate(configuration(), (Record) this, REFRESH) .operate(new RecordOperation<Record, RuntimeException>() { @Override public Record operate(Record record) throws RuntimeException { setValues(refreshFields, source); return record; } }); } else { throw new NoDataFoundException("Exactly one row expected for refresh. Record does not exist in database."); } }
private final int delete0() { TableField<R, ?>[] keys = getPrimaryKey().getFieldsArray(); try { DeleteQuery<R> delete1 = create().deleteQuery(getTable()); Tools.addConditions(delete1, this, keys); if (isExecuteWithOptimisticLocking()) { // [#1596] Add additional conditions for version and/or timestamp columns if (isTimestampOrVersionAvailable()) { addConditionForVersionAndTimestamp(delete1); } // [#1547] Try fetching the Record again first, and compare this // Record's original values with the ones in the database // [#5384] Do this only if the exclusion flag for unversioned records is off else if (isExecuteWithOptimisticLockingIncludeUnversioned()) { checkIfChanged(keys); } } int result = delete1.execute(); checkIfChanged(result, null, null); return result; } // [#673] [#3363] If store() is called after delete(), a new INSERT should // be executed and the record should be recreated finally { changed(true); fetched = false; } }
private final int storeUpdate0(Field<?>[] storeFields, TableField<R, ?>[] keys) { UpdateQuery<R> update = create().updateQuery(getTable()); addChangedValues(storeFields, update); Tools.addConditions(update, this, keys);