diff --git a/src/distroquery.c b/src/distroquery.c
index bd45adc..8dc4b6b 100644
--- a/src/distroquery.c
+++ b/src/distroquery.c
@@ -250,6 +250,39 @@ void attachCtDatabases(struct configTag* ct, sqlite3 *db, char* arch) {
}
}
+void attachRepositoryDatabases(struct configTag* ct, sqlite3 *db, char* arch) {
+ char dbname[PATH_MAX];
+ char sql[PATH_MAX];
+ char *errmsg;
+
+ snprintf(dbname, PATH_MAX, "%s%s-%s.db", ct->repository_dir, ct->tag, arch);
+ snprintf(sql, PATH_MAX, "ATTACH DATABASE '%s' as '%s'", dbname, ct->tag);
+ if (sqlite3_exec(db, sql, NULL, NULL, &errmsg)) {
+ fprintf(stderr, "ERROR: unable to exec statement for %s: %s\n", sql, errmsg);
+ }
+fprintf(stderr,"ATTACHED DATABASE %s\n", ct->tag);
+ snprintf(dbname, PATH_MAX, "%s%s-sources.db", ct->repository_dir, ct->tag);
+ snprintf(sql, PATH_MAX, "ATTACH DATABASE '%s' as '%s_sources'", dbname, ct->tag);
+ if (sqlite3_exec(db, sql, NULL, NULL, &errmsg)) {
+ fprintf(stderr, "ERROR: unable to exec statement for %s: %s\n", sql, errmsg);
+ }
+fprintf(stderr,"ATTACHED DATABASE %s_sources\n", ct->tag);
+}
+
+void detachRepositoryDatabases(struct configTag* ct, sqlite3 *db, char* arch) {
+ char sql[PATH_MAX];
+ char *errmsg;
+
+ snprintf(sql, PATH_MAX, "DETACH DATABASE '%s'", ct->tag);
+ if (sqlite3_exec(db, sql, NULL, NULL, &errmsg)) {
+ fprintf(stderr, "ERROR: unable to exec statement for %s: %s\n", sql, errmsg);
+ }
+ snprintf(sql, PATH_MAX, "DETACH DATABASE '%s_sources'", ct->tag);
+ if (sqlite3_exec(db, sql, NULL, NULL, &errmsg)) {
+ fprintf(stderr, "ERROR: unable to exec statement for %s: %s\n", sql, errmsg);
+ }
+}
+
void printInputForm() {
struct configTag *ct = firstconfigtag;
@@ -773,7 +806,6 @@ void printQueryResponse() {
}
}
-
void printPackageData() {
int i, j;
@@ -786,6 +818,8 @@ void printPackageData() {
humanDate strdate;
sizeString strsize;
FILE *file;
+ int package_id;
+ char *package_name = NULL, *package_summary = NULL;
snprintf(dbname, PATH_MAX, "%s%s-%s.db", ct->repository_dir, ct->tag, query_arch);
if (sqlite3_open_v2(dbname, (sqlite3**)&db, SQLITE_OPEN_READONLY, NULL)) {
@@ -794,14 +828,17 @@ void printPackageData() {
return;
}
- attachCtDatabases(ct, db, query_arch);
-
if (!reply_plain) printf("<%s>repository_dir, ct->tag);
if (sqlite3_open_v2(dbname, &dbs, SQLITE_OPEN_READONLY, NULL)) {
if (dbs) sqlite3_close(dbs);
@@ -943,9 +980,10 @@ void printPackageData() {
sqlite3_finalize(stmt1);
}
+ sqlite3_finalize(statement); /* need to finalize all statements before detaching databases */
/* required by */
- i=0;
- while (ct->repository[i]) {
+ for (i = 0; query_repositories[i] != NULL; i++) {
+ attachRepositoryDatabases(query_repositories[i], db, query_arch);
snprintf(sql, PATH_MAX,
"SELECT packagesup.name AS requiredbyname, "
"requiresup.requireflags AS requiredflags, "
@@ -959,14 +997,14 @@ void printPackageData() {
"AND NOT packagesup.name='%s' "
"GROUP BY packagesup.name "
"ORDER BY packagesup.name",
- ct->repository[i]->tag, ct->repository[i]->tag, ct->repository[i]->tag,
- sqlite3_column_int(statement,sqlite3_find_column_id(statement, NULL, "id")), query_package);
+ query_repositories[i]->tag, query_repositories[i]->tag, query_repositories[i]->tag,
+ package_id, query_package);
if (sqlite3_prepare_v2(db, sql, strlen(sql), &stmt1, NULL) == SQLITE_OK) {
j=0;
while (sqlite3_step(stmt1) == SQLITE_ROW) {
- if (j++ == 0) printf("
%s %s %s:",_("Required in"),ct->repository[i]->tag,_("by"));
- printf(" %s",
- ct->repository[i]->tag,
+ if (j++ == 0) printf("
%s %s %s:",_("Required in"),query_repositories[i]->tag,_("by"));
+ printf(" %s",
+ query_repositories[i]->tag,
sqlite3_column_text(stmt1,sqlite3_find_column_id(stmt1, NULL, "requiredbyname")),
query_arch,
sqlite3_column_text(stmt1,sqlite3_find_column_id(stmt1, NULL, "requiredbyname")));
@@ -978,12 +1016,12 @@ void printPackageData() {
}
sqlite3_finalize(stmt1);
}
- i++;
+ detachRepositoryDatabases(query_repositories[i], db, query_arch);
}
/* build required by */
- i=0;
- while (ct->repository[i]) {
+ for (i = 0; query_repositories[i] != NULL; i++) {
+ attachRepositoryDatabases(query_repositories[i], db, query_arch);
snprintf(sql, PATH_MAX,
"SELECT sourcesup.name as buildrequiredbyname, "
"buildrequiresup.buildrequireflags as buildrequireflags, "
@@ -996,14 +1034,13 @@ void printPackageData() {
// "AND NOT packagesup.name='%s' "
// "GROUP BY packagesup.name "
"ORDER BY sourcesup.name",
- ct->repository[i]->tag, ct->repository[i]->tag,
- sqlite3_column_int(statement,sqlite3_find_column_id(statement, NULL, "id")));
+ query_repositories[i]->tag, query_repositories[i]->tag, package_id);
if (sqlite3_prepare_v2(db, sql, strlen(sql), &stmt1, NULL) == SQLITE_OK) {
j=0;
while (sqlite3_step(stmt1) == SQLITE_ROW) {
- if (j++ == 0) printf("
%s %s %s:",_("Build required in"),ct->repository[i]->tag,_("by"));
- printf(" %s",
- ct->repository[i]->tag,
+ if (j++ == 0) printf("
%s %s %s:",_("Build required in"),query_repositories[i]->tag,_("by"));
+ printf(" %s",
+ query_repositories[i]->tag,
sqlite3_column_text(stmt1,sqlite3_find_column_id(stmt1, NULL, "buildrequiredbyname")),
sqlite3_column_text(stmt1,sqlite3_find_column_id(stmt1, NULL, "buildrequiredbyname")));
if (sqlite3_column_int(stmt1,sqlite3_find_column_id(stmt1, NULL, "buildrequireversion"))) {
@@ -1014,7 +1051,7 @@ void printPackageData() {
}
sqlite3_finalize(stmt1);
}
- i++;
+ detachRepositoryDatabases(query_repositories[i], db, query_arch);
}
/* files list */
@@ -1040,10 +1077,7 @@ void printPackageData() {
}
sqlite3_close(dbs);
}
- snprintf(buffer, PATH_MAX, "%s - %s",
- sqlite3_column_text(statement,sqlite3_find_column_id(statement, NULL, "name")),
- sqlite3_column_text(statement,sqlite3_find_column_id(statement, NULL, "summary")));
- sqlite3_finalize(statement);
+ snprintf(buffer, PATH_MAX, "%s - %s", package_name, package_summary);
}
if (!reply_plain) printf("]]>%s>", reply_xmltag);
if (!reply_plain) {
@@ -1275,6 +1309,24 @@ void parse_request_variables(char *data) {
if (query_next[strlen(query_next)] == '&') query_next[strlen(query_next)] = '\0';
ct = firstconfigtag;
i = 0;
+ if (query_package) {
+ if (strstr(query_repository, "devel") == query_repository) {
+ search_devel = 1;
+ search_milestone2 = 0;
+ search_milestone1 = 0;
+ searchbox = 1;
+ } else if (strstr(query_repository, "milestone2") == query_repository) {
+ search_devel = 0;
+ search_milestone2 = 1;
+ search_milestone1 = 0;
+ searchbox = 1;
+ } else if (strstr(query_repository, "milestone1") == query_repository) {
+ search_devel = 0;
+ search_milestone2 = 0;
+ search_milestone1 = 1;
+ searchbox = 1;
+ }
+ }
while (ct) {
if ((strstr(ct->tag, "devel") == ct->tag) && search_devel) query_repositories[i++] = ct;
ct = ct->next;