document db entity relationships
authorJustin Wind <justin.wind+git@gmail.com>
Sun, 13 Mar 2022 22:53:18 +0000 (15:53 -0700)
committerJustin Wind <justin.wind+git@gmail.com>
Sun, 13 Mar 2022 22:53:18 +0000 (15:53 -0700)
documentation/media/postgres-er.svg [new file with mode: 0644]
documentation/media/sqlite-er.svg [new file with mode: 0644]
src/db/postgres/sql/schema/1.0.0/er.dot [new file with mode: 0644]
src/db/postgres/sql/schema/1.0.1/er.dot [new file with mode: 0644]
src/db/postgres/sql/schema/1.0.2/er.dot [new file with mode: 0644]
src/db/postgres/sql/schema/1.0.3/er.dot [new file with mode: 0644]
src/db/sqlite/sql/schema/1.0.0/er.dot [new file with mode: 0644]
src/db/sqlite/sql/schema/1.0.1/er.dot [new file with mode: 0644]
src/db/sqlite/sql/schema/1.0.2/er.dot [new file with mode: 0644]
src/db/sqlite/sql/schema/1.0.3/er.dot [new file with mode: 0644]

diff --git a/documentation/media/postgres-er.svg b/documentation/media/postgres-er.svg
new file mode 100644 (file)
index 0000000..b7db5b4
--- /dev/null
@@ -0,0 +1,250 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.49.0 (20210828.1703)
+ -->
+<!-- Title: WebsubHubERD Pages: 1 -->
+<svg width="922pt" height="1084pt"
+ viewBox="0.00 0.00 922.00 1083.63" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1079.63)">
+<title>WebsubHubERD</title>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-1079.63 918,-1079.63 918,4 -4,4"/>
+<text text-anchor="middle" x="457" y="-1050.83" font-family="Times,serif" font-size="26.00">Websub Hub Entity&#45;Relations</text>
+<text text-anchor="middle" x="457" y="-1021.83" font-family="Times,serif" font-size="26.00">Postgres</text>
+<text text-anchor="middle" x="457" y="-992.83" font-family="Times,serif" font-size="26.00">Schema 1.0.3</text>
+<!-- topic -->
+<g id="node1" class="node">
+<title>topic</title>
+<polygon fill="lightblue" stroke="transparent" points="0,-665.13 0,-688.13 280,-688.13 280,-665.13 0,-665.13"/>
+<polygon fill="none" stroke="black" stroke-width="2" points="1,-666.13 1,-687.13 279,-687.13 279,-666.13 1,-666.13"/>
+<text text-anchor="start" x="117" y="-672.93" font-family="Times,serif" font-size="14.00">TOPIC</text>
+<polygon fill="none" stroke="black" points="0,-644.13 0,-665.13 280,-665.13 280,-644.13 0,-644.13"/>
+<text text-anchor="start" x="133" y="-650.93" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="none" stroke="black" points="0,-623.13 0,-644.13 280,-644.13 280,-623.13 0,-623.13"/>
+<text text-anchor="start" x="112.5" y="-629.93" font-family="Times,serif" font-size="14.00">created</text>
+<polygon fill="none" stroke="black" points="0,-602.13 0,-623.13 280,-623.13 280,-602.13 0,-602.13"/>
+<text text-anchor="start" x="129.5" y="-608.93" font-family="Times,serif" font-size="14.00">url</text>
+<polygon fill="none" stroke="black" points="0,-581.13 0,-602.13 280,-602.13 280,-581.13 0,-581.13"/>
+<text text-anchor="start" x="52" y="-587.93" font-family="Times,serif" font-size="14.00">lease_seconds_preferred</text>
+<polygon fill="none" stroke="black" points="0,-560.13 0,-581.13 280,-581.13 280,-560.13 0,-560.13"/>
+<text text-anchor="start" x="72.5" y="-566.93" font-family="Times,serif" font-size="14.00">lease_seconds_min</text>
+<polygon fill="none" stroke="black" points="0,-539.13 0,-560.13 280,-560.13 280,-539.13 0,-539.13"/>
+<text text-anchor="start" x="71" y="-545.93" font-family="Times,serif" font-size="14.00">lease_seconds_max</text>
+<polygon fill="none" stroke="black" points="0,-518.13 0,-539.13 280,-539.13 280,-518.13 0,-518.13"/>
+<text text-anchor="start" x="54" y="-524.93" font-family="Times,serif" font-size="14.00">publisher_validation_url</text>
+<polygon fill="none" stroke="black" points="0,-497.13 0,-518.13 280,-518.13 280,-497.13 0,-497.13"/>
+<text text-anchor="start" x="54" y="-503.93" font-family="Times,serif" font-size="14.00">content_hash_algorithm</text>
+<polygon fill="none" stroke="black" points="0,-476.13 0,-497.13 280,-497.13 280,-476.13 0,-476.13"/>
+<text text-anchor="start" x="109" y="-482.93" font-family="Times,serif" font-size="14.00">is_active</text>
+<polygon fill="none" stroke="black" points="0,-455.13 0,-476.13 280,-476.13 280,-455.13 0,-455.13"/>
+<text text-anchor="start" x="103.5" y="-461.93" font-family="Times,serif" font-size="14.00">is_deleted</text>
+<polygon fill="none" stroke="black" points="0,-434.13 0,-455.13 280,-455.13 280,-434.13 0,-434.13"/>
+<text text-anchor="start" x="97" y="-440.93" font-family="Times,serif" font-size="14.00">last_publish</text>
+<polygon fill="none" stroke="black" points="0,-413.13 0,-434.13 280,-434.13 280,-413.13 0,-413.13"/>
+<text text-anchor="start" x="40.5" y="-419.93" font-family="Times,serif" font-size="14.00">content_fetch_next_attempt</text>
+<polygon fill="none" stroke="black" points="0,-392.13 0,-413.13 280,-413.13 280,-392.13 0,-392.13"/>
+<text text-anchor="start" x="3" y="-398.93" font-family="Times,serif" font-size="14.00">content_fetch_attempts_since_success</text>
+<polygon fill="none" stroke="black" points="0,-371.13 0,-392.13 280,-392.13 280,-371.13 0,-371.13"/>
+<text text-anchor="start" x="80" y="-377.93" font-family="Times,serif" font-size="14.00">content_updated</text>
+<polygon fill="none" stroke="black" points="0,-350.13 0,-371.13 280,-371.13 280,-350.13 0,-350.13"/>
+<text text-anchor="start" x="112.5" y="-356.93" font-family="Times,serif" font-size="14.00">content</text>
+<polygon fill="none" stroke="black" points="0,-329.13 0,-350.13 280,-350.13 280,-329.13 0,-329.13"/>
+<text text-anchor="start" x="92.5" y="-335.93" font-family="Times,serif" font-size="14.00">content_hash</text>
+<polygon fill="none" stroke="black" points="0,-308.13 0,-329.13 280,-329.13 280,-308.13 0,-308.13"/>
+<text text-anchor="start" x="93.5" y="-314.93" font-family="Times,serif" font-size="14.00">content_type</text>
+</g>
+<!-- topic_fetch_in_progress -->
+<g id="node2" class="node">
+<title>topic_fetch_in_progress</title>
+<polygon fill="lightblue" stroke="transparent" points="323.5,-957.13 323.5,-980.13 550.5,-980.13 550.5,-957.13 323.5,-957.13"/>
+<polygon fill="none" stroke="black" stroke-width="2" points="324.5,-958.13 324.5,-979.13 549.5,-979.13 549.5,-958.13 324.5,-958.13"/>
+<text text-anchor="start" x="327.5" y="-964.93" font-family="Times,serif" font-size="14.00">TOPIC_FETCH_IN_PROGRESS</text>
+<polygon fill="none" stroke="black" points="323.5,-936.13 323.5,-957.13 550.5,-957.13 550.5,-936.13 323.5,-936.13"/>
+<text text-anchor="start" x="430" y="-942.93" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="none" stroke="black" points="323.5,-915.13 323.5,-936.13 550.5,-936.13 550.5,-915.13 323.5,-915.13"/>
+<text text-anchor="start" x="406" y="-921.93" font-family="Times,serif" font-size="14.00">claimant</text>
+<polygon fill="none" stroke="black" points="323.5,-894.13 323.5,-915.13 550.5,-915.13 550.5,-894.13 323.5,-894.13"/>
+<text text-anchor="start" x="409" y="-900.93" font-family="Times,serif" font-size="14.00">claimed</text>
+<polygon fill="none" stroke="black" points="323.5,-873.13 323.5,-894.13 550.5,-894.13 550.5,-873.13 323.5,-873.13"/>
+<text text-anchor="start" x="388" y="-879.93" font-family="Times,serif" font-size="14.00">claim_expires</text>
+</g>
+<!-- topic&#45;&gt;topic_fetch_in_progress -->
+<g id="edge1" class="edge">
+<title>topic:pk_id&#45;&gt;topic_fetch_in_progress:fk_id</title>
+<path fill="none" stroke="black" d="M280,-655.13C341.86,-655.13 266.47,-914.99 312.79,-944.43"/>
+<polygon fill="black" stroke="black" points="312.87,-944.45 321.29,-951.47 317.68,-945.79 322.5,-947.13 322.5,-947.13 322.5,-947.13 317.68,-945.79 323.71,-942.8 312.87,-944.45 312.87,-944.45"/>
+</g>
+<!-- topic_content_history -->
+<g id="node3" class="node">
+<title>topic_content_history</title>
+<polygon fill="lightblue" stroke="transparent" points="332.5,-832.13 332.5,-855.13 541.5,-855.13 541.5,-832.13 332.5,-832.13"/>
+<polygon fill="none" stroke="black" stroke-width="2" points="333.5,-833.13 333.5,-854.13 540.5,-854.13 540.5,-833.13 333.5,-833.13"/>
+<text text-anchor="start" x="336.5" y="-839.93" font-family="Times,serif" font-size="14.00">TOPIC_CONTENT_HISTORY</text>
+<polygon fill="none" stroke="black" points="332.5,-811.13 332.5,-832.13 541.5,-832.13 541.5,-811.13 332.5,-811.13"/>
+<text text-anchor="start" x="409" y="-817.93" font-family="Times,serif" font-size="14.00">topic_id</text>
+<polygon fill="none" stroke="black" points="332.5,-790.13 332.5,-811.13 541.5,-811.13 541.5,-790.13 332.5,-790.13"/>
+<text text-anchor="start" x="377" y="-796.93" font-family="Times,serif" font-size="14.00">content_updated</text>
+<polygon fill="none" stroke="black" points="332.5,-769.13 332.5,-790.13 541.5,-790.13 541.5,-769.13 332.5,-769.13"/>
+<text text-anchor="start" x="392.5" y="-775.93" font-family="Times,serif" font-size="14.00">content_size</text>
+<polygon fill="none" stroke="black" points="332.5,-748.13 332.5,-769.13 541.5,-769.13 541.5,-748.13 332.5,-748.13"/>
+<text text-anchor="start" x="389.5" y="-754.93" font-family="Times,serif" font-size="14.00">content_hash</text>
+</g>
+<!-- topic&#45;&gt;topic_content_history -->
+<g id="edge2" class="edge">
+<title>topic:pk_id&#45;&gt;topic_content_history:fk_topic_id</title>
+<path fill="none" stroke="black" d="M280,-655.13C353.88,-655.13 263.54,-806.22 321.38,-820.98"/>
+<polygon fill="black" stroke="black" points="321.56,-821 330.99,-826.6 326.53,-821.56 331.5,-822.13 331.5,-822.13 331.5,-822.13 326.53,-821.56 332.01,-817.66 321.56,-821 321.56,-821"/>
+</g>
+<!-- subscription -->
+<g id="node4" class="node">
+<title>subscription</title>
+<polygon fill="lightblue" stroke="transparent" points="316.5,-707.13 316.5,-730.13 557.5,-730.13 557.5,-707.13 316.5,-707.13"/>
+<polygon fill="none" stroke="black" stroke-width="2" points="317.5,-708.13 317.5,-729.13 556.5,-729.13 556.5,-708.13 317.5,-708.13"/>
+<text text-anchor="start" x="379" y="-714.93" font-family="Times,serif" font-size="14.00">SUBSCRIPTION</text>
+<polygon fill="none" stroke="black" points="316.5,-686.13 316.5,-707.13 557.5,-707.13 557.5,-686.13 316.5,-686.13"/>
+<text text-anchor="start" x="430" y="-692.93" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="none" stroke="black" points="316.5,-665.13 316.5,-686.13 557.5,-686.13 557.5,-665.13 316.5,-665.13"/>
+<text text-anchor="start" x="409.5" y="-671.93" font-family="Times,serif" font-size="14.00">created</text>
+<polygon fill="none" stroke="black" points="316.5,-644.13 316.5,-665.13 557.5,-665.13 557.5,-644.13 316.5,-644.13"/>
+<text text-anchor="start" x="409" y="-650.93" font-family="Times,serif" font-size="14.00">topic_id</text>
+<polygon fill="none" stroke="black" points="316.5,-623.13 316.5,-644.13 557.5,-644.13 557.5,-623.13 316.5,-623.13"/>
+<text text-anchor="start" x="408" y="-629.93" font-family="Times,serif" font-size="14.00">callback</text>
+<polygon fill="none" stroke="black" points="316.5,-602.13 316.5,-623.13 557.5,-623.13 557.5,-602.13 316.5,-602.13"/>
+<text text-anchor="start" x="409.5" y="-608.93" font-family="Times,serif" font-size="14.00">verified</text>
+<polygon fill="none" stroke="black" points="316.5,-581.13 316.5,-602.13 557.5,-602.13 557.5,-581.13 316.5,-581.13"/>
+<text text-anchor="start" x="410.5" y="-587.93" font-family="Times,serif" font-size="14.00">expires</text>
+<polygon fill="none" stroke="black" points="316.5,-560.13 316.5,-581.13 557.5,-581.13 557.5,-560.13 316.5,-560.13"/>
+<text text-anchor="start" x="414.5" y="-566.93" font-family="Times,serif" font-size="14.00">secret</text>
+<polygon fill="none" stroke="black" points="316.5,-539.13 316.5,-560.13 557.5,-560.13 557.5,-539.13 316.5,-539.13"/>
+<text text-anchor="start" x="364.5" y="-545.93" font-family="Times,serif" font-size="14.00">signature_algorithm</text>
+<polygon fill="none" stroke="black" points="316.5,-518.13 316.5,-539.13 557.5,-539.13 557.5,-518.13 316.5,-518.13"/>
+<text text-anchor="start" x="373" y="-524.93" font-family="Times,serif" font-size="14.00">http_remote_addr</text>
+<polygon fill="none" stroke="black" points="316.5,-497.13 316.5,-518.13 557.5,-518.13 557.5,-497.13 316.5,-497.13"/>
+<text text-anchor="start" x="401.5" y="-503.93" font-family="Times,serif" font-size="14.00">http_from</text>
+<polygon fill="none" stroke="black" points="316.5,-476.13 316.5,-497.13 557.5,-497.13 557.5,-476.13 316.5,-476.13"/>
+<text text-anchor="start" x="373" y="-482.93" font-family="Times,serif" font-size="14.00">content_delivered</text>
+<polygon fill="none" stroke="black" points="316.5,-455.13 316.5,-476.13 557.5,-476.13 557.5,-455.13 316.5,-455.13"/>
+<text text-anchor="start" x="349.5" y="-461.93" font-family="Times,serif" font-size="14.00">latest_content_delivered</text>
+<polygon fill="none" stroke="black" points="316.5,-434.13 316.5,-455.13 557.5,-455.13 557.5,-434.13 316.5,-434.13"/>
+<text text-anchor="start" x="319.5" y="-440.93" font-family="Times,serif" font-size="14.00">delivery_attempts_since_success</text>
+<polygon fill="none" stroke="black" points="316.5,-413.13 316.5,-434.13 557.5,-434.13 557.5,-413.13 316.5,-413.13"/>
+<text text-anchor="start" x="357" y="-419.93" font-family="Times,serif" font-size="14.00">delivery_next_attempt</text>
+</g>
+<!-- topic&#45;&gt;subscription -->
+<g id="edge3" class="edge">
+<title>topic:pk_id&#45;&gt;subscription:fk_topic_id</title>
+<path fill="none" stroke="black" d="M280,-655.13C292,-655.13 297.25,-655.13 305.88,-655.13"/>
+<polygon fill="black" stroke="black" points="306,-655.13 316,-659.63 311,-655.13 316,-655.13 316,-655.13 316,-655.13 311,-655.13 316,-650.63 306,-655.13 306,-655.13"/>
+</g>
+<!-- verification -->
+<g id="node6" class="node">
+<title>verification</title>
+<polygon fill="lightblue" stroke="transparent" points="353.5,-372.13 353.5,-395.13 519.5,-395.13 519.5,-372.13 353.5,-372.13"/>
+<polygon fill="none" stroke="black" stroke-width="2" points="354.5,-373.13 354.5,-394.13 518.5,-394.13 518.5,-373.13 354.5,-373.13"/>
+<text text-anchor="start" x="382" y="-379.93" font-family="Times,serif" font-size="14.00">VERIFICATION</text>
+<polygon fill="none" stroke="black" points="353.5,-351.13 353.5,-372.13 519.5,-372.13 519.5,-351.13 353.5,-351.13"/>
+<text text-anchor="start" x="429.5" y="-357.93" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="none" stroke="black" points="353.5,-330.13 353.5,-351.13 519.5,-351.13 519.5,-330.13 353.5,-330.13"/>
+<text text-anchor="start" x="409" y="-336.93" font-family="Times,serif" font-size="14.00">created</text>
+<polygon fill="none" stroke="black" points="353.5,-309.13 353.5,-330.13 519.5,-330.13 519.5,-309.13 353.5,-309.13"/>
+<text text-anchor="start" x="408.5" y="-315.93" font-family="Times,serif" font-size="14.00">topic_id</text>
+<polygon fill="none" stroke="black" points="353.5,-288.13 353.5,-309.13 519.5,-309.13 519.5,-288.13 353.5,-288.13"/>
+<text text-anchor="start" x="407.5" y="-294.93" font-family="Times,serif" font-size="14.00">callback</text>
+<polygon fill="none" stroke="black" points="353.5,-267.13 353.5,-288.13 519.5,-288.13 519.5,-267.13 353.5,-267.13"/>
+<text text-anchor="start" x="414" y="-273.93" font-family="Times,serif" font-size="14.00">secret</text>
+<polygon fill="none" stroke="black" points="353.5,-246.13 353.5,-267.13 519.5,-267.13 519.5,-246.13 353.5,-246.13"/>
+<text text-anchor="start" x="364" y="-252.93" font-family="Times,serif" font-size="14.00">signature_algorithm</text>
+<polygon fill="none" stroke="black" points="353.5,-225.13 353.5,-246.13 519.5,-246.13 519.5,-225.13 353.5,-225.13"/>
+<text text-anchor="start" x="372.5" y="-231.93" font-family="Times,serif" font-size="14.00">http_remote_addr</text>
+<polygon fill="none" stroke="black" points="353.5,-204.13 353.5,-225.13 519.5,-225.13 519.5,-204.13 353.5,-204.13"/>
+<text text-anchor="start" x="401" y="-210.93" font-family="Times,serif" font-size="14.00">http_from</text>
+<polygon fill="none" stroke="black" points="353.5,-183.13 353.5,-204.13 519.5,-204.13 519.5,-183.13 353.5,-183.13"/>
+<text text-anchor="start" x="416.5" y="-189.93" font-family="Times,serif" font-size="14.00">mode</text>
+<polygon fill="none" stroke="black" points="353.5,-162.13 353.5,-183.13 519.5,-183.13 519.5,-162.13 353.5,-162.13"/>
+<text text-anchor="start" x="412" y="-168.93" font-family="Times,serif" font-size="14.00">reason</text>
+<polygon fill="none" stroke="black" points="353.5,-141.13 353.5,-162.13 519.5,-162.13 519.5,-141.13 353.5,-141.13"/>
+<text text-anchor="start" x="386" y="-147.93" font-family="Times,serif" font-size="14.00">lease_seconds</text>
+<polygon fill="none" stroke="black" points="353.5,-120.13 353.5,-141.13 519.5,-141.13 519.5,-120.13 353.5,-120.13"/>
+<text text-anchor="start" x="356.5" y="-126.93" font-family="Times,serif" font-size="14.00">is_publisher_validated</text>
+<polygon fill="none" stroke="black" points="353.5,-99.13 353.5,-120.13 519.5,-120.13 519.5,-99.13 353.5,-99.13"/>
+<text text-anchor="start" x="398.5" y="-105.93" font-family="Times,serif" font-size="14.00">request_id</text>
+<polygon fill="none" stroke="black" points="353.5,-78.13 353.5,-99.13 519.5,-99.13 519.5,-78.13 353.5,-78.13"/>
+<text text-anchor="start" x="404" y="-84.93" font-family="Times,serif" font-size="14.00">attempts</text>
+<polygon fill="none" stroke="black" points="353.5,-57.13 353.5,-78.13 519.5,-78.13 519.5,-57.13 353.5,-57.13"/>
+<text text-anchor="start" x="388.5" y="-63.93" font-family="Times,serif" font-size="14.00">next_attempt</text>
+</g>
+<!-- topic&#45;&gt;verification -->
+<g id="edge5" class="edge">
+<title>topic:pk_id&#45;&gt;verification:fk_topic_id</title>
+<path fill="none" stroke="black" d="M280,-655.13C336.13,-655.13 300.8,-459.16 316,-405.13 326.09,-369.27 314.1,-328.6 342.37,-321.29"/>
+<polygon fill="black" stroke="black" points="342.56,-321.26 353.01,-324.6 347.53,-320.7 352.5,-320.13 352.5,-320.13 352.5,-320.13 347.53,-320.7 351.99,-315.66 342.56,-321.26 342.56,-321.26"/>
+</g>
+<!-- verification_in_progress -->
+<g id="node7" class="node">
+<title>verification_in_progress</title>
+<polygon fill="lightblue" stroke="transparent" points="638.5,-216.13 638.5,-239.13 869.5,-239.13 869.5,-216.13 638.5,-216.13"/>
+<polygon fill="none" stroke="black" stroke-width="2" points="639.5,-217.13 639.5,-238.13 868.5,-238.13 868.5,-217.13 639.5,-217.13"/>
+<text text-anchor="start" x="642.5" y="-223.93" font-family="Times,serif" font-size="14.00">VERIFICATION_IN_PROGRESS</text>
+<polygon fill="none" stroke="black" points="638.5,-195.13 638.5,-216.13 869.5,-216.13 869.5,-195.13 638.5,-195.13"/>
+<text text-anchor="start" x="747" y="-201.93" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="none" stroke="black" points="638.5,-174.13 638.5,-195.13 869.5,-195.13 869.5,-174.13 638.5,-174.13"/>
+<text text-anchor="start" x="726" y="-180.93" font-family="Times,serif" font-size="14.00">topic_id</text>
+<polygon fill="none" stroke="black" points="638.5,-153.13 638.5,-174.13 869.5,-174.13 869.5,-153.13 638.5,-153.13"/>
+<text text-anchor="start" x="725" y="-159.93" font-family="Times,serif" font-size="14.00">callback</text>
+<polygon fill="none" stroke="black" points="638.5,-132.13 638.5,-153.13 869.5,-153.13 869.5,-132.13 638.5,-132.13"/>
+<text text-anchor="start" x="723" y="-138.93" font-family="Times,serif" font-size="14.00">claimant</text>
+<polygon fill="none" stroke="black" points="638.5,-111.13 638.5,-132.13 869.5,-132.13 869.5,-111.13 638.5,-111.13"/>
+<text text-anchor="start" x="726" y="-117.93" font-family="Times,serif" font-size="14.00">claimed</text>
+<polygon fill="none" stroke="black" points="638.5,-90.13 638.5,-111.13 869.5,-111.13 869.5,-90.13 638.5,-90.13"/>
+<text text-anchor="start" x="705" y="-96.93" font-family="Times,serif" font-size="14.00">claim_expires</text>
+</g>
+<!-- topic&#45;&gt;verification_in_progress -->
+<g id="edge7" class="edge">
+<title>topic:pk_id&#45;&gt;verification_in_progress:fk_topic_id</title>
+<path fill="none" stroke="black" d="M280,-655.13C347.56,-655.13 266.83,-94.47 316,-48.13 393.95,25.33 464.03,5.07 557,-48.13 615.06,-81.36 571.99,-174.57 627.31,-184.31"/>
+<polygon fill="black" stroke="black" points="627.53,-184.32 637.14,-189.62 632.52,-184.73 637.5,-185.13 637.5,-185.13 637.5,-185.13 632.52,-184.73 637.86,-180.65 627.53,-184.32 627.53,-184.32"/>
+</g>
+<!-- subscription_delivery_in_progress -->
+<g id="node5" class="node">
+<title>subscription_delivery_in_progress</title>
+<polygon fill="lightblue" stroke="transparent" points="593.5,-707.13 593.5,-730.13 914.5,-730.13 914.5,-707.13 593.5,-707.13"/>
+<polygon fill="none" stroke="black" stroke-width="2" points="594.5,-708.13 594.5,-729.13 913.5,-729.13 913.5,-708.13 594.5,-708.13"/>
+<text text-anchor="start" x="597.5" y="-714.93" font-family="Times,serif" font-size="14.00">SUBSCRIPTION_DELIVERY_IN_PROGRESS</text>
+<polygon fill="none" stroke="black" points="593.5,-686.13 593.5,-707.13 914.5,-707.13 914.5,-686.13 593.5,-686.13"/>
+<text text-anchor="start" x="747" y="-692.93" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="none" stroke="black" points="593.5,-665.13 593.5,-686.13 914.5,-686.13 914.5,-665.13 593.5,-665.13"/>
+<text text-anchor="start" x="723" y="-671.93" font-family="Times,serif" font-size="14.00">claimant</text>
+<polygon fill="none" stroke="black" points="593.5,-644.13 593.5,-665.13 914.5,-665.13 914.5,-644.13 593.5,-644.13"/>
+<text text-anchor="start" x="726" y="-650.93" font-family="Times,serif" font-size="14.00">claimed</text>
+<polygon fill="none" stroke="black" points="593.5,-623.13 593.5,-644.13 914.5,-644.13 914.5,-623.13 593.5,-623.13"/>
+<text text-anchor="start" x="705" y="-629.93" font-family="Times,serif" font-size="14.00">claim_expires</text>
+</g>
+<!-- subscription&#45;&gt;subscription_delivery_in_progress -->
+<g id="edge4" class="edge">
+<title>subscription:pk_id&#45;&gt;subscription_delivery_in_progress:fk_id</title>
+<path fill="none" stroke="black" d="M557,-697.13C569,-697.13 574.25,-697.13 582.88,-697.13"/>
+<polygon fill="black" stroke="black" points="583,-697.13 593,-701.63 588,-697.13 593,-697.13 593,-697.13 593,-697.13 588,-697.13 593,-692.63 583,-697.13 583,-697.13"/>
+</g>
+<!-- verification&#45;&gt;verification_in_progress -->
+<g id="edge6" class="edge">
+<title>verification:pk_id&#45;&gt;verification_in_progress:fk_id</title>
+<path fill="none" stroke="black" d="M520.5,-362.13C603.44,-362.13 555.41,-219.25 627.1,-206.97"/>
+<polygon fill="black" stroke="black" points="627.53,-206.94 637.86,-210.62 632.52,-206.53 637.5,-206.13 637.5,-206.13 637.5,-206.13 632.52,-206.53 637.14,-201.65 627.53,-206.94 627.53,-206.94"/>
+</g>
+<!-- authentication -->
+<g id="node8" class="node">
+<title>authentication</title>
+<polygon fill="lightblue" stroke="transparent" points="67,-790.13 67,-813.13 213,-813.13 213,-790.13 67,-790.13"/>
+<polygon fill="none" stroke="black" stroke-width="2" points="68,-791.13 68,-812.13 212,-812.13 212,-791.13 68,-791.13"/>
+<text text-anchor="start" x="71" y="-797.93" font-family="Times,serif" font-size="14.00">AUTHENTICATION</text>
+<polygon fill="none" stroke="black" points="67,-769.13 67,-790.13 213,-790.13 213,-769.13 67,-769.13"/>
+<text text-anchor="start" x="112.5" y="-775.93" font-family="Times,serif" font-size="14.00">created</text>
+<polygon fill="none" stroke="black" points="67,-748.13 67,-769.13 213,-769.13 213,-748.13 67,-748.13"/>
+<text text-anchor="start" x="73.5" y="-754.93" font-family="Times,serif" font-size="14.00">last_authenticated</text>
+<polygon fill="none" stroke="black" points="67,-727.13 67,-748.13 213,-748.13 213,-727.13 67,-727.13"/>
+<text text-anchor="start" x="106.5" y="-733.93" font-family="Times,serif" font-size="14.00">identifier</text>
+<polygon fill="none" stroke="black" points="67,-706.13 67,-727.13 213,-727.13 213,-706.13 67,-706.13"/>
+<text text-anchor="start" x="103.5" y="-712.93" font-family="Times,serif" font-size="14.00">credential</text>
+</g>
+</g>
+</svg>
diff --git a/documentation/media/sqlite-er.svg b/documentation/media/sqlite-er.svg
new file mode 100644 (file)
index 0000000..e4a9c87
--- /dev/null
@@ -0,0 +1,250 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.49.0 (20210828.1703)
+ -->
+<!-- Title: WebsubHubERD Pages: 1 -->
+<svg width="922pt" height="1084pt"
+ viewBox="0.00 0.00 922.00 1083.63" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1079.63)">
+<title>WebsubHubERD</title>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-1079.63 918,-1079.63 918,4 -4,4"/>
+<text text-anchor="middle" x="457" y="-1050.83" font-family="Times,serif" font-size="26.00">Websub Hub Entity&#45;Relations</text>
+<text text-anchor="middle" x="457" y="-1021.83" font-family="Times,serif" font-size="26.00">SQLite</text>
+<text text-anchor="middle" x="457" y="-992.83" font-family="Times,serif" font-size="26.00">Schema 1.0.3</text>
+<!-- topic -->
+<g id="node1" class="node">
+<title>topic</title>
+<polygon fill="lightblue" stroke="transparent" points="0,-665.13 0,-688.13 280,-688.13 280,-665.13 0,-665.13"/>
+<polygon fill="none" stroke="black" stroke-width="2" points="1,-666.13 1,-687.13 279,-687.13 279,-666.13 1,-666.13"/>
+<text text-anchor="start" x="117" y="-672.93" font-family="Times,serif" font-size="14.00">TOPIC</text>
+<polygon fill="none" stroke="black" points="0,-644.13 0,-665.13 280,-665.13 280,-644.13 0,-644.13"/>
+<text text-anchor="start" x="133" y="-650.93" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="none" stroke="black" points="0,-623.13 0,-644.13 280,-644.13 280,-623.13 0,-623.13"/>
+<text text-anchor="start" x="112.5" y="-629.93" font-family="Times,serif" font-size="14.00">created</text>
+<polygon fill="none" stroke="black" points="0,-602.13 0,-623.13 280,-623.13 280,-602.13 0,-602.13"/>
+<text text-anchor="start" x="129.5" y="-608.93" font-family="Times,serif" font-size="14.00">url</text>
+<polygon fill="none" stroke="black" points="0,-581.13 0,-602.13 280,-602.13 280,-581.13 0,-581.13"/>
+<text text-anchor="start" x="52" y="-587.93" font-family="Times,serif" font-size="14.00">lease_seconds_preferred</text>
+<polygon fill="none" stroke="black" points="0,-560.13 0,-581.13 280,-581.13 280,-560.13 0,-560.13"/>
+<text text-anchor="start" x="72.5" y="-566.93" font-family="Times,serif" font-size="14.00">lease_seconds_min</text>
+<polygon fill="none" stroke="black" points="0,-539.13 0,-560.13 280,-560.13 280,-539.13 0,-539.13"/>
+<text text-anchor="start" x="71" y="-545.93" font-family="Times,serif" font-size="14.00">lease_seconds_max</text>
+<polygon fill="none" stroke="black" points="0,-518.13 0,-539.13 280,-539.13 280,-518.13 0,-518.13"/>
+<text text-anchor="start" x="54" y="-524.93" font-family="Times,serif" font-size="14.00">publisher_validation_url</text>
+<polygon fill="none" stroke="black" points="0,-497.13 0,-518.13 280,-518.13 280,-497.13 0,-497.13"/>
+<text text-anchor="start" x="54" y="-503.93" font-family="Times,serif" font-size="14.00">content_hash_algorithm</text>
+<polygon fill="none" stroke="black" points="0,-476.13 0,-497.13 280,-497.13 280,-476.13 0,-476.13"/>
+<text text-anchor="start" x="109" y="-482.93" font-family="Times,serif" font-size="14.00">is_active</text>
+<polygon fill="none" stroke="black" points="0,-455.13 0,-476.13 280,-476.13 280,-455.13 0,-455.13"/>
+<text text-anchor="start" x="103.5" y="-461.93" font-family="Times,serif" font-size="14.00">is_deleted</text>
+<polygon fill="none" stroke="black" points="0,-434.13 0,-455.13 280,-455.13 280,-434.13 0,-434.13"/>
+<text text-anchor="start" x="97" y="-440.93" font-family="Times,serif" font-size="14.00">last_publish</text>
+<polygon fill="none" stroke="black" points="0,-413.13 0,-434.13 280,-434.13 280,-413.13 0,-413.13"/>
+<text text-anchor="start" x="40.5" y="-419.93" font-family="Times,serif" font-size="14.00">content_fetch_next_attempt</text>
+<polygon fill="none" stroke="black" points="0,-392.13 0,-413.13 280,-413.13 280,-392.13 0,-392.13"/>
+<text text-anchor="start" x="3" y="-398.93" font-family="Times,serif" font-size="14.00">content_fetch_attempts_since_success</text>
+<polygon fill="none" stroke="black" points="0,-371.13 0,-392.13 280,-392.13 280,-371.13 0,-371.13"/>
+<text text-anchor="start" x="80" y="-377.93" font-family="Times,serif" font-size="14.00">content_updated</text>
+<polygon fill="none" stroke="black" points="0,-350.13 0,-371.13 280,-371.13 280,-350.13 0,-350.13"/>
+<text text-anchor="start" x="112.5" y="-356.93" font-family="Times,serif" font-size="14.00">content</text>
+<polygon fill="none" stroke="black" points="0,-329.13 0,-350.13 280,-350.13 280,-329.13 0,-329.13"/>
+<text text-anchor="start" x="92.5" y="-335.93" font-family="Times,serif" font-size="14.00">content_hash</text>
+<polygon fill="none" stroke="black" points="0,-308.13 0,-329.13 280,-329.13 280,-308.13 0,-308.13"/>
+<text text-anchor="start" x="93.5" y="-314.93" font-family="Times,serif" font-size="14.00">content_type</text>
+</g>
+<!-- topic_fetch_in_progress -->
+<g id="node2" class="node">
+<title>topic_fetch_in_progress</title>
+<polygon fill="lightblue" stroke="transparent" points="323.5,-957.13 323.5,-980.13 550.5,-980.13 550.5,-957.13 323.5,-957.13"/>
+<polygon fill="none" stroke="black" stroke-width="2" points="324.5,-958.13 324.5,-979.13 549.5,-979.13 549.5,-958.13 324.5,-958.13"/>
+<text text-anchor="start" x="327.5" y="-964.93" font-family="Times,serif" font-size="14.00">TOPIC_FETCH_IN_PROGRESS</text>
+<polygon fill="none" stroke="black" points="323.5,-936.13 323.5,-957.13 550.5,-957.13 550.5,-936.13 323.5,-936.13"/>
+<text text-anchor="start" x="430" y="-942.93" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="none" stroke="black" points="323.5,-915.13 323.5,-936.13 550.5,-936.13 550.5,-915.13 323.5,-915.13"/>
+<text text-anchor="start" x="406" y="-921.93" font-family="Times,serif" font-size="14.00">claimant</text>
+<polygon fill="none" stroke="black" points="323.5,-894.13 323.5,-915.13 550.5,-915.13 550.5,-894.13 323.5,-894.13"/>
+<text text-anchor="start" x="409" y="-900.93" font-family="Times,serif" font-size="14.00">claimed</text>
+<polygon fill="none" stroke="black" points="323.5,-873.13 323.5,-894.13 550.5,-894.13 550.5,-873.13 323.5,-873.13"/>
+<text text-anchor="start" x="388" y="-879.93" font-family="Times,serif" font-size="14.00">claim_expires</text>
+</g>
+<!-- topic&#45;&gt;topic_fetch_in_progress -->
+<g id="edge1" class="edge">
+<title>topic:pk_id&#45;&gt;topic_fetch_in_progress:fk_id</title>
+<path fill="none" stroke="black" d="M280,-655.13C341.86,-655.13 266.47,-914.99 312.79,-944.43"/>
+<polygon fill="black" stroke="black" points="312.87,-944.45 321.29,-951.47 317.68,-945.79 322.5,-947.13 322.5,-947.13 322.5,-947.13 317.68,-945.79 323.71,-942.8 312.87,-944.45 312.87,-944.45"/>
+</g>
+<!-- topic_content_history -->
+<g id="node3" class="node">
+<title>topic_content_history</title>
+<polygon fill="lightblue" stroke="transparent" points="332.5,-832.13 332.5,-855.13 541.5,-855.13 541.5,-832.13 332.5,-832.13"/>
+<polygon fill="none" stroke="black" stroke-width="2" points="333.5,-833.13 333.5,-854.13 540.5,-854.13 540.5,-833.13 333.5,-833.13"/>
+<text text-anchor="start" x="336.5" y="-839.93" font-family="Times,serif" font-size="14.00">TOPIC_CONTENT_HISTORY</text>
+<polygon fill="none" stroke="black" points="332.5,-811.13 332.5,-832.13 541.5,-832.13 541.5,-811.13 332.5,-811.13"/>
+<text text-anchor="start" x="409" y="-817.93" font-family="Times,serif" font-size="14.00">topic_id</text>
+<polygon fill="none" stroke="black" points="332.5,-790.13 332.5,-811.13 541.5,-811.13 541.5,-790.13 332.5,-790.13"/>
+<text text-anchor="start" x="377" y="-796.93" font-family="Times,serif" font-size="14.00">content_updated</text>
+<polygon fill="none" stroke="black" points="332.5,-769.13 332.5,-790.13 541.5,-790.13 541.5,-769.13 332.5,-769.13"/>
+<text text-anchor="start" x="392.5" y="-775.93" font-family="Times,serif" font-size="14.00">content_size</text>
+<polygon fill="none" stroke="black" points="332.5,-748.13 332.5,-769.13 541.5,-769.13 541.5,-748.13 332.5,-748.13"/>
+<text text-anchor="start" x="389.5" y="-754.93" font-family="Times,serif" font-size="14.00">content_hash</text>
+</g>
+<!-- topic&#45;&gt;topic_content_history -->
+<g id="edge2" class="edge">
+<title>topic:pk_id&#45;&gt;topic_content_history:fk_topic_id</title>
+<path fill="none" stroke="black" d="M280,-655.13C353.88,-655.13 263.54,-806.22 321.38,-820.98"/>
+<polygon fill="black" stroke="black" points="321.56,-821 330.99,-826.6 326.53,-821.56 331.5,-822.13 331.5,-822.13 331.5,-822.13 326.53,-821.56 332.01,-817.66 321.56,-821 321.56,-821"/>
+</g>
+<!-- subscription -->
+<g id="node4" class="node">
+<title>subscription</title>
+<polygon fill="lightblue" stroke="transparent" points="316.5,-707.13 316.5,-730.13 557.5,-730.13 557.5,-707.13 316.5,-707.13"/>
+<polygon fill="none" stroke="black" stroke-width="2" points="317.5,-708.13 317.5,-729.13 556.5,-729.13 556.5,-708.13 317.5,-708.13"/>
+<text text-anchor="start" x="379" y="-714.93" font-family="Times,serif" font-size="14.00">SUBSCRIPTION</text>
+<polygon fill="none" stroke="black" points="316.5,-686.13 316.5,-707.13 557.5,-707.13 557.5,-686.13 316.5,-686.13"/>
+<text text-anchor="start" x="430" y="-692.93" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="none" stroke="black" points="316.5,-665.13 316.5,-686.13 557.5,-686.13 557.5,-665.13 316.5,-665.13"/>
+<text text-anchor="start" x="409.5" y="-671.93" font-family="Times,serif" font-size="14.00">created</text>
+<polygon fill="none" stroke="black" points="316.5,-644.13 316.5,-665.13 557.5,-665.13 557.5,-644.13 316.5,-644.13"/>
+<text text-anchor="start" x="409" y="-650.93" font-family="Times,serif" font-size="14.00">topic_id</text>
+<polygon fill="none" stroke="black" points="316.5,-623.13 316.5,-644.13 557.5,-644.13 557.5,-623.13 316.5,-623.13"/>
+<text text-anchor="start" x="408" y="-629.93" font-family="Times,serif" font-size="14.00">callback</text>
+<polygon fill="none" stroke="black" points="316.5,-602.13 316.5,-623.13 557.5,-623.13 557.5,-602.13 316.5,-602.13"/>
+<text text-anchor="start" x="409.5" y="-608.93" font-family="Times,serif" font-size="14.00">verified</text>
+<polygon fill="none" stroke="black" points="316.5,-581.13 316.5,-602.13 557.5,-602.13 557.5,-581.13 316.5,-581.13"/>
+<text text-anchor="start" x="410.5" y="-587.93" font-family="Times,serif" font-size="14.00">expires</text>
+<polygon fill="none" stroke="black" points="316.5,-560.13 316.5,-581.13 557.5,-581.13 557.5,-560.13 316.5,-560.13"/>
+<text text-anchor="start" x="414.5" y="-566.93" font-family="Times,serif" font-size="14.00">secret</text>
+<polygon fill="none" stroke="black" points="316.5,-539.13 316.5,-560.13 557.5,-560.13 557.5,-539.13 316.5,-539.13"/>
+<text text-anchor="start" x="364.5" y="-545.93" font-family="Times,serif" font-size="14.00">signature_algorithm</text>
+<polygon fill="none" stroke="black" points="316.5,-518.13 316.5,-539.13 557.5,-539.13 557.5,-518.13 316.5,-518.13"/>
+<text text-anchor="start" x="373" y="-524.93" font-family="Times,serif" font-size="14.00">http_remote_addr</text>
+<polygon fill="none" stroke="black" points="316.5,-497.13 316.5,-518.13 557.5,-518.13 557.5,-497.13 316.5,-497.13"/>
+<text text-anchor="start" x="401.5" y="-503.93" font-family="Times,serif" font-size="14.00">http_from</text>
+<polygon fill="none" stroke="black" points="316.5,-476.13 316.5,-497.13 557.5,-497.13 557.5,-476.13 316.5,-476.13"/>
+<text text-anchor="start" x="373" y="-482.93" font-family="Times,serif" font-size="14.00">content_delivered</text>
+<polygon fill="none" stroke="black" points="316.5,-455.13 316.5,-476.13 557.5,-476.13 557.5,-455.13 316.5,-455.13"/>
+<text text-anchor="start" x="349.5" y="-461.93" font-family="Times,serif" font-size="14.00">latest_content_delivered</text>
+<polygon fill="none" stroke="black" points="316.5,-434.13 316.5,-455.13 557.5,-455.13 557.5,-434.13 316.5,-434.13"/>
+<text text-anchor="start" x="319.5" y="-440.93" font-family="Times,serif" font-size="14.00">delivery_attempts_since_success</text>
+<polygon fill="none" stroke="black" points="316.5,-413.13 316.5,-434.13 557.5,-434.13 557.5,-413.13 316.5,-413.13"/>
+<text text-anchor="start" x="357" y="-419.93" font-family="Times,serif" font-size="14.00">delivery_next_attempt</text>
+</g>
+<!-- topic&#45;&gt;subscription -->
+<g id="edge3" class="edge">
+<title>topic:pk_id&#45;&gt;subscription:fk_topic_id</title>
+<path fill="none" stroke="black" d="M280,-655.13C292,-655.13 297.25,-655.13 305.88,-655.13"/>
+<polygon fill="black" stroke="black" points="306,-655.13 316,-659.63 311,-655.13 316,-655.13 316,-655.13 316,-655.13 311,-655.13 316,-650.63 306,-655.13 306,-655.13"/>
+</g>
+<!-- verification -->
+<g id="node6" class="node">
+<title>verification</title>
+<polygon fill="lightblue" stroke="transparent" points="353.5,-372.13 353.5,-395.13 519.5,-395.13 519.5,-372.13 353.5,-372.13"/>
+<polygon fill="none" stroke="black" stroke-width="2" points="354.5,-373.13 354.5,-394.13 518.5,-394.13 518.5,-373.13 354.5,-373.13"/>
+<text text-anchor="start" x="382" y="-379.93" font-family="Times,serif" font-size="14.00">VERIFICATION</text>
+<polygon fill="none" stroke="black" points="353.5,-351.13 353.5,-372.13 519.5,-372.13 519.5,-351.13 353.5,-351.13"/>
+<text text-anchor="start" x="429.5" y="-357.93" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="none" stroke="black" points="353.5,-330.13 353.5,-351.13 519.5,-351.13 519.5,-330.13 353.5,-330.13"/>
+<text text-anchor="start" x="409" y="-336.93" font-family="Times,serif" font-size="14.00">created</text>
+<polygon fill="none" stroke="black" points="353.5,-309.13 353.5,-330.13 519.5,-330.13 519.5,-309.13 353.5,-309.13"/>
+<text text-anchor="start" x="408.5" y="-315.93" font-family="Times,serif" font-size="14.00">topic_id</text>
+<polygon fill="none" stroke="black" points="353.5,-288.13 353.5,-309.13 519.5,-309.13 519.5,-288.13 353.5,-288.13"/>
+<text text-anchor="start" x="407.5" y="-294.93" font-family="Times,serif" font-size="14.00">callback</text>
+<polygon fill="none" stroke="black" points="353.5,-267.13 353.5,-288.13 519.5,-288.13 519.5,-267.13 353.5,-267.13"/>
+<text text-anchor="start" x="414" y="-273.93" font-family="Times,serif" font-size="14.00">secret</text>
+<polygon fill="none" stroke="black" points="353.5,-246.13 353.5,-267.13 519.5,-267.13 519.5,-246.13 353.5,-246.13"/>
+<text text-anchor="start" x="364" y="-252.93" font-family="Times,serif" font-size="14.00">signature_algorithm</text>
+<polygon fill="none" stroke="black" points="353.5,-225.13 353.5,-246.13 519.5,-246.13 519.5,-225.13 353.5,-225.13"/>
+<text text-anchor="start" x="372.5" y="-231.93" font-family="Times,serif" font-size="14.00">http_remote_addr</text>
+<polygon fill="none" stroke="black" points="353.5,-204.13 353.5,-225.13 519.5,-225.13 519.5,-204.13 353.5,-204.13"/>
+<text text-anchor="start" x="401" y="-210.93" font-family="Times,serif" font-size="14.00">http_from</text>
+<polygon fill="none" stroke="black" points="353.5,-183.13 353.5,-204.13 519.5,-204.13 519.5,-183.13 353.5,-183.13"/>
+<text text-anchor="start" x="416.5" y="-189.93" font-family="Times,serif" font-size="14.00">mode</text>
+<polygon fill="none" stroke="black" points="353.5,-162.13 353.5,-183.13 519.5,-183.13 519.5,-162.13 353.5,-162.13"/>
+<text text-anchor="start" x="412" y="-168.93" font-family="Times,serif" font-size="14.00">reason</text>
+<polygon fill="none" stroke="black" points="353.5,-141.13 353.5,-162.13 519.5,-162.13 519.5,-141.13 353.5,-141.13"/>
+<text text-anchor="start" x="386" y="-147.93" font-family="Times,serif" font-size="14.00">lease_seconds</text>
+<polygon fill="none" stroke="black" points="353.5,-120.13 353.5,-141.13 519.5,-141.13 519.5,-120.13 353.5,-120.13"/>
+<text text-anchor="start" x="356.5" y="-126.93" font-family="Times,serif" font-size="14.00">is_publisher_validated</text>
+<polygon fill="none" stroke="black" points="353.5,-99.13 353.5,-120.13 519.5,-120.13 519.5,-99.13 353.5,-99.13"/>
+<text text-anchor="start" x="398.5" y="-105.93" font-family="Times,serif" font-size="14.00">request_id</text>
+<polygon fill="none" stroke="black" points="353.5,-78.13 353.5,-99.13 519.5,-99.13 519.5,-78.13 353.5,-78.13"/>
+<text text-anchor="start" x="404" y="-84.93" font-family="Times,serif" font-size="14.00">attempts</text>
+<polygon fill="none" stroke="black" points="353.5,-57.13 353.5,-78.13 519.5,-78.13 519.5,-57.13 353.5,-57.13"/>
+<text text-anchor="start" x="388.5" y="-63.93" font-family="Times,serif" font-size="14.00">next_attempt</text>
+</g>
+<!-- topic&#45;&gt;verification -->
+<g id="edge5" class="edge">
+<title>topic:pk_id&#45;&gt;verification:fk_topic_id</title>
+<path fill="none" stroke="black" d="M280,-655.13C336.13,-655.13 300.8,-459.16 316,-405.13 326.09,-369.27 314.1,-328.6 342.37,-321.29"/>
+<polygon fill="black" stroke="black" points="342.56,-321.26 353.01,-324.6 347.53,-320.7 352.5,-320.13 352.5,-320.13 352.5,-320.13 347.53,-320.7 351.99,-315.66 342.56,-321.26 342.56,-321.26"/>
+</g>
+<!-- verification_in_progress -->
+<g id="node7" class="node">
+<title>verification_in_progress</title>
+<polygon fill="lightblue" stroke="transparent" points="638.5,-216.13 638.5,-239.13 869.5,-239.13 869.5,-216.13 638.5,-216.13"/>
+<polygon fill="none" stroke="black" stroke-width="2" points="639.5,-217.13 639.5,-238.13 868.5,-238.13 868.5,-217.13 639.5,-217.13"/>
+<text text-anchor="start" x="642.5" y="-223.93" font-family="Times,serif" font-size="14.00">VERIFICATION_IN_PROGRESS</text>
+<polygon fill="none" stroke="black" points="638.5,-195.13 638.5,-216.13 869.5,-216.13 869.5,-195.13 638.5,-195.13"/>
+<text text-anchor="start" x="747" y="-201.93" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="none" stroke="black" points="638.5,-174.13 638.5,-195.13 869.5,-195.13 869.5,-174.13 638.5,-174.13"/>
+<text text-anchor="start" x="726" y="-180.93" font-family="Times,serif" font-size="14.00">topic_id</text>
+<polygon fill="none" stroke="black" points="638.5,-153.13 638.5,-174.13 869.5,-174.13 869.5,-153.13 638.5,-153.13"/>
+<text text-anchor="start" x="725" y="-159.93" font-family="Times,serif" font-size="14.00">callback</text>
+<polygon fill="none" stroke="black" points="638.5,-132.13 638.5,-153.13 869.5,-153.13 869.5,-132.13 638.5,-132.13"/>
+<text text-anchor="start" x="723" y="-138.93" font-family="Times,serif" font-size="14.00">claimant</text>
+<polygon fill="none" stroke="black" points="638.5,-111.13 638.5,-132.13 869.5,-132.13 869.5,-111.13 638.5,-111.13"/>
+<text text-anchor="start" x="726" y="-117.93" font-family="Times,serif" font-size="14.00">claimed</text>
+<polygon fill="none" stroke="black" points="638.5,-90.13 638.5,-111.13 869.5,-111.13 869.5,-90.13 638.5,-90.13"/>
+<text text-anchor="start" x="705" y="-96.93" font-family="Times,serif" font-size="14.00">claim_expires</text>
+</g>
+<!-- topic&#45;&gt;verification_in_progress -->
+<g id="edge7" class="edge">
+<title>topic:pk_id&#45;&gt;verification_in_progress:fk_topic_id</title>
+<path fill="none" stroke="black" d="M280,-655.13C347.56,-655.13 266.83,-94.47 316,-48.13 393.95,25.33 464.03,5.07 557,-48.13 615.06,-81.36 571.99,-174.57 627.31,-184.31"/>
+<polygon fill="black" stroke="black" points="627.53,-184.32 637.14,-189.62 632.52,-184.73 637.5,-185.13 637.5,-185.13 637.5,-185.13 632.52,-184.73 637.86,-180.65 627.53,-184.32 627.53,-184.32"/>
+</g>
+<!-- subscription_delivery_in_progress -->
+<g id="node5" class="node">
+<title>subscription_delivery_in_progress</title>
+<polygon fill="lightblue" stroke="transparent" points="593.5,-707.13 593.5,-730.13 914.5,-730.13 914.5,-707.13 593.5,-707.13"/>
+<polygon fill="none" stroke="black" stroke-width="2" points="594.5,-708.13 594.5,-729.13 913.5,-729.13 913.5,-708.13 594.5,-708.13"/>
+<text text-anchor="start" x="597.5" y="-714.93" font-family="Times,serif" font-size="14.00">SUBSCRIPTION_DELIVERY_IN_PROGRESS</text>
+<polygon fill="none" stroke="black" points="593.5,-686.13 593.5,-707.13 914.5,-707.13 914.5,-686.13 593.5,-686.13"/>
+<text text-anchor="start" x="747" y="-692.93" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="none" stroke="black" points="593.5,-665.13 593.5,-686.13 914.5,-686.13 914.5,-665.13 593.5,-665.13"/>
+<text text-anchor="start" x="723" y="-671.93" font-family="Times,serif" font-size="14.00">claimant</text>
+<polygon fill="none" stroke="black" points="593.5,-644.13 593.5,-665.13 914.5,-665.13 914.5,-644.13 593.5,-644.13"/>
+<text text-anchor="start" x="726" y="-650.93" font-family="Times,serif" font-size="14.00">claimed</text>
+<polygon fill="none" stroke="black" points="593.5,-623.13 593.5,-644.13 914.5,-644.13 914.5,-623.13 593.5,-623.13"/>
+<text text-anchor="start" x="705" y="-629.93" font-family="Times,serif" font-size="14.00">claim_expires</text>
+</g>
+<!-- subscription&#45;&gt;subscription_delivery_in_progress -->
+<g id="edge4" class="edge">
+<title>subscription:pk_id&#45;&gt;subscription_delivery_in_progress:fk_id</title>
+<path fill="none" stroke="black" d="M557,-697.13C569,-697.13 574.25,-697.13 582.88,-697.13"/>
+<polygon fill="black" stroke="black" points="583,-697.13 593,-701.63 588,-697.13 593,-697.13 593,-697.13 593,-697.13 588,-697.13 593,-692.63 583,-697.13 583,-697.13"/>
+</g>
+<!-- verification&#45;&gt;verification_in_progress -->
+<g id="edge6" class="edge">
+<title>verification:pk_id&#45;&gt;verification_in_progress:fk_id</title>
+<path fill="none" stroke="black" d="M520.5,-362.13C603.44,-362.13 555.41,-219.25 627.1,-206.97"/>
+<polygon fill="black" stroke="black" points="627.53,-206.94 637.86,-210.62 632.52,-206.53 637.5,-206.13 637.5,-206.13 637.5,-206.13 632.52,-206.53 637.14,-201.65 627.53,-206.94 627.53,-206.94"/>
+</g>
+<!-- authentication -->
+<g id="node8" class="node">
+<title>authentication</title>
+<polygon fill="lightblue" stroke="transparent" points="67,-790.13 67,-813.13 213,-813.13 213,-790.13 67,-790.13"/>
+<polygon fill="none" stroke="black" stroke-width="2" points="68,-791.13 68,-812.13 212,-812.13 212,-791.13 68,-791.13"/>
+<text text-anchor="start" x="71" y="-797.93" font-family="Times,serif" font-size="14.00">AUTHENTICATION</text>
+<polygon fill="none" stroke="black" points="67,-769.13 67,-790.13 213,-790.13 213,-769.13 67,-769.13"/>
+<text text-anchor="start" x="112.5" y="-775.93" font-family="Times,serif" font-size="14.00">created</text>
+<polygon fill="none" stroke="black" points="67,-748.13 67,-769.13 213,-769.13 213,-748.13 67,-748.13"/>
+<text text-anchor="start" x="73.5" y="-754.93" font-family="Times,serif" font-size="14.00">last_authenticated</text>
+<polygon fill="none" stroke="black" points="67,-727.13 67,-748.13 213,-748.13 213,-727.13 67,-727.13"/>
+<text text-anchor="start" x="106.5" y="-733.93" font-family="Times,serif" font-size="14.00">identifier</text>
+<polygon fill="none" stroke="black" points="67,-706.13 67,-727.13 213,-727.13 213,-706.13 67,-706.13"/>
+<text text-anchor="start" x="103.5" y="-712.93" font-family="Times,serif" font-size="14.00">credential</text>
+</g>
+</g>
+</svg>
diff --git a/src/db/postgres/sql/schema/1.0.0/er.dot b/src/db/postgres/sql/schema/1.0.0/er.dot
new file mode 100644 (file)
index 0000000..a70f150
--- /dev/null
@@ -0,0 +1,125 @@
+digraph WebsubHubERD {
+       graph[
+               rankdir=LR,
+               overlap=false,
+               splines=true,
+               label="Websub Hub Entity-Relations\nPostgres\nSchema 1.0.0",
+               labelloc="t",
+               fontsize=26,
+       ];
+       // layout=neato;
+       node[shape=plain];
+       edge[arrowhead=crow];
+
+       topic [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">TOPIC</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="">url</td></tr>
+               <tr><td port="">lease_seconds_preferred</td></tr>
+               <tr><td port="">lease_seconds_min</td></tr>
+               <tr><td port="">lease_seconds_max</td></tr>
+               <tr><td port="">publisher_validation_url</td></tr>
+               <tr><td port="">content_hash_algorithm</td></tr>
+               <tr><td port="">is_active</td></tr>
+               <tr><td port="">is_deleted</td></tr>
+               <tr><td port="">last_publish</td></tr>
+               <tr><td port="">content_fetch_next_attempt</td></tr>
+               <tr><td port="">content_fetch_attempts_since_success</td></tr>
+               <tr><td port="">content_updated</td></tr>
+               <tr><td port="">content</td></tr>
+               <tr><td port="">content_hash</td></tr>
+               <tr><td port="">content_type</td></tr>
+       </table>
+       >];
+
+       topic_fetch_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">TOPIC_FETCH_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       topic:pk_id -> topic_fetch_in_progress:fk_id;
+
+       subscription [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">SUBSCRIPTION</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">verified</td></tr>
+               <tr><td port="">expires</td></tr>
+               <tr><td port="">secret</td></tr>
+               <tr><td port="">signature_algorithm</td></tr>
+               <tr><td port="">http_remote_addr</td></tr>
+               <tr><td port="">http_from</td></tr>
+               <tr><td port="">content_delivered</td></tr>
+               <tr><td port="">delivery_attempts_since_success</td></tr>
+               <tr><td port="">delivery_next_attempt</td></tr>
+       </table>
+       >];
+       topic:pk_id -> subscription:fk_topic_id;
+
+       subscription_delivery_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">SUBSCRIPTION_DELIVERY_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       subscription:pk_id -> subscription_delivery_in_progress:fk_id;
+
+       verification [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">VERIFICATION</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">secret</td></tr>
+               <tr><td port="">signature_algorithm</td></tr>
+               <tr><td port="">http_remote_addr</td></tr>
+               <tr><td port="">http_from</td></tr>
+               <tr><td port="">mode</td></tr>
+               <tr><td port="">reason</td></tr>
+               <tr><td port="">lease_seconds</td></tr>
+               <tr><td port="">is_publisher_validated</td></tr>
+               <tr><td port="">request_id</td></tr>
+               <tr><td port="">attempts</td></tr>
+               <tr><td port="">next_attempt</td></tr>
+       </table>
+       >];
+       topic:pk_id -> verification:fk_topic_id;
+
+       verification_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">VERIFICATION_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       verification:pk_id -> verification_in_progress:fk_id;
+       topic:pk_id -> verification_in_progress:fk_topic_id;
+
+       authentication [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">AUTHENTICATION</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="">last_authenticated</td></tr>
+               <tr><td port="">identifier</td></tr>
+               <tr><td port="">credential</td></tr>
+       </table>
+       >];
+
+}
\ No newline at end of file
diff --git a/src/db/postgres/sql/schema/1.0.1/er.dot b/src/db/postgres/sql/schema/1.0.1/er.dot
new file mode 100644 (file)
index 0000000..53b63f2
--- /dev/null
@@ -0,0 +1,125 @@
+digraph WebsubHubERD {
+       graph[
+               rankdir=LR,
+               overlap=false,
+               splines=true,
+               label="Websub Hub Entity-Relations\nPostgres\nSchema 1.0.1",
+               labelloc="t",
+               fontsize=26,
+       ];
+       // layout=neato;
+       node[shape=plain];
+       edge[arrowhead=crow];
+
+       topic [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">TOPIC</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="">url</td></tr>
+               <tr><td port="">lease_seconds_preferred</td></tr>
+               <tr><td port="">lease_seconds_min</td></tr>
+               <tr><td port="">lease_seconds_max</td></tr>
+               <tr><td port="">publisher_validation_url</td></tr>
+               <tr><td port="">content_hash_algorithm</td></tr>
+               <tr><td port="">is_active</td></tr>
+               <tr><td port="">is_deleted</td></tr>
+               <tr><td port="">last_publish</td></tr>
+               <tr><td port="">content_fetch_next_attempt</td></tr>
+               <tr><td port="">content_fetch_attempts_since_success</td></tr>
+               <tr><td port="">content_updated</td></tr>
+               <tr><td port="">content</td></tr>
+               <tr><td port="">content_hash</td></tr>
+               <tr><td port="">content_type</td></tr>
+       </table>
+       >];
+
+       topic_fetch_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">TOPIC_FETCH_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       topic:pk_id -> topic_fetch_in_progress:fk_id;
+
+       subscription [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">SUBSCRIPTION</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">verified</td></tr>
+               <tr><td port="">expires</td></tr>
+               <tr><td port="">secret</td></tr>
+               <tr><td port="">signature_algorithm</td></tr>
+               <tr><td port="">http_remote_addr</td></tr>
+               <tr><td port="">http_from</td></tr>
+               <tr><td port="">content_delivered</td></tr>
+               <tr><td port="">delivery_attempts_since_success</td></tr>
+               <tr><td port="">delivery_next_attempt</td></tr>
+       </table>
+       >];
+       topic:pk_id -> subscription:fk_topic_id;
+
+       subscription_delivery_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">SUBSCRIPTION_DELIVERY_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       subscription:pk_id -> subscription_delivery_in_progress:fk_id;
+
+       verification [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">VERIFICATION</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">secret</td></tr>
+               <tr><td port="">signature_algorithm</td></tr>
+               <tr><td port="">http_remote_addr</td></tr>
+               <tr><td port="">http_from</td></tr>
+               <tr><td port="">mode</td></tr>
+               <tr><td port="">reason</td></tr>
+               <tr><td port="">lease_seconds</td></tr>
+               <tr><td port="">is_publisher_validated</td></tr>
+               <tr><td port="">request_id</td></tr>
+               <tr><td port="">attempts</td></tr>
+               <tr><td port="">next_attempt</td></tr>
+       </table>
+       >];
+       topic:pk_id -> verification:fk_topic_id;
+
+       verification_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">VERIFICATION_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       verification:pk_id -> verification_in_progress:fk_id;
+       topic:pk_id -> verification_in_progress:fk_topic_id;
+
+       authentication [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">AUTHENTICATION</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="">last_authenticated</td></tr>
+               <tr><td port="">identifier</td></tr>
+               <tr><td port="">credential</td></tr>
+       </table>
+       >];
+
+}
\ No newline at end of file
diff --git a/src/db/postgres/sql/schema/1.0.2/er.dot b/src/db/postgres/sql/schema/1.0.2/er.dot
new file mode 100644 (file)
index 0000000..c9bd7ed
--- /dev/null
@@ -0,0 +1,126 @@
+digraph WebsubHubERD {
+       graph[
+               rankdir=LR,
+               overlap=false,
+               splines=true,
+               label="Websub Hub Entity-Relations\nPostgres\nSchema 1.0.2",
+               labelloc="t",
+               fontsize=26,
+       ];
+       // layout=neato;
+       node[shape=plain];
+       edge[arrowhead=crow];
+
+       topic [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">TOPIC</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="">url</td></tr>
+               <tr><td port="">lease_seconds_preferred</td></tr>
+               <tr><td port="">lease_seconds_min</td></tr>
+               <tr><td port="">lease_seconds_max</td></tr>
+               <tr><td port="">publisher_validation_url</td></tr>
+               <tr><td port="">content_hash_algorithm</td></tr>
+               <tr><td port="">is_active</td></tr>
+               <tr><td port="">is_deleted</td></tr>
+               <tr><td port="">last_publish</td></tr>
+               <tr><td port="">content_fetch_next_attempt</td></tr>
+               <tr><td port="">content_fetch_attempts_since_success</td></tr>
+               <tr><td port="">content_updated</td></tr>
+               <tr><td port="">content</td></tr>
+               <tr><td port="">content_hash</td></tr>
+               <tr><td port="">content_type</td></tr>
+       </table>
+       >];
+
+       topic_fetch_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">TOPIC_FETCH_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       topic:pk_id -> topic_fetch_in_progress:fk_id;
+
+       subscription [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">SUBSCRIPTION</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">verified</td></tr>
+               <tr><td port="">expires</td></tr>
+               <tr><td port="">secret</td></tr>
+               <tr><td port="">signature_algorithm</td></tr>
+               <tr><td port="">http_remote_addr</td></tr>
+               <tr><td port="">http_from</td></tr>
+               <tr><td port="">content_delivered</td></tr>
+               <tr><td port="">latest_content_delivered</td></tr>
+               <tr><td port="">delivery_attempts_since_success</td></tr>
+               <tr><td port="">delivery_next_attempt</td></tr>
+       </table>
+       >];
+       topic:pk_id -> subscription:fk_topic_id;
+
+       subscription_delivery_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">SUBSCRIPTION_DELIVERY_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       subscription:pk_id -> subscription_delivery_in_progress:fk_id;
+
+       verification [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">VERIFICATION</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">secret</td></tr>
+               <tr><td port="">signature_algorithm</td></tr>
+               <tr><td port="">http_remote_addr</td></tr>
+               <tr><td port="">http_from</td></tr>
+               <tr><td port="">mode</td></tr>
+               <tr><td port="">reason</td></tr>
+               <tr><td port="">lease_seconds</td></tr>
+               <tr><td port="">is_publisher_validated</td></tr>
+               <tr><td port="">request_id</td></tr>
+               <tr><td port="">attempts</td></tr>
+               <tr><td port="">next_attempt</td></tr>
+       </table>
+       >];
+       topic:pk_id -> verification:fk_topic_id;
+
+       verification_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">VERIFICATION_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       verification:pk_id -> verification_in_progress:fk_id;
+       topic:pk_id -> verification_in_progress:fk_topic_id;
+
+       authentication [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">AUTHENTICATION</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="">last_authenticated</td></tr>
+               <tr><td port="">identifier</td></tr>
+               <tr><td port="">credential</td></tr>
+       </table>
+       >];
+
+}
\ No newline at end of file
diff --git a/src/db/postgres/sql/schema/1.0.3/er.dot b/src/db/postgres/sql/schema/1.0.3/er.dot
new file mode 100644 (file)
index 0000000..eae5a5f
--- /dev/null
@@ -0,0 +1,137 @@
+digraph WebsubHubERD {
+       graph[
+               rankdir=LR,
+               overlap=false,
+               splines=true,
+               label="Websub Hub Entity-Relations\nPostgres\nSchema 1.0.3",
+               labelloc="t",
+               fontsize=26,
+       ];
+       // layout=neato;
+       node[shape=plain];
+       edge[arrowhead=crow];
+
+       topic [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">TOPIC</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="">url</td></tr>
+               <tr><td port="">lease_seconds_preferred</td></tr>
+               <tr><td port="">lease_seconds_min</td></tr>
+               <tr><td port="">lease_seconds_max</td></tr>
+               <tr><td port="">publisher_validation_url</td></tr>
+               <tr><td port="">content_hash_algorithm</td></tr>
+               <tr><td port="">is_active</td></tr>
+               <tr><td port="">is_deleted</td></tr>
+               <tr><td port="">last_publish</td></tr>
+               <tr><td port="">content_fetch_next_attempt</td></tr>
+               <tr><td port="">content_fetch_attempts_since_success</td></tr>
+               <tr><td port="">content_updated</td></tr>
+               <tr><td port="">content</td></tr>
+               <tr><td port="">content_hash</td></tr>
+               <tr><td port="">content_type</td></tr>
+       </table>
+       >];
+
+       topic_fetch_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">TOPIC_FETCH_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       topic:pk_id -> topic_fetch_in_progress:fk_id;
+
+       topic_content_history [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">TOPIC_CONTENT_HISTORY</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">content_updated</td></tr>
+               <tr><td port="">content_size</td></tr>
+               <tr><td port="">content_hash</td></tr>
+       </table>
+       >];
+       topic:pk_id -> topic_content_history:fk_topic_id;
+
+       subscription [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">SUBSCRIPTION</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">verified</td></tr>
+               <tr><td port="">expires</td></tr>
+               <tr><td port="">secret</td></tr>
+               <tr><td port="">signature_algorithm</td></tr>
+               <tr><td port="">http_remote_addr</td></tr>
+               <tr><td port="">http_from</td></tr>
+               <tr><td port="">content_delivered</td></tr>
+               <tr><td port="">latest_content_delivered</td></tr>
+               <tr><td port="">delivery_attempts_since_success</td></tr>
+               <tr><td port="">delivery_next_attempt</td></tr>
+       </table>
+       >];
+       topic:pk_id -> subscription:fk_topic_id;
+
+       subscription_delivery_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">SUBSCRIPTION_DELIVERY_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       subscription:pk_id -> subscription_delivery_in_progress:fk_id;
+
+       verification [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">VERIFICATION</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">secret</td></tr>
+               <tr><td port="">signature_algorithm</td></tr>
+               <tr><td port="">http_remote_addr</td></tr>
+               <tr><td port="">http_from</td></tr>
+               <tr><td port="">mode</td></tr>
+               <tr><td port="">reason</td></tr>
+               <tr><td port="">lease_seconds</td></tr>
+               <tr><td port="">is_publisher_validated</td></tr>
+               <tr><td port="">request_id</td></tr>
+               <tr><td port="">attempts</td></tr>
+               <tr><td port="">next_attempt</td></tr>
+       </table>
+       >];
+       topic:pk_id -> verification:fk_topic_id;
+
+       verification_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">VERIFICATION_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       verification:pk_id -> verification_in_progress:fk_id;
+       topic:pk_id -> verification_in_progress:fk_topic_id;
+
+       authentication [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">AUTHENTICATION</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="">last_authenticated</td></tr>
+               <tr><td port="">identifier</td></tr>
+               <tr><td port="">credential</td></tr>
+       </table>
+       >];
+
+}
\ No newline at end of file
diff --git a/src/db/sqlite/sql/schema/1.0.0/er.dot b/src/db/sqlite/sql/schema/1.0.0/er.dot
new file mode 100644 (file)
index 0000000..9793ad3
--- /dev/null
@@ -0,0 +1,125 @@
+digraph WebsubHubERD {
+       graph[
+               rankdir=LR,
+               overlap=false,
+               splines=true,
+               label="Websub Hub Entity-Relations\nSQLite\nSchema 1.0.0",
+               labelloc="t",
+               fontsize=26,
+       ];
+       // layout=neato;
+       node[shape=plain];
+       edge[arrowhead=crow];
+
+       topic [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">TOPIC</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="">url</td></tr>
+               <tr><td port="">lease_seconds_preferred</td></tr>
+               <tr><td port="">lease_seconds_min</td></tr>
+               <tr><td port="">lease_seconds_max</td></tr>
+               <tr><td port="">publisher_validation_url</td></tr>
+               <tr><td port="">content_hash_algorithm</td></tr>
+               <tr><td port="">is_active</td></tr>
+               <tr><td port="">is_deleted</td></tr>
+               <tr><td port="">last_publish</td></tr>
+               <tr><td port="">content_fetch_next_attempt</td></tr>
+               <tr><td port="">content_fetch_attempts_since_success</td></tr>
+               <tr><td port="">content_updated</td></tr>
+               <tr><td port="">content</td></tr>
+               <tr><td port="">content_hash</td></tr>
+               <tr><td port="">content_type</td></tr>
+       </table>
+       >];
+
+       topic_fetch_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">TOPIC_FETCH_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       topic:pk_id -> topic_fetch_in_progress:fk_id;
+
+       subscription [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">SUBSCRIPTION</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">verified</td></tr>
+               <tr><td port="">expires</td></tr>
+               <tr><td port="">secret</td></tr>
+               <tr><td port="">signature_algorithm</td></tr>
+               <tr><td port="">http_remote_addr</td></tr>
+               <tr><td port="">http_from</td></tr>
+               <tr><td port="">content_delivered</td></tr>
+               <tr><td port="">delivery_attempts_since_success</td></tr>
+               <tr><td port="">delivery_next_attempt</td></tr>
+       </table>
+       >];
+       topic:pk_id -> subscription:fk_topic_id [ arrowhead = crow ];
+
+       subscription_delivery_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">SUBSCRIPTION_DELIVERY_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       subscription:pk_id -> subscription_delivery_in_progress:fk_id;
+
+       verification [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">VERIFICATION</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">secret</td></tr>
+               <tr><td port="">signature_algorithm</td></tr>
+               <tr><td port="">http_remote_addr</td></tr>
+               <tr><td port="">http_from</td></tr>
+               <tr><td port="">mode</td></tr>
+               <tr><td port="">reason</td></tr>
+               <tr><td port="">lease_seconds</td></tr>
+               <tr><td port="">is_publisher_validated</td></tr>
+               <tr><td port="">request_id</td></tr>
+               <tr><td port="">attempts</td></tr>
+               <tr><td port="">next_attempt</td></tr>
+       </table>
+       >];
+       topic:pk_id -> verification:fk_topic_id;
+
+       verification_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">VERIFICATION_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       verification:pk_id -> verification_in_progress:fk_id;
+       topic:pk_id -> verification_in_progress:fk_topic_id;
+
+       authentication [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">AUTHENTICATION</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="">last_authenticated</td></tr>
+               <tr><td port="">identifier</td></tr>
+               <tr><td port="">credential</td></tr>
+       </table>
+       >];
+
+}
\ No newline at end of file
diff --git a/src/db/sqlite/sql/schema/1.0.1/er.dot b/src/db/sqlite/sql/schema/1.0.1/er.dot
new file mode 100644 (file)
index 0000000..103e54a
--- /dev/null
@@ -0,0 +1,125 @@
+digraph WebsubHubERD {
+       graph[
+               rankdir=LR,
+               overlap=false,
+               splines=true,
+               label="Websub Hub Entity-Relations\SQLite\nSchema 1.0.1",
+               labelloc="t",
+               fontsize=26,
+       ];
+       // layout=neato;
+       node[shape=plain];
+       edge[arrowhead=crow];
+
+       topic [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">TOPIC</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="">url</td></tr>
+               <tr><td port="">lease_seconds_preferred</td></tr>
+               <tr><td port="">lease_seconds_min</td></tr>
+               <tr><td port="">lease_seconds_max</td></tr>
+               <tr><td port="">publisher_validation_url</td></tr>
+               <tr><td port="">content_hash_algorithm</td></tr>
+               <tr><td port="">is_active</td></tr>
+               <tr><td port="">is_deleted</td></tr>
+               <tr><td port="">last_publish</td></tr>
+               <tr><td port="">content_fetch_next_attempt</td></tr>
+               <tr><td port="">content_fetch_attempts_since_success</td></tr>
+               <tr><td port="">content_updated</td></tr>
+               <tr><td port="">content</td></tr>
+               <tr><td port="">content_hash</td></tr>
+               <tr><td port="">content_type</td></tr>
+       </table>
+       >];
+
+       topic_fetch_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">TOPIC_FETCH_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       topic:pk_id -> topic_fetch_in_progress:fk_id;
+
+       subscription [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">SUBSCRIPTION</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">verified</td></tr>
+               <tr><td port="">expires</td></tr>
+               <tr><td port="">secret</td></tr>
+               <tr><td port="">signature_algorithm</td></tr>
+               <tr><td port="">http_remote_addr</td></tr>
+               <tr><td port="">http_from</td></tr>
+               <tr><td port="">content_delivered</td></tr>
+               <tr><td port="">delivery_attempts_since_success</td></tr>
+               <tr><td port="">delivery_next_attempt</td></tr>
+       </table>
+       >];
+       topic:pk_id -> subscription:fk_topic_id;
+
+       subscription_delivery_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">SUBSCRIPTION_DELIVERY_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       subscription:pk_id -> subscription_delivery_in_progress:fk_id;
+
+       verification [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">VERIFICATION</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">secret</td></tr>
+               <tr><td port="">signature_algorithm</td></tr>
+               <tr><td port="">http_remote_addr</td></tr>
+               <tr><td port="">http_from</td></tr>
+               <tr><td port="">mode</td></tr>
+               <tr><td port="">reason</td></tr>
+               <tr><td port="">lease_seconds</td></tr>
+               <tr><td port="">is_publisher_validated</td></tr>
+               <tr><td port="">request_id</td></tr>
+               <tr><td port="">attempts</td></tr>
+               <tr><td port="">next_attempt</td></tr>
+       </table>
+       >];
+       topic:pk_id -> verification:fk_topic_id;
+
+       verification_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">VERIFICATION_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       verification:pk_id -> verification_in_progress:fk_id;
+       topic:pk_id -> verification_in_progress:fk_topic_id;
+
+       authentication [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">AUTHENTICATION</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="">last_authenticated</td></tr>
+               <tr><td port="">identifier</td></tr>
+               <tr><td port="">credential</td></tr>
+       </table>
+       >];
+
+}
\ No newline at end of file
diff --git a/src/db/sqlite/sql/schema/1.0.2/er.dot b/src/db/sqlite/sql/schema/1.0.2/er.dot
new file mode 100644 (file)
index 0000000..82cb5b1
--- /dev/null
@@ -0,0 +1,126 @@
+digraph WebsubHubERD {
+       graph[
+               rankdir=LR,
+               overlap=false,
+               splines=true,
+               label="Websub Hub Entity-Relations\nSQLite\nSchema 1.0.2",
+               labelloc="t",
+               fontsize=26,
+       ];
+       // layout=neato;
+       node[shape=plain];
+       edge[arrowhead=crow];
+
+       topic [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">TOPIC</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="">url</td></tr>
+               <tr><td port="">lease_seconds_preferred</td></tr>
+               <tr><td port="">lease_seconds_min</td></tr>
+               <tr><td port="">lease_seconds_max</td></tr>
+               <tr><td port="">publisher_validation_url</td></tr>
+               <tr><td port="">content_hash_algorithm</td></tr>
+               <tr><td port="">is_active</td></tr>
+               <tr><td port="">is_deleted</td></tr>
+               <tr><td port="">last_publish</td></tr>
+               <tr><td port="">content_fetch_next_attempt</td></tr>
+               <tr><td port="">content_fetch_attempts_since_success</td></tr>
+               <tr><td port="">content_updated</td></tr>
+               <tr><td port="">content</td></tr>
+               <tr><td port="">content_hash</td></tr>
+               <tr><td port="">content_type</td></tr>
+       </table>
+       >];
+
+       topic_fetch_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">TOPIC_FETCH_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       topic:pk_id -> topic_fetch_in_progress:fk_id;
+
+       subscription [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">SUBSCRIPTION</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">verified</td></tr>
+               <tr><td port="">expires</td></tr>
+               <tr><td port="">secret</td></tr>
+               <tr><td port="">signature_algorithm</td></tr>
+               <tr><td port="">http_remote_addr</td></tr>
+               <tr><td port="">http_from</td></tr>
+               <tr><td port="">content_delivered</td></tr>
+               <tr><td port="">latest_content_delivered</td></tr>
+               <tr><td port="">delivery_attempts_since_success</td></tr>
+               <tr><td port="">delivery_next_attempt</td></tr>
+       </table>
+       >];
+       topic:pk_id -> subscription:fk_topic_id;
+
+       subscription_delivery_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">SUBSCRIPTION_DELIVERY_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       subscription:pk_id -> subscription_delivery_in_progress:fk_id;
+
+       verification [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">VERIFICATION</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">secret</td></tr>
+               <tr><td port="">signature_algorithm</td></tr>
+               <tr><td port="">http_remote_addr</td></tr>
+               <tr><td port="">http_from</td></tr>
+               <tr><td port="">mode</td></tr>
+               <tr><td port="">reason</td></tr>
+               <tr><td port="">lease_seconds</td></tr>
+               <tr><td port="">is_publisher_validated</td></tr>
+               <tr><td port="">request_id</td></tr>
+               <tr><td port="">attempts</td></tr>
+               <tr><td port="">next_attempt</td></tr>
+       </table>
+       >];
+       topic:pk_id -> verification:fk_topic_id;
+
+       verification_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">VERIFICATION_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       verification:pk_id -> verification_in_progress:fk_id;
+       topic:pk_id -> verification_in_progress:fk_topic_id;
+
+       authentication [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">AUTHENTICATION</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="">last_authenticated</td></tr>
+               <tr><td port="">identifier</td></tr>
+               <tr><td port="">credential</td></tr>
+       </table>
+       >];
+
+}
\ No newline at end of file
diff --git a/src/db/sqlite/sql/schema/1.0.3/er.dot b/src/db/sqlite/sql/schema/1.0.3/er.dot
new file mode 100644 (file)
index 0000000..0fe277b
--- /dev/null
@@ -0,0 +1,137 @@
+digraph WebsubHubERD {
+       graph[
+               rankdir=LR,
+               overlap=false,
+               splines=true,
+               label="Websub Hub Entity-Relations\nSQLite\nSchema 1.0.3",
+               labelloc="t",
+               fontsize=26,
+       ];
+       // layout=neato;
+       node[shape=plain];
+       edge[arrowhead=crow];
+
+       topic [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">TOPIC</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="">url</td></tr>
+               <tr><td port="">lease_seconds_preferred</td></tr>
+               <tr><td port="">lease_seconds_min</td></tr>
+               <tr><td port="">lease_seconds_max</td></tr>
+               <tr><td port="">publisher_validation_url</td></tr>
+               <tr><td port="">content_hash_algorithm</td></tr>
+               <tr><td port="">is_active</td></tr>
+               <tr><td port="">is_deleted</td></tr>
+               <tr><td port="">last_publish</td></tr>
+               <tr><td port="">content_fetch_next_attempt</td></tr>
+               <tr><td port="">content_fetch_attempts_since_success</td></tr>
+               <tr><td port="">content_updated</td></tr>
+               <tr><td port="">content</td></tr>
+               <tr><td port="">content_hash</td></tr>
+               <tr><td port="">content_type</td></tr>
+       </table>
+       >];
+
+       topic_fetch_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">TOPIC_FETCH_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       topic:pk_id -> topic_fetch_in_progress:fk_id;
+
+       topic_content_history [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+                       <tr><td border="2" bgcolor="lightblue">TOPIC_CONTENT_HISTORY</td></tr>
+                       <tr><td port="fk_topic_id">topic_id</td></tr>
+                       <tr><td port="">content_updated</td></tr>
+                       <tr><td port="">content_size</td></tr>
+                       <tr><td port="">content_hash</td></tr>
+       </table>
+       >];
+       topic:pk_id -> topic_content_history:fk_topic_id;
+
+       subscription [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">SUBSCRIPTION</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">verified</td></tr>
+               <tr><td port="">expires</td></tr>
+               <tr><td port="">secret</td></tr>
+               <tr><td port="">signature_algorithm</td></tr>
+               <tr><td port="">http_remote_addr</td></tr>
+               <tr><td port="">http_from</td></tr>
+               <tr><td port="">content_delivered</td></tr>
+               <tr><td port="">latest_content_delivered</td></tr>
+               <tr><td port="">delivery_attempts_since_success</td></tr>
+               <tr><td port="">delivery_next_attempt</td></tr>
+       </table>
+       >];
+       topic:pk_id -> subscription:fk_topic_id;
+
+       subscription_delivery_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">SUBSCRIPTION_DELIVERY_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       subscription:pk_id -> subscription_delivery_in_progress:fk_id;
+
+       verification [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">VERIFICATION</td></tr>
+               <tr><td port="pk_id">id</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">secret</td></tr>
+               <tr><td port="">signature_algorithm</td></tr>
+               <tr><td port="">http_remote_addr</td></tr>
+               <tr><td port="">http_from</td></tr>
+               <tr><td port="">mode</td></tr>
+               <tr><td port="">reason</td></tr>
+               <tr><td port="">lease_seconds</td></tr>
+               <tr><td port="">is_publisher_validated</td></tr>
+               <tr><td port="">request_id</td></tr>
+               <tr><td port="">attempts</td></tr>
+               <tr><td port="">next_attempt</td></tr>
+       </table>
+       >];
+       topic:pk_id -> verification:fk_topic_id;
+
+       verification_in_progress [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">VERIFICATION_IN_PROGRESS</td></tr>
+               <tr><td port="fk_id">id</td></tr>
+               <tr><td port="fk_topic_id">topic_id</td></tr>
+               <tr><td port="">callback</td></tr>
+               <tr><td port="">claimant</td></tr>
+               <tr><td port="">claimed</td></tr>
+               <tr><td port="">claim_expires</td></tr>
+       </table>
+       >];
+       verification:pk_id -> verification_in_progress:fk_id;
+       topic:pk_id -> verification_in_progress:fk_topic_id;
+
+       authentication [label=<
+       <table cellspacing="0" cellborder="1" border="0">
+               <tr><td border="2" bgcolor="lightblue">AUTHENTICATION</td></tr>
+               <tr><td port="">created</td></tr>
+               <tr><td port="">last_authenticated</td></tr>
+               <tr><td port="">identifier</td></tr>
+               <tr><td port="">credential</td></tr>
+       </table>
+       >];
+
+}
\ No newline at end of file