Persist two singleton entities in SQL tables (#860)

* Persist two singleton entities in SQL tables

A table might not be the best place to store singleton entities, but by
doing this we ensure we can easily inspect them later and use the same
sort of persistence logic for these that we do elsewhere.

ServerSecret is stored upon retrieval so that we make sure that the same
secret is used in both Datastore and SQL (we wouldn't want to change
it).

* Responses to CR

* Don't have a separate ID for the singleton entities

* Rename secret UUID

* Rename and regenerate
This commit is contained in:
gbrodman 2020-11-09 13:47:42 -05:00 committed by GitHub
parent 8a1f5102ce
commit 9acac1a6a4
15 changed files with 759 additions and 215 deletions

View file

@ -20,15 +20,16 @@ import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.Id;
import com.googlecode.objectify.annotation.Parent;
import google.registry.model.ImmutableObject;
import javax.persistence.MappedSuperclass;
import javax.persistence.Transient;
/** A singleton entity in Datastore. */
@MappedSuperclass
public abstract class CrossTldSingleton extends ImmutableObject {
public static final long SINGLETON_ID = 1; // There is always exactly one of these.
@Id
long id = SINGLETON_ID;
@Id @Transient long id = SINGLETON_ID;
@Parent
Key<EntityGroupRoot> parent = getCrossTldKey();
@Transient @Parent Key<EntityGroupRoot> parent = getCrossTldKey();
}

View file

@ -14,29 +14,43 @@
package google.registry.model.server;
import static google.registry.model.ofy.ObjectifyService.ofy;
import static google.registry.model.common.EntityGroupRoot.getCrossTldKey;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import static google.registry.persistence.transaction.TransactionManagerFactory.ofyTm;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.common.collect.ImmutableList;
import com.google.common.primitives.Longs;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Ignore;
import com.googlecode.objectify.annotation.OnLoad;
import com.googlecode.objectify.annotation.Unindex;
import google.registry.model.annotations.NotBackedUp;
import google.registry.model.annotations.NotBackedUp.Reason;
import google.registry.model.common.CrossTldSingleton;
import google.registry.persistence.VKey;
import google.registry.schema.replay.DatastoreEntity;
import google.registry.schema.replay.SqlEntity;
import java.nio.ByteBuffer;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.PostLoad;
import javax.persistence.Transient;
/** A secret number used for generating tokens (such as XSRF tokens). */
@Entity
@javax.persistence.Entity
@Unindex
@NotBackedUp(reason = Reason.AUTO_GENERATED)
// TODO(b/27427316): Replace this with an entry in KMSKeyring
public class ServerSecret extends CrossTldSingleton {
public class ServerSecret extends CrossTldSingleton implements DatastoreEntity, SqlEntity {
/**
* Cache of the singleton ServerSecret instance that creates it if not present.
@ -45,28 +59,34 @@ public class ServerSecret extends CrossTldSingleton {
* Supplier that can be reset for testing purposes.
*/
private static final LoadingCache<Class<ServerSecret>, ServerSecret> CACHE =
CacheBuilder.newBuilder().build(
CacheBuilder.newBuilder()
.build(
new CacheLoader<Class<ServerSecret>, ServerSecret>() {
@Override
public ServerSecret load(Class<ServerSecret> unused) {
// Fast path - non-transactional load to hit memcache.
ServerSecret secret = ofy().load().entity(new ServerSecret()).now();
if (secret != null) {
return retrieveAndSaveSecret();
}
});
private static ServerSecret retrieveAndSaveSecret() {
VKey<ServerSecret> key =
VKey.create(
ServerSecret.class,
SINGLETON_ID,
Key.create(getCrossTldKey(), ServerSecret.class, SINGLETON_ID));
return tm().transact(
() -> {
// transactionally create a new ServerSecret (once per app setup) if necessary.
// return the ofy() result during Datastore-primary phase
ServerSecret secret =
ofyTm().maybeLoad(key).orElseGet(() -> create(UUID.randomUUID()));
// During a dual-write period, write it to both Datastore and SQL
// even if we didn't have to retrieve it from the DB
ofyTm().transact(() -> ofyTm().putWithoutBackup(secret));
jpaTm().transact(() -> jpaTm().putWithoutBackup(secret));
return secret;
}
// Slow path - transactionally create a new ServerSecret (once per app setup).
return tm().transact(() -> {
// Check again for an existing secret within the transaction to avoid races.
ServerSecret secret1 = ofy().load().entity(new ServerSecret()).now();
if (secret1 == null) {
UUID uuid = UUID.randomUUID();
secret1 = create(uuid.getMostSignificantBits(), uuid.getLeastSignificantBits());
ofy().saveWithoutBackup().entity(secret1).now();
}
return secret1;
});
}
});
/** Returns the global ServerSecret instance, creating it if one isn't already in Datastore. */
public static ServerSecret get() {
@ -77,23 +97,38 @@ public class ServerSecret extends CrossTldSingleton {
}
}
/** Most significant 8 bytes of the UUID value. */
long mostSignificant;
/** Most significant 8 bytes of the UUID value (stored separately for legacy purposes). */
@Transient long mostSignificant;
/** Least significant 8 bytes of the UUID value. */
long leastSignificant;
/** Least significant 8 bytes of the UUID value (stored separately for legacy purposes). */
@Transient long leastSignificant;
@VisibleForTesting
static ServerSecret create(long mostSignificant, long leastSignificant) {
ServerSecret secret = new ServerSecret();
secret.mostSignificant = mostSignificant;
secret.leastSignificant = leastSignificant;
return secret;
/** The UUID value itself. */
@Id
@Column(columnDefinition = "uuid")
@Ignore
UUID secret;
/** Convert the Datastore representation to SQL. */
@OnLoad
void onLoad() {
secret = new UUID(mostSignificant, leastSignificant);
}
/** Returns the value of this ServerSecret as a UUID. */
public UUID asUuid() {
return new UUID(mostSignificant, leastSignificant);
/** Convert the SQL representation to Datastore. */
@PostLoad
void postLoad() {
mostSignificant = secret.getMostSignificantBits();
leastSignificant = secret.getLeastSignificantBits();
}
@VisibleForTesting
static ServerSecret create(UUID uuid) {
ServerSecret secret = new ServerSecret();
secret.mostSignificant = uuid.getMostSignificantBits();
secret.leastSignificant = uuid.getLeastSignificantBits();
secret.secret = uuid;
return secret;
}
/** Returns the value of this ServerSecret as a byte array. */
@ -104,6 +139,16 @@ public class ServerSecret extends CrossTldSingleton {
.array();
}
@Override
public ImmutableList<SqlEntity> toSqlEntities() {
return ImmutableList.of(); // dually-written
}
@Override
public ImmutableList<DatastoreEntity> toDatastoreEntities() {
return ImmutableList.of(); // dually-written
}
@VisibleForTesting
static void resetCache() {
CACHE.invalidateAll();

View file

@ -15,31 +15,50 @@
package google.registry.model.tmch;
import static com.google.common.base.Preconditions.checkNotNull;
import static google.registry.model.ofy.ObjectifyService.ofy;
import static google.registry.model.common.EntityGroupRoot.getCrossTldKey;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import static google.registry.persistence.transaction.TransactionManagerFactory.ofyTm;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
import com.google.common.collect.ImmutableList;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.Entity;
import google.registry.model.annotations.NotBackedUp;
import google.registry.model.annotations.NotBackedUp.Reason;
import google.registry.model.common.CrossTldSingleton;
import javax.annotation.Nullable;
import google.registry.model.tmch.TmchCrl.TmchCrlId;
import google.registry.persistence.VKey;
import google.registry.schema.replay.DatastoreEntity;
import google.registry.schema.replay.SqlEntity;
import java.io.Serializable;
import java.util.Optional;
import javax.annotation.concurrent.Immutable;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.IdClass;
import org.joda.time.DateTime;
/** Datastore singleton for ICANN's TMCH CA certificate revocation list (CRL). */
@Entity
@javax.persistence.Entity
@Immutable
@NotBackedUp(reason = Reason.EXTERNALLY_SOURCED)
public final class TmchCrl extends CrossTldSingleton {
@IdClass(TmchCrlId.class)
public final class TmchCrl extends CrossTldSingleton implements DatastoreEntity, SqlEntity {
String crl;
DateTime updated;
String url;
@Id String crl;
@Id DateTime updated;
@Id String url;
/** Returns the singleton instance of this entity, without memoization. */
@Nullable
public static TmchCrl get() {
return ofy().load().entity(new TmchCrl()).now();
public static Optional<TmchCrl> get() {
VKey<TmchCrl> key =
VKey.create(
TmchCrl.class, SINGLETON_ID, Key.create(getCrossTldKey(), TmchCrl.class, SINGLETON_ID));
// return the ofy() result during Datastore-primary phase
return ofyTm().transact(() -> ofyTm().maybeLoad(key));
}
/**
@ -47,16 +66,18 @@ public final class TmchCrl extends CrossTldSingleton {
*
* <p>Please do not call this function unless your CRL is properly formatted, signed by the root,
* and actually newer than the one currently in Datastore.
*
* <p>During the dual-write period, we write to both Datastore and SQL
*/
public static void set(final String crl, final String url) {
tm()
.transactNew(
tm().transact(
() -> {
TmchCrl tmchCrl = new TmchCrl();
tmchCrl.updated = tm().getTransactionTime();
tmchCrl.crl = checkNotNull(crl, "crl");
tmchCrl.url = checkNotNull(url, "url");
ofy().saveWithoutBackup().entity(tmchCrl);
ofyTm().transactNew(() -> ofyTm().putWithoutBackup(tmchCrl));
jpaTm().transactNew(() -> jpaTm().putWithoutBackup(tmchCrl));
});
}
@ -74,4 +95,36 @@ public final class TmchCrl extends CrossTldSingleton {
public final DateTime getUpdated() {
return updated;
}
@Override
public ImmutableList<SqlEntity> toSqlEntities() {
return ImmutableList.of(); // dually-written
}
@Override
public ImmutableList<DatastoreEntity> toDatastoreEntities() {
return ImmutableList.of(); // dually-written
}
static class TmchCrlId implements Serializable {
@Column(name = "certificateRevocations")
String crl;
@Column(name = "updateTimestamp")
DateTime updated;
String url;
/** Hibernate requires this default constructor. */
private TmchCrlId() {}
static TmchCrlId create(String crl, DateTime updated, String url) {
TmchCrlId result = new TmchCrlId();
result.crl = crl;
result.updated = updated;
result.url = url;
return result;
}
}
}

View file

@ -32,6 +32,7 @@ import java.security.GeneralSecurityException;
import java.security.cert.CertificateParsingException;
import java.security.cert.X509CRL;
import java.security.cert.X509Certificate;
import java.util.Optional;
import javax.annotation.concurrent.Immutable;
import javax.annotation.concurrent.ThreadSafe;
import javax.inject.Inject;
@ -82,14 +83,15 @@ public final class TmchCertificateAuthority {
new CacheLoader<TmchCaMode, X509CRL>() {
@Override
public X509CRL load(final TmchCaMode tmchCaMode) throws GeneralSecurityException {
TmchCrl storedCrl = TmchCrl.get();
String crlContents;
if (storedCrl == null) {
Optional<TmchCrl> storedCrl = TmchCrl.get();
String crlContents =
storedCrl
.map(TmchCrl::getCrl)
.orElseGet(
() -> {
String file = (tmchCaMode == PILOT) ? CRL_PILOT_FILE : CRL_FILE;
crlContents = readResourceUtf8(TmchCertificateAuthority.class, file);
} else {
crlContents = storedCrl.getCrl();
}
return readResourceUtf8(TmchCertificateAuthority.class, file);
});
X509CRL crl = X509Utils.loadCrl(crlContents);
crl.verify(ROOT_CERTS.get(tmchCaMode).getPublicKey());
return crl;

View file

@ -63,8 +63,10 @@
<class>google.registry.model.reporting.DomainTransactionRecord</class>
<class>google.registry.model.reporting.Spec11ThreatMatch</class>
<class>google.registry.model.server.KmsSecretRevision</class>
<class>google.registry.model.server.ServerSecret</class>
<class>google.registry.model.smd.SignedMarkRevocationList</class>
<class>google.registry.model.tmch.ClaimsListShard</class>
<class>google.registry.model.tmch.TmchCrl</class>
<class>google.registry.persistence.transaction.TransactionEntity</class>
<class>google.registry.schema.cursor.Cursor</class>
<class>google.registry.schema.domain.RegistryLock</class>

View file

@ -15,21 +15,25 @@
package google.registry.model.server;
import static com.google.common.truth.Truth.assertThat;
import static google.registry.model.common.CrossTldSingleton.SINGLETON_ID;
import static google.registry.model.common.EntityGroupRoot.getCrossTldKey;
import static google.registry.model.ofy.ObjectifyService.ofy;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import com.googlecode.objectify.Key;
import google.registry.model.EntityTestCase;
import google.registry.model.ofy.RequestCapturingAsyncDatastoreService;
import google.registry.testing.AppEngineExtension;
import google.registry.persistence.VKey;
import java.util.UUID;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
/** Unit tests for {@link ServerSecret}. */
public class ServerSecretTest {
public class ServerSecretTest extends EntityTestCase {
@RegisterExtension
public final AppEngineExtension appEngine =
AppEngineExtension.builder().withDatastoreAndCloudSql().build();
ServerSecretTest() {
super(JpaEntityCoverageCheck.ENABLED);
}
@BeforeEach
void beforeEach() {
@ -41,18 +45,20 @@ public class ServerSecretTest {
ServerSecret secret = ServerSecret.get();
assertThat(secret).isNotNull();
assertThat(ofy().load().entity(new ServerSecret()).now()).isEqualTo(secret);
assertThat(loadFromSql()).isEqualTo(secret);
}
@Test
void testGet_existingSecret_returned() {
ServerSecret secret = ServerSecret.create(123, 456);
ServerSecret secret = ServerSecret.create(new UUID(123, 456));
ofy().saveWithoutBackup().entity(secret).now();
assertThat(ServerSecret.get()).isEqualTo(secret);
assertThat(ofy().load().entity(new ServerSecret()).now()).isEqualTo(secret);
assertThat(loadFromSql()).isEqualTo(secret);
}
@Test
void testGet_cachedSecret_returnedWithoutDatastoreRead() {
void testGet_cachedSecret() {
int numInitialReads = RequestCapturingAsyncDatastoreService.getReads().size();
ServerSecret secret = ServerSecret.get();
int numReads = RequestCapturingAsyncDatastoreService.getReads().size();
@ -62,16 +68,28 @@ public class ServerSecretTest {
}
@Test
void testAsUuid() {
UUID uuid = ServerSecret.create(123, 456).asUuid();
assertThat(uuid.getMostSignificantBits()).isEqualTo(123);
assertThat(uuid.getLeastSignificantBits()).isEqualTo(456);
void testAsBytes() {
byte[] bytes = ServerSecret.create(new UUID(123, 0x456)).asBytes();
assertThat(bytes).isEqualTo(new byte[] {0, 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0x4, 0x56});
}
@Test
void testAsBytes() {
byte[] bytes = ServerSecret.create(123, 0x456).asBytes();
assertThat(bytes)
.isEqualTo(new byte[] {0, 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0x4, 0x56});
private static ServerSecret loadFromSql() {
return jpaTm()
.transact(
() ->
jpaTm()
.getEntityManager()
.createQuery("FROM ServerSecret", ServerSecret.class)
.setMaxResults(1)
.getResultStream()
.findFirst()
.get());
}
private static VKey<ServerSecret> createKey() {
return VKey.create(
ServerSecret.class,
SINGLETON_ID,
Key.create(getCrossTldKey(), ServerSecret.class, SINGLETON_ID));
}
}

View file

@ -15,22 +15,48 @@
package google.registry.model.tmch;
import static com.google.common.truth.Truth.assertThat;
import static google.registry.model.ofy.ObjectifyService.ofy;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import google.registry.testing.AppEngineExtension;
import google.registry.model.EntityTestCase;
import java.util.Optional;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
/** Unit tests for {@link TmchCrl}. */
public class TmchCrlTest {
public class TmchCrlTest extends EntityTestCase {
@RegisterExtension
public final AppEngineExtension appEngine =
AppEngineExtension.builder().withDatastoreAndCloudSql().build();
TmchCrlTest() {
super(JpaEntityCoverageCheck.ENABLED);
}
@Test
void testSuccess() {
assertThat(TmchCrl.get()).isNull();
TmchCrl.set("lolcat", "http://lol.cat");
assertThat(TmchCrl.get().getCrl()).isEqualTo("lolcat");
assertThat(TmchCrl.get()).isEqualTo(Optional.empty());
TmchCrl.set("lolcat", "https://lol.cat");
assertThat(TmchCrl.get().get().getCrl()).isEqualTo("lolcat");
}
@Test
void testDualWrite() {
TmchCrl expected = new TmchCrl();
expected.crl = "lolcat";
expected.url = "https://lol.cat";
expected.updated = fakeClock.nowUtc();
TmchCrl.set("lolcat", "https://lol.cat");
assertThat(ofy().load().entity(new TmchCrl()).now()).isEqualTo(expected);
assertThat(loadFromSql()).isEqualTo(expected);
}
private static TmchCrl loadFromSql() {
return jpaTm()
.transact(
() ->
jpaTm()
.getEntityManager()
.createQuery("FROM TmchCrl", TmchCrl.class)
.setMaxResults(1)
.getResultStream()
.findFirst()
.get());
}
}

View file

@ -43,12 +43,13 @@ import org.junit.jupiter.api.extension.RegisterExtension;
/** Unit tests for {@link RequestAuthenticator}. */
class RequestAuthenticatorTest {
@RegisterExtension final AppEngineExtension appEngine = AppEngineExtension.builder().build();
@RegisterExtension
final AppEngineExtension appEngine =
AppEngineExtension.builder().withDatastoreAndCloudSql().build();
private static final AuthSettings AUTH_NONE = AuthSettings.create(
ImmutableList.of(AuthMethod.INTERNAL),
AuthLevel.NONE,
UserPolicy.IGNORED);
private static final AuthSettings AUTH_NONE =
AuthSettings.create(
ImmutableList.of(AuthMethod.INTERNAL), AuthLevel.NONE, UserPolicy.IGNORED);
private static final AuthSettings AUTH_INTERNAL_OR_ADMIN = AuthSettings.create(
ImmutableList.of(AuthMethod.INTERNAL),

View file

@ -30,8 +30,10 @@ import google.registry.model.registry.RegistryTest;
import google.registry.model.registry.label.ReservedListSqlDaoTest;
import google.registry.model.reporting.Spec11ThreatMatchTest;
import google.registry.model.server.KmsSecretRevisionSqlDaoTest;
import google.registry.model.server.ServerSecretTest;
import google.registry.model.smd.SignedMarkRevocationListDaoTest;
import google.registry.model.tmch.ClaimsListDaoTest;
import google.registry.model.tmch.TmchCrlTest;
import google.registry.persistence.transaction.JpaEntityCoverageExtension;
import google.registry.persistence.transaction.JpaTestRules.JpaIntegrationWithCoverageExtension;
import google.registry.schema.cursor.CursorDaoTest;
@ -95,8 +97,10 @@ import org.junit.runner.RunWith;
RegistryTest.class,
ReservedListSqlDaoTest.class,
RegistryLockDaoTest.class,
ServerSecretTest.class,
SignedMarkRevocationListDaoTest.class,
Spec11ThreatMatchTest.class,
TmchCrlTest.class,
// AfterSuiteTest must be the last entry. See class javadoc for details.
AfterSuiteTest.class
})

View file

@ -261,19 +261,19 @@ td.section {
</tr>
<tr>
<td class="property_name">generated on</td>
<td class="property_value">2020-11-04 16:40:52.942256</td>
<td class="property_value">2020-11-09 17:11:19.905881</td>
</tr>
<tr>
<td class="property_name">last flyway file</td>
<td id="lastFlywayFile" class="property_value">V72__add_missing_foreign_keys.sql</td>
<td id="lastFlywayFile" class="property_value">V73__singleton_entities.sql</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<svg viewbox="0.00 0.00 6024.44 2117.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="erDiagram" style="overflow: hidden; width: 100%; height: 800px"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 2113.5)">
<svg viewbox="0.00 0.00 6024.44 2289.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="erDiagram" style="overflow: hidden; width: 100%; height: 800px"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 2285.5)">
<title>SchemaCrawler_Diagram</title>
<polygon fill="white" stroke="transparent" points="-4,4 -4,-2113.5 6020.44,-2113.5 6020.44,4 -4,4" />
<polygon fill="white" stroke="transparent" points="-4,4 -4,-2285.5 6020.44,-2285.5 6020.44,4 -4,4" />
<text text-anchor="start" x="5747.94" y="-29.8" font-family="Helvetica,sans-Serif" font-size="14.00">
generated by
</text>
@ -284,7 +284,7 @@ td.section {
generated on
</text>
<text text-anchor="start" x="5830.94" y="-10.8" font-family="Helvetica,sans-Serif" font-size="14.00">
2020-11-04 16:40:52.942256
2020-11-09 17:11:19.905881
</text>
<polygon fill="none" stroke="#888888" points="5743.44,-4 5743.44,-44 6008.44,-44 6008.44,-4 5743.44,-4" /> <!-- allocationtoken_a08ccbef -->
<g id="node1" class="node">
@ -1352,7 +1352,7 @@ td.section {
fk_domain_transfer_losing_registrar_id
</text>
</g> <!-- tld_f1fa57e2 -->
<g id="node34" class="node">
<g id="node35" class="node">
<title>tld_f1fa57e2</title>
<polygon fill="#ebcef2" stroke="transparent" points="2521.5,-1406 2521.5,-1425 2594.5,-1425 2594.5,-1406 2521.5,-1406" />
<text text-anchor="start" x="2523.5" y="-1412.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
@ -2956,97 +2956,153 @@ td.section {
<text text-anchor="start" x="5480" y="-1908.8" font-family="Helvetica,sans-Serif" font-size="14.00">
fkgq03rk0bt1hb915dnyvd3vnfc
</text>
</g> <!-- signedmarkrevocationentry_99c39721 -->
</g> <!-- serversecret_6cc90f09 -->
<g id="node32" class="node">
<title>serversecret_6cc90f09</title>
<polygon fill="#ebcef2" stroke="transparent" points="5747.5,-1982 5747.5,-2001 5878.5,-2001 5878.5,-1982 5747.5,-1982" />
<text text-anchor="start" x="5749.5" y="-1988.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.ServerSecret
</text>
<polygon fill="#ebcef2" stroke="transparent" points="5878.5,-1982 5878.5,-2001 5955.5,-2001 5955.5,-1982 5878.5,-1982" />
<text text-anchor="start" x="5916.5" y="-1987.8" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="5749.5" y="-1969.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
secret
</text>
<text text-anchor="start" x="5832.5" y="-1968.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="5880.5" y="-1968.8" font-family="Helvetica,sans-Serif" font-size="14.00">
uuid not null
</text>
<polygon fill="none" stroke="#888888" points="5746.5,-1962 5746.5,-2002 5956.5,-2002 5956.5,-1962 5746.5,-1962" />
</g> <!-- signedmarkrevocationentry_99c39721 -->
<g id="node33" class="node">
<title>signedmarkrevocationentry_99c39721</title>
<polygon fill="#ebcef2" stroke="transparent" points="5698.5,-2000 5698.5,-2019 5931.5,-2019 5931.5,-2000 5698.5,-2000" />
<text text-anchor="start" x="5700.5" y="-2006.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="5698.5,-2067 5698.5,-2086 5931.5,-2086 5931.5,-2067 5698.5,-2067" />
<text text-anchor="start" x="5700.5" y="-2073.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.SignedMarkRevocationEntry
</text>
<polygon fill="#ebcef2" stroke="transparent" points="5931.5,-2000 5931.5,-2019 6005.5,-2019 6005.5,-2000 5931.5,-2000" />
<text text-anchor="start" x="5966.5" y="-2005.8" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="5931.5,-2067 5931.5,-2086 6005.5,-2086 6005.5,-2067 5931.5,-2067" />
<text text-anchor="start" x="5966.5" y="-2072.8" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="5700.5" y="-1987.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="5700.5" y="-2054.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id
</text>
<text text-anchor="start" x="5850.5" y="-1986.8" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="5850.5" y="-2053.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="5933.5" y="-1986.8" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="5933.5" y="-2053.8" font-family="Helvetica,sans-Serif" font-size="14.00">
int8 not null
</text>
<text text-anchor="start" x="5700.5" y="-1968.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="5700.5" y="-2035.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
smd_id
</text>
<text text-anchor="start" x="5850.5" y="-1967.8" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="5850.5" y="-2034.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="5933.5" y="-1967.8" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="5933.5" y="-2034.8" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="5697,-1961.5 5697,-2020.5 6006,-2020.5 6006,-1961.5 5697,-1961.5" />
<polygon fill="none" stroke="#888888" points="5697,-2028.5 5697,-2087.5 6006,-2087.5 6006,-2028.5 5697,-2028.5" />
</g> <!-- signedmarkrevocationlist_c5d968fb -->
<g id="node33" class="node">
<g id="node34" class="node">
<title>signedmarkrevocationlist_c5d968fb</title>
<polygon fill="#ebcef2" stroke="transparent" points="5077.5,-2000 5077.5,-2019 5299.5,-2019 5299.5,-2000 5077.5,-2000" />
<text text-anchor="start" x="5079.5" y="-2006.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="5077.5,-2067 5077.5,-2086 5299.5,-2086 5299.5,-2067 5077.5,-2067" />
<text text-anchor="start" x="5079.5" y="-2073.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.SignedMarkRevocationList
</text>
<polygon fill="#ebcef2" stroke="transparent" points="5299.5,-2000 5299.5,-2019 5409.5,-2019 5409.5,-2000 5299.5,-2000" />
<text text-anchor="start" x="5370.5" y="-2005.8" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="5299.5,-2067 5299.5,-2086 5409.5,-2086 5409.5,-2067 5299.5,-2067" />
<text text-anchor="start" x="5370.5" y="-2072.8" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="5079.5" y="-1987.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="5079.5" y="-2054.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id
</text>
<text text-anchor="start" x="5224.5" y="-1986.8" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="5224.5" y="-2053.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="5301.5" y="-1986.8" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="5301.5" y="-2053.8" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null
</text>
<text text-anchor="start" x="5224.5" y="-1967.8" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="5224.5" y="-2034.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="5301.5" y="-1967.8" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="5301.5" y="-2034.8" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented
</text>
<polygon fill="none" stroke="#888888" points="5076.5,-1961.5 5076.5,-2020.5 5410.5,-2020.5 5410.5,-1961.5 5076.5,-1961.5" />
<polygon fill="none" stroke="#888888" points="5076.5,-2028.5 5076.5,-2087.5 5410.5,-2087.5 5410.5,-2028.5 5076.5,-2028.5" />
</g> <!-- signedmarkrevocationentry_99c39721&#45;&gt;signedmarkrevocationlist_c5d968fb -->
<g id="edge78" class="edge">
<title>signedmarkrevocationentry_99c39721:w-&gt;signedmarkrevocationlist_c5d968fb:e</title>
<path fill="none" stroke="black" d="M5679.48,-1990C5569.8,-1990 5533.86,-1990 5420.6,-1990" />
<polygon fill="black" stroke="black" points="5687.5,-1990 5697.5,-1994.5 5692.5,-1990 5697.5,-1990 5697.5,-1990 5697.5,-1990 5692.5,-1990 5697.5,-1985.5 5687.5,-1990 5687.5,-1990" />
<ellipse fill="none" stroke="black" cx="5683.5" cy="-1990" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="5411.5,-1995 5411.5,-1985 5413.5,-1985 5413.5,-1995 5411.5,-1995" />
<polyline fill="none" stroke="black" points="5410.5,-1990 5415.5,-1990 " />
<polygon fill="black" stroke="black" points="5416.5,-1995 5416.5,-1985 5418.5,-1985 5418.5,-1995 5416.5,-1995" />
<polyline fill="none" stroke="black" points="5415.5,-1990 5420.5,-1990 " />
<text text-anchor="start" x="5489" y="-1993.8" font-family="Helvetica,sans-Serif" font-size="14.00">
<path fill="none" stroke="black" d="M5679.48,-2057C5569.8,-2057 5533.86,-2057 5420.6,-2057" />
<polygon fill="black" stroke="black" points="5687.5,-2057 5697.5,-2061.5 5692.5,-2057 5697.5,-2057 5697.5,-2057 5697.5,-2057 5692.5,-2057 5697.5,-2052.5 5687.5,-2057 5687.5,-2057" />
<ellipse fill="none" stroke="black" cx="5683.5" cy="-2057" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="5411.5,-2062 5411.5,-2052 5413.5,-2052 5413.5,-2062 5411.5,-2062" />
<polyline fill="none" stroke="black" points="5410.5,-2057 5415.5,-2057 " />
<polygon fill="black" stroke="black" points="5416.5,-2062 5416.5,-2052 5418.5,-2052 5418.5,-2062 5416.5,-2062" />
<polyline fill="none" stroke="black" points="5415.5,-2057 5420.5,-2057 " />
<text text-anchor="start" x="5489" y="-2060.8" font-family="Helvetica,sans-Serif" font-size="14.00">
fk5ivlhvs3121yx2li5tqh54u4
</text>
</g> <!-- transaction_d50389d4 -->
<g id="node35" class="node">
<title>transaction_d50389d4</title>
<polygon fill="#ebcef2" stroke="transparent" points="5734.5,-2085 5734.5,-2104 5859.5,-2104 5859.5,-2085 5734.5,-2085" />
<text text-anchor="start" x="5736.5" y="-2091.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.Transaction
</g> <!-- tmchcrl_d282355 -->
<g id="node36" class="node">
<title>tmchcrl_d282355</title>
<polygon fill="#ebcef2" stroke="transparent" points="5708.5,-2172 5708.5,-2191 5868.5,-2191 5868.5,-2172 5708.5,-2172" />
<text text-anchor="start" x="5710.5" y="-2178.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.TmchCrl
</text>
<polygon fill="#ebcef2" stroke="transparent" points="5859.5,-2085 5859.5,-2104 5969.5,-2104 5969.5,-2085 5859.5,-2085" />
<text text-anchor="start" x="5930.5" y="-2090.8" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="5868.5,-2172 5868.5,-2191 5994.5,-2191 5994.5,-2172 5868.5,-2172" />
<text text-anchor="start" x="5955.5" y="-2177.8" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="5736.5" y="-2072.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="5710.5" y="-2159.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
certificate_revocations
</text>
<text text-anchor="start" x="5862.5" y="-2158.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="5870.5" y="-2158.8" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<text text-anchor="start" x="5710.5" y="-2140.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
update_timestamp
</text>
<text text-anchor="start" x="5862.5" y="-2139.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="5870.5" y="-2139.8" font-family="Helvetica,sans-Serif" font-size="14.00">
timestamptz not null
</text>
<text text-anchor="start" x="5710.5" y="-2121.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
url
</text>
<text text-anchor="start" x="5862.5" y="-2120.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="5870.5" y="-2120.8" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="5707.5,-2114 5707.5,-2192 5995.5,-2192 5995.5,-2114 5707.5,-2114" />
</g> <!-- transaction_d50389d4 -->
<g id="node37" class="node">
<title>transaction_d50389d4</title>
<polygon fill="#ebcef2" stroke="transparent" points="5734.5,-2257 5734.5,-2276 5859.5,-2276 5859.5,-2257 5734.5,-2257" />
<text text-anchor="start" x="5736.5" y="-2263.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.Transaction
</text>
<polygon fill="#ebcef2" stroke="transparent" points="5859.5,-2257 5859.5,-2276 5969.5,-2276 5969.5,-2257 5859.5,-2257" />
<text text-anchor="start" x="5930.5" y="-2262.8" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="5736.5" y="-2244.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
id
</text>
<text text-anchor="start" x="5803.5" y="-2071.8" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="5803.5" y="-2243.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="5861.5" y="-2071.8" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="5861.5" y="-2243.8" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null
</text>
<text text-anchor="start" x="5803.5" y="-2052.8" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="5803.5" y="-2224.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="5861.5" y="-2052.8" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="5861.5" y="-2224.8" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented
</text>
<polygon fill="none" stroke="#888888" points="5733,-2046.5 5733,-2105.5 5970,-2105.5 5970,-2046.5 5733,-2046.5" />
<polygon fill="none" stroke="#888888" points="5733,-2218.5 5733,-2277.5 5970,-2277.5 5970,-2218.5 5733,-2218.5" />
</g>
</g>
</svg>
@ -6461,6 +6517,36 @@ td.section {
</tbody>
</table>
<p>&nbsp;</p>
<table>
<caption style="background-color: #EBCEF2;"> <span id="serversecret_6cc90f09" class="caption_name">public.ServerSecret</span> <span class="caption_description">[table]</span>
</caption>
<tbody>
<tr>
<td class="spacer"></td>
<td class="minwidth"><b><i>secret</i></b></td>
<td class="minwidth">uuid not null</td>
</tr>
<tr>
<td colspan="3"></td>
</tr>
<tr>
<td colspan="3" class="section">Primary Key</td>
</tr>
<tr>
<td colspan="3"></td>
</tr>
<tr>
<td colspan="2" class="name">ServerSecret_pkey</td>
<td class="description right">[primary key]</td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth">secret</td>
<td class="minwidth"></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<table>
<caption style="background-color: #EBCEF2;"> <span id="signedmarkrevocationentry_99c39721" class="caption_name">public.SignedMarkRevocationEntry</span> <span class="caption_description">[table]</span>
</caption>
@ -6741,6 +6827,56 @@ td.section {
</tbody>
</table>
<p>&nbsp;</p>
<table>
<caption style="background-color: #EBCEF2;"> <span id="tmchcrl_d282355" class="caption_name">public.TmchCrl</span> <span class="caption_description">[table]</span>
</caption>
<tbody>
<tr>
<td class="spacer"></td>
<td class="minwidth"><b><i>certificate_revocations</i></b></td>
<td class="minwidth">text not null</td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth"><b><i>update_timestamp</i></b></td>
<td class="minwidth">timestamptz not null</td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth"><b><i>url</i></b></td>
<td class="minwidth">text not null</td>
</tr>
<tr>
<td colspan="3"></td>
</tr>
<tr>
<td colspan="3" class="section">Primary Key</td>
</tr>
<tr>
<td colspan="3"></td>
</tr>
<tr>
<td colspan="2" class="name">TmchCrl_pkey</td>
<td class="description right">[primary key]</td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth">certificate_revocations</td>
<td class="minwidth"></td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth">update_timestamp</td>
<td class="minwidth"></td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth">url</td>
<td class="minwidth"></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<table>
<caption style="background-color: #EBCEF2;"> <span id="transaction_d50389d4" class="caption_name">public.Transaction</span> <span class="caption_description">[table]</span>
</caption>

View file

@ -261,32 +261,32 @@ td.section {
</tr>
<tr>
<td class="property_name">generated on</td>
<td class="property_value">2020-11-04 16:40:50.903391</td>
<td class="property_value">2020-11-09 17:11:18.25328</td>
</tr>
<tr>
<td class="property_name">last flyway file</td>
<td id="lastFlywayFile" class="property_value">V72__add_missing_foreign_keys.sql</td>
<td id="lastFlywayFile" class="property_value">V73__singleton_entities.sql</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<svg viewbox="0.00 0.00 6687.18 4012.58" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="erDiagram" style="overflow: hidden; width: 100%; height: 800px"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 4008.58)">
<svg viewbox="0.00 0.00 6687.18 4086.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="erDiagram" style="overflow: hidden; width: 100%; height: 800px"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 4082.5)">
<title>SchemaCrawler_Diagram</title>
<polygon fill="white" stroke="transparent" points="-4,4 -4,-4008.58 6683.18,-4008.58 6683.18,4 -4,4" />
<text text-anchor="start" x="6410.68" y="-29.8" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="white" stroke="transparent" points="-4,4 -4,-4082.5 6683.18,-4082.5 6683.18,4 -4,4" />
<text text-anchor="start" x="6418.68" y="-29.8" font-family="Helvetica,sans-Serif" font-size="14.00">
generated by
</text>
<text text-anchor="start" x="6493.68" y="-29.8" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="6501.68" y="-29.8" font-family="Helvetica,sans-Serif" font-size="14.00">
SchemaCrawler 16.10.1
</text>
<text text-anchor="start" x="6409.68" y="-10.8" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="6417.68" y="-10.8" font-family="Helvetica,sans-Serif" font-size="14.00">
generated on
</text>
<text text-anchor="start" x="6493.68" y="-10.8" font-family="Helvetica,sans-Serif" font-size="14.00">
2020-11-04 16:40:50.903391
<text text-anchor="start" x="6501.68" y="-10.8" font-family="Helvetica,sans-Serif" font-size="14.00">
2020-11-09 17:11:18.25328
</text>
<polygon fill="none" stroke="#888888" points="6406.18,-4 6406.18,-44 6671.18,-44 6671.18,-4 6406.18,-4" /> <!-- allocationtoken_a08ccbef -->
<polygon fill="none" stroke="#888888" points="6414.18,-4 6414.18,-44 6671.18,-44 6671.18,-4 6414.18,-4" /> <!-- allocationtoken_a08ccbef -->
<g id="node1" class="node">
<title>allocationtoken_a08ccbef</title>
<polygon fill="#ebcef2" stroke="transparent" points="4893.5,-2257.5 4893.5,-2276.5 5059.5,-2276.5 5059.5,-2257.5 4893.5,-2257.5" />
@ -1577,7 +1577,7 @@ td.section {
</g> <!-- billingevent_a57d1815&#45;&gt;registrar_6e1503e3 -->
<g id="edge52" class="edge">
<title>billingevent_a57d1815:w-&gt;registrar_6e1503e3:e</title>
<path fill="none" stroke="black" d="M5617.46,-2382.76C4987.93,-2400.92 5717.68,-3381.71 5224,-3812.5 4818.8,-4166.09 4556.78,-3922.5 4019,-3922.5 4019,-3922.5 4019,-3922.5 740,-3922.5 455,-3922.5 396.2,-3710.2 324,-3434.5 316.46,-3405.72 327.99,-1373.99 301.43,-1215.31" />
<path fill="none" stroke="black" d="M5617.47,-2382.76C4988.34,-2400.9 5717.06,-3380.64 5224,-3811.5 4819.01,-4165.39 4556.82,-3922.5 4019,-3922.5 4019,-3922.5 4019,-3922.5 740,-3922.5 455,-3922.5 396.2,-3710.2 324,-3434.5 316.46,-3405.72 327.99,-1373.99 301.43,-1215.31" />
<polygon fill="black" stroke="black" points="5625.5,-2382.64 5635.56,-2387 5630.5,-2382.57 5635.5,-2382.5 5635.5,-2382.5 5635.5,-2382.5 5630.5,-2382.57 5635.44,-2378 5625.5,-2382.64 5625.5,-2382.64" />
<ellipse fill="none" stroke="black" cx="5621.5" cy="-2382.7" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="293.61,-1208.1 303.05,-1204.79 303.71,-1206.68 294.27,-1209.98 293.61,-1208.1" />
@ -3048,7 +3048,7 @@ td.section {
fk_domain_transfer_losing_registrar_id
</text>
</g> <!-- tld_f1fa57e2 -->
<g id="node34" class="node">
<g id="node35" class="node">
<title>tld_f1fa57e2</title>
<polygon fill="#ebcef2" stroke="transparent" points="2732.5,-3813.5 2732.5,-3832.5 3011.5,-3832.5 3011.5,-3813.5 2732.5,-3813.5" />
<text text-anchor="start" x="2734.5" y="-3820.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
@ -5124,7 +5124,7 @@ td.section {
<polyline fill="none" stroke="black" points="3138.5,-3804.5 3143.5,-3804.49 " />
<polygon fill="black" stroke="black" points="3144.51,-3809.49 3144.49,-3799.49 3146.49,-3799.49 3146.51,-3809.49 3144.51,-3809.49" />
<polyline fill="none" stroke="black" points="3143.5,-3804.49 3148.5,-3804.49 " />
<text text-anchor="start" x="3567.5" y="-3796.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3567.5" y="-3797.3" font-family="Helvetica,sans-Serif" font-size="14.00">
fk_spec11_threat_match_tld
</text>
</g> <!-- domaindsdatahistory_995b060d -->
@ -5385,14 +5385,14 @@ td.section {
</g> <!-- domaintransactionrecord_6e77ff61&#45;&gt;tld_f1fa57e2 -->
<g id="edge80" class="edge">
<title>domaintransactionrecord_6e77ff61:w-&gt;tld_f1fa57e2:e</title>
<path fill="none" stroke="black" d="M4849.46,-3673.5C4228.33,-3673.26 4062.99,-3661.39 3438,-3740.5 3315.19,-3756.04 3280.65,-3749.07 3164,-3790.5 3156,-3793.34 3153.09,-3798.48 3148.38,-3801.68" />
<path fill="none" stroke="black" d="M4849.46,-3673.5C4228.33,-3673.24 4062.85,-3660.29 3438,-3740.5 3315.14,-3756.27 3281.28,-3751.63 3164,-3791.5 3156.1,-3794.19 3153.06,-3798.95 3148.32,-3801.9" />
<polygon fill="black" stroke="black" points="4857.5,-3673.5 4867.5,-3678 4862.5,-3673.5 4867.5,-3673.5 4867.5,-3673.5 4867.5,-3673.5 4862.5,-3673.5 4867.5,-3669 4857.5,-3673.5 4857.5,-3673.5" />
<ellipse fill="none" stroke="black" cx="4853.5" cy="-3673.5" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="3140.83,-3809.03 3138.09,-3799.42 3140.01,-3798.87 3142.76,-3808.48 3140.83,-3809.03" />
<polyline fill="none" stroke="black" points="3138.5,-3804.5 3143.31,-3803.13 " />
<polygon fill="black" stroke="black" points="3145.64,-3807.66 3142.9,-3798.05 3144.82,-3797.5 3147.57,-3807.11 3145.64,-3807.66" />
<polyline fill="none" stroke="black" points="3143.31,-3803.13 3148.12,-3801.76 " />
<text text-anchor="start" x="3915.5" y="-3696.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="black" stroke="black" points="3140.75,-3809.08 3138.19,-3799.41 3140.12,-3798.9 3142.68,-3808.57 3140.75,-3809.08" />
<polyline fill="none" stroke="black" points="3138.5,-3804.5 3143.33,-3803.22 " />
<polygon fill="black" stroke="black" points="3145.58,-3807.8 3143.02,-3798.13 3144.95,-3797.62 3147.51,-3807.29 3145.58,-3807.8" />
<polyline fill="none" stroke="black" points="3143.33,-3803.22 3148.17,-3801.94 " />
<text text-anchor="start" x="3915.5" y="-3695.3" font-family="Helvetica,sans-Serif" font-size="14.00">
fk_domain_transaction_record_tld
</text>
</g> <!-- hosthistory_56210c2&#45;&gt;host_f21b78de -->
@ -6068,121 +6068,177 @@ td.section {
<text text-anchor="start" x="6075" y="-3670.3" font-family="Helvetica,sans-Serif" font-size="14.00">
fkgq03rk0bt1hb915dnyvd3vnfc
</text>
</g> <!-- signedmarkrevocationentry_99c39721 -->
</g> <!-- serversecret_6cc90f09 -->
<g id="node32" class="node">
<title>serversecret_6cc90f09</title>
<polygon fill="#ebcef2" stroke="transparent" points="6368.5,-3742.5 6368.5,-3761.5 6499.5,-3761.5 6499.5,-3742.5 6368.5,-3742.5" />
<text text-anchor="start" x="6370.5" y="-3749.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.ServerSecret
</text>
<polygon fill="#ebcef2" stroke="transparent" points="6499.5,-3742.5 6499.5,-3761.5 6576.5,-3761.5 6576.5,-3742.5 6499.5,-3742.5" />
<text text-anchor="start" x="6537.5" y="-3748.3" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="6370.5" y="-3730.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
secret
</text>
<text text-anchor="start" x="6453.5" y="-3729.3" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="6501.5" y="-3729.3" font-family="Helvetica,sans-Serif" font-size="14.00">
uuid not null
</text>
<polygon fill="none" stroke="#888888" points="6367.5,-3722.5 6367.5,-3762.5 6577.5,-3762.5 6577.5,-3722.5 6367.5,-3722.5" />
</g> <!-- signedmarkrevocationentry_99c39721 -->
<g id="node33" class="node">
<title>signedmarkrevocationentry_99c39721</title>
<polygon fill="#ebcef2" stroke="transparent" points="6293.5,-3780.5 6293.5,-3799.5 6526.5,-3799.5 6526.5,-3780.5 6293.5,-3780.5" />
<text text-anchor="start" x="6295.5" y="-3787.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="6293.5,-3846.5 6293.5,-3865.5 6526.5,-3865.5 6526.5,-3846.5 6293.5,-3846.5" />
<text text-anchor="start" x="6295.5" y="-3853.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.SignedMarkRevocationEntry
</text>
<polygon fill="#ebcef2" stroke="transparent" points="6526.5,-3780.5 6526.5,-3799.5 6652.5,-3799.5 6652.5,-3780.5 6526.5,-3780.5" />
<text text-anchor="start" x="6613.5" y="-3786.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="6526.5,-3846.5 6526.5,-3865.5 6652.5,-3865.5 6652.5,-3846.5 6526.5,-3846.5" />
<text text-anchor="start" x="6613.5" y="-3852.3" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="6295.5" y="-3768.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="6295.5" y="-3834.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id
</text>
<text text-anchor="start" x="6458.5" y="-3767.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="6458.5" y="-3833.3" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="6528.5" y="-3767.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="6528.5" y="-3833.3" font-family="Helvetica,sans-Serif" font-size="14.00">
int8 not null
</text>
<text text-anchor="start" x="6295.5" y="-3748.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="6295.5" y="-3814.3" font-family="Helvetica,sans-Serif" font-size="14.00">
revocation_time
</text>
<text text-anchor="start" x="6458.5" y="-3748.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="6458.5" y="-3814.3" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="6528.5" y="-3748.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="6528.5" y="-3814.3" font-family="Helvetica,sans-Serif" font-size="14.00">
timestamptz not null
</text>
<text text-anchor="start" x="6295.5" y="-3730.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="6295.5" y="-3796.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
smd_id
</text>
<text text-anchor="start" x="6458.5" y="-3729.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="6458.5" y="-3795.3" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="6528.5" y="-3729.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="6528.5" y="-3795.3" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="6292,-3722.5 6292,-3800.5 6653,-3800.5 6653,-3722.5 6292,-3722.5" />
<polygon fill="none" stroke="#888888" points="6292,-3788.5 6292,-3866.5 6653,-3866.5 6653,-3788.5 6292,-3788.5" />
</g> <!-- signedmarkrevocationlist_c5d968fb -->
<g id="node33" class="node">
<g id="node34" class="node">
<title>signedmarkrevocationlist_c5d968fb</title>
<polygon fill="#ebcef2" stroke="transparent" points="5672.5,-3780.5 5672.5,-3799.5 5894.5,-3799.5 5894.5,-3780.5 5672.5,-3780.5" />
<text text-anchor="start" x="5674.5" y="-3787.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="5672.5,-3846.5 5672.5,-3865.5 5894.5,-3865.5 5894.5,-3846.5 5672.5,-3846.5" />
<text text-anchor="start" x="5674.5" y="-3853.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.SignedMarkRevocationList
</text>
<polygon fill="#ebcef2" stroke="transparent" points="5894.5,-3780.5 5894.5,-3799.5 6004.5,-3799.5 6004.5,-3780.5 5894.5,-3780.5" />
<text text-anchor="start" x="5965.5" y="-3786.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="5894.5,-3846.5 5894.5,-3865.5 6004.5,-3865.5 6004.5,-3846.5 5894.5,-3846.5" />
<text text-anchor="start" x="5965.5" y="-3852.3" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="5674.5" y="-3768.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="5674.5" y="-3834.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id
</text>
<text text-anchor="start" x="5824.5" y="-3767.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="5824.5" y="-3833.3" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="5896.5" y="-3767.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="5896.5" y="-3833.3" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null
</text>
<text text-anchor="start" x="5824.5" y="-3748.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="5824.5" y="-3814.3" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="5896.5" y="-3748.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="5896.5" y="-3814.3" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented
</text>
<text text-anchor="start" x="5674.5" y="-3729.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="5674.5" y="-3795.3" font-family="Helvetica,sans-Serif" font-size="14.00">
creation_time
</text>
<text text-anchor="start" x="5824.5" y="-3729.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="5824.5" y="-3795.3" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="5896.5" y="-3729.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="5896.5" y="-3795.3" font-family="Helvetica,sans-Serif" font-size="14.00">
timestamptz
</text>
<polygon fill="none" stroke="#888888" points="5671.5,-3722.5 5671.5,-3800.5 6005.5,-3800.5 6005.5,-3722.5 5671.5,-3722.5" />
<polygon fill="none" stroke="#888888" points="5671.5,-3788.5 5671.5,-3866.5 6005.5,-3866.5 6005.5,-3788.5 5671.5,-3788.5" />
</g> <!-- signedmarkrevocationentry_99c39721&#45;&gt;signedmarkrevocationlist_c5d968fb -->
<g id="edge78" class="edge">
<title>signedmarkrevocationentry_99c39721:w-&gt;signedmarkrevocationlist_c5d968fb:e</title>
<path fill="none" stroke="black" d="M6274.48,-3771.5C6164.8,-3771.5 6128.86,-3771.5 6015.6,-3771.5" />
<polygon fill="black" stroke="black" points="6282.5,-3771.5 6292.5,-3776 6287.5,-3771.5 6292.5,-3771.5 6292.5,-3771.5 6292.5,-3771.5 6287.5,-3771.5 6292.5,-3767 6282.5,-3771.5 6282.5,-3771.5" />
<ellipse fill="none" stroke="black" cx="6278.5" cy="-3771.5" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="6006.5,-3776.5 6006.5,-3766.5 6008.5,-3766.5 6008.5,-3776.5 6006.5,-3776.5" />
<polyline fill="none" stroke="black" points="6005.5,-3771.5 6010.5,-3771.5 " />
<polygon fill="black" stroke="black" points="6011.5,-3776.5 6011.5,-3766.5 6013.5,-3766.5 6013.5,-3776.5 6011.5,-3776.5" />
<polyline fill="none" stroke="black" points="6010.5,-3771.5 6015.5,-3771.5 " />
<text text-anchor="start" x="6084" y="-3775.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<path fill="none" stroke="black" d="M6274.48,-3837.5C6164.8,-3837.5 6128.86,-3837.5 6015.6,-3837.5" />
<polygon fill="black" stroke="black" points="6282.5,-3837.5 6292.5,-3842 6287.5,-3837.5 6292.5,-3837.5 6292.5,-3837.5 6292.5,-3837.5 6287.5,-3837.5 6292.5,-3833 6282.5,-3837.5 6282.5,-3837.5" />
<ellipse fill="none" stroke="black" cx="6278.5" cy="-3837.5" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="6006.5,-3842.5 6006.5,-3832.5 6008.5,-3832.5 6008.5,-3842.5 6006.5,-3842.5" />
<polyline fill="none" stroke="black" points="6005.5,-3837.5 6010.5,-3837.5 " />
<polygon fill="black" stroke="black" points="6011.5,-3842.5 6011.5,-3832.5 6013.5,-3832.5 6013.5,-3842.5 6011.5,-3842.5" />
<polyline fill="none" stroke="black" points="6010.5,-3837.5 6015.5,-3837.5 " />
<text text-anchor="start" x="6084" y="-3841.3" font-family="Helvetica,sans-Serif" font-size="14.00">
fk5ivlhvs3121yx2li5tqh54u4
</text>
</g> <!-- transaction_d50389d4 -->
<g id="node35" class="node">
<title>transaction_d50389d4</title>
<polygon fill="#ebcef2" stroke="transparent" points="6355.5,-3884.5 6355.5,-3903.5 6480.5,-3903.5 6480.5,-3884.5 6355.5,-3884.5" />
<text text-anchor="start" x="6357.5" y="-3891.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.Transaction
</g> <!-- tmchcrl_d282355 -->
<g id="node36" class="node">
<title>tmchcrl_d282355</title>
<polygon fill="#ebcef2" stroke="transparent" points="6329.5,-3950.5 6329.5,-3969.5 6489.5,-3969.5 6489.5,-3950.5 6329.5,-3950.5" />
<text text-anchor="start" x="6331.5" y="-3957.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.TmchCrl
</text>
<polygon fill="#ebcef2" stroke="transparent" points="6480.5,-3884.5 6480.5,-3903.5 6590.5,-3903.5 6590.5,-3884.5 6480.5,-3884.5" />
<text text-anchor="start" x="6551.5" y="-3890.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="6489.5,-3950.5 6489.5,-3969.5 6615.5,-3969.5 6615.5,-3950.5 6489.5,-3950.5" />
<text text-anchor="start" x="6576.5" y="-3956.3" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="6357.5" y="-3872.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="6331.5" y="-3938.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
certificate_revocations
</text>
<text text-anchor="start" x="6483.5" y="-3937.3" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="6491.5" y="-3937.3" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<text text-anchor="start" x="6331.5" y="-3919.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
update_timestamp
</text>
<text text-anchor="start" x="6483.5" y="-3918.3" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="6491.5" y="-3918.3" font-family="Helvetica,sans-Serif" font-size="14.00">
timestamptz not null
</text>
<text text-anchor="start" x="6331.5" y="-3900.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
url
</text>
<text text-anchor="start" x="6483.5" y="-3899.3" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="6491.5" y="-3899.3" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="6328.5,-3892.5 6328.5,-3970.5 6616.5,-3970.5 6616.5,-3892.5 6328.5,-3892.5" />
</g> <!-- transaction_d50389d4 -->
<g id="node37" class="node">
<title>transaction_d50389d4</title>
<polygon fill="#ebcef2" stroke="transparent" points="6355.5,-4054.5 6355.5,-4073.5 6480.5,-4073.5 6480.5,-4054.5 6355.5,-4054.5" />
<text text-anchor="start" x="6357.5" y="-4061.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.Transaction
</text>
<polygon fill="#ebcef2" stroke="transparent" points="6480.5,-4054.5 6480.5,-4073.5 6590.5,-4073.5 6590.5,-4054.5 6480.5,-4054.5" />
<text text-anchor="start" x="6551.5" y="-4060.3" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="6357.5" y="-4042.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
id
</text>
<text text-anchor="start" x="6443.5" y="-3871.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="6443.5" y="-4041.3" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="6482.5" y="-3871.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="6482.5" y="-4041.3" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null
</text>
<text text-anchor="start" x="6443.5" y="-3852.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="6443.5" y="-4022.3" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="6482.5" y="-3852.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="6482.5" y="-4022.3" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented
</text>
<text text-anchor="start" x="6357.5" y="-3833.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="6357.5" y="-4003.3" font-family="Helvetica,sans-Serif" font-size="14.00">
contents
</text>
<text text-anchor="start" x="6443.5" y="-3833.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="6443.5" y="-4003.3" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="6482.5" y="-3833.3" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="6482.5" y="-4003.3" font-family="Helvetica,sans-Serif" font-size="14.00">
bytea
</text>
<polygon fill="none" stroke="#888888" points="6354,-3826.5 6354,-3904.5 6591,-3904.5 6591,-3826.5 6354,-3826.5" />
<polygon fill="none" stroke="#888888" points="6354,-3996.5 6354,-4074.5 6591,-4074.5 6591,-3996.5 6354,-3996.5" />
</g>
</g>
</svg>
@ -12531,6 +12587,54 @@ td.section {
</tbody>
</table>
<p>&nbsp;</p>
<table>
<caption style="background-color: #EBCEF2;"> <span id="serversecret_6cc90f09" class="caption_name">public.ServerSecret</span> <span class="caption_description">[table]</span>
</caption>
<tbody>
<tr>
<td class="spacer"></td>
<td class="minwidth"><b><i>secret</i></b></td>
<td class="minwidth">uuid not null</td>
</tr>
<tr>
<td colspan="3"></td>
</tr>
<tr>
<td colspan="3" class="section">Primary Key</td>
</tr>
<tr>
<td colspan="3"></td>
</tr>
<tr>
<td colspan="2" class="name">ServerSecret_pkey</td>
<td class="description right">[primary key]</td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth">secret</td>
<td class="minwidth"></td>
</tr>
<tr>
<td colspan="3"></td>
</tr>
<tr>
<td colspan="3" class="section">Indexes</td>
</tr>
<tr>
<td colspan="3"></td>
</tr>
<tr>
<td colspan="2" class="name">ServerSecret_pkey</td>
<td class="description right">[unique index]</td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth">secret</td>
<td class="minwidth">ascending</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<table>
<caption style="background-color: #EBCEF2;"> <span id="signedmarkrevocationentry_99c39721" class="caption_name">public.SignedMarkRevocationEntry</span> <span class="caption_description">[table]</span>
</caption>
@ -13129,6 +13233,84 @@ td.section {
</tbody>
</table>
<p>&nbsp;</p>
<table>
<caption style="background-color: #EBCEF2;"> <span id="tmchcrl_d282355" class="caption_name">public.TmchCrl</span> <span class="caption_description">[table]</span>
</caption>
<tbody>
<tr>
<td class="spacer"></td>
<td class="minwidth"><b><i>certificate_revocations</i></b></td>
<td class="minwidth">text not null</td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth"><b><i>update_timestamp</i></b></td>
<td class="minwidth">timestamptz not null</td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth"><b><i>url</i></b></td>
<td class="minwidth">text not null</td>
</tr>
<tr>
<td colspan="3"></td>
</tr>
<tr>
<td colspan="3" class="section">Primary Key</td>
</tr>
<tr>
<td colspan="3"></td>
</tr>
<tr>
<td colspan="2" class="name">TmchCrl_pkey</td>
<td class="description right">[primary key]</td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth">certificate_revocations</td>
<td class="minwidth"></td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth">update_timestamp</td>
<td class="minwidth"></td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth">url</td>
<td class="minwidth"></td>
</tr>
<tr>
<td colspan="3"></td>
</tr>
<tr>
<td colspan="3" class="section">Indexes</td>
</tr>
<tr>
<td colspan="3"></td>
</tr>
<tr>
<td colspan="2" class="name">TmchCrl_pkey</td>
<td class="description right">[unique index]</td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth">certificate_revocations</td>
<td class="minwidth">ascending</td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth">update_timestamp</td>
<td class="minwidth">ascending</td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth">url</td>
<td class="minwidth">ascending</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<table>
<caption style="background-color: #EBCEF2;"> <span id="transaction_d50389d4" class="caption_name">public.Transaction</span> <span class="caption_description">[table]</span>
</caption>

View file

@ -70,3 +70,4 @@ V69__change_primary_key_and_add_history_table_for_delegation_signer.sql
V70__signed_mark_revocation_list.sql
V71__create_kms_secret.sql
V72__add_missing_foreign_keys.sql
V73__singleton_entities.sql

View file

@ -0,0 +1,25 @@
-- Copyright 2020 The Nomulus Authors. All Rights Reserved.
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
CREATE TABLE "ServerSecret" (
secret uuid NOT NULL,
PRIMARY KEY (secret)
);
CREATE TABLE "TmchCrl" (
certificate_revocations text NOT NULL,
update_timestamp timestamptz NOT NULL,
url text NOT NULL,
PRIMARY KEY (certificate_revocations, update_timestamp, url)
);

View file

@ -626,6 +626,11 @@
primary key (revision_id)
);
create table "ServerSecret" (
secret uuid not null,
primary key (secret)
);
create table "SignedMarkRevocationEntry" (
revision_id int8 not null,
revocation_time timestamptz not null,
@ -692,6 +697,13 @@
primary key (tld_name)
);
create table "TmchCrl" (
certificate_revocations text not null,
update_timestamp timestamptz not null,
url text not null,
primary key (certificate_revocations, update_timestamp, url)
);
create table "Transaction" (
id bigserial not null,
contents bytea,

View file

@ -899,6 +899,15 @@ CREATE SEQUENCE public."SafeBrowsingThreat_id_seq"
ALTER SEQUENCE public."SafeBrowsingThreat_id_seq" OWNED BY public."Spec11ThreatMatch".id;
--
-- Name: ServerSecret; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE public."ServerSecret" (
secret uuid NOT NULL
);
--
-- Name: SignedMarkRevocationEntry; Type: TABLE; Schema: public; Owner: -
--
@ -985,6 +994,17 @@ CREATE TABLE public."Tld" (
);
--
-- Name: TmchCrl; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE public."TmchCrl" (
certificate_revocations text NOT NULL,
update_timestamp timestamp with time zone NOT NULL,
url text NOT NULL
);
--
-- Name: Transaction; Type: TABLE; Schema: public; Owner: -
--
@ -1302,6 +1322,14 @@ ALTER TABLE ONLY public."Spec11ThreatMatch"
ADD CONSTRAINT "SafeBrowsingThreat_pkey" PRIMARY KEY (id);
--
-- Name: ServerSecret ServerSecret_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public."ServerSecret"
ADD CONSTRAINT "ServerSecret_pkey" PRIMARY KEY (secret);
--
-- Name: SignedMarkRevocationEntry SignedMarkRevocationEntry_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
@ -1326,6 +1354,14 @@ ALTER TABLE ONLY public."Tld"
ADD CONSTRAINT "Tld_pkey" PRIMARY KEY (tld_name);
--
-- Name: TmchCrl TmchCrl_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public."TmchCrl"
ADD CONSTRAINT "TmchCrl_pkey" PRIMARY KEY (certificate_revocations, update_timestamp, url);
--
-- Name: Transaction Transaction_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--