/** * {@inheritDoc} */ @Override public org.jooq.Row11<java.lang.String, java.lang.String, java.lang.String, java.util.Date, java.lang.Integer, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String> fieldsRow() { return (org.jooq.Row11) super.fieldsRow(); }
/** * {@inheritDoc} */ @Override public Row3<UUID, Timestamp, Integer> valuesRow() { return (Row3) super.valuesRow(); }
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; }
/** * 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; }
final void getReturningIfNeeded(StoreQuery<R> query, Collection<Field<?>> key) { if (key != null && !key.isEmpty()) { R record = query.getReturnedRecord(); if (record != null) { for (Field<?> field : key) { int index = indexOrFail(fieldsRow(), field); Object value = record.get(field); values[index] = value; originals[index] = value; } } // [#1859] In some databases, not all fields can be fetched via getGeneratedKeys() if (TRUE.equals(configuration().settings().isReturnAllOnUpdatableRecord()) && REFRESH_GENERATED_KEYS.contains(configuration().family()) && this instanceof UpdatableRecord) ((UpdatableRecord<?>) this).refresh(key.toArray(EMPTY_FIELD)); } }
/** * 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 Collection<Field<?>> setReturningIfNeeded(StoreQuery<R> query) { Collection<Field<?>> key = null; if (configuration() != null) if (!TRUE.equals(configuration().data(DATA_OMIT_RETURNING_CLAUSE))) // [#1859] Return also non-key columns if (TRUE.equals(configuration().settings().isReturnAllOnUpdatableRecord())) key = Arrays.asList(fields()); // [#5940] Getting the primary key mostly doesn't make sense on UPDATE statements else if (query instanceof InsertQuery || updatablePrimaryKeys(settings(this))) key = getReturning(); if (key != null) query.setReturning(key); return key; }
@SuppressWarnings({ "unchecked", "rawtypes" }) @Override public Row valuesRow() { return new RowImpl(Tools.fields(intoArray(), fields.fields.fields())); }
/** * Set all changed values of this record to a store query */ final void addChangedValues(Field<?>[] storeFields, StoreQuery<R> query) { Fields<Record> f = new Fields<Record>(storeFields); for (Field<?> field : fields.fields.fields) { if (changed(field) && f.field(field) != null) { addValue(query, field); } } }
final int storeInsert(final Field<?>[] storeFields) { final int[] result = new int[1]; delegate(configuration(), (Record) this, INSERT) .operate(new RecordOperation<Record, RuntimeException>() { @Override public Record operate(Record record) throws RuntimeException { result[0] = storeInsert0(storeFields); return record; } }); return result[0]; }
@SuppressWarnings({ "unchecked", "rawtypes" }) @Override public Row valuesRow() { return new RowImpl(Utils.fields(intoArray(), fields.fields.fields())); }
/** * {@inheritDoc} */ @Override public Row3<UUID, Timestamp, Integer> fieldsRow() { return (Row3) super.fieldsRow(); }
/** * {@inheritDoc} */ @Override public org.jooq.Row11<java.lang.String, java.lang.String, java.lang.String, java.util.Date, java.lang.Integer, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String> valuesRow() { return (org.jooq.Row11) super.valuesRow(); }
/** * {@inheritDoc} */ @Override public Row4<UUID, UUID, UUID, UUID> fieldsRow() { return (Row4) super.fieldsRow(); }
/** * {@inheritDoc} */ @Override public Row7<Long, Timestamp, UUID, String, String, String, Object> valuesRow() { return (Row7) super.valuesRow(); }
/** * {@inheritDoc} */ @Override public Row7<Long, Timestamp, UUID, String, String, String, Object> fieldsRow() { return (Row7) super.fieldsRow(); }
/** * {@inheritDoc} */ @Override public Row6<UUID, UUID, UUID, String, String, byte[]> valuesRow() { return (Row6) super.valuesRow(); }
/** * {@inheritDoc} */ @Override public Row3<UUID, Timestamp, Integer> fieldsRow() { return (Row3) super.fieldsRow(); }