Parcourir la source

[1330] Update after review

Resolved confusion over "operation" values for adding and deleting
records.  Added ORDER BY clause to SQL statement and removed
redundant variable declaration.
Stephen Morris il y a 13 ans
Parent
commit
2aac7b891f

+ 12 - 8
src/lib/datasrc/sqlite3_accessor.cc

@@ -23,6 +23,7 @@
 #include <datasrc/logger.h>
 #include <datasrc/data_source.h>
 #include <datasrc/factory.h>
+#include <datasrc/database.h>
 #include <util/filename.h>
 
 using namespace std;
@@ -96,16 +97,17 @@ const char* const text_statements[NUM_STATEMENTS] = {
     // Two statements to select the lowest ID and highest ID in a set of
     // differences.
     "SELECT id FROM diffs "     // LOW_DIFF_ID
-        "WHERE zone_id=?1 AND version=?2 and OPERATION=0 "
+        "WHERE zone_id=?1 AND version=?2 and OPERATION=?3 "
         "ORDER BY id ASC LIMIT 1",
     "SELECT id FROM diffs "     // HIGH_DIFF_ID
-        "WHERE zone_id=?1 AND version=?2 and OPERATION=1 "
+        "WHERE zone_id=?1 AND version=?2 and OPERATION=?3 "
         "ORDER BY id DESC LIMIT 1",
 
     // In the next statement, note the redundant ID.  This is to ensure
     // that the columns match the column IDs passed to the iterator
     "SELECT rrtype, ttl, id, rdata, name FROM diffs "   // DIFF_RECS
-        "WHERE zone_id=?1 AND id>=?2 and id<=?3"
+        "WHERE zone_id=?1 AND id>=?2 and id<=?3 "
+        "ORDER BY id ASC"
 };
 
 struct SQLite3Parameters {
@@ -622,8 +624,8 @@ public:
         last_status_(SQLITE_ROW)
     {
         try {
-            int low_id = findIndex(LOW_DIFF_ID, zone_id, start);
-            int high_id = findIndex(HIGH_DIFF_ID, zone_id, end);
+            int low_id = findIndex(LOW_DIFF_ID, zone_id, start, DIFF_DELETE);
+            int high_id = findIndex(HIGH_DIFF_ID, zone_id, end, DIFF_ADD);
 
             // Prepare the statement that will return data values
             reset(DIFF_RECS);
@@ -743,7 +745,7 @@ private:
 
             // Got some data, extract the value
             result = sqlite3_column_int(stmt, 0);
-            int rc = sqlite3_step(stmt);
+            rc = sqlite3_step(stmt);
             if (rc == SQLITE_DONE) {
 
                 // All OK, exit with the value.
@@ -777,6 +779,7 @@ private:
     /// \param stmt_id Index of the prepared statement to execute
     /// \param zone_id ID of the zone for which the index is being sought
     /// \param serial Zone serial number for which an index is being sought.
+    /// \param diff Code to delete record additions or deletions
     ///
     /// \return int ID of the row in the difss table corresponding to the
     ///         statement.
@@ -785,19 +788,20 @@ private:
     ///            was expected.
     /// \exception NoSuchSerial Serial number not found.
     /// \exception NoDiffsData No data for this zone found in diffs table
-    int findIndex(StatementID stindex, int zone_id, uint32_t serial) {
+    int findIndex(StatementID stindex, int zone_id, uint32_t serial, int diff) {
 
         // Set up the statement
         reset(stindex);
         bindInt(stindex, 1, zone_id);
         bindInt(stindex, 2, serial);
+        bindInt(stindex, 3, diff);
 
         // Execute the statement
         int result = -1;
         try {
             result = getSingleValue(stindex);
 
-        } catch (TooLittleData) {
+        } catch (const TooLittleData&) {
 
             // No data returned but the SQL query succeeded.  Only possibility
             // is that there is no entry in the differences table for the given

BIN
src/lib/datasrc/tests/testdata/diffs.sqlite3


+ 19 - 19
src/lib/datasrc/tests/testdata/diffs_table.sql

@@ -45,77 +45,77 @@ CREATE TABLE diffs (id INTEGER PRIMARY KEY,
 -- Change from 4294967280 (0xfffffff0) to 1230 to show serial rollover
 -- Update one record in the zone.
 INSERT INTO diffs(zone_id, version, operation, name, rrtype, ttl, rdata)
-    VALUES(1, 4294967280,  0, "example.org.", "SOA", 3600,
+    VALUES(1, 4294967280,  1, "example.org.", "SOA", 3600,
            "ns1.example.org. admin.example.org. 4294967280 3600 1800 2419200 7200");
 INSERT INTO diffs(zone_id, version, operation, name, rrtype, ttl, rdata)
-    VALUES(1, 4294967280, 0, "www.example.org.", "A", 3600, "192.0.2.31");
+    VALUES(1, 4294967280, 1, "www.example.org.", "A", 3600, "192.0.2.31");
 
 -- Records added in version 1230 of the zone
 INSERT INTO diffs(zone_id, version, operation, name, rrtype, ttl, rdata)
-    VALUES(1, 1230, 1, "example.org.", "SOA", 1800,
+    VALUES(1, 1230, 0, "example.org.", "SOA", 1800,
            "ns1.example.org. admin.example.org. 1230 3600 1800 2419200 7200");
 INSERT INTO diffs(zone_id, version, operation, name, rrtype, ttl, rdata)
-    VALUES(1, 1230, 1, "www.example.org.", "A", 3600, "192.0.2.21");
+    VALUES(1, 1230, 0, "www.example.org.", "A", 3600, "192.0.2.21");
 
 -- Change 1230 to 1231: Change change a parameter of the SOA record
 -- Records removed from version 1230 of the zone
 INSERT INTO diffs(zone_id, version, operation, name, rrtype, ttl, rdata)
-    VALUES(1, 1230, 0, "example.org.", "SOA", 1800,
+    VALUES(1, 1230, 1, "example.org.", "SOA", 1800,
            "ns1.example.org. admin.example.org. 1230 3600 1800 2419200 7200");
 
 -- Records added in version 1231 of the zone
 INSERT INTO diffs(zone_id, version, operation, name, rrtype, ttl, rdata)
-    VALUES(1, 1231, 1, "example.org.", "SOA", 3600,
+    VALUES(1, 1231, 0, "example.org.", "SOA", 3600,
            "ns1.example.org. admin.example.org. 1231 3600 1800 2419200 7200");
 
 
 -- Change 1231 to 1232: Remove one record, don't add anything.
 -- Records removed from version 1231 of the zone
 INSERT INTO diffs(zone_id, version, operation, name, rrtype, ttl, rdata)
-    VALUES(1, 1231, 0, "example.org.", "SOA", 3600,
+    VALUES(1, 1231, 1, "example.org.", "SOA", 3600,
            "ns1.example.org. admin.example.org. 1231 3600 1800 2419200 7200");
 INSERT INTO diffs(zone_id, version, operation, name, rrtype, ttl, rdata)
-    VALUES(1, 1231, 0, "unused.example.org.", "A", 3600, "192.0.2.102");
+    VALUES(1, 1231, 1, "unused.example.org.", "A", 3600, "192.0.2.102");
 
 -- Records added in version 1232 of the zone
 INSERT INTO diffs(zone_id, version, operation, name, rrtype, ttl, rdata)
-    VALUES(1, 1232, 1, "example.org.", "SOA", 3600,
+    VALUES(1, 1232, 0, "example.org.", "SOA", 3600,
            "ns1.example.org. admin.example.org. 1232 3600 1800 2419200 7200");
 
 -- Change 1232 to 1233: Add two, don't remove anything.
 -- Records removed from version 1232 of the zone
 INSERT INTO diffs(zone_id, version, operation, name, rrtype, ttl, rdata)
-    VALUES(1, 1232, 0, "example.org.", "SOA", 3600,
+    VALUES(1, 1232, 1, "example.org.", "SOA", 3600,
            "ns1.example.org. admin.example.org. 1232 3600 1800 2419200 7200");
 
 -- Records added in version 1233 of the zone
 INSERT INTO diffs(zone_id, version, operation, name, rrtype, ttl, rdata)
-    VALUES(1, 1233, 1, "example.org.", "SOA", 3600,
+    VALUES(1, 1233, 0, "example.org.", "SOA", 3600,
            "ns1.example.org. admin.example.org. 1233 3600 1800 2419200 7200");
 INSERT INTO diffs(zone_id, version, operation, name, rrtype, ttl, rdata)
-    VALUES(1, 1233, 1, "sub.example.org.", "NS", 3600, "ns.sub.example.org.");
+    VALUES(1, 1233, 0, "sub.example.org.", "NS", 3600, "ns.sub.example.org.");
 INSERT INTO diffs(zone_id, version, operation, name, rrtype, ttl, rdata)
-    VALUES(1, 1233, 1, "ns.sub.example.org.", "A", 3600, "192.0.2.101");
+    VALUES(1, 1233, 0, "ns.sub.example.org.", "A", 3600, "192.0.2.101");
 
 
 -- Change 1233 to 1234: change addresses of two A records
 -- Records removed from version 1233 of the zone
 INSERT INTO diffs(zone_id, version, operation, name, rrtype, ttl, rdata)
-    VALUES(1, 1233, 0, "example.org.", "SOA", 3600,
+    VALUES(1, 1233, 1, "example.org.", "SOA", 3600,
            "ns1.example.org. admin.example.org. 1233 3600 1800 2419200 7200");
 INSERT INTO diffs(zone_id, version, operation, name, rrtype, ttl, rdata)
-    VALUES(1, 1233, 0, "www.example.org.", "A", 3600, "192.0.2.21");
+    VALUES(1, 1233, 1, "www.example.org.", "A", 3600, "192.0.2.21");
 INSERT INTO diffs(zone_id, version, operation, name, rrtype, ttl, rdata)
-    VALUES(1, 1233, 0, "mail.example.org.", "A", 3600, "192.0.2.210");
+    VALUES(1, 1233, 1, "mail.example.org.", "A", 3600, "192.0.2.210");
 
 -- Records added in version 1234 of the zone
 INSERT INTO diffs(zone_id, version, operation, name, rrtype, ttl, rdata)
-    VALUES(1, 1234, 1, "example.org.", "SOA", 3600,
+    VALUES(1, 1234, 0, "example.org.", "SOA", 3600,
            "ns1.example.org. admin.example.org. 1234 3600 1800 2419200 7200");
 INSERT INTO diffs(zone_id, version, operation, name, rrtype, ttl, rdata)
-    VALUES(1, 1234, 1, "www.example.org.", "A", 3600, "192.0.2.1");
+    VALUES(1, 1234, 0, "www.example.org.", "A", 3600, "192.0.2.1");
 INSERT INTO diffs(zone_id, version, operation, name, rrtype, ttl, rdata)
-    VALUES(1, 1234, 1, "mail.example.org.", "A", 3600, "192.0.2.10");
+    VALUES(1, 1234, 0, "mail.example.org.", "A", 3600, "192.0.2.10");
 
 -- Finally, update the zone_id in the diffs table with what is actually
 -- in the zone table.