public void upsertUser(DSLContext tx, UUID teamId, UUID userId, TeamRole role) { tx.insertInto(USER_TEAMS) .columns(USER_TEAMS.TEAM_ID, USER_TEAMS.USER_ID, USER_TEAMS.TEAM_ROLE) .values(teamId, userId, role.toString()) .onConflict(USER_TEAMS.TEAM_ID, USER_TEAMS.USER_ID) .doUpdate().set(USER_TEAMS.TEAM_ROLE, role.toString()) .execute(); }
public synchronized void putString(UUID projectId, String key, String value) { ProjectKvStore kv = PROJECT_KV_STORE.as("kv"); tx(tx -> { int rows = tx.insertInto(kv) .columns(kv.PROJECT_ID, kv.VALUE_KEY, kv.VALUE_STRING) .values(projectId, key, value) .onConflict(kv.PROJECT_ID, kv.VALUE_KEY) .doUpdate().set(kv.VALUE_STRING, value) .execute(); if (rows != 1) { throw new DataAccessException("Invalid number of rows: " + rows); } }); }
public synchronized void putLong(UUID projectId, String key, long value) { ProjectKvStore kv = PROJECT_KV_STORE.as("kv"); tx(tx -> { int rows = tx.insertInto(kv) .columns(kv.PROJECT_ID, kv.VALUE_KEY, kv.VALUE_LONG) .values(projectId, key, value) .onConflict(kv.PROJECT_ID, kv.VALUE_KEY) .doUpdate().set(kv.VALUE_LONG, value) .execute(); if (rows != 1) { throw new DataAccessException("Invalid number of rows: " + rows); } }); }
public synchronized long inc(UUID projectId, String key) { ProjectKvStore kv = PROJECT_KV_STORE.as("kv"); return txResult(tx -> { // grab a lock, it will be released when the transaction ends tx.execute("select from pg_advisory_xact_lock(?)", hash(projectId, key)); // "upsert" the record tx.insertInto(kv) .columns(kv.PROJECT_ID, kv.VALUE_KEY, kv.VALUE_LONG) .values(projectId, key, 1L) .onConflict(kv.PROJECT_ID, kv.VALUE_KEY) .doUpdate().set(kv.VALUE_LONG, kv.VALUE_LONG.plus(1)) .execute(); // get an updated value return tx.select(kv.VALUE_LONG) .from(kv) .where(kv.PROJECT_ID.eq(projectId) .and(kv.VALUE_KEY.eq(key))) .fetchOne(kv.VALUE_LONG); }); }