Create SQL schema for RdeRevision (#835)

* Create SQL schema for RdeRevision

* Split RdeRevision IDs into three separate DB fields as unified pkey

* Rename variable

* Merge remote-tracking branch 'origin/master' into rdeRevision

* Rename variable in one other location

* Implement no-op toDatastore/Sql for RdeRevision

* Responses to CR

* Merge remote-tracking branch 'origin/master' into rdeRevision

* Use a date for the date column

* Fix exception messages in tests

* Regen diagram to fix the test

* Use assignment in static factory methods

* Merge remote-tracking branch 'origin/master' into rdeRevision
This commit is contained in:
gbrodman 2020-10-23 13:14:07 -04:00 committed by GitHub
parent 9ddde4799c
commit 3ed3b351d0
11 changed files with 895 additions and 525 deletions

View file

@ -15,17 +15,32 @@
package google.registry.model.rde; package google.registry.model.rde;
import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Verify.verify;
import static com.google.common.base.Verify.verifyNotNull;
import static google.registry.model.ofy.ObjectifyService.ofy;
import static google.registry.model.rde.RdeNamingUtils.makePartialName; import static google.registry.model.rde.RdeNamingUtils.makePartialName;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm; import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
import com.google.common.base.VerifyException; import com.google.common.base.VerifyException;
import com.google.common.collect.ImmutableList;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.Entity; import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id; import com.googlecode.objectify.annotation.Id;
import com.googlecode.objectify.annotation.Ignore;
import google.registry.model.BackupGroupRoot;
import google.registry.model.ImmutableObject; import google.registry.model.ImmutableObject;
import google.registry.model.rde.RdeRevision.RdeRevisionId;
import google.registry.persistence.VKey;
import google.registry.persistence.converter.LocalDateConverter;
import google.registry.schema.replay.DatastoreEntity;
import google.registry.schema.replay.SqlEntity;
import java.io.Serializable;
import java.util.Optional;
import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.IdClass;
import javax.persistence.Transient;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.joda.time.LocalDate;
/** /**
* Datastore entity for tracking RDE revisions. * Datastore entity for tracking RDE revisions.
@ -35,32 +50,67 @@ import org.joda.time.DateTime;
* flag is included in the generated XML. * flag is included in the generated XML.
*/ */
@Entity @Entity
public final class RdeRevision extends ImmutableObject { @javax.persistence.Entity
@IdClass(RdeRevisionId.class)
public final class RdeRevision extends BackupGroupRoot implements DatastoreEntity, SqlEntity {
/** String triplet of tld, date, and mode, e.g. {@code soy_2015-09-01_full}. */ /** String triplet of tld, date, and mode, e.g. {@code soy_2015-09-01_full}. */
@Id @Id @Transient String id;
String id;
@javax.persistence.Id @Ignore String tld;
@javax.persistence.Id @Ignore LocalDate date;
@javax.persistence.Id @Ignore RdeMode mode;
/** /**
* Number of last revision successfully staged to GCS. * Number of last revision successfully staged to GCS.
* *
* <p>This values begins at zero upon object creation and thenceforth incremented transactionally. * <p>This values begins at zero upon object creation and thenceforth incremented transactionally.
*/ */
@Column(nullable = false)
int revision; int revision;
/** Hibernate requires an empty constructor. */
private RdeRevision() {}
public static RdeRevision create(
String id, String tld, LocalDate date, RdeMode mode, int revision) {
RdeRevision instance = new RdeRevision();
instance.id = id;
instance.tld = tld;
instance.date = date;
instance.mode = mode;
instance.revision = revision;
return instance;
}
public int getRevision() { public int getRevision() {
return revision; return revision;
} }
@Override
public ImmutableList<SqlEntity> toSqlEntities() {
return ImmutableList.of(); // we don't care about RdeRevision history
}
@Override
public ImmutableList<DatastoreEntity> toDatastoreEntities() {
return ImmutableList.of(); // we don't care about RdeRevision history
}
/** /**
* Returns next revision ID to use when staging a new deposit file for the given triplet. * Returns next revision ID to use when staging a new deposit file for the given triplet.
* *
* @return {@code 0} for first deposit generation and {@code >0} for resends * @return {@code 0} for first deposit generation and {@code >0} for resends
*/ */
public static int getNextRevision(String tld, DateTime date, RdeMode mode) { public static int getNextRevision(String tld, DateTime date, RdeMode mode) {
RdeRevision object = String id = makePartialName(tld, date, mode);
ofy().load().type(RdeRevision.class).id(makePartialName(tld, date, mode)).now(); RdeRevisionId sqlKey = RdeRevisionId.create(tld, date.toLocalDate(), mode);
return object == null ? 0 : object.revision + 1; Key<RdeRevision> ofyKey = Key.create(RdeRevision.class, id);
Optional<RdeRevision> revisionOptional =
tm().maybeLoad(VKey.create(RdeRevision.class, sqlKey, ofyKey));
return revisionOptional.map(rdeRevision -> rdeRevision.revision + 1).orElse(0);
} }
/** /**
@ -76,17 +126,56 @@ public final class RdeRevision extends ImmutableObject {
checkArgument(revision >= 0, "Negative revision: %s", revision); checkArgument(revision >= 0, "Negative revision: %s", revision);
String triplet = makePartialName(tld, date, mode); String triplet = makePartialName(tld, date, mode);
tm().assertInTransaction(); tm().assertInTransaction();
RdeRevision object = ofy().load().type(RdeRevision.class).id(triplet).now(); RdeRevisionId sqlKey = RdeRevisionId.create(tld, date.toLocalDate(), mode);
Key<RdeRevision> ofyKey = Key.create(RdeRevision.class, triplet);
Optional<RdeRevision> revisionOptional =
tm().maybeLoad(VKey.create(RdeRevision.class, sqlKey, ofyKey));
if (revision == 0) { if (revision == 0) {
verify(object == null, "RdeRevision object already created: %s", object); revisionOptional.ifPresent(
rdeRevision -> {
throw new IllegalArgumentException(
String.format(
"RdeRevision object already created and revision 0 specified: %s",
rdeRevision));
});
} else { } else {
verifyNotNull(object, "RDE revision object missing for %s?! revision=%s", triplet, revision); checkArgument(
verify(object.revision == revision - 1, revisionOptional.isPresent(),
"RDE revision object should be at %s but was: %s", revision - 1, object); "Couldn't find existing RDE revision %s when trying to save new revision %s",
triplet,
revision);
checkArgument(
revisionOptional.get().revision == revision - 1,
"RDE revision object should be at revision %s but was: %s",
revision - 1,
revisionOptional.get());
}
RdeRevision object = RdeRevision.create(triplet, tld, date.toLocalDate(), mode, revision);
tm().put(object);
}
/** Class to represent the composite primary key of {@link RdeRevision} entity. */
static class RdeRevisionId extends ImmutableObject implements Serializable {
String tld;
// Auto-conversion doesn't work for ID classes, we must specify @Column and @Convert
@Column(columnDefinition = "date")
@Convert(converter = LocalDateConverter.class)
LocalDate date;
@Enumerated(EnumType.STRING)
RdeMode mode;
/** Hibernate requires this default constructor. */
private RdeRevisionId() {}
static RdeRevisionId create(String tld, LocalDate date, RdeMode mode) {
RdeRevisionId instance = new RdeRevisionId();
instance.tld = tld;
instance.date = date;
instance.mode = mode;
return instance;
} }
object = new RdeRevision();
object.id = triplet;
object.revision = revision;
ofy().save().entity(object);
} }
} }

View file

@ -53,6 +53,7 @@
<class>google.registry.model.poll.PollMessage</class> <class>google.registry.model.poll.PollMessage</class>
<class>google.registry.model.poll.PollMessage$OneTime</class> <class>google.registry.model.poll.PollMessage$OneTime</class>
<class>google.registry.model.poll.PollMessage$Autorenew</class> <class>google.registry.model.poll.PollMessage$Autorenew</class>
<class>google.registry.model.rde.RdeRevision</class>
<class>google.registry.model.registrar.Registrar</class> <class>google.registry.model.registrar.Registrar</class>
<class>google.registry.model.registrar.RegistrarContact</class> <class>google.registry.model.registrar.RegistrarContact</class>
<class>google.registry.model.registry.label.PremiumList</class> <class>google.registry.model.registry.label.PremiumList</class>

View file

@ -15,118 +15,116 @@
package google.registry.model.rde; package google.registry.model.rde;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static google.registry.model.ofy.ObjectifyService.ofy;
import static google.registry.model.rde.RdeMode.FULL; import static google.registry.model.rde.RdeMode.FULL;
import static google.registry.model.rde.RdeRevision.getNextRevision; import static google.registry.model.rde.RdeRevision.getNextRevision;
import static google.registry.model.rde.RdeRevision.saveRevision; import static google.registry.model.rde.RdeRevision.saveRevision;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm; import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertThrows;
import com.google.common.base.VerifyException; import google.registry.model.EntityTestCase;
import google.registry.testing.AppEngineExtension; import google.registry.testing.DualDatabaseTest;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.TestTemplate;
/** Unit tests for {@link RdeRevision}. */ /** Unit tests for {@link RdeRevision}. */
public class RdeRevisionTest { @DualDatabaseTest
public class RdeRevisionTest extends EntityTestCase {
@RegisterExtension public RdeRevisionTest() {
final AppEngineExtension appEngine = super(JpaEntityCoverageCheck.ENABLED);
AppEngineExtension.builder().withDatastoreAndCloudSql().build(); }
@Test @BeforeEach
void beforeEach() {
fakeClock.setTo(DateTime.parse("1984-12-18TZ"));
}
@TestTemplate
void testGetNextRevision_objectDoesntExist_returnsZero() { void testGetNextRevision_objectDoesntExist_returnsZero() {
assertThat(getNextRevision("torment", DateTime.parse("1984-12-18TZ"), FULL)).isEqualTo(0); tm().transact(
() -> assertThat(getNextRevision("torment", fakeClock.nowUtc(), FULL)).isEqualTo(0));
} }
@Test @TestTemplate
void testGetNextRevision_objectExistsAtZero_returnsOne() { void testGetNextRevision_objectExistsAtZero_returnsOne() {
save("sorrow", DateTime.parse("1984-12-18TZ"), FULL, 0); save("sorrow", fakeClock.nowUtc(), FULL, 0);
assertThat(getNextRevision("sorrow", DateTime.parse("1984-12-18TZ"), FULL)).isEqualTo(1); tm().transact(
() -> assertThat(getNextRevision("sorrow", fakeClock.nowUtc(), FULL)).isEqualTo(1));
} }
@Test @TestTemplate
void testSaveRevision_objectDoesntExist_newRevisionIsZero_nextRevIsOne() { void testSaveRevision_objectDoesntExist_newRevisionIsZero_nextRevIsOne() {
tm().transact(() -> saveRevision("despondency", DateTime.parse("1984-12-18TZ"), FULL, 0)); tm().transact(() -> saveRevision("despondency", fakeClock.nowUtc(), FULL, 0));
tm().transact( tm().transact(
() -> () ->
assertThat(getNextRevision("despondency", DateTime.parse("1984-12-18TZ"), FULL)) assertThat(getNextRevision("despondency", fakeClock.nowUtc(), FULL)).isEqualTo(1));
.isEqualTo(1));
} }
@Test @TestTemplate
void testSaveRevision_objectDoesntExist_newRevisionIsOne_throwsVe() { void testSaveRevision_objectDoesntExist_newRevisionIsOne_throwsVe() {
VerifyException thrown = IllegalArgumentException thrown =
assertThrows( assertThrows(
VerifyException.class, IllegalArgumentException.class,
() -> () -> tm().transact(() -> saveRevision("despondency", fakeClock.nowUtc(), FULL, 1)));
tm().transact( assertThat(thrown)
() -> .hasMessageThat()
saveRevision("despondency", DateTime.parse("1984-12-18TZ"), FULL, 1))); .isEqualTo(
assertThat(thrown).hasMessageThat().contains("object missing"); "Couldn't find existing RDE revision despondency_1984-12-18_full "
+ "when trying to save new revision 1");
} }
@Test @TestTemplate
void testSaveRevision_objectExistsAtZero_newRevisionIsZero_throwsVe() { void testSaveRevision_objectExistsAtZero_newRevisionIsZero_throwsVe() {
save("melancholy", DateTime.parse("1984-12-18TZ"), FULL, 0); save("melancholy", fakeClock.nowUtc(), FULL, 0);
VerifyException thrown = IllegalArgumentException thrown =
assertThrows( assertThrows(
VerifyException.class, IllegalArgumentException.class,
() -> () -> tm().transact(() -> saveRevision("melancholy", fakeClock.nowUtc(), FULL, 0)));
tm().transact(
() -> saveRevision("melancholy", DateTime.parse("1984-12-18TZ"), FULL, 0)));
assertThat(thrown).hasMessageThat().contains("object already created"); assertThat(thrown).hasMessageThat().contains("object already created");
} }
@Test @TestTemplate
void testSaveRevision_objectExistsAtZero_newRevisionIsOne_nextRevIsTwo() { void testSaveRevision_objectExistsAtZero_newRevisionIsOne_nextRevIsTwo() {
save("melancholy", DateTime.parse("1984-12-18TZ"), FULL, 0); DateTime startOfDay = fakeClock.nowUtc().withTimeAtStartOfDay();
tm().transact(() -> saveRevision("melancholy", DateTime.parse("1984-12-18TZ"), FULL, 1)); save("melancholy", startOfDay, FULL, 0);
tm().transact( fakeClock.advanceOneMilli();
() -> tm().transact(() -> saveRevision("melancholy", startOfDay, FULL, 1));
assertThat(getNextRevision("melancholy", DateTime.parse("1984-12-18TZ"), FULL)) tm().transact(() -> assertThat(getNextRevision("melancholy", startOfDay, FULL)).isEqualTo(2));
.isEqualTo(2));
} }
@Test @TestTemplate
void testSaveRevision_objectExistsAtZero_newRevisionIsTwo_throwsVe() { void testSaveRevision_objectExistsAtZero_newRevisionIsTwo_throwsVe() {
save("melancholy", DateTime.parse("1984-12-18TZ"), FULL, 0); save("melancholy", fakeClock.nowUtc(), FULL, 0);
VerifyException thrown = IllegalArgumentException thrown =
assertThrows( assertThrows(
VerifyException.class, IllegalArgumentException.class,
() -> () -> tm().transact(() -> saveRevision("melancholy", fakeClock.nowUtc(), FULL, 2)));
tm().transact( assertThat(thrown)
() -> saveRevision("melancholy", DateTime.parse("1984-12-18TZ"), FULL, 2))); .hasMessageThat()
assertThat(thrown).hasMessageThat().contains("should be at 1 "); .contains("RDE revision object should be at revision 1 but was");
} }
@Test @TestTemplate
void testSaveRevision_negativeRevision_throwsIae() { void testSaveRevision_negativeRevision_throwsIae() {
IllegalArgumentException thrown = IllegalArgumentException thrown =
assertThrows( assertThrows(
IllegalArgumentException.class, IllegalArgumentException.class,
() -> () -> tm().transact(() -> saveRevision("melancholy", fakeClock.nowUtc(), FULL, -1)));
tm().transact(
() ->
saveRevision("melancholy", DateTime.parse("1984-12-18TZ"), FULL, -1)));
assertThat(thrown).hasMessageThat().contains("Negative revision"); assertThat(thrown).hasMessageThat().contains("Negative revision");
} }
@Test @TestTemplate
void testSaveRevision_callerNotInTransaction_throwsIse() { void testSaveRevision_callerNotInTransaction_throwsIse() {
IllegalStateException thrown = IllegalStateException thrown =
assertThrows( assertThrows(
IllegalStateException.class, IllegalStateException.class, () -> saveRevision("frenzy", fakeClock.nowUtc(), FULL, 1));
() -> saveRevision("frenzy", DateTime.parse("1984-12-18TZ"), FULL, 1));
assertThat(thrown).hasMessageThat().contains("transaction"); assertThat(thrown).hasMessageThat().contains("transaction");
} }
public static void save(String tld, DateTime date, RdeMode mode, int revision) { public static void save(String tld, DateTime date, RdeMode mode, int revision) {
String triplet = RdeNamingUtils.makePartialName(tld, date, mode); String triplet = RdeNamingUtils.makePartialName(tld, date, mode);
RdeRevision object = new RdeRevision(); RdeRevision object = RdeRevision.create(triplet, tld, date.toLocalDate(), mode, revision);
object.id = triplet; tm().transact(() -> tm().put(object));
object.revision = revision;
ofy().saveWithoutBackup().entity(object).now();
} }
} }

View file

@ -24,6 +24,7 @@ import google.registry.model.history.ContactHistoryTest;
import google.registry.model.history.DomainHistoryTest; import google.registry.model.history.DomainHistoryTest;
import google.registry.model.history.HostHistoryTest; import google.registry.model.history.HostHistoryTest;
import google.registry.model.poll.PollMessageTest; import google.registry.model.poll.PollMessageTest;
import google.registry.model.rde.RdeRevisionTest;
import google.registry.model.registry.RegistryLockDaoTest; import google.registry.model.registry.RegistryLockDaoTest;
import google.registry.model.registry.RegistryTest; import google.registry.model.registry.RegistryTest;
import google.registry.model.registry.label.ReservedListSqlDaoTest; import google.registry.model.registry.label.ReservedListSqlDaoTest;
@ -86,6 +87,7 @@ import org.junit.runner.RunWith;
LockDaoTest.class, LockDaoTest.class,
PollMessageTest.class, PollMessageTest.class,
PremiumListDaoTest.class, PremiumListDaoTest.class,
RdeRevisionTest.class,
RegistrarDaoTest.class, RegistrarDaoTest.class,
RegistryTest.class, RegistryTest.class,
ReservedListSqlDaoTest.class, ReservedListSqlDaoTest.class,

View file

@ -523,6 +523,7 @@ class google.registry.model.poll.PollMessage$OneTime {
} }
class google.registry.model.rde.RdeRevision { class google.registry.model.rde.RdeRevision {
@Id java.lang.String id; @Id java.lang.String id;
google.registry.model.UpdateAutoTimestamp updateTimestamp;
int revision; int revision;
} }
class google.registry.model.registrar.Registrar { class google.registry.model.registrar.Registrar {

View file

@ -261,19 +261,19 @@ td.section {
</tr> </tr>
<tr> <tr>
<td class="property_name">generated on</td> <td class="property_name">generated on</td>
<td class="property_value">2020-10-19 18:49:22.440463</td> <td class="property_value">2020-10-21 14:40:52.221127</td>
</tr> </tr>
<tr> <tr>
<td class="property_name">last flyway file</td> <td class="property_name">last flyway file</td>
<td id="lastFlywayFile" class="property_value">V65__local_date_date_type.sql</td> <td id="lastFlywayFile" class="property_value">V66__create_rde_revision.sql</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<p>&nbsp;</p> <p>&nbsp;</p>
<p>&nbsp;</p> <p>&nbsp;</p>
<svg viewbox="0.00 0.00 3506.90 2635.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 2631.5)"> <svg viewbox="0.00 0.00 3506.90 2739.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 2735.5)">
<title>SchemaCrawler_Diagram</title> <title>SchemaCrawler_Diagram</title>
<polygon fill="white" stroke="transparent" points="-4,4 -4,-2631.5 3502.9,-2631.5 3502.9,4 -4,4" /> <polygon fill="white" stroke="transparent" points="-4,4 -4,-2735.5 3502.9,-2735.5 3502.9,4 -4,4" />
<text text-anchor="start" x="3230.4" y="-29.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3230.4" y="-29.8" font-family="Helvetica,sans-Serif" font-size="14.00">
generated by generated by
</text> </text>
@ -284,7 +284,7 @@ td.section {
generated on generated on
</text> </text>
<text text-anchor="start" x="3313.4" y="-10.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3313.4" y="-10.8" font-family="Helvetica,sans-Serif" font-size="14.00">
2020-10-19 18:49:22.440463 2020-10-21 14:40:52.221127
</text> </text>
<polygon fill="none" stroke="#888888" points="3225.9,-4 3225.9,-44 3490.9,-44 3490.9,-4 3225.9,-4" /> <!-- allocationtoken_a08ccbef --> <polygon fill="none" stroke="#888888" points="3225.9,-4 3225.9,-44 3490.9,-44 3490.9,-4 3225.9,-4" /> <!-- allocationtoken_a08ccbef -->
<g id="node1" class="node"> <g id="node1" class="node">
@ -521,7 +521,7 @@ td.section {
fk_billing_cancellation_billing_recurrence_id fk_billing_cancellation_billing_recurrence_id
</text> </text>
</g> <!-- registrar_6e1503e3 --> </g> <!-- registrar_6e1503e3 -->
<g id="node23" class="node"> <g id="node24" class="node">
<title>registrar_6e1503e3</title> <title>registrar_6e1503e3</title>
<polygon fill="#ebcef2" stroke="transparent" points="9.5,-1102 9.5,-1121 116.5,-1121 116.5,-1102 9.5,-1102" /> <polygon fill="#ebcef2" stroke="transparent" points="9.5,-1102 9.5,-1121 116.5,-1121 116.5,-1102 9.5,-1102" />
<text text-anchor="start" x="11.5" y="-1108.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="11.5" y="-1108.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
@ -2203,280 +2203,316 @@ td.section {
<text text-anchor="start" x="2969" y="-1918.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2969" y="-1918.8" font-family="Helvetica,sans-Serif" font-size="14.00">
fko0gw90lpo1tuee56l0nb6y6g5 fko0gw90lpo1tuee56l0nb6y6g5
</text> </text>
</g> <!-- rderevision_83396864 -->
<g id="node23" class="node">
<title>rderevision_83396864</title>
<polygon fill="#ebcef2" stroke="transparent" points="3231,-2030 3231,-2049 3361,-2049 3361,-2030 3231,-2030" />
<text text-anchor="start" x="3233" y="-2036.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.RdeRevision
</text>
<polygon fill="#ebcef2" stroke="transparent" points="3361,-2030 3361,-2049 3439,-2049 3439,-2030 3361,-2030" />
<text text-anchor="start" x="3400" y="-2035.8" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="3233" y="-2017.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
tld
</text>
<text text-anchor="start" x="3317" y="-2016.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3363" y="-2016.8" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<text text-anchor="start" x="3233" y="-1998.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
mode
</text>
<text text-anchor="start" x="3317" y="-1997.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3363" y="-1997.8" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<text text-anchor="start" x="3233" y="-1979.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
"date"
</text>
<text text-anchor="start" x="3317" y="-1978.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3363" y="-1978.8" font-family="Helvetica,sans-Serif" font-size="14.00">
date not null
</text>
<polygon fill="none" stroke="#888888" points="3230,-1972 3230,-2050 3440,-2050 3440,-1972 3230,-1972" />
</g> <!-- registrarpoc_ab47054d --> </g> <!-- registrarpoc_ab47054d -->
<g id="node24" class="node"> <g id="node25" class="node">
<title>registrarpoc_ab47054d</title> <title>registrarpoc_ab47054d</title>
<polygon fill="#ebcef2" stroke="transparent" points="3232,-2030 3232,-2049 3364,-2049 3364,-2030 3232,-2030" /> <polygon fill="#ebcef2" stroke="transparent" points="3232,-2134 3232,-2153 3364,-2153 3364,-2134 3232,-2134" />
<text text-anchor="start" x="3234" y="-2036.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3234" y="-2140.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.RegistrarPoc public.RegistrarPoc
</text> </text>
<polygon fill="#ebcef2" stroke="transparent" points="3364,-2030 3364,-2049 3438,-2049 3438,-2030 3364,-2030" /> <polygon fill="#ebcef2" stroke="transparent" points="3364,-2134 3364,-2153 3438,-2153 3438,-2134 3364,-2134" />
<text text-anchor="start" x="3399" y="-2035.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3399" y="-2139.8" font-family="Helvetica,sans-Serif" font-size="14.00">
[table] [table]
</text> </text>
<text text-anchor="start" x="3234" y="-2017.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3234" y="-2121.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
email_address email_address
</text> </text>
<text text-anchor="start" x="3345" y="-2016.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3345" y="-2120.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3366" y="-2016.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3366" y="-2120.8" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<text text-anchor="start" x="3234" y="-1997.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3234" y="-2101.8" font-family="Helvetica,sans-Serif" font-size="14.00">
gae_user_id gae_user_id
</text> </text>
<text text-anchor="start" x="3345" y="-1997.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3345" y="-2101.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3366" y="-1997.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3366" y="-2101.8" font-family="Helvetica,sans-Serif" font-size="14.00">
text text
</text> </text>
<text text-anchor="start" x="3234" y="-1979.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3234" y="-2083.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
registrar_id registrar_id
</text> </text>
<text text-anchor="start" x="3345" y="-1978.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3345" y="-2082.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3366" y="-1978.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3366" y="-2082.8" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<polygon fill="none" stroke="#888888" points="3231,-1972 3231,-2050 3439,-2050 3439,-1972 3231,-1972" /> <polygon fill="none" stroke="#888888" points="3231,-2076 3231,-2154 3439,-2154 3439,-2076 3231,-2076" />
</g> <!-- registrylock_ac88663e --> </g> <!-- registrylock_ac88663e -->
<g id="node25" class="node"> <g id="node26" class="node">
<title>registrylock_ac88663e</title> <title>registrylock_ac88663e</title>
<polygon fill="#ebcef2" stroke="transparent" points="3213,-2191 3213,-2210 3347,-2210 3347,-2191 3213,-2191" /> <polygon fill="#ebcef2" stroke="transparent" points="3213,-2295 3213,-2314 3347,-2314 3347,-2295 3213,-2295" />
<text text-anchor="start" x="3215" y="-2197.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3215" y="-2301.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.RegistryLock public.RegistryLock
</text> </text>
<polygon fill="#ebcef2" stroke="transparent" points="3347,-2191 3347,-2210 3457,-2210 3457,-2191 3347,-2191" /> <polygon fill="#ebcef2" stroke="transparent" points="3347,-2295 3347,-2314 3457,-2314 3457,-2295 3347,-2295" />
<text text-anchor="start" x="3418" y="-2196.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3418" y="-2300.8" font-family="Helvetica,sans-Serif" font-size="14.00">
[table] [table]
</text> </text>
<text text-anchor="start" x="3215" y="-2178.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3215" y="-2282.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id revision_id
</text> </text>
<text text-anchor="start" x="3334" y="-2177.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3334" y="-2281.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3349" y="-2177.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3349" y="-2281.8" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null bigserial not null
</text> </text>
<text text-anchor="start" x="3334" y="-2158.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3334" y="-2262.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3349" y="-2158.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3349" y="-2262.8" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented auto-incremented
</text> </text>
<text text-anchor="start" x="3215" y="-2139.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3215" y="-2243.8" font-family="Helvetica,sans-Serif" font-size="14.00">
registrar_id registrar_id
</text> </text>
<text text-anchor="start" x="3334" y="-2139.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3334" y="-2243.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3349" y="-2139.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3349" y="-2243.8" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<text text-anchor="start" x="3215" y="-2120.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3215" y="-2224.8" font-family="Helvetica,sans-Serif" font-size="14.00">
repo_id repo_id
</text> </text>
<text text-anchor="start" x="3334" y="-2120.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3334" y="-2224.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3349" y="-2120.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3349" y="-2224.8" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<text text-anchor="start" x="3215" y="-2101.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3215" y="-2205.8" font-family="Helvetica,sans-Serif" font-size="14.00">
verification_code verification_code
</text> </text>
<text text-anchor="start" x="3334" y="-2101.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3334" y="-2205.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3349" y="-2101.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3349" y="-2205.8" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<text text-anchor="start" x="3215" y="-2082.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3215" y="-2186.8" font-family="Helvetica,sans-Serif" font-size="14.00">
relock_revision_id relock_revision_id
</text> </text>
<text text-anchor="start" x="3334" y="-2082.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3334" y="-2186.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3349" y="-2082.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3349" y="-2186.8" font-family="Helvetica,sans-Serif" font-size="14.00">
int8 int8
</text> </text>
<polygon fill="none" stroke="#888888" points="3212,-2076.5 3212,-2211.5 3458,-2211.5 3458,-2076.5 3212,-2076.5" /> <polygon fill="none" stroke="#888888" points="3212,-2180.5 3212,-2315.5 3458,-2315.5 3458,-2180.5 3212,-2180.5" />
</g> <!-- registrylock_ac88663e&#45;&gt;registrylock_ac88663e --> </g> <!-- registrylock_ac88663e&#45;&gt;registrylock_ac88663e -->
<g id="edge58" class="edge"> <g id="edge58" class="edge">
<title>registrylock_ac88663e:w-&gt;registrylock_ac88663e:e</title> <title>registrylock_ac88663e:w-&gt;registrylock_ac88663e:e</title>
<path fill="none" stroke="black" d="M3197.38,-2095.25C3146.34,-2134.77 3160.96,-2233.5 3335,-2233.5 3515.72,-2233.5 3524.55,-2213.9 3466.46,-2186.31" /> <path fill="none" stroke="black" d="M3197.38,-2199.25C3146.34,-2238.77 3160.96,-2337.5 3335,-2337.5 3515.72,-2337.5 3524.55,-2317.9 3466.46,-2290.31" />
<polygon fill="black" stroke="black" points="3204.4,-2091.1 3215.29,-2089.87 3208.7,-2088.55 3213,-2086 3213,-2086 3213,-2086 3208.7,-2088.55 3210.71,-2082.13 3204.4,-2091.1 3204.4,-2091.1" /> <polygon fill="black" stroke="black" points="3204.4,-2195.1 3215.29,-2193.87 3208.7,-2192.55 3213,-2190 3213,-2190 3213,-2190 3208.7,-2192.55 3210.71,-2186.13 3204.4,-2195.1 3204.4,-2195.1" />
<ellipse fill="none" stroke="black" cx="3200.95" cy="-2093.14" rx="4" ry="4" /> <ellipse fill="none" stroke="black" cx="3200.95" cy="-2197.14" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="3455.84,-2186.96 3459.98,-2177.86 3461.8,-2178.69 3457.66,-2187.79 3455.84,-2186.96" /> <polygon fill="black" stroke="black" points="3455.84,-2290.96 3459.98,-2281.86 3461.8,-2282.69 3457.66,-2291.79 3455.84,-2290.96" />
<polyline fill="none" stroke="black" points="3457,-2182 3461.55,-2184.07 " /> <polyline fill="none" stroke="black" points="3457,-2286 3461.55,-2288.07 " />
<polygon fill="black" stroke="black" points="3460.39,-2189.04 3464.53,-2179.94 3466.35,-2180.77 3462.21,-2189.87 3460.39,-2189.04" /> <polygon fill="black" stroke="black" points="3460.39,-2293.04 3464.53,-2283.94 3466.35,-2284.77 3462.21,-2293.87 3460.39,-2293.04" />
<polyline fill="none" stroke="black" points="3461.55,-2184.07 3466.1,-2186.15 " /> <polyline fill="none" stroke="black" points="3461.55,-2288.07 3466.1,-2290.15 " />
<text text-anchor="start" x="3253.5" y="-2237.3" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3253.5" y="-2341.3" font-family="Helvetica,sans-Serif" font-size="14.00">
fk2lhcwpxlnqijr96irylrh1707 fk2lhcwpxlnqijr96irylrh1707
</text> </text>
</g> <!-- reservedentry_1a7b8520 --> </g> <!-- reservedentry_1a7b8520 -->
<g id="node26" class="node"> <g id="node27" class="node">
<title>reservedentry_1a7b8520</title> <title>reservedentry_1a7b8520</title>
<polygon fill="#ebcef2" stroke="transparent" points="3227,-2309 3227,-2328 3370,-2328 3370,-2309 3227,-2309" /> <polygon fill="#ebcef2" stroke="transparent" points="3227,-2413 3227,-2432 3370,-2432 3370,-2413 3227,-2413" />
<text text-anchor="start" x="3229" y="-2315.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3229" y="-2419.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.ReservedEntry public.ReservedEntry
</text> </text>
<polygon fill="#ebcef2" stroke="transparent" points="3370,-2309 3370,-2328 3444,-2328 3444,-2309 3370,-2309" /> <polygon fill="#ebcef2" stroke="transparent" points="3370,-2413 3370,-2432 3444,-2432 3444,-2413 3370,-2413" />
<text text-anchor="start" x="3405" y="-2314.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3405" y="-2418.8" font-family="Helvetica,sans-Serif" font-size="14.00">
[table] [table]
</text> </text>
<text text-anchor="start" x="3229" y="-2296.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3229" y="-2400.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id revision_id
</text> </text>
<text text-anchor="start" x="3342" y="-2295.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3342" y="-2399.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3372" y="-2295.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3372" y="-2399.8" font-family="Helvetica,sans-Serif" font-size="14.00">
int8 not null int8 not null
</text> </text>
<text text-anchor="start" x="3229" y="-2277.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3229" y="-2381.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
domain_label domain_label
</text> </text>
<text text-anchor="start" x="3342" y="-2276.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3342" y="-2380.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3372" y="-2276.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3372" y="-2380.8" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<polygon fill="none" stroke="#888888" points="3225.5,-2270.5 3225.5,-2329.5 3444.5,-2329.5 3444.5,-2270.5 3225.5,-2270.5" /> <polygon fill="none" stroke="#888888" points="3225.5,-2374.5 3225.5,-2433.5 3444.5,-2433.5 3444.5,-2374.5 3225.5,-2374.5" />
</g> <!-- reservedlist_b97c3f1c --> </g> <!-- reservedlist_b97c3f1c -->
<g id="node27" class="node"> <g id="node28" class="node">
<title>reservedlist_b97c3f1c</title> <title>reservedlist_b97c3f1c</title>
<polygon fill="#ebcef2" stroke="transparent" points="2650.5,-2308 2650.5,-2327 2783.5,-2327 2783.5,-2308 2650.5,-2308" /> <polygon fill="#ebcef2" stroke="transparent" points="2650.5,-2412 2650.5,-2431 2783.5,-2431 2783.5,-2412 2650.5,-2412" />
<text text-anchor="start" x="2652.5" y="-2314.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="2652.5" y="-2418.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.ReservedList public.ReservedList
</text> </text>
<polygon fill="#ebcef2" stroke="transparent" points="2783.5,-2308 2783.5,-2327 2893.5,-2327 2893.5,-2308 2783.5,-2308" /> <polygon fill="#ebcef2" stroke="transparent" points="2783.5,-2412 2783.5,-2431 2893.5,-2431 2893.5,-2412 2783.5,-2412" />
<text text-anchor="start" x="2854.5" y="-2313.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2854.5" y="-2417.8" font-family="Helvetica,sans-Serif" font-size="14.00">
[table] [table]
</text> </text>
<text text-anchor="start" x="2652.5" y="-2295.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="2652.5" y="-2399.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id revision_id
</text> </text>
<text text-anchor="start" x="2752.5" y="-2294.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2752.5" y="-2398.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="2785.5" y="-2294.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2785.5" y="-2398.8" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null bigserial not null
</text> </text>
<text text-anchor="start" x="2752.5" y="-2275.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2752.5" y="-2379.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="2785.5" y="-2275.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2785.5" y="-2379.8" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented auto-incremented
</text> </text>
<text text-anchor="start" x="2652.5" y="-2256.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2652.5" y="-2360.8" font-family="Helvetica,sans-Serif" font-size="14.00">
name name
</text> </text>
<text text-anchor="start" x="2752.5" y="-2256.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2752.5" y="-2360.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="2785.5" y="-2256.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2785.5" y="-2360.8" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<polygon fill="none" stroke="#888888" points="2649,-2250 2649,-2328 2894,-2328 2894,-2250 2649,-2250" /> <polygon fill="none" stroke="#888888" points="2649,-2354 2649,-2432 2894,-2432 2894,-2354 2649,-2354" />
</g> <!-- reservedentry_1a7b8520&#45;&gt;reservedlist_b97c3f1c --> </g> <!-- reservedentry_1a7b8520&#45;&gt;reservedlist_b97c3f1c -->
<g id="edge59" class="edge"> <g id="edge59" class="edge">
<title>reservedentry_1a7b8520:w-&gt;reservedlist_b97c3f1c:e</title> <title>reservedentry_1a7b8520:w-&gt;reservedlist_b97c3f1c:e</title>
<path fill="none" stroke="black" d="M3207.6,-2299C3078.53,-2299 3037.5,-2299 2904.65,-2299" /> <path fill="none" stroke="black" d="M3207.6,-2403C3078.53,-2403 3037.5,-2403 2904.65,-2403" />
<polygon fill="black" stroke="black" points="3216,-2299 3226,-2303.5 3221,-2299 3226,-2299 3226,-2299 3226,-2299 3221,-2299 3226,-2294.5 3216,-2299 3216,-2299" /> <polygon fill="black" stroke="black" points="3216,-2403 3226,-2407.5 3221,-2403 3226,-2403 3226,-2403 3226,-2403 3221,-2403 3226,-2398.5 3216,-2403 3216,-2403" />
<ellipse fill="none" stroke="black" cx="3212" cy="-2299" rx="4" ry="4" /> <ellipse fill="none" stroke="black" cx="3212" cy="-2403" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="2895.5,-2304 2895.5,-2294 2897.5,-2294 2897.5,-2304 2895.5,-2304" /> <polygon fill="black" stroke="black" points="2895.5,-2408 2895.5,-2398 2897.5,-2398 2897.5,-2408 2895.5,-2408" />
<polyline fill="none" stroke="black" points="2894.5,-2299 2899.5,-2299 " /> <polyline fill="none" stroke="black" points="2894.5,-2403 2899.5,-2403 " />
<polygon fill="black" stroke="black" points="2900.5,-2304 2900.5,-2294 2902.5,-2294 2902.5,-2304 2900.5,-2304" /> <polygon fill="black" stroke="black" points="2900.5,-2408 2900.5,-2398 2902.5,-2398 2902.5,-2408 2900.5,-2408" />
<polyline fill="none" stroke="black" points="2899.5,-2299 2904.5,-2299 " /> <polyline fill="none" stroke="black" points="2899.5,-2403 2904.5,-2403 " />
<text text-anchor="start" x="2970.5" y="-2302.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2970.5" y="-2406.8" font-family="Helvetica,sans-Serif" font-size="14.00">
fkgq03rk0bt1hb915dnyvd3vnfc fkgq03rk0bt1hb915dnyvd3vnfc
</text> </text>
</g> <!-- spec11threatmatch_a61228a6 --> </g> <!-- spec11threatmatch_a61228a6 -->
<g id="node28" class="node"> <g id="node29" class="node">
<title>spec11threatmatch_a61228a6</title> <title>spec11threatmatch_a61228a6</title>
<polygon fill="#ebcef2" stroke="transparent" points="3192,-2452 3192,-2471 3368,-2471 3368,-2452 3192,-2452" /> <polygon fill="#ebcef2" stroke="transparent" points="3192,-2556 3192,-2575 3368,-2575 3368,-2556 3192,-2556" />
<text text-anchor="start" x="3194" y="-2458.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3194" y="-2562.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.Spec11ThreatMatch public.Spec11ThreatMatch
</text> </text>
<polygon fill="#ebcef2" stroke="transparent" points="3368,-2452 3368,-2471 3478,-2471 3478,-2452 3368,-2452" /> <polygon fill="#ebcef2" stroke="transparent" points="3368,-2556 3368,-2575 3478,-2575 3478,-2556 3368,-2556" />
<text text-anchor="start" x="3439" y="-2457.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3439" y="-2561.8" font-family="Helvetica,sans-Serif" font-size="14.00">
[table] [table]
</text> </text>
<text text-anchor="start" x="3194" y="-2439.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3194" y="-2543.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
id id
</text> </text>
<text text-anchor="start" x="3315" y="-2438.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3315" y="-2542.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3370" y="-2438.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3370" y="-2542.8" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null bigserial not null
</text> </text>
<text text-anchor="start" x="3315" y="-2419.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3315" y="-2523.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3370" y="-2419.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3370" y="-2523.8" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented auto-incremented
</text> </text>
<text text-anchor="start" x="3194" y="-2400.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3194" y="-2504.8" font-family="Helvetica,sans-Serif" font-size="14.00">
check_date check_date
</text> </text>
<text text-anchor="start" x="3315" y="-2400.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3315" y="-2504.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3370" y="-2400.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3370" y="-2504.8" font-family="Helvetica,sans-Serif" font-size="14.00">
date not null date not null
</text> </text>
<text text-anchor="start" x="3194" y="-2381.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3194" y="-2485.8" font-family="Helvetica,sans-Serif" font-size="14.00">
registrar_id registrar_id
</text> </text>
<text text-anchor="start" x="3315" y="-2381.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3315" y="-2485.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3370" y="-2381.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3370" y="-2485.8" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<text text-anchor="start" x="3194" y="-2362.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3194" y="-2466.8" font-family="Helvetica,sans-Serif" font-size="14.00">
tld tld
</text> </text>
<text text-anchor="start" x="3315" y="-2362.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3315" y="-2466.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3370" y="-2362.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3370" y="-2466.8" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<polygon fill="none" stroke="#888888" points="3191,-2356 3191,-2472 3479,-2472 3479,-2356 3191,-2356" /> <polygon fill="none" stroke="#888888" points="3191,-2460 3191,-2576 3479,-2576 3479,-2460 3191,-2460" />
</g> <!-- tld_f1fa57e2 --> </g> <!-- tld_f1fa57e2 -->
<g id="node29" class="node"> <g id="node30" class="node">
<title>tld_f1fa57e2</title> <title>tld_f1fa57e2</title>
<polygon fill="#ebcef2" stroke="transparent" points="3262,-2518 3262,-2537 3335,-2537 3335,-2518 3262,-2518" /> <polygon fill="#ebcef2" stroke="transparent" points="3262,-2622 3262,-2641 3335,-2641 3335,-2622 3262,-2622" />
<text text-anchor="start" x="3264" y="-2524.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3264" y="-2628.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.Tld public.Tld
</text> </text>
<polygon fill="#ebcef2" stroke="transparent" points="3335,-2518 3335,-2537 3409,-2537 3409,-2518 3335,-2518" /> <polygon fill="#ebcef2" stroke="transparent" points="3335,-2622 3335,-2641 3409,-2641 3409,-2622 3335,-2622" />
<text text-anchor="start" x="3370" y="-2523.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3370" y="-2627.8" font-family="Helvetica,sans-Serif" font-size="14.00">
[table] [table]
</text> </text>
<text text-anchor="start" x="3264" y="-2505.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3264" y="-2609.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
tld_name tld_name
</text> </text>
<text text-anchor="start" x="3329" y="-2504.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3329" y="-2608.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3337" y="-2504.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3337" y="-2608.8" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<polygon fill="none" stroke="#888888" points="3260.5,-2498 3260.5,-2538 3409.5,-2538 3409.5,-2498 3260.5,-2498" /> <polygon fill="none" stroke="#888888" points="3260.5,-2602 3260.5,-2642 3409.5,-2642 3409.5,-2602 3260.5,-2602" />
</g> <!-- transaction_d50389d4 --> </g> <!-- transaction_d50389d4 -->
<g id="node30" class="node"> <g id="node31" class="node">
<title>transaction_d50389d4</title> <title>transaction_d50389d4</title>
<polygon fill="#ebcef2" stroke="transparent" points="3218,-2603 3218,-2622 3343,-2622 3343,-2603 3218,-2603" /> <polygon fill="#ebcef2" stroke="transparent" points="3218,-2707 3218,-2726 3343,-2726 3343,-2707 3218,-2707" />
<text text-anchor="start" x="3220" y="-2609.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3220" y="-2713.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.Transaction public.Transaction
</text> </text>
<polygon fill="#ebcef2" stroke="transparent" points="3343,-2603 3343,-2622 3453,-2622 3453,-2603 3343,-2603" /> <polygon fill="#ebcef2" stroke="transparent" points="3343,-2707 3343,-2726 3453,-2726 3453,-2707 3343,-2707" />
<text text-anchor="start" x="3414" y="-2608.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3414" y="-2712.8" font-family="Helvetica,sans-Serif" font-size="14.00">
[table] [table]
</text> </text>
<text text-anchor="start" x="3220" y="-2590.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3220" y="-2694.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
id id
</text> </text>
<text text-anchor="start" x="3287" y="-2589.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3287" y="-2693.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3345" y="-2589.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3345" y="-2693.8" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null bigserial not null
</text> </text>
<text text-anchor="start" x="3287" y="-2570.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3287" y="-2674.8" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3345" y="-2570.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3345" y="-2674.8" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented auto-incremented
</text> </text>
<polygon fill="none" stroke="#888888" points="3216.5,-2564.5 3216.5,-2623.5 3453.5,-2623.5 3453.5,-2564.5 3216.5,-2564.5" /> <polygon fill="none" stroke="#888888" points="3216.5,-2668.5 3216.5,-2727.5 3453.5,-2727.5 3453.5,-2668.5 3216.5,-2668.5" />
</g> </g>
</g> </g>
</svg> </svg>
@ -4774,6 +4810,56 @@ td.section {
</tbody> </tbody>
</table> </table>
<p>&nbsp;</p> <p>&nbsp;</p>
<table>
<caption style="background-color: #EBCEF2;"> <span id="rderevision_83396864" class="caption_name">public.RdeRevision</span> <span class="caption_description">[table]</span>
</caption>
<tbody>
<tr>
<td class="spacer"></td>
<td class="minwidth"><b><i>tld</i></b></td>
<td class="minwidth">text not null</td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth"><b><i>mode</i></b></td>
<td class="minwidth">text not null</td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth"><b><i>"date"</i></b></td>
<td class="minwidth">date 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">RdeRevision_pkey</td>
<td class="description right">[primary key]</td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth">tld</td>
<td class="minwidth"></td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth">mode</td>
<td class="minwidth"></td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth">"date"</td>
<td class="minwidth"></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<table> <table>
<caption style="background-color: #EBCEF2;"> <span id="registrar_6e1503e3" class="caption_name">public.Registrar</span> <span class="caption_description">[table]</span> <caption style="background-color: #EBCEF2;"> <span id="registrar_6e1503e3" class="caption_name">public.Registrar</span> <span class="caption_description">[table]</span>
</caption> </caption>

File diff suppressed because it is too large Load diff

View file

@ -63,3 +63,4 @@ V62__disable_key_auto_generation_for_history_tables.sql
V63__add_schema_for_ds_data.sql V63__add_schema_for_ds_data.sql
V64__transfer_history_columns.sql V64__transfer_history_columns.sql
V65__local_date_date_type.sql V65__local_date_date_type.sql
V66__create_rde_revision.sql

View file

@ -0,0 +1,22 @@
-- 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 "RdeRevision" (
tld TEXT NOT NULL,
mode TEXT NOT NULL,
date date NOT NULL,
update_timestamp timestamptz,
revision int4 NOT NULL,
PRIMARY KEY (tld, mode, date)
);

View file

@ -494,6 +494,15 @@
primary key (revision_id) primary key (revision_id)
); );
create table "RdeRevision" (
date date not null,
mode text not null,
tld text not null,
update_timestamp timestamptz,
revision int4 not null,
primary key (date, mode, tld)
);
create table "Registrar" ( create table "Registrar" (
registrar_id text not null, registrar_id text not null,
allowed_tlds text[], allowed_tlds text[],

View file

@ -682,6 +682,19 @@ CREATE SEQUENCE public."PremiumList_revision_id_seq"
ALTER SEQUENCE public."PremiumList_revision_id_seq" OWNED BY public."PremiumList".revision_id; ALTER SEQUENCE public."PremiumList_revision_id_seq" OWNED BY public."PremiumList".revision_id;
--
-- Name: RdeRevision; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE public."RdeRevision" (
tld text NOT NULL,
mode text NOT NULL,
date date NOT NULL,
update_timestamp timestamp with time zone,
revision integer NOT NULL
);
-- --
-- Name: Registrar; Type: TABLE; Schema: public; Owner: - -- Name: Registrar; Type: TABLE; Schema: public; Owner: -
-- --
@ -1166,6 +1179,14 @@ ALTER TABLE ONLY public."PremiumList"
ADD CONSTRAINT "PremiumList_pkey" PRIMARY KEY (revision_id); ADD CONSTRAINT "PremiumList_pkey" PRIMARY KEY (revision_id);
--
-- Name: RdeRevision RdeRevision_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public."RdeRevision"
ADD CONSTRAINT "RdeRevision_pkey" PRIMARY KEY (tld, mode, date);
-- --
-- Name: RegistrarPoc RegistrarPoc_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- Name: RegistrarPoc RegistrarPoc_pkey; Type: CONSTRAINT; Schema: public; Owner: -
-- --