Skip to content

Commit

Permalink
Add created_at and last_updated_at timestamps.
Browse files Browse the repository at this point in the history
We use application level timestamps to maintain
dialect compatibility between different SQL variations.
We truncate timestamp to granularity of days for privacy
reasons.
  • Loading branch information
G8XSU committed Jul 29, 2024
1 parent 187c6bc commit 19344ac
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 5 deletions.
18 changes: 13 additions & 5 deletions app/src/main/java/org/vss/impl/postgres/PostgresBackendImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<VssDbRecord> 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<VssDbRecord> 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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
);
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ private void createTable(DSLContext dslContext) {
+ "key character varying(120) 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)"
+ ");");
}
Expand Down

0 comments on commit 19344ac

Please sign in to comment.