final Collection<Field<?>> getReturning() { Collection<Field<?>> result = new LinkedHashSet<Field<?>>(); Identity<R, ?> identity = getTable().getIdentity(); if (identity != null) result.add(identity.getField()); UniqueKey<?> key = getPrimaryKey(); if (key != null) result.addAll(key.getFields()); return result; } }
/** * Set an updated version value to a store query */ final BigInteger addRecordVersion(StoreQuery<?> store) { BigInteger result = null; if (isTimestampOrVersionAvailable()) { TableField<R, ?> version = getTable().getRecordVersion(); if (version != null) { Object value = get(version); // Use BigInteger locally to avoid arithmetic overflows if (value == null) { result = BigInteger.ONE; } else { result = new BigInteger(value.toString()).add(BigInteger.ONE); } addValue(store, version, result); } } return result; }
/** * Set an updated timestamp value to a store query */ final Timestamp addRecordTimestamp(StoreQuery<?> store) { Timestamp result = null; if (isTimestampOrVersionAvailable()) { TableField<R, ?> timestamp = getTable().getRecordTimestamp(); if (timestamp != null) { // Use Timestamp locally, to provide maximum precision result = new Timestamp(configuration().clock().millis()); addValue(store, timestamp, result); } } return result; }
/** * Set a generated version and timestamp value onto this record after * successfully storing the record. */ final void setRecordVersionAndTimestamp(BigInteger version, Timestamp timestamp) { if (version != null) { TableField<R, ?> field = getTable().getRecordVersion(); int fieldIndex = indexOrFail(fieldsRow(), field); Object value = field.getDataType().convert(version); values[fieldIndex] = value; originals[fieldIndex] = value; changed.clear(fieldIndex); } if (timestamp != null) { TableField<R, ?> field = getTable().getRecordTimestamp(); int fieldIndex = indexOrFail(fieldsRow(), field); Object value = field.getDataType().convert(timestamp); values[fieldIndex] = value; originals[fieldIndex] = value; changed.clear(fieldIndex); } }
final int storeInsert0(Field<?>[] storeFields) { DSLContext create = create(); InsertQuery<R> insert = create.insertQuery(getTable()); addChangedValues(storeFields, insert); // Don't store records if no value was set by client code if (!insert.isExecutable()) { if (log.isDebugEnabled()) log.debug("Query is not executable", insert); return 0; } // [#1596] Set timestamp and/or version columns to appropriate values BigInteger version = addRecordVersion(insert); Timestamp timestamp = addRecordTimestamp(insert); // [#814] Refresh identity and/or main unique key values // [#1002] Consider also identity columns of non-updatable records // [#1537] Avoid refreshing identity columns on batch inserts Collection<Field<?>> key = setReturningIfNeeded(insert); int result = insert.execute(); if (result > 0) { for (Field<?> storeField : storeFields) changed(storeField, false); // [#1596] If insert was successful, update timestamp and/or version columns setRecordVersionAndTimestamp(version, timestamp); // [#1859] If an insert was successful try fetching the generated values. getReturningIfNeeded(insert, key); fetched = true; } return result; }