about summary refs log tree commit diff
path: root/src/libstore/nar-info-disk-cache.cc
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2016-06-20T15·39+0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2016-06-20T15·39+0200
commit74dd603495273fe8b81d8635676861792cf420e8 (patch)
tree6efc8e8a53b08ce77cd439361d0c6c6eefda1d6d /src/libstore/nar-info-disk-cache.cc
parentfffacd7c780f2fcd1be9ab78793d30dcf4fe599b (diff)
Re-implement negative binary cache lookup caching
Diffstat (limited to 'src/libstore/nar-info-disk-cache.cc')
-rw-r--r--src/libstore/nar-info-disk-cache.cc27
1 files changed, 15 insertions, 12 deletions
diff --git a/src/libstore/nar-info-disk-cache.cc b/src/libstore/nar-info-disk-cache.cc
index 39510f38f8..172a918ff4 100644
--- a/src/libstore/nar-info-disk-cache.cc
+++ b/src/libstore/nar-info-disk-cache.cc
@@ -20,7 +20,7 @@ create table if not exists BinaryCaches (
 create table if not exists NARs (
     cache            integer not null,
     hashPart         text not null,
-    namePart         text not null,
+    namePart         text,
     url              text,
     compression      text,
     fileHash         text,
@@ -31,6 +31,7 @@ create table if not exists NARs (
     deriver          text,
     sigs             text,
     timestamp        integer not null,
+    present          integer not null,
     primary key (cache, hashPart),
     foreign key (cache) references BinaryCaches(id) on delete cascade
 );
@@ -64,7 +65,7 @@ public:
     struct State
     {
         SQLite db;
-        SQLiteStmt insertCache, queryCache, insertNAR, queryNAR, insertNARExistence, queryNARExistence;
+        SQLiteStmt insertCache, queryCache, insertNAR, insertMissingNAR, queryNAR;
         std::map<std::string, Cache> caches;
     };
 
@@ -74,7 +75,7 @@ public:
     {
         auto state(_state.lock());
 
-        Path dbPath = getCacheDir() + "/nix/binary-cache-v4.sqlite";
+        Path dbPath = getCacheDir() + "/nix/binary-cache-v5.sqlite";
         createDirs(dirOf(dbPath));
 
         if (sqlite3_open_v2(dbPath.c_str(), &state->db.db,
@@ -101,16 +102,13 @@ public:
 
         state->insertNAR.create(state->db,
             "insert or replace into NARs(cache, hashPart, namePart, url, compression, fileHash, fileSize, narHash, "
-            "narSize, refs, deriver, sigs, timestamp) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
+            "narSize, refs, deriver, sigs, timestamp, present) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)");
+
+        state->insertMissingNAR.create(state->db,
+            "insert or replace into NARs(cache, hashPart, timestamp, present) values (?, ?, ?, 0)");
 
         state->queryNAR.create(state->db,
             "select * from NARs where cache = ? and hashPart = ?");
-
-        state->insertNARExistence.create(state->db,
-            "insert or replace into NARExistence(cache, storePath, exist, timestamp) values (?, ?, ?, ?)");
-
-        state->queryNARExistence.create(state->db,
-            "select exist, timestamp from NARExistence where cache = ? and storePath = ?");
     }
 
     Cache & getCache(State & state, const std::string & uri)
@@ -165,6 +163,9 @@ public:
             // FIXME: check NARExistence
             return {oUnknown, 0};
 
+        if (!queryNAR.getInt(13))
+            return {oInvalid, 0};
+
         auto narInfo = make_ref<NarInfo>();
 
         // FIXME: implement TTL.
@@ -219,8 +220,10 @@ public:
                 (time(0)).exec();
 
         } else {
-            // not implemented
-            abort();
+            state->insertMissingNAR.use()
+                (cache.id)
+                (hashPart)
+                (time(0)).exec();
         }
     }
 };