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:
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> ¤t = 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);