distroquery: initial package page, PackageKit plugin integration and more
This commit is contained in:
parent
ce9c01a844
commit
fb4d8d65a6
@ -72,17 +72,68 @@
|
|||||||
#include "functions.h"
|
#include "functions.h"
|
||||||
|
|
||||||
static struct configTag *firstconfigtag = NULL, *configtag = NULL;
|
static struct configTag *firstconfigtag = NULL, *configtag = NULL;
|
||||||
char *repository_tag = NULL;
|
|
||||||
char *query;
|
char *query;
|
||||||
|
char *query_package;
|
||||||
|
char *query_repository;
|
||||||
|
char *query_arch;
|
||||||
struct configTag *query_repositories[100];
|
struct configTag *query_repositories[100];
|
||||||
|
|
||||||
int search_milestone1 = 0, search_milestone2 = 1, search_devel = 1;
|
int search_milestone1 = 0, search_milestone2 = 1, search_devel = 1;
|
||||||
int search_arm = 0, search_x86_64 = 0, search_i586 = 1, search_sources = 0;
|
int search_arm = 0, search_x86_64 = 0, search_i586 = 1, search_sources = 0;
|
||||||
|
|
||||||
void printInputForm(char *data) {
|
/* Converts a hex character to its integer value */
|
||||||
|
char from_hex(char ch) {
|
||||||
|
return isdigit(ch) ? ch - '0' : tolower(ch) - 'a' + 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Converts an integer value to its hex character*/
|
||||||
|
char to_hex(char code) {
|
||||||
|
static char hex[] = "0123456789abcdef";
|
||||||
|
return hex[code & 15];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns a url-encoded version of str */
|
||||||
|
/* IMPORTANT: be sure to free() the returned string after use */
|
||||||
|
char *url_encode(char *str) {
|
||||||
|
char *pstr = str, *buf = malloc(strlen(str) * 3 + 1), *pbuf = buf;
|
||||||
|
while (*pstr) {
|
||||||
|
if (isalnum(*pstr) || *pstr == '-' || *pstr == '_' || *pstr == '.' || *pstr == '~')
|
||||||
|
*pbuf++ = *pstr;
|
||||||
|
else if (*pstr == ' ')
|
||||||
|
*pbuf++ = '+';
|
||||||
|
else
|
||||||
|
*pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15);
|
||||||
|
pstr++;
|
||||||
|
}
|
||||||
|
*pbuf = '\0';
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns a url-decoded version of str */
|
||||||
|
/* IMPORTANT: be sure to free() the returned string after use */
|
||||||
|
char *url_decode(char *str) {
|
||||||
|
char *pstr = str, *buf = malloc(strlen(str) + 1), *pbuf = buf;
|
||||||
|
while (*pstr) {
|
||||||
|
if (*pstr == '%') {
|
||||||
|
if (pstr[1] && pstr[2]) {
|
||||||
|
*pbuf++ = from_hex(pstr[1]) << 4 | from_hex(pstr[2]);
|
||||||
|
pstr += 2;
|
||||||
|
}
|
||||||
|
} else if (*pstr == '+') {
|
||||||
|
*pbuf++ = ' ';
|
||||||
|
} else {
|
||||||
|
*pbuf++ = *pstr;
|
||||||
|
}
|
||||||
|
pstr++;
|
||||||
|
}
|
||||||
|
*pbuf = '\0';
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
void printInputForm() {
|
||||||
struct configTag *ct = firstconfigtag;
|
struct configTag *ct = firstconfigtag;
|
||||||
|
|
||||||
const char ajax_call[] = "ajax_getvalues("
|
const char ajax_call[] = "distroquery_request("
|
||||||
// "'repository='+getElementById('repository').value"
|
// "'repository='+getElementById('repository').value"
|
||||||
"'query='+getElementById('query').value+"
|
"'query='+getElementById('query').value+"
|
||||||
"'&search_devel='+getElementById('search_devel').checked+"
|
"'&search_devel='+getElementById('search_devel').checked+"
|
||||||
@ -119,7 +170,7 @@ void printInputForm(char *data) {
|
|||||||
printf("]]></queryform>");
|
printf("]]></queryform>");
|
||||||
}
|
}
|
||||||
|
|
||||||
void printQueryData(char* repository_tag, char* query) {
|
void printQueryData() {
|
||||||
|
|
||||||
int a, i, j, k, numresults = 0;
|
int a, i, j, k, numresults = 0;
|
||||||
char dbname[PATH_MAX];
|
char dbname[PATH_MAX];
|
||||||
@ -127,6 +178,9 @@ void printQueryData(char* repository_tag, char* query) {
|
|||||||
char sql[PATH_MAX];
|
char sql[PATH_MAX];
|
||||||
|
|
||||||
printf("<queryreply><![CDATA[");
|
printf("<queryreply><![CDATA[");
|
||||||
|
for (i = 0; i < strlen(query); i++) {
|
||||||
|
if (query[i] == ' ') query[i] = '%';
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; query_repositories[i] != NULL; i++) {
|
for (i = 0; query_repositories[i] != NULL; i++) {
|
||||||
snprintf(dbname, PATH_MAX, "%sdistromatic.db", query_repositories[i]->repository_dir);
|
snprintf(dbname, PATH_MAX, "%sdistromatic.db", query_repositories[i]->repository_dir);
|
||||||
@ -136,7 +190,7 @@ void printQueryData(char* repository_tag, char* query) {
|
|||||||
fprintf(stderr, "ERROR: unable to open sqlite3 db %s; aborting.\n", dbname);
|
fprintf(stderr, "ERROR: unable to open sqlite3 db %s; aborting.\n", dbname);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; query_repositories[i] != NULL; i++) {
|
for (i = 0; query_repositories[i] != NULL; i++) {
|
||||||
for (a = 0; a < ARCHS_MAX && query_repositories[i]->arch[a]; a++) {
|
for (a = 0; a < ARCHS_MAX && query_repositories[i]->arch[a]; a++) {
|
||||||
if ((search_i586 && !strcmp(query_repositories[i]->arch[a],"i586")) ||
|
if ((search_i586 && !strcmp(query_repositories[i]->arch[a],"i586")) ||
|
||||||
@ -147,18 +201,46 @@ void printQueryData(char* repository_tag, char* query) {
|
|||||||
(sqlite3_prepare_v2((sqlite3*)query_repositories[i]->db, sql, strlen(sql), &statement, NULL) == SQLITE_OK)) {
|
(sqlite3_prepare_v2((sqlite3*)query_repositories[i]->db, sql, strlen(sql), &statement, NULL) == SQLITE_OK)) {
|
||||||
while (sqlite3_step(statement) == SQLITE_ROW) {
|
while (sqlite3_step(statement) == SQLITE_ROW) {
|
||||||
numresults++;
|
numresults++;
|
||||||
printf("<hr><br><div style='display:inline;color:white;background-color:green'> %s </div> "
|
printf("<div style='position:relative'><hr><br><div style='display:inline;color:white;background-color:green'> %s </div> "
|
||||||
"<div style='display:inline;color:black;background-color:yellow'> %s </div><br>"
|
"<div style='display:inline;color:black;background-color:yellow'> %s </div><br>"
|
||||||
"<b>%s</b> %s-%s<br>%s<br>Group: %s<br><br>"
|
"<b>%s</b> %s-%s<br>%s<br>Group: %s",
|
||||||
"<div style='text-align:justify;text-justify:inter-word;font-style:italic'>%s</div><br>",
|
|
||||||
query_repositories[i]->arch[a],
|
query_repositories[i]->arch[a],
|
||||||
query_repositories[i]->tag,
|
query_repositories[i]->tag,
|
||||||
sqlite3_column_text(statement,1),
|
sqlite3_column_text(statement,1),
|
||||||
sqlite3_column_text(statement,4),
|
sqlite3_column_text(statement,4),
|
||||||
sqlite3_column_text(statement,5),
|
sqlite3_column_text(statement,5),
|
||||||
sqlite3_column_text(statement,6),
|
sqlite3_column_text(statement,6),
|
||||||
sqlite3_column_text(statement,7),
|
sqlite3_column_text(statement,7));
|
||||||
|
|
||||||
|
printf("<br><br><div style='text-align:justify;text-justify:inter-word;font-style:italic'>%s</div>",
|
||||||
sqlite3_column_text(statement,8));
|
sqlite3_column_text(statement,8));
|
||||||
|
|
||||||
|
/* install */
|
||||||
|
printf("<div align=right style='position:absolute;top:5px;right:0;padding:5px;'>"
|
||||||
|
"<div><object type=\"application/x-packagekit-plugin\" width=\"400\" height=\"50\">"
|
||||||
|
"<param name=\"displayname\" value=\"%s - %s\" />"
|
||||||
|
"<param name=\"packagenames\" value=\"%s\" /></object></div>",
|
||||||
|
sqlite3_column_text(statement,1),
|
||||||
|
sqlite3_column_text(statement,6),
|
||||||
|
sqlite3_column_text(statement,1));
|
||||||
|
|
||||||
|
/* download */
|
||||||
|
printf("<div style='display:inline;color:white;background-color:green;font-weight:strong'>"
|
||||||
|
"<a href=\"%s%s/SRPMS.base/%s-%s-%s.src.rpm\"> Download </a></div>",
|
||||||
|
query_repositories[i]->download_prefix,
|
||||||
|
query_repositories[i]->download_dir,
|
||||||
|
sqlite3_column_text(statement,1),
|
||||||
|
sqlite3_column_text(statement,4),
|
||||||
|
sqlite3_column_text(statement,5));
|
||||||
|
/* details */
|
||||||
|
printf("<div style='display:inline;background-color:lightblue;font-weight:strong'>"
|
||||||
|
"<a href='javascript:distroquery_request("
|
||||||
|
"\"repository=%s&package=%s&arch=%s\")'> Details </a></div>",
|
||||||
|
query_repositories[i]->tag,
|
||||||
|
sqlite3_column_text(statement,1),
|
||||||
|
query_repositories[i]->arch[a]);
|
||||||
|
|
||||||
|
printf("</div></div><br>");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -201,6 +283,78 @@ void printQueryData(char* repository_tag, char* query) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void printPackageData() {
|
||||||
|
|
||||||
|
int a, i, j, k, numresults = 0;
|
||||||
|
char dbname[PATH_MAX];
|
||||||
|
sqlite3_stmt *statement;
|
||||||
|
char sql[PATH_MAX];
|
||||||
|
struct configTag* ct = findRepositoryByTag(query_repository);
|
||||||
|
|
||||||
|
printf("<queryreply><![CDATA[");
|
||||||
|
|
||||||
|
snprintf(dbname, PATH_MAX, "%sdistromatic.db", ct->repository_dir);
|
||||||
|
if (sqlite3_open_v2(dbname, (sqlite3**)&ct->db, SQLITE_OPEN_READONLY, NULL)) {
|
||||||
|
if (ct->db) sqlite3_close(ct->db);
|
||||||
|
ct->db = NULL;
|
||||||
|
fprintf(stderr, "ERROR: unable to open sqlite3 db %s; aborting.\n", dbname);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(sql, PATH_MAX, "SELECT * FROM packages_%s WHERE name = '%s'", query_arch, query_package);
|
||||||
|
if (ct->db &&
|
||||||
|
(sqlite3_prepare_v2((sqlite3*)ct->db, sql, strlen(sql), &statement, NULL) == SQLITE_OK)) {
|
||||||
|
while (sqlite3_step(statement) == SQLITE_ROW) {
|
||||||
|
numresults++;
|
||||||
|
printf("<hr><br><div style='display:inline;color:white;background-color:green'> %s </div> "
|
||||||
|
"<div style='display:inline;color:black;background-color:yellow'> %s </div><br>"
|
||||||
|
"<b>%s</b> %s-%s<br>%s<br>Group: %s"
|
||||||
|
"<br><br><div style='text-align:justify;text-justify:inter-word;font-style:italic'>%s</div><br>",
|
||||||
|
query_repositories[i]->arch[a],
|
||||||
|
query_repositories[i]->tag,
|
||||||
|
sqlite3_column_text(statement,1),
|
||||||
|
sqlite3_column_text(statement,4),
|
||||||
|
sqlite3_column_text(statement,5),
|
||||||
|
sqlite3_column_text(statement,6),
|
||||||
|
sqlite3_column_text(statement,7),
|
||||||
|
sqlite3_column_text(statement,8));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
/* if (search_sources) {
|
||||||
|
snprintf(sql, PATH_MAX, "SELECT * FROM sources WHERE name LIKE '%%%s%%' OR summary LIKE '%%%s%%' OR description LIKE '%%%s%%'", query, query, query);
|
||||||
|
for (i = 0; query_repositories[i] != NULL; i++) {
|
||||||
|
if (query_repositories[i]->db &&
|
||||||
|
(sqlite3_prepare_v2((sqlite3*)query_repositories[i]->db, sql, strlen(sql), &statement, NULL) == SQLITE_OK)) {
|
||||||
|
while (sqlite3_step(statement) == SQLITE_ROW) {
|
||||||
|
numresults++;
|
||||||
|
printf("<hr><br><div style='display:inline;color:black;background-color:red'> Source </div> "
|
||||||
|
"<div style='display:inline;color:black;background-color:yellow'> %s </div><br>"
|
||||||
|
"<b>%s</b> %s-%s<br>%s<br>Group: %s<br>License: %s</br>URL: %s<br><br>"
|
||||||
|
"<div style='text-align:justify;text-justify:inter-word;font-style:italic'>%s</div><br>",
|
||||||
|
query_repositories[i]->tag,
|
||||||
|
sqlite3_column_text(statement,1),
|
||||||
|
sqlite3_column_text(statement,4),
|
||||||
|
sqlite3_column_text(statement,5),
|
||||||
|
sqlite3_column_text(statement,6),
|
||||||
|
sqlite3_column_text(statement,8),
|
||||||
|
sqlite3_column_text(statement,11),
|
||||||
|
sqlite3_column_text(statement,10),
|
||||||
|
sqlite3_column_text(statement,9));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("<hr><br>%d result(s) found.", numresults);*/
|
||||||
|
printf("]]></queryreply>");
|
||||||
|
|
||||||
|
sqlite3_close(ct->db);
|
||||||
|
ct->db = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void parse_request_variables(char *data) {
|
void parse_request_variables(char *data) {
|
||||||
char *vartok, *valuetok;
|
char *vartok, *valuetok;
|
||||||
struct configTag *ct = firstconfigtag;
|
struct configTag *ct = firstconfigtag;
|
||||||
@ -211,23 +365,27 @@ void parse_request_variables(char *data) {
|
|||||||
if (data) data = NULL;
|
if (data) data = NULL;
|
||||||
if (!vartok || (vartok[0] == '\0') ) break;
|
if (!vartok || (vartok[0] == '\0') ) break;
|
||||||
valuetok = (char *) strtok(NULL, "&");
|
valuetok = (char *) strtok(NULL, "&");
|
||||||
if (strstr(vartok, "repository")) {
|
if (!strcmp(vartok, "repository")) {
|
||||||
repository_tag = valuetok;
|
query_repository = valuetok;
|
||||||
} else if (strstr(vartok, "query")) {
|
} else if (!strcmp(vartok, "package")) {
|
||||||
query = valuetok;
|
query_package = valuetok;
|
||||||
} else if (strstr(vartok, "search_milestone2")) {
|
} else if (!strcmp(vartok, "arch")) {
|
||||||
|
query_arch = valuetok;
|
||||||
|
} else if (!strcmp(vartok, "query")) {
|
||||||
|
query = url_decode(valuetok);
|
||||||
|
} else if (!strcmp(vartok, "search_milestone2")) {
|
||||||
search_milestone2 = (strstr(valuetok, "false") != valuetok);
|
search_milestone2 = (strstr(valuetok, "false") != valuetok);
|
||||||
} else if (strstr(vartok, "search_milestone1")) {
|
} else if (!strcmp(vartok, "search_milestone1")) {
|
||||||
search_milestone1 = (strstr(valuetok, "false") != valuetok);
|
search_milestone1 = (strstr(valuetok, "false") != valuetok);
|
||||||
} else if (strstr(vartok, "search_devel")) {
|
} else if (!strcmp(vartok, "search_devel")) {
|
||||||
search_devel = (strstr(valuetok, "false") != valuetok);
|
search_devel = (strstr(valuetok, "false") != valuetok);
|
||||||
} else if (strstr(vartok, "search_i586")) {
|
} else if (!strcmp(vartok, "search_i586")) {
|
||||||
search_i586 = (strstr(valuetok, "false") != valuetok);
|
search_i586 = (strstr(valuetok, "false") != valuetok);
|
||||||
} else if (strstr(vartok, "search_x86_64")) {
|
} else if (!strcmp(vartok, "search_x86_64")) {
|
||||||
search_x86_64 = (strstr(valuetok, "false") != valuetok);
|
search_x86_64 = (strstr(valuetok, "false") != valuetok);
|
||||||
} else if (strstr(vartok, "search_arm")) {
|
} else if (!strcmp(vartok, "search_arm")) {
|
||||||
search_arm = (strstr(valuetok, "false") != valuetok);
|
search_arm = (strstr(valuetok, "false") != valuetok);
|
||||||
} else if (strstr(vartok, "search_sources")) {
|
} else if (!strcmp(vartok, "search_sources")) {
|
||||||
search_sources = (strstr(valuetok, "false") != valuetok);
|
search_sources = (strstr(valuetok, "false") != valuetok);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -263,14 +421,15 @@ main(int argc, char *argv[])
|
|||||||
parse_request_variables(data);
|
parse_request_variables(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (query && strlen(query)) {
|
if (query_package && strlen(query_package)) {
|
||||||
printQueryData(repository_tag, query);
|
printPackageData();
|
||||||
printf("</distroquery>\n");
|
} else if (query && strlen(query)) {
|
||||||
exit(0);
|
printQueryData();
|
||||||
|
} else {
|
||||||
|
printInputForm();
|
||||||
}
|
}
|
||||||
|
|
||||||
printInputForm(data);
|
|
||||||
|
|
||||||
printf("</distroquery>\n");
|
printf("</distroquery>\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user