diff --git a/app/src/main/java/org/vss/impl/postgres/PostgresBackendImpl.java b/app/src/main/java/org/vss/impl/postgres/PostgresBackendImpl.java index 3ed57ad..376fc07 100644 --- a/app/src/main/java/org/vss/impl/postgres/PostgresBackendImpl.java +++ b/app/src/main/java/org/vss/impl/postgres/PostgresBackendImpl.java @@ -2,6 +2,9 @@ import com.google.inject.Inject; import com.google.protobuf.ByteString; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -151,36 +154,41 @@ private Query buildPutObjectQuery(DSLContext dsl, VssDbRecord vssRecord) { private Query buildNonConditionalUpsertRecordQuery(DSLContext dsl, VssDbRecord vssRecord) { return dsl.insertInto(VSS_DB) .values(vssRecord.getStoreId(), vssRecord.getKey(), - vssRecord.getValue(), 1) + vssRecord.getValue(), 1, vssRecord.getCreatedAt(), vssRecord.getLastUpdatedAt()) .onConflict(VSS_DB.STORE_ID, VSS_DB.KEY) .doUpdate() .set(VSS_DB.VALUE, vssRecord.getValue()) - .set(VSS_DB.VERSION, 1L); + .set(VSS_DB.VERSION, 1L) + .set(VSS_DB.LAST_UPDATED_AT, vssRecord.getLastUpdatedAt()); } private Insert buildConditionalInsertRecordQuery(DSLContext dsl, VssDbRecord vssRecord) { return dsl.insertInto(VSS_DB) .values(vssRecord.getStoreId(), vssRecord.getKey(), - vssRecord.getValue(), 1) + vssRecord.getValue(), 1, vssRecord.getCreatedAt(), vssRecord.getLastUpdatedAt()) .onDuplicateKeyIgnore(); } private Update buildConditionalUpdateRecordQuery(DSLContext dsl, VssDbRecord vssRecord) { return dsl.update(VSS_DB) .set(Map.of(VSS_DB.VALUE, vssRecord.getValue(), - VSS_DB.VERSION, vssRecord.getVersion() + 1)) + VSS_DB.VERSION, vssRecord.getVersion() + 1, + VSS_DB.LAST_UPDATED_AT, vssRecord.getLastUpdatedAt())) .where(VSS_DB.STORE_ID.eq(vssRecord.getStoreId()) .and(VSS_DB.KEY.eq(vssRecord.getKey())) .and(VSS_DB.VERSION.eq(vssRecord.getVersion()))); } private VssDbRecord buildVssRecord(String storeId, KeyValue kv) { + OffsetDateTime today = OffsetDateTime.now(ZoneOffset.UTC).truncatedTo(ChronoUnit.DAYS); return new VssDbRecord() .setStoreId(storeId) .setKey(kv.getKey()) .setValue(kv.getValue().toByteArray()) - .setVersion(kv.getVersion()); + .setVersion(kv.getVersion()) + .setCreatedAt(today) + .setLastUpdatedAt(today); } @Override diff --git a/app/src/main/java/org/vss/impl/postgres/sql/v0_create_vss_db.sql b/app/src/main/java/org/vss/impl/postgres/sql/v0_create_vss_db.sql index bd81216..4051bca 100644 --- a/app/src/main/java/org/vss/impl/postgres/sql/v0_create_vss_db.sql +++ b/app/src/main/java/org/vss/impl/postgres/sql/v0_create_vss_db.sql @@ -3,5 +3,7 @@ CREATE TABLE vss_db ( key character varying(600) NOT NULL, value bytea NULL, version bigint NOT NULL, + created_at TIMESTAMP WITH TIME ZONE, + last_updated_at TIMESTAMP WITH TIME ZONE, PRIMARY KEY (store_id, key) ); diff --git a/app/src/test/java/org/vss/impl/postgres/PostgresBackendImplIntegrationTest.java b/app/src/test/java/org/vss/impl/postgres/PostgresBackendImplIntegrationTest.java index 76bf78c..57b5197 100644 --- a/app/src/test/java/org/vss/impl/postgres/PostgresBackendImplIntegrationTest.java +++ b/app/src/test/java/org/vss/impl/postgres/PostgresBackendImplIntegrationTest.java @@ -48,9 +48,11 @@ void destroy() throws Exception { private void createTable(DSLContext dslContext) { dslContext.execute("CREATE TABLE vss_db (" + "store_id character varying(120) NOT NULL CHECK (store_id <> '')," - + "key character varying(120) NOT NULL," + + "key character varying(600) NOT NULL," + "value bytea NULL," + "version bigint NOT NULL," + + "created_at TIMESTAMP WITH TIME ZONE," + + "last_updated_at TIMESTAMP WITH TIME ZONE," + "PRIMARY KEY (store_id, key)" + ");"); }