diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index 1b56235..ec11252 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -699,23 +699,39 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmPkgRequest(const QJsonValue //OPTIONAL: "repo" (uses local repo database by default) QString repo = "local"; if(in_args.toObject().contains("repo")){ repo = in_args.toObject().value("repo").toString(); } - //OPTIONAL: "pkg_origins" (defaults to everything for listing functions) - QStringList pkgs; - if(in_args.toObject().contains("pkg_origins")){ - if(in_args.toObject().value("pkg_origins").isString()){ pkgs << in_args.toObject().value("pkg_origins").toString(); } - else if(in_args.toObject().value("pkg_origins").isArray()){ pkgs = JsonArrayToStringList(in_args.toObject().value("pkg_origins").toArray()); } - } //OPTIONAL: "category" (only used if "pkg_origins" is not specified) QString cat; if(in_args.toObject().contains("category")){ cat = in_args.toObject().value("category").toString(); } - //OPTIONAL: "result" - bool fullresults = true; - if(in_args.toObject().contains("result")){ fullresults = (in_args.toObject().value("result").toString()=="full"); } + //Parse if(act=="pkg_info"){ + //OPTIONAL: "pkg_origins" (defaults to everything for listing functions) + QStringList pkgs; + if(in_args.toObject().contains("pkg_origins")){ + if(in_args.toObject().value("pkg_origins").isString()){ pkgs << in_args.toObject().value("pkg_origins").toString(); } + else if(in_args.toObject().value("pkg_origins").isArray()){ pkgs = JsonArrayToStringList(in_args.toObject().value("pkg_origins").toArray()); } + } + //OPTIONAL: "result" + bool fullresults = true; + if(in_args.toObject().contains("result")){ fullresults = (in_args.toObject().value("result").toString()=="full"); } + //Now run the info fetch routine QJsonObject info = sysadm::PKG::pkg_info(pkgs, repo, cat, fullresults); if(!info.isEmpty()){ out->insert("pkg_info",info); } else{ return RestOutputStruct::NOCONTENT; } + + + }else if(act=="pkg_search"){ + //REQUIRED + QString srch; + if(in_args.toObject().contains("search_term")){ srch = in_args.toObject().value("search_term").toString(); } + if(srch.isEmpty()){ return RestOutputStruct::BADREQUEST; } + QStringList pkgs = sysadm::PKG::pkg_search(repo, srch, cat); + if(!pkgs.isEmpty()){ + QJsonObject info = sysadm::PKG::pkg_info(pkgs, repo, cat, false); //always do simple results for a search + if(!info.isEmpty()){ out->insert("pkg_search",info); } + }else{ + return RestOutputStruct::NOCONTENT; + } }else{ //unknown action return RestOutputStruct::BADREQUEST; diff --git a/src/server/library/sysadm-pkg.cpp b/src/server/library/sysadm-pkg.cpp index 710c3a4..bc7cf25 100644 --- a/src/server/library/sysadm-pkg.cpp +++ b/src/server/library/sysadm-pkg.cpp @@ -58,16 +58,16 @@ inline QStringList requires_from_ids(QStringList ids){ while(q.next()){ out << q.value("require").toString(); } return out; } - +inline QString getRepoFile(QString repo){ + if(repo=="local"){ return "/var/db/pkg/local.sqlite"; } + else{ return ("/var/db/pkg/repo-"+repo+".sqlite"); } +} // ================= // MAIN FUNCTIONS // ================= QJsonObject PKG::pkg_info(QStringList origins, QString repo, QString category, bool fullresults){ QJsonObject retObj; - QString dbname; - if(repo=="local"){ dbname= "/var/db/pkg/local.sqlite"; } - else{ dbname= "/var/db/pkg/repo-"+repo+".sqlite"; } - //QString conn = dbname; conn.replace("/","_"); + QString dbname = getRepoFile(repo); //qDebug() << "Database:" << dbname;// << conn; //Open the local database QSqlDatabase DB; @@ -188,4 +188,69 @@ QJsonObject PKG::pkg_info(QStringList origins, QString repo, QString category, b } //end loop over pkg matches DB.close(); return retObj; +} + +QStringList PKG::pkg_search(QString repo, QString searchterm, QString category){ + QStringList found; + QString dbname = getRepoFile(repo); + //qDebug() << "Database:" << dbname;// << conn; + //Open the local database + QSqlDatabase DB; + if(QSqlDatabase::contains()){ + //database already loaded + qDebug() << "Existing DB Connection"; + DB = QSqlDatabase::database(); + }else{ + //new database needs to be loaded + qDebug() << "New DB Connection"; + DB = QSqlDatabase::addDatabase("QSQLITE"); + DB.setConnectOptions("QSQLITE_OPEN_READONLY=1"); + DB.setHostName("localhost"); + DB.setDatabaseName(dbname); + } + if(DB.databaseName()!=dbname){ + if(DB.isOpen()){ DB.close(); } + DB.setConnectOptions("QSQLITE_OPEN_READONLY=1"); + DB.setHostName("localhost"); + DB.setDatabaseName(dbname); + } + qDebug() << "Open Database:" << DB.databaseName() << dbname; + if( !DB.open() ){ + //qDebug() << " - could not be opened"; + return found; + } + QString q_string = "SELECT origin FROM packages WHERE name LIKE '"+searchterm+"%'"; + if(!category.isEmpty()){ q_string.append(" AND origin LIKE '"+category+"/%'"); } + QSqlQuery query(q_string); + while(query.next()){ + found << query.value("origin").toString(); //need the origin for later + } + if(found.isEmpty()){ + //Expand the search to comments + q_string = "SELECT origin FROM packages WHERE comment LIKE '%"+searchterm+"%'"; + if(!category.isEmpty()){ q_string.append(" AND origin LIKE '"+category+"/%'"); } + QSqlQuery q2(q_string); + while(q2.next()){ + found << q2.value("origin").toString(); //need the origin for later + } + } + if(found.isEmpty()){ + //Expand the search to full descriptions + q_string = "SELECT origin FROM packages WHERE desc LIKE '%"+searchterm+"%'"; + if(!category.isEmpty()){ q_string.append(" AND origin LIKE '"+category+"/%'"); } + QSqlQuery q2(q_string); + while(q2.next()){ + found << q2.value("origin").toString(); //need the origin for later + } + } + DB.close(); + return found; +} + +QJsonObject PKG::list_categories(QString repo){ + return QJsonObject(); +} + +QJsonObject PKG::list_repos(){ + return QJsonObject(); } \ No newline at end of file diff --git a/src/server/library/sysadm-pkg.h b/src/server/library/sysadm-pkg.h index 1a7829c..7e02ee7 100644 --- a/src/server/library/sysadm-pkg.h +++ b/src/server/library/sysadm-pkg.h @@ -19,6 +19,9 @@ namespace sysadm{ class PKG{ public: static QJsonObject pkg_info(QStringList origins, QString repo, QString category = "", bool fullresults = true); + static QStringList pkg_search(QString repo, QString searchterm, QString category = ""); + static QJsonObject list_categories(QString repo); + static QJsonObject list_repos(); }; } //end of sysadm namespace