aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libstore/local-store.cc18
-rw-r--r--src/libstore/schema.sql21
2 files changed, 25 insertions, 14 deletions
diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc
index 55637dd85..03c5d76b3 100644
--- a/src/libstore/local-store.cc
+++ b/src/libstore/local-store.cc
@@ -1229,6 +1229,8 @@ void LocalStore::upgradeStore6()
if (sqlite3_exec(db, "begin;", 0, 0, 0) != SQLITE_OK)
throw SQLiteError(db, "running `begin' command");
+
+ std::map<Path, sqlite3_int64> pathToId;
foreach (PathSet::iterator, i, validPaths) {
ValidPathInfo info = queryPathInfo(*i, true);
@@ -1245,12 +1247,24 @@ void LocalStore::upgradeStore6()
if (sqlite3_step(registerStmt) != SQLITE_DONE)
throw SQLiteError(db, "registering valid path in database");
+ pathToId[*i] = sqlite3_last_insert_rowid(db);
+
+ std::cerr << ".";
+ }
+
+ std::cerr << "|";
+
+ foreach (PathSet::iterator, i, validPaths) {
+ ValidPathInfo info = queryPathInfo(*i, true);
+
foreach (PathSet::iterator, j, info.references) {
if (sqlite3_reset(addRefStmt) != SQLITE_OK)
throw SQLiteError(db, "resetting statement");
- if (sqlite3_bind_text(addRefStmt, 1, i->c_str(), -1, SQLITE_TRANSIENT) != SQLITE_OK)
+ if (sqlite3_bind_int(addRefStmt, 1, pathToId[*i]) != SQLITE_OK)
throw SQLiteError(db, "binding argument 1");
- if (sqlite3_bind_text(addRefStmt, 2, j->c_str(), -1, SQLITE_TRANSIENT) != SQLITE_OK)
+ if (pathToId.find(*j) == pathToId.end())
+ throw Error(format("path `%1%' referenced by `%2%' is invalid") % *j % *i);
+ if (sqlite3_bind_int(addRefStmt, 2, pathToId[*j]) != SQLITE_OK)
throw SQLiteError(db, "binding argument 2");
if (sqlite3_step(addRefStmt) != SQLITE_DONE)
throw SQLiteError(db, "adding reference to database");
diff --git a/src/libstore/schema.sql b/src/libstore/schema.sql
index e24132943..3c07978fc 100644
--- a/src/libstore/schema.sql
+++ b/src/libstore/schema.sql
@@ -1,27 +1,24 @@
pragma foreign_keys = on;
create table if not exists ValidPaths (
- path text primary key not null,
+ id integer primary key autoincrement not null,
+ path text unique not null,
hash text not null,
registrationTime integer not null
);
create table if not exists Refs (
- referrer text not null,
- reference text not null,
+ referrer integer not null,
+ reference integer not null,
primary key (referrer, reference),
- foreign key (referrer) references ValidPaths(path)
- on delete cascade
- deferrable initially deferred,
- foreign key (reference) references ValidPaths(path)
- on delete restrict
- deferrable initially deferred
+ foreign key (referrer) references ValidPaths(id) on delete cascade,
+ foreign key (reference) references ValidPaths(id) on delete restrict
);
+create index if not exists IndexReferrer on Refs(referrer);
+create index if not exists IndexReference on Refs(reference);
+
create table if not exists FailedDerivations (
path text primary key not null,
time integer not null
);
-
-create index IndexReferrer on Refs(referrer);
-create index IndexReference on Refs(reference);