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 25, 2024
1 parent 7f492fc commit ce6a5d6
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 6 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 @@ -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)"
+ ");");
}
Expand Down

0 comments on commit ce6a5d6

Please sign in to comment.