# # # add_file "tests/schema_migration_error_recovery/column_missing.dump" # content [cb02b632a339f5149d148cd6e4f6e301ad1096c6] # # add_file "tests/schema_migration_error_recovery/heights_already.dump" # content [97f6860f9f9a6e059f9a3dea63c96512a24e51c8] # # add_file "tests/schema_migration_error_recovery/no_revision_roster.dump" # content [be46a73ea537e35ba0cd468dfcb3420b649768bc] # # add_file "tests/schema_migration_error_recovery/tmp_in_the_way.dump" # content [6e8154705c158d304ce418682f9377c9c01e2e84] # # patch "ChangeLog" # from [9307f0c3384b2c4ea7c19994392ffa8060ff2c3e] # to [c51b17fb6ad5bd744e797ea8ab96373adf940a19] # # patch "cmd_db.cc" # from [0a03c7dd7e8a8a7c9a413e23d40d280e7e3ce37a] # to [c0c5f005a9bb5be565620668b649f7a22e21e2fa] # # patch "database.cc" # from [b29f1d375abb09db0ec39e2190a28051bb0b086b] # to [c0b7bcc73596dbe49ceb18c98141c360b0cabf64] # # patch "database.hh" # from [e4127ba355cbae5f5e6cf4774b47f5e2e9a8bfed] # to [ff098459a66c8681188f7d66c1be55cf0ac109d1] # # patch "schema_migration.cc" # from [0c24ca599347dc4d5b97c97c5b95b8601dc05061] # to [071875b4adcbd347759debda23e0c1fe4dc4931f] # # patch "schema_migration.hh" # from [c5297d15ee9dfa8b96cb01a96cd6a811d80ef97c] # to [d17dda6f74de9d6cc6a84c8faf222e5c0bb8013e] # # patch "tests/schema_migration_error_recovery/__driver__.lua" # from [69671b8cf2ddaeb74716c2f8d01dbe2c82a1f48b] # to [a4b51f336dff083ec53c2199d398f8edb90da941] # ============================================================ --- tests/schema_migration_error_recovery/column_missing.dump cb02b632a339f5149d148cd6e4f6e301ad1096c6 +++ tests/schema_migration_error_recovery/column_missing.dump cb02b632a339f5149d148cd6e4f6e301ad1096c6 @@ -0,0 +1,306 @@ +BEGIN EXCLUSIVE; +CREATE TABLE branch_epochs + ( + hash not null unique, -- hash of remaining fields separated by ":" + branch not null unique, -- joins with revision_certs.value + epoch not null -- random hex-encoded id + ); +CREATE TABLE db_vars + ( + domain not null, -- scope of application of a var + name not null, -- var key + unique(domain, name) + ); +CREATE TABLE file_deltas + ( + id not null, -- strong hash of file contents + base not null, -- joins with files.id or file_deltas.id + delta not null, -- rdiff to construct current from base + unique(id, base) + ); +INSERT INTO file_deltas VALUES('a9ca701697adae066b96d07aabb30f0d6245692c','d4929f246d23a51eba6799685e28f9ab077b483a','H4sIAAAAAAAA//NUMOVKMywz5OICAOrIolkKAAAA +'); +INSERT INTO file_deltas VALUES('36f92840dcffa22064b2dd9e0848d14350f07c5c','f9d518a4e1308cbe8503bdd8f578b16de4407491','H4sIAAAAAAAA//NUMOVKMyoz5OICADqyAh4KAAAA +'); +INSERT INTO file_deltas VALUES('09848c4631a20ac166344f58a23fee04a6c646a4','1ece609689fb9462de25716110769bad1a80e8d8','H4sIAAAAAAAA//NUMOVKMykz5OICAJpHQpEKAAAA +'); +CREATE TABLE files + ( + id primary key, -- strong hash of file contents + data not null -- compressed, encoded contents of a file + ); +INSERT INTO files VALUES('d4929f246d23a51eba6799685e28f9ab077b483a','H4sIAAAAAAAA/0szLDPiAgC5Qx7FBQAAAA== +'); +INSERT INTO files VALUES('bbeadf8e35428c9e5333e71caf25851498306eb6','H4sIAAAAAAAA/0szLjPkAgDx2DpEBQAAAA== +'); +INSERT INTO files VALUES('f9d518a4e1308cbe8503bdd8f578b16de4407491','H4sIAAAAAAAA/0szKjPiAgBX7KvXBQAAAA== +'); +INSERT INTO files VALUES('1ece609689fb9462de25716110769bad1a80e8d8','H4sIAAAAAAAA/0szKTPiAgCLs8DyBQAAAA== +'); +CREATE TABLE manifest_certs + ( + hash not null unique, -- hash of remaining fields separated by ":" + id not null, -- joins with manifests.id or manifest_deltas.id + name not null, -- opaque string chosen by user + value not null, -- opaque blob + keypair not null, -- joins with public_keys.id + signature not null, -- RSA/SHA1 signature of "address@hidden:val]" + unique(name, id, value, keypair, signature) + ); +CREATE TABLE manifest_deltas + ( + id not null, -- strong hash of all the entries in a manifest + base not null, -- joins with either manifest.id or manifest_deltas.id + delta not null, -- rdiff to construct current from base + unique(id, base) + ); +CREATE TABLE manifests + ( + id primary key, -- strong hash of all the entries in a manifest + data not null -- compressed, encoded contents of a manifest + ); +CREATE TABLE next_roster_node_number + ( + node primary key -- only one entry in this table, ever + ); +INSERT INTO next_roster_node_number VALUES('5'); +CREATE TABLE public_keys + ( + hash not null unique, -- hash of remaining fields separated by ":" + id primary key, -- key identifier chosen by user + keydata not null -- RSA public params + ); +INSERT INTO public_keys VALUES('de84b575d5e47254393eba49dce9dc4db98ed42d','address@hidden','MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC54vVjrrqYoTfPTgWm6JpuL+kOERcN2OSc +BsWq6cb4Wm3nlymwVqJJywq6cbfygUYwmqyiRLPxRosfLGu228AhEzaM4JbAH1pgg7CwvvVd +fHRXNAXEMgO89gBjkkecxLi4U/T67DrLjkRPAilCgWLZNv8YeOG9XAPegWyr7hNA9wIBEQ=='); +INSERT INTO public_keys VALUES('c9d80250e944708aab7fe960c1136b517fd30772','address@hidden','MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V +yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H +oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ=='); +CREATE TABLE revision_ancestry + ( + parent not null, -- joins with revisions.id + child not null, -- joins with revisions.id + unique(parent, child) + ); +INSERT INTO revision_ancestry VALUES('','bf468e6c22dec9203af6441ad7d20b6ad8af049a'); +INSERT INTO revision_ancestry VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','c81722b0236303685e341e16f0073d665090fb73'); +INSERT INTO revision_ancestry VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','43a2235616452dca74eecf39d645a69da8e0bdd0'); +INSERT INTO revision_ancestry VALUES('43a2235616452dca74eecf39d645a69da8e0bdd0','4a1274f35812a695e357c6e7c7cd60f449f0cada'); +INSERT INTO revision_ancestry VALUES('c81722b0236303685e341e16f0073d665090fb73','4a1274f35812a695e357c6e7c7cd60f449f0cada'); +INSERT INTO revision_ancestry VALUES('4a1274f35812a695e357c6e7c7cd60f449f0cada','75810233cc39b62341d669b610e9416fd6352869'); +CREATE TABLE revision_certs + ( + hash not null unique, -- hash of remaining fields separated by ":" + id not null, -- joins with revisions.id + name not null, -- opaque string chosen by user + value not null, -- opaque blob + keypair not null, -- joins with public_keys.id + signature not null, -- RSA/SHA1 signature of "address@hidden:val]" + unique(name, id, value, keypair, signature) + ); +INSERT INTO revision_certs VALUES('6f938572483d4f73bf952c3666dace09f95ebd50','bf468e6c22dec9203af6441ad7d20b6ad8af049a','branch','dGVzdGJyYW5jaDE= +','address@hidden','CjgQqP1r/1DVkgSCaz7jKvgdPJ1WJ3EbC8jyeARxqs2w1tgM7iAGNs0961Y8+rBVZuCBcGLl +S/W1F1ZVAlseVT2NmBVOhu0OlmWhZ2V1JPklyIkFk3krJjSJxP1bt8D6IHCVxxdnhEDUrf8O +Cc4Z0gOzDznJ2qUnFfM3ZZUCAjI= +'); +INSERT INTO revision_certs VALUES('6ac4524843235b44ca2dfc2696d38f2b90239109','bf468e6c22dec9203af6441ad7d20b6ad8af049a','date','MTk5OS0wMS0wMVQxMjowMDowMA== +','address@hidden','ZBHfnu/Gi6S90RN4GpIuQsflSL2JPU3QISuVIejxWCxK54V6zieOZ6ZHI8GECfWCqJWtD3L+ +wFEhpgg3oSSsZrQRM8mdpqZM5sTEOKja5td72dPkISp0ysJE4KLmuDVv88aSCrcsXDxyEZU8 +jUEGaii+JwAfFdP4OTrfL2sH1JI= +'); +INSERT INTO revision_certs VALUES('d77b687d8c619078e80721658a6d99dcfe7e32e5','bf468e6c22dec9203af6441ad7d20b6ad8af049a','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','HZsa3yyBrQGi+Gl4/jL6pJhrjz6ef3ASrg6YNjONW5ypegj2DIcZpQN4jLGJGKzTPQUI+RBg +SFn3G2dTEA1T/ul8STkuIc/mqZmKvMeMPStq3ezjSKYCyLey5QbTvm0HkpISY3nTmsXetcsc +mhBDuUA9GjZHgj9CIEVOrYfkKQc= +'); +INSERT INTO revision_certs VALUES('2dda1c13436be7c2f10271c210a2bd0c885f313c','bf468e6c22dec9203af6441ad7d20b6ad8af049a','changelog','YmxhaC1ibGFo +','address@hidden','NKIdKEogyd3DKwjJfUk0BoqfgRfE8e5HrRahLsMSf/j6XD8XQ00qVW9hmrn/CaBTdByZ5ZZu +TH+ByLcXDAHVhITHYaRALxTx34Wl+GpPBdguXgI3hgy5V+FI9JN1m2cBl89nkVG6GW0o78nG +Fo1x73vpmYqa5WPWwCrAOwJm7ZQ= +'); +INSERT INTO revision_certs VALUES('c50226beb7e3d289d38e9f613021c380f89ab011','bf468e6c22dec9203af6441ad7d20b6ad8af049a','somekey','c29tZXZhbHVl +','address@hidden','GAfv6ovoLebquWhqqUnZmHCpnzdLCfneH4mWmfIajdivhBu+hPFV6yi++xSv83crepDtVJYe +Fd1RI50PYZntUF4rzW3JOOlJlwAhairzx0saEpHJiSY+zBLNXDWbsFRnDwWwACd5TsSwdPVV +AF4ZtPvUfCg2oG4qinL+JoUNcWI= +'); +INSERT INTO revision_certs VALUES('628a294256cbb30fa29665cba0ce9a58c02e57b0','c81722b0236303685e341e16f0073d665090fb73','branch','dGVzdGJyYW5jaDI= +','address@hidden','l8RLneTmbvJraUlwzqqNi4pjoMDIV4rQlR2ShOIbmFR1FjyOvRaN6Q4rj36kYaeMlVasCjHR +K5dMMnmhEGcjwUmtc6z4+HKbvO5BjbHC7HeMsc7e+nKpz94cmbVVT0fJ5/vCqzI3awnKi3jT +9TT9v384x5OTWhukmV7C7VSwrns= +'); +INSERT INTO revision_certs VALUES('70c013d2ba0e97f5e706dcc27e8eb32920f09c6f','c81722b0236303685e341e16f0073d665090fb73','date','MjAwMC0wMS0wMVQxMjowMDowMA== +','address@hidden','L77126IRXEDbZjhtv5FFNoTF2zxZdCTWMb0r9X2FD//BX5uPPfQLR70dk19KzkZPHcWzNyRd +iwcSYJmDSuV7blTtLvrvG66RjLcZRHJdrBL6u7heyhMqL+7lWJq273aFvvP+XjbuJq5LbXyr +jQeu69/Demh7LWJlnzfwel4KUgo= +'); +INSERT INTO revision_certs VALUES('e70e1cc3843fe732d6ee20d25749f98c8862166b','c81722b0236303685e341e16f0073d665090fb73','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','hqMs692uyOaM7i3vI71OrU/0Y0a+wmFBnIs5kfH/iJqH7phcRYm34WDFFnZCLaKuBkzaj5wu +6ftkEPwNYFwlhzKzoGf1XkNGj50vGuo2ZR7ksAO6gtQLhU8FSBUhc1im6tmBvFDWQa0h9J9g +b4mifWttew/gS8b5Sv3pq4FxewI= +'); +INSERT INTO revision_certs VALUES('55d537c81d3e6db852813076cbb476aa7bfb8e6d','c81722b0236303685e341e16f0073d665090fb73','changelog','YmxhaC1ibGFo +','address@hidden','MprtSWnltZ1+tRKIwOku8QM0+yJA1x22UiFuDgnF3iVuR3lePSNWilzObMzGuYRLvbJ5fXY9 +blnKDPZe8JlCQVgamunYCjpok4u8SEcSa0abGvCPSfIjX8UY4YBY+hNj0zmQBfrVvOORwSVR +SUQmoqylhIUgDr1+azI7w8OgEXM= +'); +INSERT INTO revision_certs VALUES('b8207be46ed175205466998210bab3b6c30fa06b','43a2235616452dca74eecf39d645a69da8e0bdd0','branch','dGVzdGJyYW5jaDE= +','address@hidden','aOq1Ecb9GZfbcUHQyRcbLa+AeEs4dfnAUyP008eIYkt2tX+nHgoEPiY8k87cpo8KurjDZlt7 +6Rjom0NEH8vkfml57WbcejYxq/7TSG7qlIiQ0uKmkON+sT6MR8k+1yCcmkK4e0pjfCtK/TCh +Ac7oy1iF0WgbfS6dmQ3zPpmqrGI= +'); +INSERT INTO revision_certs VALUES('c2e926d430da9903c918ee15b2b2dfe99ee58463','43a2235616452dca74eecf39d645a69da8e0bdd0','date','MjAwMS0wMS0wMVQxMjowMDowMA== +','address@hidden','CKFR6o8w5ewVdO27QwTs2Q0MvnZSWWtWrnJO/FNGre0CTpVwAo0cj1ZfAt4oQYN9+bYOiFJv +so886hP7b65h/gQlBjY4hVTKgsXfW+CYhJcO/xicA8dSuHyGQMqWzd0wKkORRassF8FYQ7aN +w9I2aW54oWHc5kYHlnkNnFcnxCw= +'); +INSERT INTO revision_certs VALUES('eaa39fc163b0d38cded5270f60bc9570e7f4e1b0','43a2235616452dca74eecf39d645a69da8e0bdd0','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','OsgLCmG7U9ZPHM4QgiwNFHB9taJmo1F08bCNXO7vUNhTJygeR6by6jlxIZzZLdVwlDZ2QlNY +l4KluIftqFpYj81w0gxA0cNgf2YSfpLDUU6YlsmvjtGhUDu8m2EX46oDhWC+kV1uDhQjuZQW +niDaS0V3tAr7151DiBU4CivDoCM= +'); +INSERT INTO revision_certs VALUES('9d9472e1be171031fee0ff82f41d752e8124742e','43a2235616452dca74eecf39d645a69da8e0bdd0','changelog','YmxhaC1ibGFo +','address@hidden','CZdbbLXvcETdez6wt9Jz1l+IX5b8xOcEcgNNO4IhE5qL92jY0uJYD19YT7krv4wSEyqGr+UM +vS71Lns1A87MnvaaYqLDzWJKLfpKCTLbXmvXkxVFot+d1NjrapHyxDWkzsWYvpMDv+QsLFjB +JYBFpdy5EDj1g5cKN2+dbYojLWg= +'); +INSERT INTO revision_certs VALUES('884d60e16e31cf3621191bd2dab0caf39a0283fe','4a1274f35812a695e357c6e7c7cd60f449f0cada','date','MjAwMi0wMS0wMVQxMjowMDowMA== +','address@hidden','DPd17dv2lhHUrM5XBA5/28ygytUeoHs12/SDB9mzoUpfSByEAgR6ONCy8RRcboz58V/5sc02 +gMDwaQ6VFpMqeQs8mQ1ng/Y3RCbPhgDwilatA4vrn7bn4J3vxuTr8giy9m1R6EDAGIdLBt6y +shx9joHN4G7zutOmRgtr7U5xYUY= +'); +INSERT INTO revision_certs VALUES('2724dd7883fb44a58d40eba12808ed5b9e09f7b6','4a1274f35812a695e357c6e7c7cd60f449f0cada','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','bKe9iSJ7+z3xoq1GqC4VvO4DqnIaYKK3EGdXPxtk4xRdIGNkNRbcwIr9+YvxknZaCBhyDJQy +q+5Smfw34N59CEO5CcfylWcAS4gcpmjDNWFMDDxGxof/vN+OwDQTNFRpAn6PVPnuHbKkBs6J +F3fuS5ooLxfVLKF6Iu8ljXcyPtI= +'); +INSERT INTO revision_certs VALUES('1288aa1a3c351fd0528aa95ddaae309cc5eec3e2','4a1274f35812a695e357c6e7c7cd60f449f0cada','branch','dGVzdGJyYW5jaDE= +','address@hidden','l2qifuBN5jBbGr04fu/xC7HGbp1h890kboHv7VVw+rejuWM46DLluAE4NaoaE1qxlAZmWiCV +l382q/q9vAR4nWFkmsXInj1myKGyvK2CHpTtaxDSUAORNnrkYOOc4uSbjRWuiQtefhSUNWyx +1WgxAsCSsEksUkE3gntXBcGZ5Mw= +'); +INSERT INTO revision_certs VALUES('27e8a71b0fa56a551e72aed26861ba404d02fd32','4a1274f35812a695e357c6e7c7cd60f449f0cada','changelog','cHJvcGFnYXRlIGZyb20gYnJhbmNoICd0ZXN0YnJhbmNoMicgKGhlYWQgYzgxNzIyYjAyMzYz +MDM2ODVlMzQxZTE2ZjAwNzNkNjY1MDkwZmI3MykKICAgICAgICAgICAgdG8gYnJhbmNoICd0 +ZXN0YnJhbmNoMScgKGhlYWQgNDNhMjIzNTYxNjQ1MmRjYTc0ZWVjZjM5ZDY0NWE2OWRhOGUw +YmRkMCkK +','address@hidden','ilQqoBOBBjdPbRC0UOplwSuv1wHAv4HKAyZL40QspeWv/qlG3fqYZTRfOcXiG/Ey43/lRUPg +Q9KqaNmDAfD1sQzBLiWmpdi31Qdzb2XI383VSc2kZxwwrK7GzCc7WXTWW6Mm9vyUb7N4Xo1U +Tc7Y3obkFE+VPmYLTjD+6S1xwf0= +'); +INSERT INTO revision_certs VALUES('5b44cd5cd32f3e8f268ac1cd30ccfa27d16667c6','75810233cc39b62341d669b610e9416fd6352869','branch','dGVzdGJyYW5jaDM= +','address@hidden','AgZdq7S2Skb6vekOGl/GknzDlVsCsQShdAClWGSjxfNeu8ISaO91MgFXeT1QQZZ9Vmu2ln9H +8YFu5NlAlcgL1xX2d8JMTDadlnk48xWxKhLS2pKNpFzfA5LS6yO5t2NOVGEI5016SfU3UWxD +pWg/TyjvXAl9LHkve8bT2k6wGek= +'); +INSERT INTO revision_certs VALUES('b0f324986982bdf443036f061977a7895ae94f84','75810233cc39b62341d669b610e9416fd6352869','date','MjAwMy0wMS0wMVQxMjowMDowMA== +','address@hidden','O3ORIe1YVt/fEz0uHf4wZKZ2K7HfjGJHeSPyhf1RGfdSCv2pfWhfGlfagM2V1Lzsyl4TkikZ +YS+H+6sC6FbN32zpeE/9+iisdaRHGACWXdOebKWdEJaBGRTNc6w3ablmkhvXAqK36FjFJSbj +wD1XGZbqq/VilnTZ5cr5GqYRGNs= +'); +INSERT INTO revision_certs VALUES('7a8a589d30fc17ee317ff9bacecac0d30524003a','75810233cc39b62341d669b610e9416fd6352869','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','H/C6jJ1fyAdu3QF+rLt3FuhWJm5lsapfV8mYkETKuu2gjbTecx3So8MCsP2WhE+Itvc7LMu4 +j0oAk9VePu5q4o1h3x5Nezc8zx9L2igJqko9HFenu6QAj3SbE6AUMYNolk+nmAj/jUPvT3R8 +1/+SlGe42S1TzlDxTv8Exk7UcUY= +'); +INSERT INTO revision_certs VALUES('98640622c14a2ecbe23b7251b960d8bc78dec4a2','75810233cc39b62341d669b610e9416fd6352869','changelog','YmxhaC1ibGFo +','address@hidden','Xrbz1t1qJYpFKoWfRP1ijeGXiS3Y0Mxy/oc54CvZ1x+yBicMSPldPb7GZsLklb8du939pUuv +jtKDDdK/nm5Byo+svmz6eP0orqLJIh5VIAmY9tN8h78eMdLrm+yUmN41OwVxHv3oNrUbwo3S +euGYk7NjxhWm+XFPoQbayRLZfgM= +'); +CREATE TABLE revision_roster + ( + rev_id primary key, -- joins with revisions.id + roster_id not null -- joins with either rosters.id or roster_deltas.id + ); +INSERT INTO revision_roster VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','e63f3fbaa205e1d3117d3ee9b056b1edcd95cbbe'); +INSERT INTO revision_roster VALUES('c81722b0236303685e341e16f0073d665090fb73','330548314b7c980863e65195d0f82aab4cd7e355'); +INSERT INTO revision_roster VALUES('43a2235616452dca74eecf39d645a69da8e0bdd0','cb81e62f9e18a8b3f16fb714fd8b564813e5ab28'); +INSERT INTO revision_roster VALUES('4a1274f35812a695e357c6e7c7cd60f449f0cada','74185a2d2c138df730096e0e92b8e43dfec2aa94'); +INSERT INTO revision_roster VALUES('75810233cc39b62341d669b610e9416fd6352869','c8b35398ca2282fb9b893c47245920870a475c4b'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','H4sIAAAAAAAA/32PUYrDMAxE/3MK4xM4jq3YZynFKJYEZlMHUjfL3n6dFko/lv0bCc2bkWz7 +DVs6eL+XrSo96mGo/J1uWIvwvanL6HkiDxkmycYAGRcEA2UHQnbx3rEQxjBfh2FbKe18lCfq +0hdIlKjsSuuXlrKy0q1zT9WzVN5q49pjMGaczQhxRkI2AEvsWTPiskxGDIF1HqLN179I9pM0 +gUQbnKEsgtYacIslimyCCzS6yXfcnP1JUurO7WynsLVes3dNX/yjhwPXR+eXWlrBNT1H/b7/ +fOBlfG/+s/8CTv6BAGwBAAA= +'); +INSERT INTO revisions VALUES('c81722b0236303685e341e16f0073d665090fb73','H4sIAAAAAAAA/1VQW27EIAz85xQoJwADBs4SrSKDjRo1m1QJ3aq3b7KV+vgbeeR5tW2/U58e +sh/zturBDkqt8jHdaZ2bHF2PJTp0JMBRPGAhSGDAJK4tBrKlXhQbgJtS28LTLo/5KTWW5jEJ +VgCWmsE4aui9JY4MpiBxomZ8pvORmKc2L6KHfnpeyA1K123tsl4RihC3JC54SDVLcM5JtJUa +hBSsz8kZlIKn0hv1+vIrc9bRbd/ueqRcKRqLORKTGMSSkU0kKsWZZhjBB8xQb0pr3Tc9ss+Q +G3hkcBSsFMKYM6YgkFqmYmIsPrkrfl2E9v+m1Pvfy/Qqn+eyWh/S9fDD87x/Mw9a3s/21/JP +OKgvDhQZ/pkBAAA= +'); +INSERT INTO revisions VALUES('43a2235616452dca74eecf39d645a69da8e0bdd0','H4sIAAAAAAAA/0XPQW7EMAgF0H1OYeUEGGNinyWqImxAjTSTVJloev263XTH5r//8fN6yr29 +7Xrt5xHmOE/TYd/bU47d7XWH1UDRoqbc2oIgtWBsS+kZIRfmxtAxdVzixzSdD90ue+9/1Nqc +uBh3RLVeEZI4E0XRRREaixZxoCojKKqb7w8L8z06fy+ap9DP47ZjTIBaqHTiFGUs6JE5EXku +gsnNgIQ7EwsN6Uvu/vnP4GD8Op9hTewVC4F2d0EEpoaq1WDQGillcFh67h9TCOE+w+pVcyxC +FhOU3qxkSE21eF5Ki6xGBAvV8fcPP3EP60QBAAA= +'); +INSERT INTO revisions VALUES('4a1274f35812a695e357c6e7c7cd60f449f0cada','H4sIAAAAAAAA/22S3Y4bIQyF7+cp0DyBwcaYZ4lWkcFGjZrNVJNpqr59yVba3f7cGSzOOf7M +2PZXPc4P3++X7RbWuC7LzX+cX/V2GX4/wql6qzU69gaxinjuERhLL2OwcSQRGZIgvizLdrXz +7o/Lm9SJUFPCzJEpJ+tayL0PrDbPytVUHJoZzIdqdh6Xq4f1mJ7PCtcl9O12+G1GaM3Vhjhm +StKrZ0T0EruOlCVHqoLA3ngqfdOjf/mQmeOEsW+v4aR1JoDItaipA3OrbFBUW0MYYJwoc039 +ZQkhHFs4GdVURyK2hJqjN+VSK0v2JKNqg1IaCeo07VfX/U9TPY7PN+ev/nOSDeHuR1jf+3bZ +f3ceev0+p3+SfyvXv2F2iSWlBgkZAZ8pkKJHHgAFjTlDhdEK/hcmfYYJVUg6MUZNoD0yI9HI +ogmHO5ByZ2Klf2Gmd5jIoyYhsD7GXDIwtWRWHaa0RcI8iZaeP2COajmKkkcE6c0lA87dy8hF +WmRzIihU5yf6Bb/ZGwSRAgAA +'); +INSERT INTO revisions VALUES('75810233cc39b62341d669b610e9416fd6352869','H4sIAAAAAAAA/0WOS27DMAwF9zqF4BNQFkVRZzECg5JI1IA/hSMk12/aTbcPmJln133IWF96 +P7fr9FOYnDv1vR5ybqbP4ZeeEDkkwciZGCDWZia1citSsWsWxgIED+euva+3vrY/1YIS5owW +E4dZqCSNKTfS3HLrBIZYDJp0+YBddx3qp/Ep2rbr74tvGe3rf8LJebuvwy9QGLkhxSAzSAtE +EdESyxxNFVCoEZLgw3nvx+WXoE0JCnGxWpDmrnPKgUKATKVKD8Kg3PnhfgC2AzoCDgEAAA== + +'); +CREATE TABLE roster_deltas + ( + id not null, -- strong hash of the roster + base not null, -- joins with either rosters.id or roster_deltas.id + delta not null, -- rdiff to construct current from base + unique(id, base) + ); +INSERT INTO roster_deltas VALUES('e63f3fbaa205e1d3117d3ee9b056b1edcd95cbbe','330548314b7c980863e65195d0f82aab4cd7e355','H4sIAAAAAAAA/5WPTWoDMQxG9z6F8AkkjSOP11n1DCEM8h+YTKaQuIXevjN0GgLdNFoJCX1P +7wgIMpo38KYtrTedzRE8AQ2HdUijM7E6GYsk5lxSYBy0inOk2WfGKJpHreiCno2BvWqbC9he +7n3ryP4s0vvSy9LhpCGpR5LgNWtBkRgko1eNccCKWdgdJHA6/wa2vN1Ztg+C9n57IkyX8mXB +7gbTp84fZfUYvAPizY6IXxDZAdNVb5c/lNN/c9YHhBywBPMNbVnlwmYBAAA= +'); +INSERT INTO roster_deltas VALUES('e63f3fbaa205e1d3117d3ee9b056b1edcd95cbbe','cb81e62f9e18a8b3f16fb714fd8b564813e5ab28','H4sIAAAAAAAA/xXLsRUEIQgFwJwqKAHxixpvtEVsgCD9l3DvJp+HhW0avQyhbrV1QTKqXFUM +RzP3lYWVDX1IyYwR9PBsxg3j/5ROwda1UM0bW6V7GdA8Z6oc81xegu0f0Q+YPBTccAAAAA== + +'); +INSERT INTO roster_deltas VALUES('cb81e62f9e18a8b3f16fb714fd8b564813e5ab28','74185a2d2c138df730096e0e92b8e43dfec2aa94','H4sIAAAAAAAA/5WPTWrEMAxG9z6F8AksWSPH61n1DMMQ5D8wk6Yw4xZ6+yY0LYVuWq0+JKSn +dwYHMpknCKavfXRdzBkCAvrT1sSJTWosU5VMVGqO5Lw2YUYtoZBLomXS5jjq1Rg4qvWlgh31 +MfaE9nOQX9ZR1wEXjVmDQ4lBi1YnkqIUF1RT8q65IsQniZSvXwd72fcs2W+CjnH/QZhv9d2C +PQzmN11e6+bhAwPSbodI/xA5APOz3m+/KJe/3tkeEGSgSFtCDB6I2XwA8hU3MHEBAAA= +'); +INSERT INTO roster_deltas VALUES('330548314b7c980863e65195d0f82aab4cd7e355','74185a2d2c138df730096e0e92b8e43dfec2aa94','H4sIAAAAAAAA/yXLsREDMQgEwFxVUAJC6B7ij1wGAtF/CfaMN9+XmLAxPqQ8FtrFlCu7Q4Sh +R6r8sqnV1LW5+cmd4yU4aOr+v9MKu0iRuunCKxqqM+op4YMoi2b1+D2zSQIfX8XZRk14AAAA + +'); +INSERT INTO roster_deltas VALUES('74185a2d2c138df730096e0e92b8e43dfec2aa94','c8b35398ca2282fb9b893c47245920870a475c4b','H4sIAAAAAAAA/03NPW7DMAyG4V2nIHwC/omS5kw9QxEYtH6AII0DJFp6+9rtUm4c3ue7AAIn +Ch9AKIGWAOfV5z77PuGzaeEyWK2xeKS+uaVSLMfOeRTfMKVNs/j1rwO4tbNbeAnt+Xr4Plef +8wXL7O85bl+d1nv/DhcQjUCcj12LoWZKzBuymKCcuih1soGYpJlFLDi2JL8rp7c+/HX/hx4g +lQLGcoCKAUvWXNWEnNErmYnqiNlZRu+obtXUXI8uGwNpPDsOKs4s0cg0cquetPc6pLTjdyvN +c8etNbyG8APg9u/sOQEAAA== +'); +CREATE TABLE rosters + ( + id primary key, -- strong hash of the roster + data not null -- compressed, encoded contents of the roster + ); +INSERT INTO rosters VALUES('c8b35398ca2282fb9b893c47245920870a475c4b','H4sIAAAAAAAA/6WSYWojMQyF/+cUw5xAsmxZPksIQbZlOrRNymTaZW9fJ00oGVhIt/4l+fGM +3ie34/yqy/7D5tN0PAwjjpvNcDl1modxvDRTtcNy0S6KLkuXur5/tr/jMB7sz/5DX97tS8/T +vDwN29w8i3FxrlpJDkgbe49aY3WQWatoA590t3nT5Wn/qvPzT0znIb5M35Nsi2B0LoMjJiCW +YOTRkBtApMocIEHLkXa3kMPQphcbxsVOy7ly14jleFjOmbct1YCi3pBASjYJQLlWaSFKRq7m +PUSfcHd78MqKxtvFj3F0z38Ruc589XlS5ygwsg+uFo3erDRKtffKqaoY9CDwTxS0RpGzaW1i +FLyTkiwQkUUs2lyQgD4JAVvmNQq/RvH4lu5RPO67R/HrX+HXKNCKMSSW1HLy3FfjQkRGhMgp +a0UVMKmyRhHWKB7f0j2Kx333KGIQ7ByoFEqZXefQ8/cKwZLvRCpTcMJpt/kEwROOuxkEAAA= + +'); +CREATE INDEX revision_ancestry__child ON revision_ancestry (child); +CREATE INDEX revision_certs__id ON revision_certs (id); +CREATE INDEX revision_certs__name_value ON revision_certs (name, value); +COMMIT; ============================================================ --- tests/schema_migration_error_recovery/heights_already.dump 97f6860f9f9a6e059f9a3dea63c96512a24e51c8 +++ tests/schema_migration_error_recovery/heights_already.dump 97f6860f9f9a6e059f9a3dea63c96512a24e51c8 @@ -0,0 +1,154 @@ +BEGIN EXCLUSIVE; +CREATE TABLE branch_epochs + ( + hash not null unique, -- hash of remaining fields separated by ":" + branch not null unique, -- joins with revision_certs.value + epoch not null -- random hex-encoded id + ); +CREATE TABLE db_vars + ( + domain not null, -- scope of application of a var + name not null, -- var key + value not null, -- var value + unique(domain, name) + ); +CREATE TABLE file_deltas + ( + id not null, -- strong hash of file contents + base not null, -- joins with files.id or file_deltas.id + delta not null, -- compressed rdiff to construct current from base + unique(id, base) + ); +INSERT INTO file_deltas VALUES('a9ca701697adae066b96d07aabb30f0d6245692c','d4929f246d23a51eba6799685e28f9ab077b483a',X'1f8b08000000000000fff35430e54a332c33e4e20200eac8a2590a000000'); +INSERT INTO file_deltas VALUES('36f92840dcffa22064b2dd9e0848d14350f07c5c','f9d518a4e1308cbe8503bdd8f578b16de4407491',X'1f8b08000000000000fff35430e54a332a33e4e202003ab2021e0a000000'); +INSERT INTO file_deltas VALUES('09848c4631a20ac166344f58a23fee04a6c646a4','1ece609689fb9462de25716110769bad1a80e8d8',X'1f8b08000000000000fff35430e54a332933e4e202009a4742910a000000'); +CREATE TABLE files + ( + id primary key, -- strong hash of file contents + data not null -- compressed contents of a file + ); +INSERT INTO files VALUES('bbeadf8e35428c9e5333e71caf25851498306eb6',X'1f8b08000000000000ff4b332e33e40200f1d83a4405000000'); +INSERT INTO files VALUES('d4929f246d23a51eba6799685e28f9ab077b483a',X'1f8b08000000000000ff4b332c33e20200b9431ec505000000'); +INSERT INTO files VALUES('f9d518a4e1308cbe8503bdd8f578b16de4407491',X'1f8b08000000000000ff4b332a33e2020057ecabd705000000'); +INSERT INTO files VALUES('1ece609689fb9462de25716110769bad1a80e8d8',X'1f8b08000000000000ff4b332933e202008bb3c0f205000000'); +CREATE TABLE heights + ( + revision not null, -- joins with revisions.id + height not null, -- complex height, array of big endian u32 integers + unique(revision, height) + ); +INSERT INTO heights VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a',X'00000001'); +INSERT INTO heights VALUES('c81722b0236303685e341e16f0073d665090fb73',X'00000002'); +INSERT INTO heights VALUES('43a2235616452dca74eecf39d645a69da8e0bdd0',X'000000010000000000000000'); +INSERT INTO heights VALUES('4a1274f35812a695e357c6e7c7cd60f449f0cada',X'00000003'); +INSERT INTO heights VALUES('75810233cc39b62341d669b610e9416fd6352869',X'00000004'); +CREATE TABLE manifest_certs + ( + hash not null unique, -- hash of remaining fields separated by ":" + id not null, -- joins with manifests.id or manifest_deltas.id + name not null, -- opaque string chosen by user + value not null, -- opaque blob + keypair not null, -- joins with public_keys.id + signature not null, -- RSA/SHA1 signature of "address@hidden:val]" + unique(name, id, value, keypair, signature) + ); +CREATE TABLE manifest_deltas + ( + id not null, -- strong hash of all the entries in a manifest + base not null, -- joins with either manifest.id or manifest_deltas.id + delta not null, -- rdiff to construct current from base + unique(id, base) + ); +CREATE TABLE manifests + ( + id primary key, -- strong hash of all the entries in a manifest + data not null -- compressed, encoded contents of a manifest + ); +CREATE TABLE next_roster_node_number + ( + node primary key -- only one entry in this table, ever + ); +INSERT INTO next_roster_node_number VALUES('5'); +CREATE TABLE public_keys + ( + hash not null unique, -- hash of remaining fields separated by ":" + id primary key, -- key identifier chosen by user + keydata not null -- RSA public params + ); +INSERT INTO public_keys VALUES('de84b575d5e47254393eba49dce9dc4db98ed42d','address@hidden',X'30819d300d06092a864886f70d010101050003818b0030818702818100b9e2f563aeba98a137cf4e05a6e89a6e2fe90e11170dd8e49c06c5aae9c6f85a6de79729b056a249cb0aba71b7f28146309aaca244b3f1468b1f2c6bb6dbc02113368ce096c01f5a6083b0b0bef55d7c74573405c43203bcf6006392479cc4b8b853f4faec3acb8e444f0229428162d936ff1878e1bd5c03de816cabee1340f7020111'); +INSERT INTO public_keys VALUES('c9d80250e944708aab7fe960c1136b517fd30772','address@hidden',X'30819d300d06092a864886f70d010101050003818b00308187028181009f37f70031a6e06fa4fb9bc92c1a7a50ecb3ba84e76773fed5ca2beb446b66a70488b658e1b756e680b405dfb2a248fa0c10351bd6cb5f2b168cb188b2f224f2a10f8cd845453f7ee7dabb67359d07a15710776b11b027ab40587d9ec9513f29a59105d494e88d14de9194535c76392e72a35ef98a2b157db5118c3b5ee4f95f020111'); +CREATE TABLE revision_ancestry + ( + parent not null, -- joins with revisions.id + child not null, -- joins with revisions.id + unique(parent, child) + ); +INSERT INTO revision_ancestry VALUES('','bf468e6c22dec9203af6441ad7d20b6ad8af049a'); +INSERT INTO revision_ancestry VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','c81722b0236303685e341e16f0073d665090fb73'); +INSERT INTO revision_ancestry VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','43a2235616452dca74eecf39d645a69da8e0bdd0'); +INSERT INTO revision_ancestry VALUES('43a2235616452dca74eecf39d645a69da8e0bdd0','4a1274f35812a695e357c6e7c7cd60f449f0cada'); +INSERT INTO revision_ancestry VALUES('c81722b0236303685e341e16f0073d665090fb73','4a1274f35812a695e357c6e7c7cd60f449f0cada'); +INSERT INTO revision_ancestry VALUES('4a1274f35812a695e357c6e7c7cd60f449f0cada','75810233cc39b62341d669b610e9416fd6352869'); +CREATE TABLE revision_certs + ( + hash not null unique, -- hash of remaining fields separated by ":" + id not null, -- joins with revisions.id + name not null, -- opaque string chosen by user + value not null, -- opaque blob + keypair not null, -- joins with public_keys.id + signature not null, -- RSA/SHA1 signature of "address@hidden:val]" + unique(name, id, value, keypair, signature) + ); +INSERT INTO revision_certs VALUES('6f938572483d4f73bf952c3666dace09f95ebd50','bf468e6c22dec9203af6441ad7d20b6ad8af049a','branch',X'746573746272616e636831','address@hidden',X'0a3810a8fd6bff50d59204826b3ee32af81d3c9d5627711b0bc8f2780471aacdb0d6d80cee200636cd3deb563cfab05566e0817062e54bf5b5175655025b1e553d8d98154e86ed0e9665a167657524f925c8890593792b263489c4fd5bb7c0fa207095c717678440d4adff0e09ce19d203b30f39c9daa52715f3376595020232'); +INSERT INTO revision_certs VALUES('6ac4524843235b44ca2dfc2696d38f2b90239109','bf468e6c22dec9203af6441ad7d20b6ad8af049a','date',X'313939392d30312d30315431323a30303a3030','address@hidden',X'6411df9eefc68ba4bdd113781a922e42c7e548bd893d4dd0212b9521e8f1582c4ae7857ace278e67a64723c18409f582a895ad0f72fec05121a60837a124ac66b41133c99da6a64ce6c4c438a8dae6d77bd9d3e4212a74cac244e0a2e6b8356ff3c6920ab72c5c3c7211953c8d41066a28be27001f15d3f8393adf2f6b07d492'); +INSERT INTO revision_certs VALUES('d77b687d8c619078e80721658a6d99dcfe7e32e5','bf468e6c22dec9203af6441ad7d20b6ad8af049a','author',X'74657374657240746573742e6e6574','address@hidden',X'1d9b1adf2c81ad01a2f86978fe32faa4986b8f3e9e7f7012ae0e9836338d5b9ca97a08f60c8719a503788cb18918acd33d0508f910604859f71b6753100d53fee97c49392e21cfe6a9998abcc78c3d2b6addece348a602c8b7b2e506d3be6d079292126379d39ac5deb5cb1c9a1043b9403d1a3647823f4220454ead87e42907'); +INSERT INTO revision_certs VALUES('2dda1c13436be7c2f10271c210a2bd0c885f313c','bf468e6c22dec9203af6441ad7d20b6ad8af049a','changelog',X'626c61682d626c6168','address@hidden',X'34a21d284a20c9ddc32b08c97d4934068a9f8117c4f1ee47ad16a12ec3127ff8fa5c3f17434d2a556f619ab9ff09a053741c99e5966e4c7f81c8b7170c01d58484c761a4402f14f1df85a5f86a4f05d82e5e0237860cb957e148f493759b670197cf679151ba196d28efc9c6168d71ef7be9998a9ae563d6c02ac03b0266ed94'); +INSERT INTO revision_certs VALUES('c50226beb7e3d289d38e9f613021c380f89ab011','bf468e6c22dec9203af6441ad7d20b6ad8af049a','somekey',X'736f6d6576616c7565','address@hidden',X'1807efea8be82de6eab9686aa949d99870a99f374b09f9de1f899699f21a8dd8af841bbe84f155eb28befb14aff3772b7a90ed54961e15dd51239d0f6199ed505e2bcd6dc938e9499700216a2af3c74b1a1291c989263ecc12cd5c359bb054670f05b00027794ec4b074f555005e19b4fbd47c2836a06e2a8a72fe26850d7162'); +INSERT INTO revision_certs VALUES('628a294256cbb30fa29665cba0ce9a58c02e57b0','c81722b0236303685e341e16f0073d665090fb73','branch',X'746573746272616e636832','address@hidden',X'97c44b9de4e66ef26b694970ceaa8d8b8a63a0c0c8578ad0951d9284e21b985475163c8ebd168de90e2b8f7ea461a78c9556ac0a31d12b974c3279a1106723c149ad73acf8f8729bbcee418db1c2ec778cb1cedefa72a9cfde1c99b5554f47c9e7fbc2ab32376b09ca8b78d3f534fdbf7f38c793935a1ba4995ec2ed54b0ae7b'); +INSERT INTO revision_certs VALUES('70c013d2ba0e97f5e706dcc27e8eb32920f09c6f','c81722b0236303685e341e16f0073d665090fb73','date',X'323030302d30312d30315431323a30303a3030','address@hidden',X'2fbef5dba2115c40db66386dbf91453684c5db3c597424d631bd2bf57d850fffc15f9b8f3df40b47bd1d935f4ace464f1dc5b337245d8b07126099834ae57b6e54ed2efaef1bae918cb71944725dac12fabbb85eca132a2feee5589ab6ef7685bef3fe5e36ee26ae4b6d7cab8d07aeebdfc37a687b2d62659f37f07a5e0a520a'); +INSERT INTO revision_certs VALUES('e70e1cc3843fe732d6ee20d25749f98c8862166b','c81722b0236303685e341e16f0073d665090fb73','author',X'74657374657240746573742e6e6574','address@hidden',X'86a32cebddaec8e68cee2def23bd4ead4ff46346bec261419c8b3991f1ff889a87ee985c4589b7e160c51676422da2ae064cda8f9c2ee9fb6410fc0d605c258732b3a067f55e43468f9d2f1aea36651ee4b003ba82d40b854f054815217358a6ead981bc50d641ad21f49f606f89a27d6b6d7b0fe04bc6f94afde9ab81717b02'); +INSERT INTO revision_certs VALUES('55d537c81d3e6db852813076cbb476aa7bfb8e6d','c81722b0236303685e341e16f0073d665090fb73','changelog',X'626c61682d626c6168','address@hidden',X'329aed4969e5b59d7eb51288c0e92ef10334fb2240d71db652216e0e09c5de256e47795e3d23568a5cce6cccc6b9844bbdb2797d763d6e59ca0cf65ef0994241581a9ae9d80a3a68938bbc4847126b469b1af08f49f2235fc518e18058fa1363d3399005fad5bce391c12551494426a2aca58485200ebd7e6b323bc3c3a01173'); +INSERT INTO revision_certs VALUES('b8207be46ed175205466998210bab3b6c30fa06b','43a2235616452dca74eecf39d645a69da8e0bdd0','branch',X'746573746272616e636831','address@hidden',X'68eab511c6fd1997db7141d0c9171b2daf80784b3875f9c05323f4d3c788624b76b57fa71e0a043e263c93cedca68f0abab8c3665b7be918e89b43441fcbe47e6979ed66dc7a3631abfed3486eea948890d2e2a690e37eb13e8c47c93ed7209c9a42b87b4a637c2b4afd30a101cee8cb5885d1681b7d2e9d990df33e99aaac62'); +INSERT INTO revision_certs VALUES('c2e926d430da9903c918ee15b2b2dfe99ee58463','43a2235616452dca74eecf39d645a69da8e0bdd0','date',X'323030312d30312d30315431323a30303a3030','address@hidden',X'08a151ea8f30e5ec1574edbb4304ecd90d0cbe7652596b56ae724efc5346aded024e9570028d1c8f565f02de2841837df9b60e88526fb28f3cea13fb6fae61fe04250636388554ca82c5df5be09884970eff189c03c752b87c8640ca96cddd302a439145ab2c17c15843b68dc3d236696e78a161dce6460796790d9c5727c42c'); +INSERT INTO revision_certs VALUES('eaa39fc163b0d38cded5270f60bc9570e7f4e1b0','43a2235616452dca74eecf39d645a69da8e0bdd0','author',X'74657374657240746573742e6e6574','address@hidden',X'3ac80b0a61bb53d64f1cce10822c0d14707db5a266a35174f1b08d5ceeef50d85327281e47a6f2ea3971219cd92dd5709436764253589782a5b887eda85a588fcd70d20c40d1c3607f66127e92c3514e9896c9af8ed1a1503bbc9b6117e3aa038560be915d6e0e1423b994169e20da4b4577b40afbd79d438815380a2bc3a023'); +INSERT INTO revision_certs VALUES('9d9472e1be171031fee0ff82f41d752e8124742e','43a2235616452dca74eecf39d645a69da8e0bdd0','changelog',X'626c61682d626c6168','address@hidden',X'09975b6cb5ef7044dd7b3eb0b7d273d65f885f96fcc4e70472034d3b8221139a8bf768d8d2e2580f5f584fb92bbf8c12132a86afe50cbd2ef52e7b3503cecc9ef69a62a2c3cd624a2dfa4a0932db5e6bd7931545a2df9dd4d8eb6a91f2c435a4cec598be9303bfe42c2c58c1258045a5dcb91038f583970a376f9d6d8a232d68'); +INSERT INTO revision_certs VALUES('884d60e16e31cf3621191bd2dab0caf39a0283fe','4a1274f35812a695e357c6e7c7cd60f449f0cada','date',X'323030322d30312d30315431323a30303a3030','address@hidden',X'0cf775eddbf69611d4acce57040e7fdbcca0cad51ea07b35dbf48307d9b3a14a5f481c8402047a38d0b2f1145c6e8cf9f15ff9b1cd3680c0f0690e9516932a790b3c990d6783f6374426cf8600f08a56ad038beb9fb6e7e09defc6e4ebf208b2f66d51e840c018874b06deb2b21c7d8e81cde06ef3bad3a6460b6bed4e716146'); +INSERT INTO revision_certs VALUES('2724dd7883fb44a58d40eba12808ed5b9e09f7b6','4a1274f35812a695e357c6e7c7cd60f449f0cada','author',X'74657374657240746573742e6e6574','address@hidden',X'6ca7bd89227bfb3df1a2ad46a82e15bcee03aa721a60a2b71067573f1b64e3145d2063643516dcc08afdf98bf192765a0818720c9432abee5299fc37e0de7d0843b909c7f29567004b881ca668c335614c0c3c46c687ffbcdf8ec03413345469027e8f54f9ee1db2a406ce891777ee4b9a282f17d52ca17a22ef258d77323ed2'); +INSERT INTO revision_certs VALUES('1288aa1a3c351fd0528aa95ddaae309cc5eec3e2','4a1274f35812a695e357c6e7c7cd60f449f0cada','branch',X'746573746272616e636831','address@hidden',X'976aa27ee04de6305b1abd387eeff10bb1c66e9d61f3dd246e81efed5570fab7a3b96338e832e5b8013835aa1a135ab19406665a2095977f36abfabdbc04789d61649ac5c89e3d66c8a1b2bcad821e94ed6b10d2500391367ae460e39ce2e49b8d15ae890b5e7e1494356cb1d5683102c092b0492c524137827b5705c199e4cc'); +INSERT INTO revision_certs VALUES('27e8a71b0fa56a551e72aed26861ba404d02fd32','4a1274f35812a695e357c6e7c7cd60f449f0cada','changelog',X'70726f7061676174652066726f6d206272616e63682027746573746272616e636832272028686561642063383137323262303233363330333638356533343165313666303037336436363530393066623733290a202020202020202020202020746f206272616e63682027746573746272616e636831272028686561642034336132323335363136343532646361373465656366333964363435613639646138653062646430290a','address@hidden',X'8a542aa0138106374f6d10b450ea65c12bafd701c0bf81ca03264be3442ca5e5affea946ddfa9865345f39c5e21bf132e37fe54543e043d2aa68d98301f0f5b10cc12e25a6a5d8b7d507736f65c8dfcdd549cda4671c30acaec6cc273b5974d65ba326f6fc946fb3785e8d544dced8de86e4144f953e660b4e30fee92d71c1fd'); +INSERT INTO revision_certs VALUES('5b44cd5cd32f3e8f268ac1cd30ccfa27d16667c6','75810233cc39b62341d669b610e9416fd6352869','branch',X'746573746272616e636833','address@hidden',X'02065dabb4b64a46fabde90e1a5fc6927cc3955b02b104a17400a55864a3c5f35ebbc21268ef75320157793d5041967d566bb6967f47f1816ee4d94095c80bd715f677c24c4c369d967938f315b12a12d2da928da45cdf0392d2eb23b9b7634e546108e74d7a49f537516c43a5683f4f28ef5c097d2c792f7bc6d3da4eb019e9'); +INSERT INTO revision_certs VALUES('b0f324986982bdf443036f061977a7895ae94f84','75810233cc39b62341d669b610e9416fd6352869','date',X'323030332d30312d30315431323a30303a3030','address@hidden',X'3b739121ed5856dfdf133d2e1dfe3064a6762bb1df8c62477923f285fd5119f7520afda97d685f1a57da80cd95d4bcecca5e13922919612f87fbab02e856cddf6ce9784ffdfa28ac75a4471800965dd39e6ca59d1096811914cd73ac3769b966921bd702a2b7e858c52526e3c03d571996eaabf5629674d9e5caf91aa61118db'); +INSERT INTO revision_certs VALUES('7a8a589d30fc17ee317ff9bacecac0d30524003a','75810233cc39b62341d669b610e9416fd6352869','author',X'74657374657240746573742e6e6574','address@hidden',X'1ff0ba8c9d5fc8076edd017eacbb7716e856266e65b1aa5f57c9989044cabaeda08db4de731dd2a3c302b0fd96844f88b6f73b2ccbb88f4a0093d55e3eee6ae28d61df1e4d7b373ccf1f4bda2809aa4a3d1c57a7bba4008f749b13a014318368964fa79808ff8d43ef4f747cd7ff929467b8d92d53ce50f14eff04c64ed47146'); +INSERT INTO revision_certs VALUES('98640622c14a2ecbe23b7251b960d8bc78dec4a2','75810233cc39b62341d669b610e9416fd6352869','changelog',X'626c61682d626c6168','address@hidden',X'5eb6f3d6dd6a258a452a859f44fd628de197892dd8d0cc72fe8739e02bd9d71fb206270c48f95d3dbec666c2e495bf1dbbddfda54baf8ed2830dd2bf9e6e41ca8facbe6cfa78fd28aea2c9221e55200998f6d37c87bf1e31d2eb9bec9498de353b05711efde836b51bc28dd27ae19893b363c615a6f9714fa106dac912d97e03'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a',X'1f8b08000000000000ff7d8f516ec4200c44ff730a941310020e9c655521838d849a25524253f5f675b6ab6afbd33f7b64bf9929db7ec71e4fde8fba35354ee33034fe8c776cb5f0d1d56d723c93830c73c95a0369eb0b7aca160a99e49ce54218fcf2360cdb4a71e7b33e503711902852ddd528d46b2e75653576e15e9378a9bcb5ce4d6c30645cf404614142d6002988d78298d2ac8b2630d64130f949fd4b32afa4194a30de6acaa5a0311a6c324481b5b79e263b3bc12dd95d24a50eee573a85bd4b4cc91adff96b1c4e5c3f24696db5575ce363950ecffbd7023f8fbfca7fefdf4efe81006c010000'); +INSERT INTO revisions VALUES('c81722b0236303685e341e16f0073d665090fb73',X'1f8b08000000000000ff55504b6ec4200cdde7142827000306ce128d22838d1a359354099daab72f9959b4dd3df9c9ef57f7e34e6d7ec8712efba646330ec3265ff39db6a5cad9d49483454b021cc4016682081a74e452832793cb45b106b80dc3bef27cc863794a4db93a8c820580a524d0962a3a67880383ce481ca96a97a83f12f35c9755d4d8bae785ec38a8b26f4db62b4216e21ac57a07b124f1d65a09a650051fbd71295a8d92b12b7d502b6fbf32bd8eaac77e5713a542411b4c81984423e684ac0351ce5657cd08ce6382721b94526d5713bb04a98243064bde48260c2961f402b126ca3a84eca2bde29755e8f86f4aadfdbdcceff2dd9755ea94a6c61eeac5f372bc9807ad9fbdfdb5fc138ec30f0e1419fe99010000'); +INSERT INTO revisions VALUES('43a2235616452dca74eecf39d645a69da8e0bdd0',X'1f8b08000000000000ff45cf416ec4300805d07d4e61e5041863629f25aa226c408d34935499687afdbadd74c7e6bffff1f37acabdbded7aede711e6384fd361dfdb538edded7587d540d1a2a6dcda8220b5606c4be9192117e6c6d031755ce2c7349d0fdd2e7bef7fd4da9cb8187744b55e1192381345d145111a8b1671a02a2328aa9bef0f0bf33d3a7f2f9aa7d0cfe3b6634c805aa874e214652ce8913911792e82c9cd80843b130b0de94beefef9cfe060fc3a9f614dec150b8176774104a686aad560d01a296570587aee1f5308e13ec3ea55732c42161394deac64484db5785e4a8bac46040bd5f1f70f3f710feb44010000'); +INSERT INTO revisions VALUES('4a1274f35812a695e357c6e7c7cd60f449f0cada',X'1f8b08000000000000ff6d925d8e5b310885dfef2aacac001b8c612dd128c23656a326b9d5cd6daaeebece8c343f9abe61830f870f8f75bbda7e7af8763fafb770888765b9f99fd3d56ee7e1f73d1cd5ab6a746c15a28a786e11184b2b6370e748223224417c5996f5d24f9b3fceaf5247424b093347a69c7ab342ee6da0f67936d66ee2507b87f9d07a3f8df3c5c3619f3d9f111e96d0d6dbeeb769a156b73ec4315392a69e11d14b6c3652961c490581bdf254fa657bfbf12133c709635bafe1683a1d40642dd6cd81b92a772866b5220ce89c28b3a6f6b28410f6351c3b69d291887b42cbd1ab715165c99e64a85528a592a0cda6ede2b67d6d6afbfef9e6f4d3ff4eb221dc7d0f8769ea2ddfcfdb5be66197df73fa27f9d770d67e85d92496942a2464047cba408a1e790014eccc1914462df85f98f41926a89034628c96c05a6446a291c5120e7720e3c6c446df61a67798c8439310f436c65c3230d5d4bb3a4ce91e09f3245a5afe8039b4e728461e11a455970c38772f2317a991bb1341219d9fe81fbfd91b0491020000'); +INSERT INTO revisions VALUES('75810233cc39b62341d669b610e9416fd6352869',X'1f8b08000000000000ff458e4b6ec3300c05f73a85e01350164551673102839248d4803f852324d76fda4db70f989967d77dc8585f7a3fb7ebf453989c3bf5bd1e726ea6cfe1979e103924c1c8991820d66626b5722b52b16b16c602040fe7aebdafb7beb63fd58212e68c16138759a8248d2937d2dc72eb0486580c9a74f9805d771deaa7f129dab6ebef8b6f19edeb7fc2c979bbafc32f5018b921c52033480b4411d112cb1c4d1550a81192e0c379efc7e597a04d090a71b15a90e6ae73ca8142804ca54a0fc2a0dcf9e17e00b6033a020e010000'); +CREATE TABLE roster_deltas + ( + id primary key, -- a revision id + checksum not null, -- checksum of 'delta', to protect against disk corruption + base not null, -- joins with either rosters.id or roster_deltas.id + delta not null -- rdiff to construct current from base + ); +INSERT INTO roster_deltas VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','e27f3cde4a1ab7074b37f9a95e2827a5d1c54a98','c81722b0236303685e341e16f0073d665090fb73',X'1f8b08000000000000ff9d92516ec3201044ff3905e20498501cce1245d6c22e310aa595bbadd4db173b955bff95f2b9308f9901a4424c2895554248895418a4324ac497ca54595ec04718f5e0fc0808a49d0bdea11e014238e9a4d119fbe4bc895721807999e20cf5b61207d5808fb56e48857999eef4b98f3fa0bcd37a4eaa5c336728d3366a4e8ea466e748627ae3940b0d7fe549f90ccb3dd7db6e2be485677909c9ba33b9680c52f4469f20396b07c0118d0e0ef00c495b0f57f10a3c4f2ba547b4e5d8447bfa1ef923f66efda7876ef7adbf7f05f8fe06ddc1db7dbfb21fdfaba7812f78156ffba0020000'); +INSERT INTO roster_deltas VALUES('43a2235616452dca74eecf39d645a69da8e0bdd0','e27f3cde4a1ab7074b37f9a95e2827a5d1c54a98','4a1274f35812a695e357c6e7c7cd60f449f0cada',X'1f8b08000000000000ff9d92516ec3201044ff3905e20498501cce1245d6c22e310aa595bbadd4db173b955bff95f2b9308f9901a4424c2895554248895418a4324ac497ca54595ec04718f5e0fc0808a49d0bdea11e014238e9a4d119fbe4bc895721807999e20cf5b61207d5808fb56e48857999eef4b98f3fa0bcd37a4eaa5c336728d3366a4e8ea466e748627ae3940b0d7fe549f90ccb3dd7db6e2be485677909c9ba33b9680c52f4469f20396b07c0118d0e0ef00c495b0f57f10a3c4f2ba547b4e5d8447bfa1ef923f66efda7876ef7adbf7f05f8fe06ddc1db7dbfb21fdfaba7812f78156ffba0020000'); +INSERT INTO roster_deltas VALUES('c81722b0236303685e341e16f0073d665090fb73','8f1ef559aafa23fd0ac6812bfb37359aca147026','4a1274f35812a695e357c6e7c7cd60f449f0cada',X'1f8b08000000000000ff958ed10d83300c05ff99c2ca04c6312199055595133b0595d20a657fb5a02ec0fb3ce94e4f6db5660a6e705d07a0b63601e75d57de5bb3adc1e4434d1419b5d42a441838936a328c1cb5673f60c5b10ce576f8bfbd647f2edbe38c9c00202f7b9b61ca9543b45088d44a22f45203732f3a2a610ea2512a7292db11fa489bef47eb8af73f7dd9fb02912a55d206010000'); +INSERT INTO roster_deltas VALUES('4a1274f35812a695e357c6e7c7cd60f449f0cada','c0e9c55669954cdd7b1fdbcec6dd2acc34cf4bf3','75810233cc39b62341d669b610e9416fd6352869',X'1f8b08000000000000ff9551d16ec3200c7ccf5720be008c63e05baa293218da685d3a756cd2fe7e248bb6ae4fddbd59d69defce2c32d5f95c94063d9c2f99db7c5994b65ae956dedabab27a50f9b2b4b23475108c102b2009381e6d494c3e460a6381502327e37dc2e0f869189492726eacf4a8871fbe890143467296c170b6440eb18e81c1d5520c32654262ec7c6eed3ae5132fc7229b3db5635ddcd89b9ecb67b7f88d0f3ebff730a6fbd7ab858e17be3ecfcbf15622cdd7765287549142a10c202547308e2b215a162f6012b104ae06630fd3655eb99da655eb3fbc3df7cecbc17a8064c091336e2dcda12d96aa31de09d168a2a9c9bbedde167fbbf7fb892daa3a3cae73d740ffc45689527b03e818c08d64094790cc1e4bc9d545e93353140ec5241173dfc0e3bcbf0d3ccefb02ae00bba999020000'); +CREATE TABLE rosters + ( + id primary key, -- a revision id + checksum not null, -- checksum of 'data', to protect against disk corruption + data not null -- compressed, encoded contents of the roster + ); +INSERT INTO rosters VALUES('75810233cc39b62341d669b610e9416fd6352869','9c5d47769e8f04ad777bd574a6a6e2bcb658c4bc',X'1f8b08000000000000ff9d93dd6a23310c85eff314669e40b26c597e9610827f643ab44dca74dab26fbf4e32e9928185697d25231fa3f3496ae7e935cdc74f9ddec7f3c90c38ec76e67aea389961b85ec6aaa7f99abb66d23cf754cf1f9ff5cf6086937e1d3fd3cb87de5ee7719a9fcc3e37c7a25cacad5aa2054a8d9dc35443b5903955490d5c4c87dd5b9a9f8eaf697afe89e852c44df4af927d110cd666b0c404c4e2951c2a72030854993d446839d0e16ed29836bea819667d9f2f91bd5930e57c9a2f9ef72d568f929c228194ace28172add27c908c5cd539082ee261a1661656b47c64cc8f7174c6bf22b2d4bc907494ac25cfc8cedb5a5270aaa551acfd9e38d6240add08fc17c5ddc1378a9c35d5264ade5929513d1169c0929af5e2d1452160cdbc46e1d628b677e911c576dd238aedba7b1357537177f08d02b5284364892d47c77dc2ad0fc8881038e6543109a85459a3f06b14dbbbf48862bbee1145f0827d3ba8148a996ddf8ebe153d42d0e8fa9e54266f85e361f717c1138ebb19040000'); +CREATE INDEX revision_ancestry__child ON revision_ancestry (child); +CREATE INDEX revision_certs__id ON revision_certs (id); +CREATE INDEX revision_certs__name_value ON revision_certs (name, value); +COMMIT; ============================================================ --- tests/schema_migration_error_recovery/no_revision_roster.dump be46a73ea537e35ba0cd468dfcb3420b649768bc +++ tests/schema_migration_error_recovery/no_revision_roster.dump be46a73ea537e35ba0cd468dfcb3420b649768bc @@ -0,0 +1,143 @@ +BEGIN EXCLUSIVE; +CREATE TABLE branch_epochs + ( + hash not null unique, -- hash of remaining fields separated by ":" + branch not null unique, -- joins with revision_certs.value + epoch not null -- random hex-encoded id + ); +CREATE TABLE db_vars + ( + domain not null, -- scope of application of a var + name not null, -- var key + value not null, -- var value + unique(domain, name) + ); +CREATE TABLE file_deltas + ( + id not null, -- strong hash of file contents + base not null, -- joins with files.id or file_deltas.id + delta not null, -- compressed rdiff to construct current from base + unique(id, base) + ); +INSERT INTO file_deltas VALUES('a9ca701697adae066b96d07aabb30f0d6245692c','d4929f246d23a51eba6799685e28f9ab077b483a',X'1f8b08000000000000fff35430e54a332c33e4e20200eac8a2590a000000'); +INSERT INTO file_deltas VALUES('36f92840dcffa22064b2dd9e0848d14350f07c5c','f9d518a4e1308cbe8503bdd8f578b16de4407491',X'1f8b08000000000000fff35430e54a332a33e4e202003ab2021e0a000000'); +INSERT INTO file_deltas VALUES('09848c4631a20ac166344f58a23fee04a6c646a4','1ece609689fb9462de25716110769bad1a80e8d8',X'1f8b08000000000000fff35430e54a332933e4e202009a4742910a000000'); +CREATE TABLE files + ( + id primary key, -- strong hash of file contents + data not null -- compressed contents of a file + ); +INSERT INTO files VALUES('d4929f246d23a51eba6799685e28f9ab077b483a',X'1f8b08000000000000ff4b332c33e20200b9431ec505000000'); +INSERT INTO files VALUES('bbeadf8e35428c9e5333e71caf25851498306eb6',X'1f8b08000000000000ff4b332e33e40200f1d83a4405000000'); +INSERT INTO files VALUES('f9d518a4e1308cbe8503bdd8f578b16de4407491',X'1f8b08000000000000ff4b332a33e2020057ecabd705000000'); +INSERT INTO files VALUES('1ece609689fb9462de25716110769bad1a80e8d8',X'1f8b08000000000000ff4b332933e202008bb3c0f205000000'); +CREATE TABLE manifest_certs + ( + hash not null unique, -- hash of remaining fields separated by ":" + id not null, -- joins with manifests.id or manifest_deltas.id + name not null, -- opaque string chosen by user + value not null, -- opaque blob + keypair not null, -- joins with public_keys.id + signature not null, -- RSA/SHA1 signature of "address@hidden:val]" + unique(name, id, value, keypair, signature) + ); +CREATE TABLE manifest_deltas + ( + id not null, -- strong hash of all the entries in a manifest + base not null, -- joins with either manifest.id or manifest_deltas.id + delta not null, -- rdiff to construct current from base + unique(id, base) + ); +CREATE TABLE manifests + ( + id primary key, -- strong hash of all the entries in a manifest + data not null -- compressed, encoded contents of a manifest + ); +CREATE TABLE next_roster_node_number + ( + node primary key -- only one entry in this table, ever + ); +INSERT INTO next_roster_node_number VALUES('5'); +CREATE TABLE public_keys + ( + hash not null unique, -- hash of remaining fields separated by ":" + id primary key, -- key identifier chosen by user + keydata not null -- RSA public params + ); +INSERT INTO public_keys VALUES('de84b575d5e47254393eba49dce9dc4db98ed42d','address@hidden',X'30819d300d06092a864886f70d010101050003818b0030818702818100b9e2f563aeba98a137cf4e05a6e89a6e2fe90e11170dd8e49c06c5aae9c6f85a6de79729b056a249cb0aba71b7f28146309aaca244b3f1468b1f2c6bb6dbc02113368ce096c01f5a6083b0b0bef55d7c74573405c43203bcf6006392479cc4b8b853f4faec3acb8e444f0229428162d936ff1878e1bd5c03de816cabee1340f7020111'); +INSERT INTO public_keys VALUES('c9d80250e944708aab7fe960c1136b517fd30772','address@hidden',X'30819d300d06092a864886f70d010101050003818b00308187028181009f37f70031a6e06fa4fb9bc92c1a7a50ecb3ba84e76773fed5ca2beb446b66a70488b658e1b756e680b405dfb2a248fa0c10351bd6cb5f2b168cb188b2f224f2a10f8cd845453f7ee7dabb67359d07a15710776b11b027ab40587d9ec9513f29a59105d494e88d14de9194535c76392e72a35ef98a2b157db5118c3b5ee4f95f020111'); +CREATE TABLE revision_ancestry + ( + parent not null, -- joins with revisions.id + child not null, -- joins with revisions.id + unique(parent, child) + ); +INSERT INTO revision_ancestry VALUES('','bf468e6c22dec9203af6441ad7d20b6ad8af049a'); +INSERT INTO revision_ancestry VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','c81722b0236303685e341e16f0073d665090fb73'); +INSERT INTO revision_ancestry VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','43a2235616452dca74eecf39d645a69da8e0bdd0'); +INSERT INTO revision_ancestry VALUES('43a2235616452dca74eecf39d645a69da8e0bdd0','4a1274f35812a695e357c6e7c7cd60f449f0cada'); +INSERT INTO revision_ancestry VALUES('c81722b0236303685e341e16f0073d665090fb73','4a1274f35812a695e357c6e7c7cd60f449f0cada'); +INSERT INTO revision_ancestry VALUES('4a1274f35812a695e357c6e7c7cd60f449f0cada','75810233cc39b62341d669b610e9416fd6352869'); +CREATE TABLE revision_certs + ( + hash not null unique, -- hash of remaining fields separated by ":" + id not null, -- joins with revisions.id + name not null, -- opaque string chosen by user + value not null, -- opaque blob + keypair not null, -- joins with public_keys.id + signature not null, -- RSA/SHA1 signature of "address@hidden:val]" + unique(name, id, value, keypair, signature) + ); +INSERT INTO revision_certs VALUES('6f938572483d4f73bf952c3666dace09f95ebd50','bf468e6c22dec9203af6441ad7d20b6ad8af049a','branch',X'746573746272616e636831','address@hidden',X'0a3810a8fd6bff50d59204826b3ee32af81d3c9d5627711b0bc8f2780471aacdb0d6d80cee200636cd3deb563cfab05566e0817062e54bf5b5175655025b1e553d8d98154e86ed0e9665a167657524f925c8890593792b263489c4fd5bb7c0fa207095c717678440d4adff0e09ce19d203b30f39c9daa52715f3376595020232'); +INSERT INTO revision_certs VALUES('6ac4524843235b44ca2dfc2696d38f2b90239109','bf468e6c22dec9203af6441ad7d20b6ad8af049a','date',X'313939392d30312d30315431323a30303a3030','address@hidden',X'6411df9eefc68ba4bdd113781a922e42c7e548bd893d4dd0212b9521e8f1582c4ae7857ace278e67a64723c18409f582a895ad0f72fec05121a60837a124ac66b41133c99da6a64ce6c4c438a8dae6d77bd9d3e4212a74cac244e0a2e6b8356ff3c6920ab72c5c3c7211953c8d41066a28be27001f15d3f8393adf2f6b07d492'); +INSERT INTO revision_certs VALUES('d77b687d8c619078e80721658a6d99dcfe7e32e5','bf468e6c22dec9203af6441ad7d20b6ad8af049a','author',X'74657374657240746573742e6e6574','address@hidden',X'1d9b1adf2c81ad01a2f86978fe32faa4986b8f3e9e7f7012ae0e9836338d5b9ca97a08f60c8719a503788cb18918acd33d0508f910604859f71b6753100d53fee97c49392e21cfe6a9998abcc78c3d2b6addece348a602c8b7b2e506d3be6d079292126379d39ac5deb5cb1c9a1043b9403d1a3647823f4220454ead87e42907'); +INSERT INTO revision_certs VALUES('2dda1c13436be7c2f10271c210a2bd0c885f313c','bf468e6c22dec9203af6441ad7d20b6ad8af049a','changelog',X'626c61682d626c6168','address@hidden',X'34a21d284a20c9ddc32b08c97d4934068a9f8117c4f1ee47ad16a12ec3127ff8fa5c3f17434d2a556f619ab9ff09a053741c99e5966e4c7f81c8b7170c01d58484c761a4402f14f1df85a5f86a4f05d82e5e0237860cb957e148f493759b670197cf679151ba196d28efc9c6168d71ef7be9998a9ae563d6c02ac03b0266ed94'); +INSERT INTO revision_certs VALUES('c50226beb7e3d289d38e9f613021c380f89ab011','bf468e6c22dec9203af6441ad7d20b6ad8af049a','somekey',X'736f6d6576616c7565','address@hidden',X'1807efea8be82de6eab9686aa949d99870a99f374b09f9de1f899699f21a8dd8af841bbe84f155eb28befb14aff3772b7a90ed54961e15dd51239d0f6199ed505e2bcd6dc938e9499700216a2af3c74b1a1291c989263ecc12cd5c359bb054670f05b00027794ec4b074f555005e19b4fbd47c2836a06e2a8a72fe26850d7162'); +INSERT INTO revision_certs VALUES('628a294256cbb30fa29665cba0ce9a58c02e57b0','c81722b0236303685e341e16f0073d665090fb73','branch',X'746573746272616e636832','address@hidden',X'97c44b9de4e66ef26b694970ceaa8d8b8a63a0c0c8578ad0951d9284e21b985475163c8ebd168de90e2b8f7ea461a78c9556ac0a31d12b974c3279a1106723c149ad73acf8f8729bbcee418db1c2ec778cb1cedefa72a9cfde1c99b5554f47c9e7fbc2ab32376b09ca8b78d3f534fdbf7f38c793935a1ba4995ec2ed54b0ae7b'); +INSERT INTO revision_certs VALUES('70c013d2ba0e97f5e706dcc27e8eb32920f09c6f','c81722b0236303685e341e16f0073d665090fb73','date',X'323030302d30312d30315431323a30303a3030','address@hidden',X'2fbef5dba2115c40db66386dbf91453684c5db3c597424d631bd2bf57d850fffc15f9b8f3df40b47bd1d935f4ace464f1dc5b337245d8b07126099834ae57b6e54ed2efaef1bae918cb71944725dac12fabbb85eca132a2feee5589ab6ef7685bef3fe5e36ee26ae4b6d7cab8d07aeebdfc37a687b2d62659f37f07a5e0a520a'); +INSERT INTO revision_certs VALUES('e70e1cc3843fe732d6ee20d25749f98c8862166b','c81722b0236303685e341e16f0073d665090fb73','author',X'74657374657240746573742e6e6574','address@hidden',X'86a32cebddaec8e68cee2def23bd4ead4ff46346bec261419c8b3991f1ff889a87ee985c4589b7e160c51676422da2ae064cda8f9c2ee9fb6410fc0d605c258732b3a067f55e43468f9d2f1aea36651ee4b003ba82d40b854f054815217358a6ead981bc50d641ad21f49f606f89a27d6b6d7b0fe04bc6f94afde9ab81717b02'); +INSERT INTO revision_certs VALUES('55d537c81d3e6db852813076cbb476aa7bfb8e6d','c81722b0236303685e341e16f0073d665090fb73','changelog',X'626c61682d626c6168','address@hidden',X'329aed4969e5b59d7eb51288c0e92ef10334fb2240d71db652216e0e09c5de256e47795e3d23568a5cce6cccc6b9844bbdb2797d763d6e59ca0cf65ef0994241581a9ae9d80a3a68938bbc4847126b469b1af08f49f2235fc518e18058fa1363d3399005fad5bce391c12551494426a2aca58485200ebd7e6b323bc3c3a01173'); +INSERT INTO revision_certs VALUES('b8207be46ed175205466998210bab3b6c30fa06b','43a2235616452dca74eecf39d645a69da8e0bdd0','branch',X'746573746272616e636831','address@hidden',X'68eab511c6fd1997db7141d0c9171b2daf80784b3875f9c05323f4d3c788624b76b57fa71e0a043e263c93cedca68f0abab8c3665b7be918e89b43441fcbe47e6979ed66dc7a3631abfed3486eea948890d2e2a690e37eb13e8c47c93ed7209c9a42b87b4a637c2b4afd30a101cee8cb5885d1681b7d2e9d990df33e99aaac62'); +INSERT INTO revision_certs VALUES('c2e926d430da9903c918ee15b2b2dfe99ee58463','43a2235616452dca74eecf39d645a69da8e0bdd0','date',X'323030312d30312d30315431323a30303a3030','address@hidden',X'08a151ea8f30e5ec1574edbb4304ecd90d0cbe7652596b56ae724efc5346aded024e9570028d1c8f565f02de2841837df9b60e88526fb28f3cea13fb6fae61fe04250636388554ca82c5df5be09884970eff189c03c752b87c8640ca96cddd302a439145ab2c17c15843b68dc3d236696e78a161dce6460796790d9c5727c42c'); +INSERT INTO revision_certs VALUES('eaa39fc163b0d38cded5270f60bc9570e7f4e1b0','43a2235616452dca74eecf39d645a69da8e0bdd0','author',X'74657374657240746573742e6e6574','address@hidden',X'3ac80b0a61bb53d64f1cce10822c0d14707db5a266a35174f1b08d5ceeef50d85327281e47a6f2ea3971219cd92dd5709436764253589782a5b887eda85a588fcd70d20c40d1c3607f66127e92c3514e9896c9af8ed1a1503bbc9b6117e3aa038560be915d6e0e1423b994169e20da4b4577b40afbd79d438815380a2bc3a023'); +INSERT INTO revision_certs VALUES('9d9472e1be171031fee0ff82f41d752e8124742e','43a2235616452dca74eecf39d645a69da8e0bdd0','changelog',X'626c61682d626c6168','address@hidden',X'09975b6cb5ef7044dd7b3eb0b7d273d65f885f96fcc4e70472034d3b8221139a8bf768d8d2e2580f5f584fb92bbf8c12132a86afe50cbd2ef52e7b3503cecc9ef69a62a2c3cd624a2dfa4a0932db5e6bd7931545a2df9dd4d8eb6a91f2c435a4cec598be9303bfe42c2c58c1258045a5dcb91038f583970a376f9d6d8a232d68'); +INSERT INTO revision_certs VALUES('884d60e16e31cf3621191bd2dab0caf39a0283fe','4a1274f35812a695e357c6e7c7cd60f449f0cada','date',X'323030322d30312d30315431323a30303a3030','address@hidden',X'0cf775eddbf69611d4acce57040e7fdbcca0cad51ea07b35dbf48307d9b3a14a5f481c8402047a38d0b2f1145c6e8cf9f15ff9b1cd3680c0f0690e9516932a790b3c990d6783f6374426cf8600f08a56ad038beb9fb6e7e09defc6e4ebf208b2f66d51e840c018874b06deb2b21c7d8e81cde06ef3bad3a6460b6bed4e716146'); +INSERT INTO revision_certs VALUES('2724dd7883fb44a58d40eba12808ed5b9e09f7b6','4a1274f35812a695e357c6e7c7cd60f449f0cada','author',X'74657374657240746573742e6e6574','address@hidden',X'6ca7bd89227bfb3df1a2ad46a82e15bcee03aa721a60a2b71067573f1b64e3145d2063643516dcc08afdf98bf192765a0818720c9432abee5299fc37e0de7d0843b909c7f29567004b881ca668c335614c0c3c46c687ffbcdf8ec03413345469027e8f54f9ee1db2a406ce891777ee4b9a282f17d52ca17a22ef258d77323ed2'); +INSERT INTO revision_certs VALUES('1288aa1a3c351fd0528aa95ddaae309cc5eec3e2','4a1274f35812a695e357c6e7c7cd60f449f0cada','branch',X'746573746272616e636831','address@hidden',X'976aa27ee04de6305b1abd387eeff10bb1c66e9d61f3dd246e81efed5570fab7a3b96338e832e5b8013835aa1a135ab19406665a2095977f36abfabdbc04789d61649ac5c89e3d66c8a1b2bcad821e94ed6b10d2500391367ae460e39ce2e49b8d15ae890b5e7e1494356cb1d5683102c092b0492c524137827b5705c199e4cc'); +INSERT INTO revision_certs VALUES('27e8a71b0fa56a551e72aed26861ba404d02fd32','4a1274f35812a695e357c6e7c7cd60f449f0cada','changelog',X'70726f7061676174652066726f6d206272616e63682027746573746272616e636832272028686561642063383137323262303233363330333638356533343165313666303037336436363530393066623733290a202020202020202020202020746f206272616e63682027746573746272616e636831272028686561642034336132323335363136343532646361373465656366333964363435613639646138653062646430290a','address@hidden',X'8a542aa0138106374f6d10b450ea65c12bafd701c0bf81ca03264be3442ca5e5affea946ddfa9865345f39c5e21bf132e37fe54543e043d2aa68d98301f0f5b10cc12e25a6a5d8b7d507736f65c8dfcdd549cda4671c30acaec6cc273b5974d65ba326f6fc946fb3785e8d544dced8de86e4144f953e660b4e30fee92d71c1fd'); +INSERT INTO revision_certs VALUES('5b44cd5cd32f3e8f268ac1cd30ccfa27d16667c6','75810233cc39b62341d669b610e9416fd6352869','branch',X'746573746272616e636833','address@hidden',X'02065dabb4b64a46fabde90e1a5fc6927cc3955b02b104a17400a55864a3c5f35ebbc21268ef75320157793d5041967d566bb6967f47f1816ee4d94095c80bd715f677c24c4c369d967938f315b12a12d2da928da45cdf0392d2eb23b9b7634e546108e74d7a49f537516c43a5683f4f28ef5c097d2c792f7bc6d3da4eb019e9'); +INSERT INTO revision_certs VALUES('b0f324986982bdf443036f061977a7895ae94f84','75810233cc39b62341d669b610e9416fd6352869','date',X'323030332d30312d30315431323a30303a3030','address@hidden',X'3b739121ed5856dfdf133d2e1dfe3064a6762bb1df8c62477923f285fd5119f7520afda97d685f1a57da80cd95d4bcecca5e13922919612f87fbab02e856cddf6ce9784ffdfa28ac75a4471800965dd39e6ca59d1096811914cd73ac3769b966921bd702a2b7e858c52526e3c03d571996eaabf5629674d9e5caf91aa61118db'); +INSERT INTO revision_certs VALUES('7a8a589d30fc17ee317ff9bacecac0d30524003a','75810233cc39b62341d669b610e9416fd6352869','author',X'74657374657240746573742e6e6574','address@hidden',X'1ff0ba8c9d5fc8076edd017eacbb7716e856266e65b1aa5f57c9989044cabaeda08db4de731dd2a3c302b0fd96844f88b6f73b2ccbb88f4a0093d55e3eee6ae28d61df1e4d7b373ccf1f4bda2809aa4a3d1c57a7bba4008f749b13a014318368964fa79808ff8d43ef4f747cd7ff929467b8d92d53ce50f14eff04c64ed47146'); +INSERT INTO revision_certs VALUES('98640622c14a2ecbe23b7251b960d8bc78dec4a2','75810233cc39b62341d669b610e9416fd6352869','changelog',X'626c61682d626c6168','address@hidden',X'5eb6f3d6dd6a258a452a859f44fd628de197892dd8d0cc72fe8739e02bd9d71fb206270c48f95d3dbec666c2e495bf1dbbddfda54baf8ed2830dd2bf9e6e41ca8facbe6cfa78fd28aea2c9221e55200998f6d37c87bf1e31d2eb9bec9498de353b05711efde836b51bc28dd27ae19893b363c615a6f9714fa106dac912d97e03'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a',X'1f8b08000000000000ff7d8f518ac3300c44ff730ae313388eadd86729c52896046653075237cbde7e9d164a3f96fd1b09cd9b916cfb0d5b3a78bf97ad2a3dea61a8fc9d6e588bf0bda9cbe879220f1926c9c6001917040365074276f1deb110c6305f87615b29ed7c9427ead2174894a8ec4aeb9796b2b2d2ad734fd5b354de6ae3da6330669ccd0871464236004bec5933e2b24c460c81751ea2cdd7bf48f6933481441b9ca12c82d61a708b258a6c820b34bac977dc9cfd4952eaceed6ca7b0b55eb3774d5ffca38703d747e7975a5ac1353d47fdbeff7ce0657c6ffeb3ff024efe81006c010000'); +INSERT INTO revisions VALUES('c81722b0236303685e341e16f0073d665090fb73',X'1f8b08000000000000ff55505b6ec4200cfce7142827000306ce12ad22838d1a359b5409ddaab76fb295faf81b79e479b56dbf539f1eb21ff3b6eac10e4aadf231dd699d9b1c5d8f253a7424c0513c60214860c024ae2d06b2a55e141b809b52dbc2d32e8ff9293596e631095600969ac1386ae8bd258e0ca62071a2667ca6f39198a7362fa2877e7a5ec80d4ad76dedb25e118a10b7242e7848354b70ce49b4951a8414accfc9199482a7d21bf5faf22b73d6d16ddfee7aa45c291a8b39129318c492914d242ac5996618c107cc506f4a6bdd373db2cf901b78647014ac14c29833a620905aa662622c3eb92b7e5d84f6ffa6d4fbdfcbf42a9fe7b25a1fd2f5f0c3f3bc7f330f5adecff6d7f24f38a82f0e1419fe99010000'); +INSERT INTO revisions VALUES('43a2235616452dca74eecf39d645a69da8e0bdd0',X'1f8b08000000000000ff45cf416ec4300805d07d4e61e5041863629f25aa226c408d34935499687afdbadd74c7e6bffff1f37acabdbded7aede711e6384fd361dfdb538edded7587d540d1a2a6dcda8220b5606c4be9192117e6c6d031755ce2c7349d0fdd2e7bef7fd4da9cb8187744b55e1192381345d145111a8b1671a02a2328aa9bef0f0bf33d3a7f2f9aa7d0cfe3b6634c805aa874e214652ce8913911792e82c9cd80843b130b0de94beefef9cfe060fc3a9f614dec150b8176774104a686aad560d01a296570587aee1f5308e13ec3ea55732c42161394deac64484db5785e4a8bac46040bd5f1f70f3f710feb44010000'); +INSERT INTO revisions VALUES('4a1274f35812a695e357c6e7c7cd60f449f0cada',X'1f8b08000000000000ff6d92dd8e1b210c85efe729d03c81c1c69867895691c1468d9acd549369aabe7dc956daddfedc192cce39feccd8f6573dce0fdfef97ed16d6b82ecbcd7f9c5ff576197e3fc2a97aab353af606b18a78ee11184b2f63b0712411199220be2ccb76b5f3ee8fcb9bd4895053c2cc912927eb5ac8bd0fac36cfcad5541c9a19cc876a761e97ab87f5989ecf0ad725f4ed76f86d4668cdd58638664ad2ab6744f412bb8e942547aa82c0de782a7dd3a37ff99099e384b16fafe1a4752680c8b5a8a90373ab6c50545b4318609c28734dfd6509211c5b3819d5544722b6849aa337e5522b4bf624a36a83521a09ea34ed57d7fd4f533d8ecf37e7affe73920de1ee4758dffb76d97f771e7afd3ea77f927f2bd7bf61768925a5060919019f2990a2471e00058d394385d10afe17267d860955483a31464da03d3223d1c8a209873b90726762a57f61a67798c8a32621b03ec65c3230b564561da6b445c23c89969e3f608e6a398a924704e9cd2503ceddcbc8455a6473222854e727fa05bfd91b0491020000'); +INSERT INTO revisions VALUES('75810233cc39b62341d669b610e9416fd6352869',X'1f8b08000000000000ff458e4b6ec3300c05f73a85e01350164551673102839248d4803f852324d76fda4db70f989967d77dc8585f7a3fb7ebf453989c3bf5bd1e726ea6cfe1979e103924c1c8991820d66626b5722b52b16b16c602040fe7aebdafb7beb63fd58212e68c16138759a8248d2937d2dc72eb0486580c9a74f9805d771deaa7f129dab6ebef8b6f19edeb7fc2c979bbafc32f5018b921c52033480b4411d112cb1c4d1550a81192e0c379efc7e597a04d090a71b15a90e6ae73ca8142804ca54a0fc2a0dcf9e17e00b6033a020e010000'); +CREATE TABLE roster_deltas + ( + id not null, -- strong hash of the roster + base not null, -- joins with either rosters.id or roster_deltas.id + delta not null, -- rdiff to construct current from base + unique(id, base) + ); +INSERT INTO roster_deltas VALUES('e63f3fbaa205e1d3117d3ee9b056b1edcd95cbbe','330548314b7c980863e65195d0f82aab4cd7e355',X'1f8b08000000000000ff958f4d6a03310c46f73e85f009248d238fd759f50c210cf21f984ca690b885debe33741a02dd345a09097d4fef0808329a37f0a62dad379dcd113c010d877548a333b13a198b24e65c52601cb48a73a4d967c6289a47ade8829e8d81bd6a9b0bd85eee7debc8fe2cd2fbd2cbd2e1a421a94792e0356b41911824a3578d71c08a59d81d24703aff06b6bcdd59b60f82f67e7b224c97f265c1ee06d3a7ce1f65f518bc03e2cd8e885f10d901d3556f973f94d37f73d607841cb004f30d6d59e5c266010000'); +INSERT INTO roster_deltas VALUES('e63f3fbaa205e1d3117d3ee9b056b1edcd95cbbe','cb81e62f9e18a8b3f16fb714fd8b564813e5ab28',X'1f8b08000000000000ff15cbb11504210805c09c2a2801f18b1a6fb4456c8020fd9770ef269f87856d1abd0ca16eb5754132aa5c550c4733f79585950d7d48c98c11f4f06cc60de3ff944ec1d6b550cd1b5ba57b19d03c67aa1cf35c5e82ed1fd10f983c14dc70000000'); +INSERT INTO roster_deltas VALUES('cb81e62f9e18a8b3f16fb714fd8b564813e5ab28','74185a2d2c138df730096e0e92b8e43dfec2aa94',X'1f8b08000000000000ff958f4d6ac4300c46f73e85f0092c5923c7eb59f50cc310e43f3093a630e3167afb26342d856e5aad3e24a4a777060732992708a6af7d745dcc190202fad3d6c4894d6a2c53954c546a8ee4bc3661462da1904ba265d2e638ead51838aaf5a5821df531f684f673905fd651d701178d59834389418b562792a214175453f2aeb922c4278994af5f077bd9f72cd96f828e71ff41986ff5dd823d0ce6375d5eebe6e10303d26e8748ff103900f3b3de6fbf2897bfded91e1064a0485b420c1e88d97c00f215373071010000'); +INSERT INTO roster_deltas VALUES('330548314b7c980863e65195d0f82aab4cd7e355','74185a2d2c138df730096e0e92b8e43dfec2aa94',X'1f8b08000000000000ff25cbb11103310804c05c55500242e81ee28f5c0602d17f09f68c37df9798b0313ea43c16dac5942bbb4384a147aafcb2a9d5d4b5b9f9c99de3253868eafebfd30abb4891bae9c22b1aaa33ea29e183288b66f5f83db349021f5fc5d9464d78000000'); +INSERT INTO roster_deltas VALUES('74185a2d2c138df730096e0e92b8e43dfec2aa94','c8b35398ca2282fb9b893c47245920870a475c4b',X'1f8b08000000000000ff4dcd3d6ec3300c86e15da7207c02fe8992e64c3d431118b47e80208d03245a7afbdaed526e1cdee7bb0002270a1f4028819600e7d5e73efb3ee1b369e13258adb178a4beb9a5522cc7ce7914df30a54db3f8f5af03b8b5b35b7809edf97af83e579ff305cbecef396e5f9dd67bff0e17108d409c8f5d8ba1664acc1bb298a09cba2875b28198a499452c38b624bf2ba7b73efc75ff871e209502c672808a014bd65cd5849cd12b9989ea88d95946efa86ed5d45c8f2e1b03693c3b0e2ace2cd1c83472ab9eb4f73aa4b4e3772bcd73c7ad35bc86f003e0f6efec39010000'); +CREATE TABLE rosters + ( + id primary key, -- strong hash of the roster + data not null -- compressed, encoded contents of the roster + ); +INSERT INTO rosters VALUES('c8b35398ca2282fb9b893c47245920870a475c4b',X'1f8b08000000000000ffa592616a23310c85ffe714c39c40b26c593e4b0841b6653ab44dca64da656f5f274d28195848b7fe25f9f18cde27b7e3fcaacbfec3e6d3743c0c238e9bcd7039759a8771bc3453b5c372d12e8a2e4b97babe7fb6bfe3301eeccffe435fdeed4bcfd3bc3c0ddbdc3c8b7171ae5a490e481b7b8f5a63759059ab68039f74b779d3e569ffaaf3f34f4ce721be4cdf936c8b60742e832326209660e4d1901b40a4ca1c2041cb9176b790c3d0a6171bc6c54ecbb972d788e57858ce99b72dd580a2de90404a360940b95669214a46aee63d449f70777bf0ca8ac6dbc58f7174cf7f11b9ce7cf57952e72830b20fae168ddeac344ab5f7caa9aa18f420f04f14b44691b3696d6214bc93922c1091452cda5c90803e09015be6350abf46f1f896ee513ceebb47f1eb5fe1d728d08a312496d472f2dc57e342444684c8296b451530a9b24611d6281edfd23d8ac77df7286210ec1ca8144a995de7d0f3f70ac192ef442a5370c269b7f904c1138ebb19040000'); +CREATE INDEX revision_ancestry__child ON revision_ancestry (child); +CREATE INDEX revision_certs__id ON revision_certs (id); +CREATE INDEX revision_certs__name_value ON revision_certs (name, value); +COMMIT; ============================================================ --- tests/schema_migration_error_recovery/tmp_in_the_way.dump 6e8154705c158d304ce418682f9377c9c01e2e84 +++ tests/schema_migration_error_recovery/tmp_in_the_way.dump 6e8154705c158d304ce418682f9377c9c01e2e84 @@ -0,0 +1,309 @@ +BEGIN EXCLUSIVE; +CREATE TABLE branch_epochs + ( + hash not null unique, -- hash of remaining fields separated by ":" + branch not null unique, -- joins with revision_certs.value + epoch not null -- random hex-encoded id + ); +CREATE TABLE db_vars + ( + domain not null, -- scope of application of a var + name not null, -- var key + value not null, -- var value + unique(domain, name) + ); +CREATE TABLE file_deltas + ( + id not null, -- strong hash of file contents + base not null, -- joins with files.id or file_deltas.id + delta not null, -- rdiff to construct current from base + unique(id, base) + ); +INSERT INTO file_deltas VALUES('a9ca701697adae066b96d07aabb30f0d6245692c','d4929f246d23a51eba6799685e28f9ab077b483a','H4sIAAAAAAAA//NUMOVKMywz5OICAOrIolkKAAAA +'); +INSERT INTO file_deltas VALUES('36f92840dcffa22064b2dd9e0848d14350f07c5c','f9d518a4e1308cbe8503bdd8f578b16de4407491','H4sIAAAAAAAA//NUMOVKMyoz5OICADqyAh4KAAAA +'); +INSERT INTO file_deltas VALUES('09848c4631a20ac166344f58a23fee04a6c646a4','1ece609689fb9462de25716110769bad1a80e8d8','H4sIAAAAAAAA//NUMOVKMykz5OICAJpHQpEKAAAA +'); +CREATE TABLE files + ( + id primary key, -- strong hash of file contents + data not null -- compressed, encoded contents of a file + ); +INSERT INTO files VALUES('d4929f246d23a51eba6799685e28f9ab077b483a','H4sIAAAAAAAA/0szLDPiAgC5Qx7FBQAAAA== +'); +INSERT INTO files VALUES('bbeadf8e35428c9e5333e71caf25851498306eb6','H4sIAAAAAAAA/0szLjPkAgDx2DpEBQAAAA== +'); +INSERT INTO files VALUES('f9d518a4e1308cbe8503bdd8f578b16de4407491','H4sIAAAAAAAA/0szKjPiAgBX7KvXBQAAAA== +'); +INSERT INTO files VALUES('1ece609689fb9462de25716110769bad1a80e8d8','H4sIAAAAAAAA/0szKTPiAgCLs8DyBQAAAA== +'); +CREATE TABLE manifest_certs + ( + hash not null unique, -- hash of remaining fields separated by ":" + id not null, -- joins with manifests.id or manifest_deltas.id + name not null, -- opaque string chosen by user + value not null, -- opaque blob + keypair not null, -- joins with public_keys.id + signature not null, -- RSA/SHA1 signature of "address@hidden:val]" + unique(name, id, value, keypair, signature) + ); +CREATE TABLE manifest_deltas + ( + id not null, -- strong hash of all the entries in a manifest + base not null, -- joins with either manifest.id or manifest_deltas.id + delta not null, -- rdiff to construct current from base + unique(id, base) + ); +CREATE TABLE manifests + ( + id primary key, -- strong hash of all the entries in a manifest + data not null -- compressed, encoded contents of a manifest + ); +CREATE TABLE next_roster_node_number + ( + node primary key -- only one entry in this table, ever + ); +INSERT INTO next_roster_node_number VALUES('5'); +CREATE TABLE public_keys + ( + hash not null unique, -- hash of remaining fields separated by ":" + id primary key, -- key identifier chosen by user + keydata not null -- RSA public params + ); +INSERT INTO public_keys VALUES('de84b575d5e47254393eba49dce9dc4db98ed42d','address@hidden','MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC54vVjrrqYoTfPTgWm6JpuL+kOERcN2OSc +BsWq6cb4Wm3nlymwVqJJywq6cbfygUYwmqyiRLPxRosfLGu228AhEzaM4JbAH1pgg7CwvvVd +fHRXNAXEMgO89gBjkkecxLi4U/T67DrLjkRPAilCgWLZNv8YeOG9XAPegWyr7hNA9wIBEQ=='); +INSERT INTO public_keys VALUES('c9d80250e944708aab7fe960c1136b517fd30772','address@hidden','MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V +yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H +oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ=='); +CREATE TABLE revision_ancestry + ( + parent not null, -- joins with revisions.id + child not null, -- joins with revisions.id + unique(parent, child) + ); +INSERT INTO revision_ancestry VALUES('','bf468e6c22dec9203af6441ad7d20b6ad8af049a'); +INSERT INTO revision_ancestry VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','c81722b0236303685e341e16f0073d665090fb73'); +INSERT INTO revision_ancestry VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','43a2235616452dca74eecf39d645a69da8e0bdd0'); +INSERT INTO revision_ancestry VALUES('43a2235616452dca74eecf39d645a69da8e0bdd0','4a1274f35812a695e357c6e7c7cd60f449f0cada'); +INSERT INTO revision_ancestry VALUES('c81722b0236303685e341e16f0073d665090fb73','4a1274f35812a695e357c6e7c7cd60f449f0cada'); +INSERT INTO revision_ancestry VALUES('4a1274f35812a695e357c6e7c7cd60f449f0cada','75810233cc39b62341d669b610e9416fd6352869'); +CREATE TABLE revision_certs + ( + hash not null unique, -- hash of remaining fields separated by ":" + id not null, -- joins with revisions.id + name not null, -- opaque string chosen by user + value not null, -- opaque blob + keypair not null, -- joins with public_keys.id + signature not null, -- RSA/SHA1 signature of "address@hidden:val]" + unique(name, id, value, keypair, signature) + ); +INSERT INTO revision_certs VALUES('6f938572483d4f73bf952c3666dace09f95ebd50','bf468e6c22dec9203af6441ad7d20b6ad8af049a','branch','dGVzdGJyYW5jaDE= +','address@hidden','CjgQqP1r/1DVkgSCaz7jKvgdPJ1WJ3EbC8jyeARxqs2w1tgM7iAGNs0961Y8+rBVZuCBcGLl +S/W1F1ZVAlseVT2NmBVOhu0OlmWhZ2V1JPklyIkFk3krJjSJxP1bt8D6IHCVxxdnhEDUrf8O +Cc4Z0gOzDznJ2qUnFfM3ZZUCAjI= +'); +INSERT INTO revision_certs VALUES('6ac4524843235b44ca2dfc2696d38f2b90239109','bf468e6c22dec9203af6441ad7d20b6ad8af049a','date','MTk5OS0wMS0wMVQxMjowMDowMA== +','address@hidden','ZBHfnu/Gi6S90RN4GpIuQsflSL2JPU3QISuVIejxWCxK54V6zieOZ6ZHI8GECfWCqJWtD3L+ +wFEhpgg3oSSsZrQRM8mdpqZM5sTEOKja5td72dPkISp0ysJE4KLmuDVv88aSCrcsXDxyEZU8 +jUEGaii+JwAfFdP4OTrfL2sH1JI= +'); +INSERT INTO revision_certs VALUES('d77b687d8c619078e80721658a6d99dcfe7e32e5','bf468e6c22dec9203af6441ad7d20b6ad8af049a','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','HZsa3yyBrQGi+Gl4/jL6pJhrjz6ef3ASrg6YNjONW5ypegj2DIcZpQN4jLGJGKzTPQUI+RBg +SFn3G2dTEA1T/ul8STkuIc/mqZmKvMeMPStq3ezjSKYCyLey5QbTvm0HkpISY3nTmsXetcsc +mhBDuUA9GjZHgj9CIEVOrYfkKQc= +'); +INSERT INTO revision_certs VALUES('2dda1c13436be7c2f10271c210a2bd0c885f313c','bf468e6c22dec9203af6441ad7d20b6ad8af049a','changelog','YmxhaC1ibGFo +','address@hidden','NKIdKEogyd3DKwjJfUk0BoqfgRfE8e5HrRahLsMSf/j6XD8XQ00qVW9hmrn/CaBTdByZ5ZZu +TH+ByLcXDAHVhITHYaRALxTx34Wl+GpPBdguXgI3hgy5V+FI9JN1m2cBl89nkVG6GW0o78nG +Fo1x73vpmYqa5WPWwCrAOwJm7ZQ= +'); +INSERT INTO revision_certs VALUES('c50226beb7e3d289d38e9f613021c380f89ab011','bf468e6c22dec9203af6441ad7d20b6ad8af049a','somekey','c29tZXZhbHVl +','address@hidden','GAfv6ovoLebquWhqqUnZmHCpnzdLCfneH4mWmfIajdivhBu+hPFV6yi++xSv83crepDtVJYe +Fd1RI50PYZntUF4rzW3JOOlJlwAhairzx0saEpHJiSY+zBLNXDWbsFRnDwWwACd5TsSwdPVV +AF4ZtPvUfCg2oG4qinL+JoUNcWI= +'); +INSERT INTO revision_certs VALUES('628a294256cbb30fa29665cba0ce9a58c02e57b0','c81722b0236303685e341e16f0073d665090fb73','branch','dGVzdGJyYW5jaDI= +','address@hidden','l8RLneTmbvJraUlwzqqNi4pjoMDIV4rQlR2ShOIbmFR1FjyOvRaN6Q4rj36kYaeMlVasCjHR +K5dMMnmhEGcjwUmtc6z4+HKbvO5BjbHC7HeMsc7e+nKpz94cmbVVT0fJ5/vCqzI3awnKi3jT +9TT9v384x5OTWhukmV7C7VSwrns= +'); +INSERT INTO revision_certs VALUES('70c013d2ba0e97f5e706dcc27e8eb32920f09c6f','c81722b0236303685e341e16f0073d665090fb73','date','MjAwMC0wMS0wMVQxMjowMDowMA== +','address@hidden','L77126IRXEDbZjhtv5FFNoTF2zxZdCTWMb0r9X2FD//BX5uPPfQLR70dk19KzkZPHcWzNyRd +iwcSYJmDSuV7blTtLvrvG66RjLcZRHJdrBL6u7heyhMqL+7lWJq273aFvvP+XjbuJq5LbXyr +jQeu69/Demh7LWJlnzfwel4KUgo= +'); +INSERT INTO revision_certs VALUES('e70e1cc3843fe732d6ee20d25749f98c8862166b','c81722b0236303685e341e16f0073d665090fb73','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','hqMs692uyOaM7i3vI71OrU/0Y0a+wmFBnIs5kfH/iJqH7phcRYm34WDFFnZCLaKuBkzaj5wu +6ftkEPwNYFwlhzKzoGf1XkNGj50vGuo2ZR7ksAO6gtQLhU8FSBUhc1im6tmBvFDWQa0h9J9g +b4mifWttew/gS8b5Sv3pq4FxewI= +'); +INSERT INTO revision_certs VALUES('55d537c81d3e6db852813076cbb476aa7bfb8e6d','c81722b0236303685e341e16f0073d665090fb73','changelog','YmxhaC1ibGFo +','address@hidden','MprtSWnltZ1+tRKIwOku8QM0+yJA1x22UiFuDgnF3iVuR3lePSNWilzObMzGuYRLvbJ5fXY9 +blnKDPZe8JlCQVgamunYCjpok4u8SEcSa0abGvCPSfIjX8UY4YBY+hNj0zmQBfrVvOORwSVR +SUQmoqylhIUgDr1+azI7w8OgEXM= +'); +INSERT INTO revision_certs VALUES('b8207be46ed175205466998210bab3b6c30fa06b','43a2235616452dca74eecf39d645a69da8e0bdd0','branch','dGVzdGJyYW5jaDE= +','address@hidden','aOq1Ecb9GZfbcUHQyRcbLa+AeEs4dfnAUyP008eIYkt2tX+nHgoEPiY8k87cpo8KurjDZlt7 +6Rjom0NEH8vkfml57WbcejYxq/7TSG7qlIiQ0uKmkON+sT6MR8k+1yCcmkK4e0pjfCtK/TCh +Ac7oy1iF0WgbfS6dmQ3zPpmqrGI= +'); +INSERT INTO revision_certs VALUES('c2e926d430da9903c918ee15b2b2dfe99ee58463','43a2235616452dca74eecf39d645a69da8e0bdd0','date','MjAwMS0wMS0wMVQxMjowMDowMA== +','address@hidden','CKFR6o8w5ewVdO27QwTs2Q0MvnZSWWtWrnJO/FNGre0CTpVwAo0cj1ZfAt4oQYN9+bYOiFJv +so886hP7b65h/gQlBjY4hVTKgsXfW+CYhJcO/xicA8dSuHyGQMqWzd0wKkORRassF8FYQ7aN +w9I2aW54oWHc5kYHlnkNnFcnxCw= +'); +INSERT INTO revision_certs VALUES('eaa39fc163b0d38cded5270f60bc9570e7f4e1b0','43a2235616452dca74eecf39d645a69da8e0bdd0','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','OsgLCmG7U9ZPHM4QgiwNFHB9taJmo1F08bCNXO7vUNhTJygeR6by6jlxIZzZLdVwlDZ2QlNY +l4KluIftqFpYj81w0gxA0cNgf2YSfpLDUU6YlsmvjtGhUDu8m2EX46oDhWC+kV1uDhQjuZQW +niDaS0V3tAr7151DiBU4CivDoCM= +'); +INSERT INTO revision_certs VALUES('9d9472e1be171031fee0ff82f41d752e8124742e','43a2235616452dca74eecf39d645a69da8e0bdd0','changelog','YmxhaC1ibGFo +','address@hidden','CZdbbLXvcETdez6wt9Jz1l+IX5b8xOcEcgNNO4IhE5qL92jY0uJYD19YT7krv4wSEyqGr+UM +vS71Lns1A87MnvaaYqLDzWJKLfpKCTLbXmvXkxVFot+d1NjrapHyxDWkzsWYvpMDv+QsLFjB +JYBFpdy5EDj1g5cKN2+dbYojLWg= +'); +INSERT INTO revision_certs VALUES('884d60e16e31cf3621191bd2dab0caf39a0283fe','4a1274f35812a695e357c6e7c7cd60f449f0cada','date','MjAwMi0wMS0wMVQxMjowMDowMA== +','address@hidden','DPd17dv2lhHUrM5XBA5/28ygytUeoHs12/SDB9mzoUpfSByEAgR6ONCy8RRcboz58V/5sc02 +gMDwaQ6VFpMqeQs8mQ1ng/Y3RCbPhgDwilatA4vrn7bn4J3vxuTr8giy9m1R6EDAGIdLBt6y +shx9joHN4G7zutOmRgtr7U5xYUY= +'); +INSERT INTO revision_certs VALUES('2724dd7883fb44a58d40eba12808ed5b9e09f7b6','4a1274f35812a695e357c6e7c7cd60f449f0cada','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','bKe9iSJ7+z3xoq1GqC4VvO4DqnIaYKK3EGdXPxtk4xRdIGNkNRbcwIr9+YvxknZaCBhyDJQy +q+5Smfw34N59CEO5CcfylWcAS4gcpmjDNWFMDDxGxof/vN+OwDQTNFRpAn6PVPnuHbKkBs6J +F3fuS5ooLxfVLKF6Iu8ljXcyPtI= +'); +INSERT INTO revision_certs VALUES('1288aa1a3c351fd0528aa95ddaae309cc5eec3e2','4a1274f35812a695e357c6e7c7cd60f449f0cada','branch','dGVzdGJyYW5jaDE= +','address@hidden','l2qifuBN5jBbGr04fu/xC7HGbp1h890kboHv7VVw+rejuWM46DLluAE4NaoaE1qxlAZmWiCV +l382q/q9vAR4nWFkmsXInj1myKGyvK2CHpTtaxDSUAORNnrkYOOc4uSbjRWuiQtefhSUNWyx +1WgxAsCSsEksUkE3gntXBcGZ5Mw= +'); +INSERT INTO revision_certs VALUES('27e8a71b0fa56a551e72aed26861ba404d02fd32','4a1274f35812a695e357c6e7c7cd60f449f0cada','changelog','cHJvcGFnYXRlIGZyb20gYnJhbmNoICd0ZXN0YnJhbmNoMicgKGhlYWQgYzgxNzIyYjAyMzYz +MDM2ODVlMzQxZTE2ZjAwNzNkNjY1MDkwZmI3MykKICAgICAgICAgICAgdG8gYnJhbmNoICd0 +ZXN0YnJhbmNoMScgKGhlYWQgNDNhMjIzNTYxNjQ1MmRjYTc0ZWVjZjM5ZDY0NWE2OWRhOGUw +YmRkMCkK +','address@hidden','ilQqoBOBBjdPbRC0UOplwSuv1wHAv4HKAyZL40QspeWv/qlG3fqYZTRfOcXiG/Ey43/lRUPg +Q9KqaNmDAfD1sQzBLiWmpdi31Qdzb2XI383VSc2kZxwwrK7GzCc7WXTWW6Mm9vyUb7N4Xo1U +Tc7Y3obkFE+VPmYLTjD+6S1xwf0= +'); +INSERT INTO revision_certs VALUES('5b44cd5cd32f3e8f268ac1cd30ccfa27d16667c6','75810233cc39b62341d669b610e9416fd6352869','branch','dGVzdGJyYW5jaDM= +','address@hidden','AgZdq7S2Skb6vekOGl/GknzDlVsCsQShdAClWGSjxfNeu8ISaO91MgFXeT1QQZZ9Vmu2ln9H +8YFu5NlAlcgL1xX2d8JMTDadlnk48xWxKhLS2pKNpFzfA5LS6yO5t2NOVGEI5016SfU3UWxD +pWg/TyjvXAl9LHkve8bT2k6wGek= +'); +INSERT INTO revision_certs VALUES('b0f324986982bdf443036f061977a7895ae94f84','75810233cc39b62341d669b610e9416fd6352869','date','MjAwMy0wMS0wMVQxMjowMDowMA== +','address@hidden','O3ORIe1YVt/fEz0uHf4wZKZ2K7HfjGJHeSPyhf1RGfdSCv2pfWhfGlfagM2V1Lzsyl4TkikZ +YS+H+6sC6FbN32zpeE/9+iisdaRHGACWXdOebKWdEJaBGRTNc6w3ablmkhvXAqK36FjFJSbj +wD1XGZbqq/VilnTZ5cr5GqYRGNs= +'); +INSERT INTO revision_certs VALUES('7a8a589d30fc17ee317ff9bacecac0d30524003a','75810233cc39b62341d669b610e9416fd6352869','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','H/C6jJ1fyAdu3QF+rLt3FuhWJm5lsapfV8mYkETKuu2gjbTecx3So8MCsP2WhE+Itvc7LMu4 +j0oAk9VePu5q4o1h3x5Nezc8zx9L2igJqko9HFenu6QAj3SbE6AUMYNolk+nmAj/jUPvT3R8 +1/+SlGe42S1TzlDxTv8Exk7UcUY= +'); +INSERT INTO revision_certs VALUES('98640622c14a2ecbe23b7251b960d8bc78dec4a2','75810233cc39b62341d669b610e9416fd6352869','changelog','YmxhaC1ibGFo +','address@hidden','Xrbz1t1qJYpFKoWfRP1ijeGXiS3Y0Mxy/oc54CvZ1x+yBicMSPldPb7GZsLklb8du939pUuv +jtKDDdK/nm5Byo+svmz6eP0orqLJIh5VIAmY9tN8h78eMdLrm+yUmN41OwVxHv3oNrUbwo3S +euGYk7NjxhWm+XFPoQbayRLZfgM= +'); +CREATE TABLE revision_roster + ( + rev_id primary key, -- joins with revisions.id + roster_id not null -- joins with either rosters.id or roster_deltas.id + ); +INSERT INTO revision_roster VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','e63f3fbaa205e1d3117d3ee9b056b1edcd95cbbe'); +INSERT INTO revision_roster VALUES('c81722b0236303685e341e16f0073d665090fb73','330548314b7c980863e65195d0f82aab4cd7e355'); +INSERT INTO revision_roster VALUES('43a2235616452dca74eecf39d645a69da8e0bdd0','cb81e62f9e18a8b3f16fb714fd8b564813e5ab28'); +INSERT INTO revision_roster VALUES('4a1274f35812a695e357c6e7c7cd60f449f0cada','74185a2d2c138df730096e0e92b8e43dfec2aa94'); +INSERT INTO revision_roster VALUES('75810233cc39b62341d669b610e9416fd6352869','c8b35398ca2282fb9b893c47245920870a475c4b'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','H4sIAAAAAAAA/32PUYrDMAxE/3MK4xM4jq3YZynFKJYEZlMHUjfL3n6dFko/lv0bCc2bkWz7 +DVs6eL+XrSo96mGo/J1uWIvwvanL6HkiDxkmycYAGRcEA2UHQnbx3rEQxjBfh2FbKe18lCfq +0hdIlKjsSuuXlrKy0q1zT9WzVN5q49pjMGaczQhxRkI2AEvsWTPiskxGDIF1HqLN179I9pM0 +gUQbnKEsgtYacIslimyCCzS6yXfcnP1JUurO7WynsLVes3dNX/yjhwPXR+eXWlrBNT1H/b7/ +fOBlfG/+s/8CTv6BAGwBAAA= +'); +INSERT INTO revisions VALUES('c81722b0236303685e341e16f0073d665090fb73','H4sIAAAAAAAA/1VQW27EIAz85xQoJwADBs4SrSKDjRo1m1QJ3aq3b7KV+vgbeeR5tW2/U58e +sh/zturBDkqt8jHdaZ2bHF2PJTp0JMBRPGAhSGDAJK4tBrKlXhQbgJtS28LTLo/5KTWW5jEJ +VgCWmsE4aui9JY4MpiBxomZ8pvORmKc2L6KHfnpeyA1K123tsl4RihC3JC54SDVLcM5JtJUa +hBSsz8kZlIKn0hv1+vIrc9bRbd/ueqRcKRqLORKTGMSSkU0kKsWZZhjBB8xQb0pr3Tc9ss+Q +G3hkcBSsFMKYM6YgkFqmYmIsPrkrfl2E9v+m1Pvfy/Qqn+eyWh/S9fDD87x/Mw9a3s/21/JP +OKgvDhQZ/pkBAAA= +'); +INSERT INTO revisions VALUES('43a2235616452dca74eecf39d645a69da8e0bdd0','H4sIAAAAAAAA/0XPQW7EMAgF0H1OYeUEGGNinyWqImxAjTSTVJloev263XTH5r//8fN6yr29 +7Xrt5xHmOE/TYd/bU47d7XWH1UDRoqbc2oIgtWBsS+kZIRfmxtAxdVzixzSdD90ue+9/1Nqc +uBh3RLVeEZI4E0XRRREaixZxoCojKKqb7w8L8z06fy+ap9DP47ZjTIBaqHTiFGUs6JE5EXku +gsnNgIQ7EwsN6Uvu/vnP4GD8Op9hTewVC4F2d0EEpoaq1WDQGillcFh67h9TCOE+w+pVcyxC +FhOU3qxkSE21eF5Ki6xGBAvV8fcPP3EP60QBAAA= +'); +INSERT INTO revisions VALUES('4a1274f35812a695e357c6e7c7cd60f449f0cada','H4sIAAAAAAAA/22S3Y4bIQyF7+cp0DyBwcaYZ4lWkcFGjZrNVJNpqr59yVba3f7cGSzOOf7M +2PZXPc4P3++X7RbWuC7LzX+cX/V2GX4/wql6qzU69gaxinjuERhLL2OwcSQRGZIgvizLdrXz +7o/Lm9SJUFPCzJEpJ+tayL0PrDbPytVUHJoZzIdqdh6Xq4f1mJ7PCtcl9O12+G1GaM3Vhjhm +StKrZ0T0EruOlCVHqoLA3ngqfdOjf/mQmeOEsW+v4aR1JoDItaipA3OrbFBUW0MYYJwoc039 +ZQkhHFs4GdVURyK2hJqjN+VSK0v2JKNqg1IaCeo07VfX/U9TPY7PN+ev/nOSDeHuR1jf+3bZ +f3ceev0+p3+SfyvXv2F2iSWlBgkZAZ8pkKJHHgAFjTlDhdEK/hcmfYYJVUg6MUZNoD0yI9HI +ogmHO5ByZ2Klf2Gmd5jIoyYhsD7GXDIwtWRWHaa0RcI8iZaeP2COajmKkkcE6c0lA87dy8hF +WmRzIihU5yf6Bb/ZGwSRAgAA +'); +INSERT INTO revisions VALUES('75810233cc39b62341d669b610e9416fd6352869','H4sIAAAAAAAA/0WOS27DMAwF9zqF4BNQFkVRZzECg5JI1IA/hSMk12/aTbcPmJln133IWF96 +P7fr9FOYnDv1vR5ybqbP4ZeeEDkkwciZGCDWZia1citSsWsWxgIED+euva+3vrY/1YIS5owW +E4dZqCSNKTfS3HLrBIZYDJp0+YBddx3qp/Ep2rbr74tvGe3rf8LJebuvwy9QGLkhxSAzSAtE +EdESyxxNFVCoEZLgw3nvx+WXoE0JCnGxWpDmrnPKgUKATKVKD8Kg3PnhfgC2AzoCDgEAAA== + +'); +CREATE TABLE roster_deltas + ( + id not null, -- strong hash of the roster + base not null, -- joins with either rosters.id or roster_deltas.id + delta not null, -- rdiff to construct current from base + unique(id, base) + ); +INSERT INTO roster_deltas VALUES('e63f3fbaa205e1d3117d3ee9b056b1edcd95cbbe','330548314b7c980863e65195d0f82aab4cd7e355','H4sIAAAAAAAA/5WPTWoDMQxG9z6F8AkkjSOP11n1DCEM8h+YTKaQuIXevjN0GgLdNFoJCX1P +7wgIMpo38KYtrTedzRE8AQ2HdUijM7E6GYsk5lxSYBy0inOk2WfGKJpHreiCno2BvWqbC9he +7n3ryP4s0vvSy9LhpCGpR5LgNWtBkRgko1eNccCKWdgdJHA6/wa2vN1Ztg+C9n57IkyX8mXB +7gbTp84fZfUYvAPizY6IXxDZAdNVb5c/lNN/c9YHhBywBPMNbVnlwmYBAAA= +'); +INSERT INTO roster_deltas VALUES('e63f3fbaa205e1d3117d3ee9b056b1edcd95cbbe','cb81e62f9e18a8b3f16fb714fd8b564813e5ab28','H4sIAAAAAAAA/xXLsRUEIQgFwJwqKAHxixpvtEVsgCD9l3DvJp+HhW0avQyhbrV1QTKqXFUM +RzP3lYWVDX1IyYwR9PBsxg3j/5ROwda1UM0bW6V7GdA8Z6oc81xegu0f0Q+YPBTccAAAAA== + +'); +INSERT INTO roster_deltas VALUES('cb81e62f9e18a8b3f16fb714fd8b564813e5ab28','74185a2d2c138df730096e0e92b8e43dfec2aa94','H4sIAAAAAAAA/5WPTWrEMAxG9z6F8AksWSPH61n1DMMQ5D8wk6Yw4xZ6+yY0LYVuWq0+JKSn +dwYHMpknCKavfXRdzBkCAvrT1sSJTWosU5VMVGqO5Lw2YUYtoZBLomXS5jjq1Rg4qvWlgh31 +MfaE9nOQX9ZR1wEXjVmDQ4lBi1YnkqIUF1RT8q65IsQniZSvXwd72fcs2W+CjnH/QZhv9d2C +PQzmN11e6+bhAwPSbodI/xA5APOz3m+/KJe/3tkeEGSgSFtCDB6I2XwA8hU3MHEBAAA= +'); +INSERT INTO roster_deltas VALUES('330548314b7c980863e65195d0f82aab4cd7e355','74185a2d2c138df730096e0e92b8e43dfec2aa94','H4sIAAAAAAAA/yXLsREDMQgEwFxVUAJC6B7ij1wGAtF/CfaMN9+XmLAxPqQ8FtrFlCu7Q4Sh +R6r8sqnV1LW5+cmd4yU4aOr+v9MKu0iRuunCKxqqM+op4YMoi2b1+D2zSQIfX8XZRk14AAAA + +'); +INSERT INTO roster_deltas VALUES('74185a2d2c138df730096e0e92b8e43dfec2aa94','c8b35398ca2282fb9b893c47245920870a475c4b','H4sIAAAAAAAA/03NPW7DMAyG4V2nIHwC/omS5kw9QxEYtH6AII0DJFp6+9rtUm4c3ue7AAIn +Ch9AKIGWAOfV5z77PuGzaeEyWK2xeKS+uaVSLMfOeRTfMKVNs/j1rwO4tbNbeAnt+Xr4Plef +8wXL7O85bl+d1nv/DhcQjUCcj12LoWZKzBuymKCcuih1soGYpJlFLDi2JL8rp7c+/HX/hx4g +lQLGcoCKAUvWXNWEnNErmYnqiNlZRu+obtXUXI8uGwNpPDsOKs4s0cg0cquetPc6pLTjdyvN +c8etNbyG8APg9u/sOQEAAA== +'); +CREATE TABLE rosters + ( + id primary key, -- strong hash of the roster + data not null -- compressed, encoded contents of the roster + ); +INSERT INTO rosters VALUES('c8b35398ca2282fb9b893c47245920870a475c4b','H4sIAAAAAAAA/6WSYWojMQyF/+cUw5xAsmxZPksIQbZlOrRNymTaZW9fJ00oGVhIt/4l+fGM +3ie34/yqy/7D5tN0PAwjjpvNcDl1modxvDRTtcNy0S6KLkuXur5/tr/jMB7sz/5DX97tS8/T +vDwN29w8i3FxrlpJDkgbe49aY3WQWatoA590t3nT5Wn/qvPzT0znIb5M35Nsi2B0LoMjJiCW +YOTRkBtApMocIEHLkXa3kMPQphcbxsVOy7ly14jleFjOmbct1YCi3pBASjYJQLlWaSFKRq7m +PUSfcHd78MqKxtvFj3F0z38Ruc589XlS5ygwsg+uFo3erDRKtffKqaoY9CDwTxS0RpGzaW1i +FLyTkiwQkUUs2lyQgD4JAVvmNQq/RvH4lu5RPO67R/HrX+HXKNCKMSSW1HLy3FfjQkRGhMgp +a0UVMKmyRhHWKB7f0j2Kx333KGIQ7ByoFEqZXefQ8/cKwZLvRCpTcMJpt/kEwROOuxkEAAA= + +'); +CREATE INDEX revision_ancestry__child ON revision_ancestry (child); +CREATE INDEX revision_certs__id ON revision_certs (id); +CREATE INDEX revision_certs__name_value ON revision_certs (name, value); +CREATE TABLE tmp ( col1, col2 ); +INSERT INTO tmp VALUES('a', 'b'); +COMMIT; ============================================================ --- ChangeLog 9307f0c3384b2c4ea7c19994392ffa8060ff2c3e +++ ChangeLog c51b17fb6ad5bd744e797ea8ab96373adf940a19 @@ -1,5 +1,23 @@ 2007-01-13 Zack Weinberg + * schema_migration.cc: Further prune using-declarations. + (migrate_*): Use sql::exec directly. Shorten names. Don't call + set_regime. Remove errmsg and upgrade_regime arguments. Change + app_state argument to a reference. Return void. + (logged_sqlite3_exec, set_regime, move_table): Delete. + (enum upgrade_regime): Move to just above the migration_events table. + (struct migration_event): Add third 'regime' field. + (migration_events): Fill in the migration regimes. + (migrator_cb): Adjust. + (migrate_monotone_schema): Rename migrate_sql_schema. Register + unbase64 here. Change app_state argument to a refernece. Handle + calculation of upgrade regime here. Use sql::exec. + (test_migration_step): New function, for debugging. + * cmd_db.cc (test_migration_step): New debugging command. + * database.cc, database.hh: Adjust call of migrate_sql_schema. + (test_migration_step): New member function. + * tests/schema_migration_error_recovery: Add several more subcases. + * schema_migration.cc: Replace logged_sqlite3_* with a new, tidier class-based API. (logged_sqlite3_exec remains for transitional purposes.) Globally change "sql" local variables to "db" to avoid @@ -10,6 +28,7 @@ 2007-01-13 Zack Weinberg pub, priv; - vector pairs; { sql stmt(db, 2, "SELECT id, keydata FROM private_keys"); @@ -826,7 +526,7 @@ migrate_client_to_external_privkeys(sqli base64< arc4 > old_priv = i->second; map::const_iterator j = pub.find(i->first); keypair kp; - migrate_private_key(*app, ident, old_priv, kp); + migrate_private_key(app, ident, old_priv, kp); MM(kp.pub); if (j != pub.end()) { @@ -837,261 +537,142 @@ migrate_client_to_external_privkeys(sqli } P(F("moving key '%s' from database to %s") - % ident % app->keys.get_key_dir()); - app->keys.put_key_pair(ident, kp); + % ident % app.keys.get_key_dir()); + app.keys.put_key_pair(ident, kp); } - res = logged_sqlite3_exec(db, "DROP TABLE private_keys;", NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - - return true; + sql::exec(db, "DROP TABLE private_keys"); } -static bool -migrate_client_to_add_rosters(sqlite3 * db, - char ** errmsg, - app_state *, - upgrade_regime & regime) +static void +migrate_add_rosters(sqlite3 * db, app_state &) { - int res; + sql::exec(db, + "CREATE TABLE rosters\n" + "(\n" + "id primary key, -- strong hash of the roster\n" + "data not null -- compressed, encoded contents of the roster\n" + ")"); - res = logged_sqlite3_exec(db, - "CREATE TABLE rosters\n" - "(\n" - "id primary key, -- strong hash of the roster\n" - "data not null -- compressed, encoded contents of the roster\n" - ");", - NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; + sql::exec(db, + "CREATE TABLE roster_deltas\n" + "(\n" + "id not null, -- strong hash of the roster\n" + "base not null, -- joins with either rosters.id or roster_deltas.id\n" + "delta not null, -- rdiff to construct current from base\n" + "unique(id, base)\n" + ")"); - res = logged_sqlite3_exec(db, - "CREATE TABLE roster_deltas\n" - "(\n" - "id not null, -- strong hash of the roster\n" - "base not null, -- joins with either rosters.id or roster_deltas.id\n" - "delta not null, -- rdiff to construct current from base\n" - "unique(id, base)\n" - ");", - NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; + sql::exec(db, + "CREATE TABLE revision_roster\n" + "(\n" + "rev_id primary key, -- joins with revisions.id\n" + "roster_id not null -- joins with either rosters.id or roster_deltas.id\n" + ")"); - res = logged_sqlite3_exec(db, - "CREATE TABLE revision_roster\n" - "(\n" - "rev_id primary key, -- joins with revisions.id\n" - "roster_id not null -- joins with either rosters.id or roster_deltas.id\n" - ");", - NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - - res = logged_sqlite3_exec(db, - "CREATE TABLE next_roster_node_number\n" - "(\n" - "node primary key -- only one entry in this table, ever\n" - ");", - NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - - set_regime(upgrade_rosterify, regime); - - return true; + sql::exec(db, + "CREATE TABLE next_roster_node_number\n" + "(\n" + "node primary key -- only one entry in this table, ever\n" + ")"); } // I wish I had a form of ALTER TABLE COMMENT on sqlite3 -static bool -migrate_files_BLOB(sqlite3 * db, - char ** errmsg, - app_state *app, - upgrade_regime & regime) +static void +migrate_files_BLOB(sqlite3 * db, app_state &) { - int res; - sql::create_function(db, "unbase64", sqlite3_unbase64_fn); - // change the encoding of file(_delta)s - if (!move_table(db, errmsg, - "files", - "tmp", - "(" - "id primary key," - "data not null" - ")")) - return false; + sql::exec(db, "ALTER TABLE files RENAME TO tmp"); + sql::exec(db, "CREATE TABLE files\n" + "(\n" + "id primary key, -- strong hash of file contents\n" + "data not null -- compressed contents of a file\n" + ")"); + sql::exec(db, "INSERT INTO files SELECT id, unbase64(data) FROM tmp"); + sql::exec(db, "DROP TABLE tmp"); - res = logged_sqlite3_exec(db, "CREATE TABLE files\n" - "\t(\n" - "\tid primary key, -- strong hash of file contents\n" - "\tdata not null -- compressed contents of a file\n" - "\t)", NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; + sql::exec(db, "ALTER TABLE file_deltas RENAME TO tmp"); + sql::exec(db, "CREATE TABLE file_deltas\n" + "(\n" + "id not null, -- strong hash of file contents\n" + "base not null, -- joins with files.id or file_deltas.id\n" + "delta not null, -- compressed rdiff to construct current from base\n" + "unique(id, base)\n" + ")"); + sql::exec(db, "INSERT INTO file_deltas SELECT id, base, unbase64(delta) " + "FROM tmp"); + sql::exec(db, "DROP TABLE tmp"); - res = logged_sqlite3_exec(db, "INSERT INTO files " - "SELECT id, unbase64(data) " - "FROM tmp", NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - - res = logged_sqlite3_exec(db, "DROP TABLE tmp", NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - - if (!move_table(db, errmsg, - "file_deltas", - "tmp", - "(" - "id not null," - "base not null," - "delta not null" - ")")) - return false; - - res = logged_sqlite3_exec(db, "CREATE TABLE file_deltas\n" - "\t(\n" - "\tid not null, -- strong hash of file contents\n" - "\tbase not null, -- joins with files.id or file_deltas.id\n" - "\tdelta not null, -- compressed rdiff to construct current from base\n" - "\tunique(id, base)\n" - "\t)", NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - - res = logged_sqlite3_exec(db, "INSERT INTO file_deltas " - "SELECT id, base, unbase64(delta) " - "FROM tmp", NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - - res = logged_sqlite3_exec(db, "DROP TABLE tmp", NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - // migrate other contents which are accessed by get|put_version - res = logged_sqlite3_exec(db, "UPDATE manifests SET data=unbase64(data)", - NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - res = logged_sqlite3_exec(db, "UPDATE manifest_deltas " - "SET delta=unbase64(delta)", NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - res = logged_sqlite3_exec(db, "UPDATE rosters SET data=unbase64(data) ", - NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - res = logged_sqlite3_exec(db, "UPDATE roster_deltas " - "SET delta=unbase64(delta)", NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - - res = logged_sqlite3_exec(db, "UPDATE db_vars " - "SET value=unbase64(value),name=unbase64(name)", NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - res = logged_sqlite3_exec(db, "UPDATE public_keys " - "SET keydata=unbase64(keydata)", NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - res = logged_sqlite3_exec(db, "UPDATE revision_certs " - "SET value=unbase64(value),signature=unbase64(signature)", - NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - res = logged_sqlite3_exec(db, "UPDATE manifest_certs " - "SET value=unbase64(value),signature=unbase64(signature) ", - NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - res = logged_sqlite3_exec(db, "UPDATE revisions " - "SET data=unbase64(data)", NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - res = logged_sqlite3_exec(db, "UPDATE branch_epochs " - "SET branch=unbase64(branch)", NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - return true; + sql::exec(db, "UPDATE manifests SET data=unbase64(data)"); + sql::exec(db, "UPDATE manifest_deltas SET delta=unbase64(delta)"); + sql::exec(db, "UPDATE rosters SET data=unbase64(data) "); + sql::exec(db, "UPDATE roster_deltas SET delta=unbase64(delta)"); + sql::exec(db, "UPDATE db_vars SET value=unbase64(value),name=unbase64(name)"); + sql::exec(db, "UPDATE public_keys SET keydata=unbase64(keydata)"); + sql::exec(db, "UPDATE revision_certs " + "SET value=unbase64(value),signature=unbase64(signature)"); + sql::exec(db, "UPDATE manifest_certs " + "SET value=unbase64(value),signature=unbase64(signature)"); + sql::exec(db, "UPDATE revisions SET data=unbase64(data)"); + sql::exec(db, "UPDATE branch_epochs SET branch=unbase64(branch)"); } -static bool -migrate_rosters_no_hash(sqlite3 * db, - char ** errmsg, - app_state * app, - upgrade_regime & regime) +static void +migrate_rosters_no_hash(sqlite3 * db, app_state &) { - int res; - - res = logged_sqlite3_exec(db, "DROP TABLE rosters", NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - res = logged_sqlite3_exec(db, "DROP TABLE roster_deltas", NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - res = logged_sqlite3_exec(db, "DROP TABLE revision_roster", NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; + sql::exec(db, "DROP TABLE rosters"); + sql::exec(db, "DROP TABLE roster_deltas"); + sql::exec(db, "DROP TABLE revision_roster"); - res = logged_sqlite3_exec(db, - "CREATE TABLE rosters\n" - "\t(\n" - "\tid primary key, -- a revision id\n" - "\tchecksum not null, -- checksum of 'data', to protect against disk corruption\n" - "\tdata not null -- compressed, encoded contents of the roster\n" - "\t);", - NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; + sql::exec(db, + "CREATE TABLE rosters\n" + "(\n" + "id primary key, -- a revision id\n" + "checksum not null, -- checksum of 'data', to protect against disk corruption\n" + "data not null -- compressed, encoded contents of the roster\n" + ")"); - res = logged_sqlite3_exec(db, - "CREATE TABLE roster_deltas\n" - "\t(\n" - "\tid primary key, -- a revision id\n" - "\tchecksum not null, -- checksum of 'delta', to protect against disk corruption\n" - "\tbase not null, -- joins with either rosters.id or roster_deltas.id\n" - "\tdelta not null -- rdiff to construct current from base\n" - ");", - NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; - - set_regime(upgrade_regen_caches, regime); - - return true; + sql::exec(db, + "CREATE TABLE roster_deltas\n" + "(\n" + "id primary key, -- a revision id\n" + "checksum not null, -- checksum of 'delta', to protect against disk corruption\n" + "base not null, -- joins with either rosters.id or roster_deltas.id\n" + "delta not null -- rdiff to construct current from base\n" + ")"); } -static bool -migrate_add_heights(sqlite3 *db, - char ** errmsg, - app_state *app, - upgrade_regime & regime) +static void +migrate_add_heights(sqlite3 * db, app_state &) { - int res; + sql::exec(db, + "CREATE TABLE heights\n" + "(\n" + "revision not null, -- joins with revisions.id\n" + "height not null, -- complex height, array of big endian u32 integers\n" + "unique(revision, height)\n" + ")"); +} - res = logged_sqlite3_exec(db, - "CREATE TABLE heights\n" - "(\n" - "revision not null, -- joins with revisions.id\n" - "height not null, -- complex height, array of big endian u32 integers\n" - "unique(revision, height)\n" - ");", NULL, NULL, errmsg); - if (res != SQLITE_OK) - return false; +// these must be listed in order so that ones listed earlier override ones +// listed later +enum upgrade_regime + { + upgrade_changesetify, + upgrade_rosterify, + upgrade_regen_caches, + upgrade_none, + }; - set_regime(upgrade_regen_caches, regime); - - return true; -} +typedef void (*migrator_cb)(sqlite3 *, app_state &); -typedef bool (*migrator_cb)(sqlite3 *, char **, app_state *, upgrade_regime &); struct migration_event { char const * id; migrator_cb migrator; + upgrade_regime regime; }; // IMPORTANT: whenever you modify this to add a new schema version, you must @@ -1100,42 +681,53 @@ const migration_event migration_events[] const migration_event migration_events[] = { { "edb5fa6cef65bcb7d0c612023d267c3aeaa1e57a", - migrate_client_merge_url_and_group }, + migrate_merge_url_and_group, + upgrade_none }, { "f042f3c4d0a4f98f6658cbaf603d376acf88ff4b", - migrate_client_add_hashes_and_merkle_trees }, + migrate_add_hashes_and_merkle_trees, + upgrade_none }, { "8929e54f40bf4d3b4aea8b037d2c9263e82abdf4", - migrate_client_to_revisions }, + migrate_to_revisions, + upgrade_changesetify }, { "c1e86588e11ad07fa53e5d294edc043ce1d4005a", - migrate_client_to_epochs }, + migrate_to_epochs, + upgrade_none }, { "40369a7bda66463c5785d160819ab6398b9d44f4", - migrate_client_to_vars }, + migrate_to_vars, + upgrade_none }, { "e372b508bea9b991816d1c74680f7ae10d2a6d94", - migrate_client_to_add_indexes }, + migrate_add_indexes, + upgrade_none }, { "1509fd75019aebef5ac3da3a5edf1312393b70e9", - migrate_client_to_external_privkeys }, + migrate_to_external_privkeys, + upgrade_none }, { "bd86f9a90b5d552f0be1fa9aee847ea0f317778b", - migrate_client_to_add_rosters }, + migrate_add_rosters, + upgrade_rosterify }, { "1db80c7cee8fa966913db1a463ed50bf1b0e5b0e", - migrate_files_BLOB }, + migrate_files_BLOB, + upgrade_none }, { "9d2b5d7b86df00c30ac34fe87a3c20f1195bb2df", - migrate_rosters_no_hash }, + migrate_rosters_no_hash, + upgrade_regen_caches }, { "ae196843d368d042f475e3dadfed11e9d7f9f01e", - migrate_add_heights }, + migrate_add_heights, + upgrade_regen_caches }, // The last entry in this table should always be the current // schema ID, with 0 for the migrator. - { "48fd5d84f1e5a949ca093e87e5ac558da6e5956d", 0 } + { "48fd5d84f1e5a949ca093e87e5ac558da6e5956d", 0, upgrade_none } }; const size_t n_migration_events = (sizeof migration_events / sizeof migration_events[0]); @@ -1250,10 +842,11 @@ void } void -migrate_monotone_schema(sqlite3 * db, app_state * app) +migrate_sql_schema(sqlite3 * db, app_state & app) { I(db != NULL); sql::create_function(db, "sha1", sqlite_sha1_fn); + sql::create_function(db, "unbase64", sqlite3_unbase64_fn); upgrade_regime regime = upgrade_none; @@ -1274,7 +867,7 @@ migrate_monotone_schema(sqlite3 * db, ap int i = schema_to_migration(init); if (i == -1) - diagnose_unrecognized_schema(db, app->db.get_filename(), init); + diagnose_unrecognized_schema(db, app.db.get_filename(), init); // We really want 'db migrate' on an up-to-date schema to be a no-op // (no vacuum or anything, even), so that automated scripts can fire @@ -1298,7 +891,8 @@ migrate_monotone_schema(sqlite3 * db, ap if (migration_events[i].migrator == 0) break; - migration_events[i].migrator(db, 0, app, regime); + migration_events[i].migrator(db, app); + regime = std::min(regime, migration_events[i].regime); i++; I((size_t)i < n_migration_events); @@ -1309,7 +903,7 @@ migrate_monotone_schema(sqlite3 * db, ap } P(F("optimizing database")); - logged_sqlite3_exec(db, "VACUUM"); + sql::exec(db, "VACUUM"); switch (regime) { @@ -1334,7 +928,35 @@ migrate_monotone_schema(sqlite3 * db, ap } } +// test_migration_step runs the migration step from SCHEMA to its successor, +// *without* validating that the database actually conforms to that schema +// first. the point of this is to test error recovery from conditions that +// are not accessible through normal malformed dumps (because the schema +// conformance check will reject them). +void +test_migration_step(sqlite3 * db, app_state & app, string const & schema) +{ + I(db != NULL); + sql::create_function(db, "sha1", sqlite_sha1_fn); + sql::create_function(db, "unbase64", sqlite3_unbase64_fn); + + transaction guard(db); + + int i = schema_to_migration(schema); + N(i > 0, F("cannot test migration from unknown schema %s") % schema); + N(migration_events[i].migrator, F("schema %s is up to date") % schema); + + L(FL("testing migration from %s to %s\n in database %s") + % schema % migration_events[i+1].id % app.db.get_filename()); + + migration_events[i].migrator(db, app); + // in the unlikely event that we get here ... + P(F("successful migration to schema %s") % migration_events[i+1].id); + guard.commit(); +} + + // Local Variables: // mode: C++ // fill-column: 76 ============================================================ --- schema_migration.hh c5297d15ee9dfa8b96cb01a96cd6a811d80ef97c +++ schema_migration.hh d17dda6f74de9d6cc6a84c8faf222e5c0bb8013e @@ -23,9 +23,11 @@ class system_path; class app_state; class system_path; -void calculate_schema_id(sqlite3 * sql, std::string & id); -void migrate_monotone_schema(sqlite3 * sql, app_state * app); -void check_sql_schema(sqlite3 * sql, system_path const & filename); +void calculate_schema_id(sqlite3 * db, std::string & id); +void migrate_sql_schema(sqlite3 * db, app_state & app); +void check_sql_schema(sqlite3 * db, system_path const & filename); +void test_migration_step(sqlite3 * db, app_state & app, + std::string const & schema); // Local Variables: // mode: C++ ============================================================ --- tests/schema_migration_error_recovery/__driver__.lua 69671b8cf2ddaeb74716c2f8d01dbe2c82a1f48b +++ tests/schema_migration_error_recovery/__driver__.lua a4b51f336dff083ec53c2199d398f8edb90da941 @@ -1,13 +1,35 @@ --- This test exercises monotone's ability to detect and recover from errors --- while migrating to new database schemata. +-- This test exercises monotone's ability to detect and recover from +-- errors while migrating to new database schemata. We attempt to be +-- exhaustive in the set of possible errors, but not the set of +-- possible operations that could fail. -function test_one(tag, diagnostic) +function test_one(tag, target, diagnostic) dump = tag .. ".dump" db = tag .. ".mtn" check(get(dump)) check(raw_mtn("db", "load", "-d", db), 0, nil, nil, {dump}) - check(raw_mtn("db", "migrate", "-d", db), 1, nil, true) + check(raw_mtn("test_migration_step", target, "-d", db), 1, nil, true) check(qgrep(diagnostic, "stderr")) end + +-- migrate_files_BLOB +test_one("bad_base64", "1db80c7cee8fa966913db1a463ed50bf1b0e5b0e", + "invalid base64 character") +test_one("tmp_in_the_way", "1db80c7cee8fa966913db1a463ed50bf1b0e5b0e", + "already another table") +test_one("column_missing", "1db80c7cee8fa966913db1a463ed50bf1b0e5b0e", + "no such column") + +-- migrate_rosters_no_hash +test_one("no_revision_roster", "9d2b5d7b86df00c30ac34fe87a3c20f1195bb2df", + "no such table") + +-- migrate_add_heights +test_one("heights_already", "ae196843d368d042f475e3dadfed11e9d7f9f01e", + "heights already exists") + +-- I would like to exercise migrate_to_external_privkeys' own peculiar +-- failure mode but I don't see how to trip the "key mismatch" error +-- without having it demand passphrases that don't exist (because the +-- keys are mismatched)... -test_one("bad_base64", "invalid base64 character")