reapack

Package manager for REAPER
Log | Files | Refs | Submodules | README | LICENSE

commit 69baf6707394d6d78124ed0153a9dd749147cc34
parent 48ecf7a65ac2dba64a0549945ab4c88f130e36b3
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Thu, 11 Aug 2016 17:58:54 -0400

registry: store package descriptions offline

Diffstat:
Msrc/registry.cpp | 78++++++++++++++++++++++++++++++++++++++++--------------------------------------
Msrc/registry.hpp | 2++
Mtest/registry.cpp | 57++++++++++++++++++++++++++++-----------------------------
3 files changed, 70 insertions(+), 67 deletions(-)

diff --git a/src/registry.cpp b/src/registry.cpp @@ -34,23 +34,24 @@ Registry::Registry(const Path &path) // entry queries m_insertEntry = m_db.prepare( - "INSERT INTO entries(remote, category, package, type, version, author)" - "VALUES(?, ?, ?, ?, ?, ?);" + "INSERT INTO entries(remote, category, package, desc, type, version, author)" + "VALUES(?, ?, ?, ?, ?, ?, ?);" ); m_updateEntry = m_db.prepare( - "UPDATE entries SET type = ?, version = ?, author = ? WHERE id = ?" + "UPDATE entries " + "SET desc = ?, type = ?, version = ?, author = ? WHERE id = ?" ); m_setPinned = m_db.prepare("UPDATE entries SET pinned = ? WHERE id = ?"); m_findEntry = m_db.prepare( - "SELECT id, remote, category, package, type, version, author, pinned " + "SELECT id, remote, category, package, desc, type, version, author, pinned " "FROM entries WHERE remote = ? AND category = ? AND package = ? LIMIT 1" ); m_allEntries = m_db.prepare( - "SELECT id, category, package, type, version, author, pinned " + "SELECT id, remote, category, package, desc, type, version, author, pinned " "FROM entries WHERE remote = ?" ); m_forgetEntry = m_db.prepare("DELETE FROM entries WHERE id = ?"); @@ -84,6 +85,7 @@ void Registry::migrate() " remote TEXT NOT NULL," " category TEXT NOT NULL," " package TEXT NOT NULL," + " desc TEXT NOT NULL," " type INTEGER NOT NULL," " version TEXT NOT NULL," " author TEXT NOT NULL," @@ -106,14 +108,16 @@ void Registry::migrate() case 2: m_db.exec("ALTER TABLE files ADD COLUMN type INTEGER NOT NULL DEFAULT 0;"); case 3: - // current schema version + m_db.exec("ALTER TABLE entries ADD COLUMN desc TEXT NOT NULL DEFAULT '';"); + case 4: + // schema is up to date break; default: throw reapack_error( "The package registry was created by a newer version of ReaPack"); } - m_db.exec("PRAGMA user_version = 3"); + m_db.exec("PRAGMA user_version = 4"); m_db.commit(); } @@ -134,21 +138,23 @@ auto Registry::push(const Version *ver, vector<Path> *conflicts) -> Entry int entryId = getEntry(ver->package()).id; - // register version + // register or update package and version if(entryId) { - m_updateEntry->bind(1, pkg->type()); - m_updateEntry->bind(2, ver->name()); - m_updateEntry->bind(3, ver->author()); - m_updateEntry->bind(4, entryId); + m_updateEntry->bind(1, pkg->description()); + m_updateEntry->bind(2, pkg->type()); + m_updateEntry->bind(3, ver->name()); + m_updateEntry->bind(4, ver->author()); + m_updateEntry->bind(5, entryId); m_updateEntry->exec(); } else { m_insertEntry->bind(1, ri->name()); m_insertEntry->bind(2, cat->name()); m_insertEntry->bind(3, pkg->name()); - m_insertEntry->bind(4, pkg->type()); - m_insertEntry->bind(5, ver->name()); - m_insertEntry->bind(6, ver->author()); + m_insertEntry->bind(4, pkg->description()); + m_insertEntry->bind(5, pkg->type()); + m_insertEntry->bind(6, ver->name()); + m_insertEntry->bind(7, ver->author()); m_insertEntry->exec(); entryId = m_db.lastInsertId(); @@ -189,7 +195,8 @@ auto Registry::push(const Version *ver, vector<Path> *conflicts) -> Entry } else { release(); - return {entryId, ri->name(), cat->name(), pkg->name(), pkg->type(), *ver}; + return {entryId, ri->name(), cat->name(), + pkg->name(), pkg->description(), pkg->type(), *ver}; } } @@ -212,17 +219,7 @@ auto Registry::getEntry(const Package *pkg) const -> Entry m_findEntry->bind(3, pkg->name()); m_findEntry->exec([&] { - int col = 0; - - entry.id = m_findEntry->intColumn(col++); - entry.remote = m_findEntry->stringColumn(col++); - entry.category = m_findEntry->stringColumn(col++); - entry.package = m_findEntry->stringColumn(col++); - entry.type = static_cast<Package::Type>(m_findEntry->intColumn(col++)); - entry.version.tryParse(m_findEntry->stringColumn(col++)); - entry.version.setAuthor(m_findEntry->stringColumn(col++)); - entry.pinned = m_findEntry->boolColumn(col++); - + fillEntry(m_findEntry, &entry); return false; }); @@ -235,18 +232,8 @@ auto Registry::getEntries(const string &remoteName) const -> vector<Entry> m_allEntries->bind(1, remoteName); m_allEntries->exec([&] { - int col = 0; - Entry entry{}; - entry.id = m_allEntries->intColumn(col++); - entry.remote = remoteName; - entry.category = m_allEntries->stringColumn(col++); - entry.package = m_allEntries->stringColumn(col++); - entry.type = static_cast<Package::Type>(m_allEntries->intColumn(col++)); - entry.version.tryParse(m_allEntries->stringColumn(col++)); - entry.version.setAuthor(m_allEntries->stringColumn(col++)); - entry.pinned = m_allEntries->boolColumn(col++); - + fillEntry(m_allEntries, &entry); list.push_back(entry); return true; @@ -329,3 +316,18 @@ void Registry::commit() { m_db.commit(); } + +void Registry::fillEntry(const Statement *stmt, Entry *entry) const +{ + int col = 0; + + entry->id = stmt->intColumn(col++); + entry->remote = stmt->stringColumn(col++); + entry->category = stmt->stringColumn(col++); + entry->package = stmt->stringColumn(col++); + entry->description = stmt->stringColumn(col++); + entry->type = static_cast<Package::Type>(stmt->intColumn(col++)); + entry->version.tryParse(stmt->stringColumn(col++)); + entry->version.setAuthor(stmt->stringColumn(col++)); + entry->pinned = stmt->boolColumn(col++); +} diff --git a/src/registry.hpp b/src/registry.hpp @@ -37,6 +37,7 @@ public: std::string remote; std::string category; std::string package; + std::string description; Package::Type type; Version version; bool pinned; @@ -68,6 +69,7 @@ public: private: void migrate(); + void fillEntry(const Statement *, Entry *) const; Database m_db; Statement *m_insertEntry; diff --git a/test/registry.cpp b/test/registry.cpp @@ -17,11 +17,11 @@ static const char *M = "[registry]"; Index ri("Remote Name"); \ Category cat("Category Name", &ri); \ Package pkg(Package::ScriptType, "Hello", &cat); \ - Version *ver = new Version("1.0", &pkg); \ - ver->setAuthor("John Doe"); \ - Source *src = new Source("file", "url", ver); \ - ver->addSource(src); \ - pkg.addVersion(ver); + pkg.setDescription("Hello World"); \ + Version ver("1.0", &pkg); \ + ver.setAuthor("John Doe"); \ + Source *src = new Source("file", "url", &ver); \ + ver.addSource(src); TEST_CASE("query uninstalled package", M) { MAKE_PACKAGE @@ -39,7 +39,7 @@ TEST_CASE("query installed package", M) { Registry reg; - const Registry::Entry &entry = reg.push(ver); + const Registry::Entry &entry = reg.push(&ver); REQUIRE(entry); REQUIRE(entry.id == 1); REQUIRE(entry.remote == "Remote Name"); @@ -54,6 +54,7 @@ TEST_CASE("query installed package", M) { REQUIRE(selectEntry.remote == entry.remote); REQUIRE(selectEntry.category == entry.category); REQUIRE(selectEntry.package == entry.package); + REQUIRE(selectEntry.description == entry.description); REQUIRE(selectEntry.type == entry.type); REQUIRE(selectEntry.version == entry.version); REQUIRE(selectEntry.version.author() == entry.version.author()); @@ -62,18 +63,17 @@ TEST_CASE("query installed package", M) { TEST_CASE("bump version", M) { MAKE_PACKAGE - Version *ver2 = new Version("2.0", &pkg); - ver2->addSource(new Source("file", "url", ver2)); + Version ver2("2.0", &pkg); + ver2.addSource(new Source("file", "url", &ver2)); Registry reg; - reg.push(ver); - pkg.addVersion(ver2); + reg.push(&ver); const Registry::Entry &entry1 = reg.getEntry(&pkg); REQUIRE(entry1.version.name() == "1.0"); CHECK(entry1.version.author() == "John Doe"); - reg.push(ver2); + reg.push(&ver2); const Registry::Entry &entry2 = reg.getEntry(&pkg); REQUIRE(entry2.version.name() == "2.0"); CHECK(entry2.version.author() == ""); @@ -87,7 +87,7 @@ TEST_CASE("get file list", M) { Registry reg; REQUIRE(reg.getFiles(reg.getEntry(&pkg)).empty()); - reg.push(ver); + reg.push(&ver); const vector<Registry::File> &files = reg.getFiles(reg.getEntry(&pkg)); REQUIRE(files.size() == 1); @@ -104,7 +104,7 @@ TEST_CASE("query all packages", M) { Registry reg; REQUIRE(reg.getEntries(remote).empty()); - reg.push(ver); + reg.push(&ver); const vector<Registry::Entry> &entries = reg.getEntries(remote); REQUIRE(entries.size() == 1); @@ -121,7 +121,7 @@ TEST_CASE("forget registry entry", M) { MAKE_PACKAGE Registry reg; - reg.forget(reg.push(ver)); + reg.forget(reg.push(&ver)); const Registry::Entry &afterForget = reg.getEntry(&pkg); REQUIRE(afterForget.id == 0); // uninstalled @@ -132,23 +132,22 @@ TEST_CASE("file conflicts", M) { { MAKE_PACKAGE - reg.push(ver); + reg.push(&ver); } Index ri("Remote Name"); Category cat("Category Name", &ri); Package pkg(Package::ScriptType, "Duplicate Package", &cat); - Version *ver = new Version("1.0", &pkg); - Source *src1 = new Source("file", "url", ver); - Source *src2 = new Source("file2", "url", ver); - ver->addSource(src1); - ver->addSource(src2); - pkg.addVersion(ver); + Version ver("1.0", &pkg); + Source *src1 = new Source("file", "url", &ver); + ver.addSource(src1); + Source *src2 = new Source("file2", "url", &ver); + ver.addSource(src2); CHECK(reg.getEntry(&pkg).id == 0); // uninstalled try { - reg.push(ver); + reg.push(&ver); FAIL("duplicate is accepted"); } catch(const reapack_error &) {} @@ -156,7 +155,7 @@ TEST_CASE("file conflicts", M) { CHECK(reg.getEntry(&pkg).id == 0); // still uninstalled vector<Path> conflicts; - reg.push(ver, &conflicts); + reg.push(&ver, &conflicts); REQUIRE(conflicts.size() == 1); REQUIRE(conflicts[0] == src1->targetPath()); @@ -170,17 +169,17 @@ TEST_CASE("get main files", M) { Registry reg; REQUIRE((reg.getMainFiles({})).empty()); - Source *main1 = new Source({}, "url", ver); + Source *main1 = new Source({}, "url", &ver); main1->setMain(true); main1->setTypeOverride(Package::EffectType); - ver->addSource(main1); + ver.addSource(main1); - Source *main2 = new Source({}, "url", ver); // duplicate file ignored + Source *main2 = new Source({}, "url", &ver); // duplicate file ignored main2->setMain(true); main2->setTypeOverride(Package::EffectType); - ver->addSource(main2); + ver.addSource(main2); - const Registry::Entry &entry = reg.push(ver); + const Registry::Entry &entry = reg.push(&ver); const vector<Registry::File> &current = reg.getMainFiles(entry); REQUIRE(current.size() == 1); @@ -193,7 +192,7 @@ TEST_CASE("pin registry entry", M) { MAKE_PACKAGE Registry reg; - reg.push(ver); + reg.push(&ver); const Registry::Entry &entry = reg.getEntry(&pkg); REQUIRE_FALSE(entry.pinned);