diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index 55637dd859..03c5d76b37 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 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 e241329430..3c07978fc9 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);