sqlite3-backend, distroquery: split database into dbs with names: <repository>-<arch>.db and <repository>-sources.db
This commit is contained in:
parent
b8b1a3db49
commit
948e63c538
@ -22,6 +22,7 @@
|
|||||||
#include "headerlist.h"
|
#include "headerlist.h"
|
||||||
#include "changelog.h"
|
#include "changelog.h"
|
||||||
#include "backend-sqlite3.h"
|
#include "backend-sqlite3.h"
|
||||||
|
#include "functions.h"
|
||||||
|
|
||||||
#define SQLITE_TABLE_files "id INTEGER PRIMARY KEY, "\
|
#define SQLITE_TABLE_files "id INTEGER PRIMARY KEY, "\
|
||||||
"name STRING, firstchild INTEGER, next INTEGER, parent INTEGER, numproviders INTEGER"
|
"name STRING, firstchild INTEGER, next INTEGER, parent INTEGER, numproviders INTEGER"
|
||||||
@ -186,20 +187,19 @@ int generateSQLite_files(struct configTag* ct, sqlite3 *db) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int generateSQLite_provided(struct configTag* ct, sqlite3 *db) {
|
int generateSQLite_provided(struct configTag* ct, sqlite3 *db, int arch) {
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
struct providedList* provided;
|
struct providedList* provided;
|
||||||
|
|
||||||
for (i = 0; i < ARCHS_MAX && ct->arch[i]; i++) {
|
// for (i = 0; i < ARCHS_MAX && ct->arch[i]; i++) {
|
||||||
snprintf(sqlite3_query, PATH_MAX, "provided_%s", ct->arch[i]);
|
snprintf(sqlite3_query, PATH_MAX, "provided");
|
||||||
SQLite_init_table(db, sqlite3_query, SQLITE_TABLE_provided);
|
SQLite_init_table(db, sqlite3_query, SQLITE_TABLE_provided);
|
||||||
SQLite_begin_transaction(db);
|
SQLite_begin_transaction(db);
|
||||||
|
|
||||||
provided = ct->providedlist_idx[i][0];
|
provided = ct->providedlist_idx[arch][0];
|
||||||
while (provided) {
|
while (provided) {
|
||||||
snprintf(sqlite3_query, PATH_MAX, "INSERT INTO provided_%s VALUES(%d,?,%d,%d);",
|
snprintf(sqlite3_query, PATH_MAX, "INSERT INTO provided VALUES(%d,?,%d,%d);",
|
||||||
ct->arch[i],
|
|
||||||
provided->id,
|
provided->id,
|
||||||
provided->flags,
|
provided->flags,
|
||||||
provided->numproviders);
|
provided->numproviders);
|
||||||
@ -218,7 +218,7 @@ int generateSQLite_provided(struct configTag* ct, sqlite3 *db) {
|
|||||||
/* if (sqlite3_finalize(stmt)) {
|
/* if (sqlite3_finalize(stmt)) {
|
||||||
fprintf(stderr, "ERROR: SQLite: (%s) %s", sqlite3_query, sqlite3_errmsg(db));
|
fprintf(stderr, "ERROR: SQLite: (%s) %s", sqlite3_query, sqlite3_errmsg(db));
|
||||||
}*/
|
}*/
|
||||||
}
|
// }
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -399,16 +399,16 @@ generateSQLite_packages(struct configTag *ct, sqlite3 *db, int arch) {
|
|||||||
struct headerList* currpackage;
|
struct headerList* currpackage;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
snprintf(sqlite3_query, PATH_MAX, "packages_%s", ct->arch[arch]);
|
snprintf(sqlite3_query, PATH_MAX, "packages");
|
||||||
SQLite_init_table(db, sqlite3_query, SQLITE_TABLE_packages);
|
SQLite_init_table(db, sqlite3_query, SQLITE_TABLE_packages);
|
||||||
snprintf(sqlite3_query, PATH_MAX, "packages_files_rel_%s", ct->arch[arch]);
|
snprintf(sqlite3_query, PATH_MAX, "packages_files_rel");
|
||||||
SQLite_init_table(db, sqlite3_query, SQLITE_TABLE_packages_files_rel);
|
SQLite_init_table(db, sqlite3_query, SQLITE_TABLE_packages_files_rel);
|
||||||
SQLite_begin_transaction(db);
|
SQLite_begin_transaction(db);
|
||||||
|
|
||||||
currpackage = ct->headerlist[arch];
|
currpackage = ct->headerlist[arch];
|
||||||
while (currpackage) {
|
while (currpackage) {
|
||||||
|
|
||||||
snprintf(sqlite3_query, PATH_MAX, "INSERT INTO packages_%s VALUES(NULL,?,%d,%d,?,?,?,?,?,%d,%d);",
|
snprintf(sqlite3_query, PATH_MAX, "INSERT INTO packages VALUES(NULL,?,%d,%d,?,?,?,?,?,%d,%d);",
|
||||||
ct->arch[arch],
|
ct->arch[arch],
|
||||||
currpackage->altrepository,
|
currpackage->altrepository,
|
||||||
currpackage->epoch,
|
currpackage->epoch,
|
||||||
@ -434,7 +434,7 @@ generateSQLite_packages(struct configTag *ct, sqlite3 *db, int arch) {
|
|||||||
|
|
||||||
/* packages <-> files relations */
|
/* packages <-> files relations */
|
||||||
for (i = 0; i < currpackage->filenamecount; i++) {
|
for (i = 0; i < currpackage->filenamecount; i++) {
|
||||||
snprintf(sqlite3_query, PATH_MAX, "INSERT INTO packages_files_rel_%s VALUES(NULL,%d,%d);",
|
snprintf(sqlite3_query, PATH_MAX, "INSERT INTO packages_files_rel VALUES(NULL,%d,%d);",
|
||||||
ct->arch[arch],
|
ct->arch[arch],
|
||||||
currpackage->id,
|
currpackage->id,
|
||||||
currpackage->file[i]->id);
|
currpackage->file[i]->id);
|
||||||
@ -461,7 +461,23 @@ generateSQLite(struct configTag *ct)
|
|||||||
char dbname[PATH_MAX];
|
char dbname[PATH_MAX];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
snprintf(dbname, PATH_MAX, "%sdistromatic.db", ct->repository_dir);
|
for (i = 0; i < ARCHS_MAX && ct->arch[i]; i++) {
|
||||||
|
snprintf(dbname, PATH_MAX, "%s%s-%s.db", ct->repository_dir, ct->tag, ct->arch[i]);
|
||||||
|
unlink(dbname);
|
||||||
|
|
||||||
|
if (sqlite3_open_v2(dbname, &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL)) {
|
||||||
|
logmsg(LOG_ERROR, "sqlite3_open_v2: %s %s", sqlite3_errmsg(db), dbname);
|
||||||
|
if (db) sqlite3_close(db);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
generateSQLite_packages(ct, db, i);
|
||||||
|
// generateSQLite_files(ct, db);
|
||||||
|
generateSQLite_provided(ct, db, i);
|
||||||
|
sqlite3_close(db);
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(dbname, PATH_MAX, "%s%s-sources.db", ct->repository_dir, ct->tag);
|
||||||
unlink(dbname);
|
unlink(dbname);
|
||||||
|
|
||||||
if (sqlite3_open_v2(dbname, &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL)) {
|
if (sqlite3_open_v2(dbname, &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL)) {
|
||||||
@ -469,15 +485,8 @@ generateSQLite(struct configTag *ct)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
generateSQLite_packagers(db);
|
|
||||||
// generateSQLite_files(ct, db);
|
|
||||||
generateSQLite_provided(ct, db);
|
|
||||||
|
|
||||||
for (i = 0; i < ARCHS_MAX && ct->arch[i]; i++) {
|
|
||||||
generateSQLite_packages(ct, db, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
generateSQLite_sources(ct, db);
|
generateSQLite_sources(ct, db);
|
||||||
|
generateSQLite_packagers(db);
|
||||||
|
|
||||||
sqlite3_close(db);
|
sqlite3_close(db);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -187,26 +187,6 @@ program_version(void) {
|
|||||||
printf("%s\n", freelicense[linenum]);
|
printf("%s\n", freelicense[linenum]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Obtain a backtrace and print it to stdout. */
|
|
||||||
void backtraceHandler(int sig)
|
|
||||||
{
|
|
||||||
void *array[10];
|
|
||||||
size_t size;
|
|
||||||
char **strings;
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
size = backtrace (array, 10);
|
|
||||||
strings = (char**)backtrace_symbols (array, size);
|
|
||||||
|
|
||||||
fprintf(stderr, "Obtained %zd stack frames.\n", size);
|
|
||||||
|
|
||||||
for (i = 0; i < size; i++)
|
|
||||||
fprintf(stderr, "%s\n", strings[i]);
|
|
||||||
|
|
||||||
free (strings);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* checks if given single requirement is met by given provides
|
* checks if given single requirement is met by given provides
|
||||||
*
|
*
|
||||||
@ -508,7 +488,7 @@ resolveFirstLevelDependencies(struct configTag *ct, int archidx)
|
|||||||
provided->flags=0;
|
provided->flags=0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!scanheader) {
|
if (!scanheader && incremental_mode) {
|
||||||
snprintf(warning,PATH_MAX,"%s(%s,%s): missing provider for %s",
|
snprintf(warning,PATH_MAX,"%s(%s,%s): missing provider for %s",
|
||||||
currheader->name,
|
currheader->name,
|
||||||
ct->arch[archidx],
|
ct->arch[archidx],
|
||||||
@ -768,7 +748,7 @@ resolveFirstLevelSourceDependencies(struct configTag *ct, int archidx)
|
|||||||
logmsg(LOG_DEBUG,"%s is a build provider for %s",provided->name,currsourceheader->name);
|
logmsg(LOG_DEBUG,"%s is a build provider for %s",provided->name,currsourceheader->name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (provided->numbuildproviders == 0) {
|
if (provided->numbuildproviders == 0 && incremental_mode) {
|
||||||
snprintf(warning,PATH_MAX,"missing build provider for %s",currsourceheader->require[i]->name);
|
snprintf(warning,PATH_MAX,"missing build provider for %s",currsourceheader->require[i]->name);
|
||||||
fprintf(stderr,"Warning: %s(source,%s): %s\n",
|
fprintf(stderr,"Warning: %s(source,%s): %s\n",
|
||||||
currsourceheader->name,
|
currsourceheader->name,
|
||||||
@ -1086,7 +1066,7 @@ main(int argc, char *argv[])
|
|||||||
recursive_mode = 0;
|
recursive_mode = 0;
|
||||||
incremental_mode = 0;
|
incremental_mode = 0;
|
||||||
obsolete_packages = 0;
|
obsolete_packages = 0;
|
||||||
resolve_dependencies = 0;
|
//resolve_dependencies = 0;
|
||||||
name = NULL;
|
name = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1221,9 +1201,12 @@ main(int argc, char *argv[])
|
|||||||
} // if (genheader_mode)
|
} // if (genheader_mode)
|
||||||
|
|
||||||
if (mode & MODE_SQLITE3) {
|
if (mode & MODE_SQLITE3) {
|
||||||
if (!quietmode) printf("Generating sqlite db...\n");
|
if (!quietmode) printf("Generating sqlite databases...\n");
|
||||||
logmsg(LOG_DEBUG,"generateSQLite - start");
|
logmsg(LOG_DEBUG,"generateSQLite - start");
|
||||||
generateSQLite(configtag);
|
if (generateSQLite(configtag)) {
|
||||||
|
logmsg(LOG_ERROR, "could not generate sqlite databases; aborting.");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
logmsg(LOG_DEBUG,"generateSQLite - done");
|
logmsg(LOG_DEBUG,"generateSQLite - done");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,15 +71,20 @@
|
|||||||
#include "distromatic.h"
|
#include "distromatic.h"
|
||||||
#include "functions.h"
|
#include "functions.h"
|
||||||
|
|
||||||
|
// must be as big as ARCHS_MAX (5)
|
||||||
|
const char* ARCHS[ARCHS_MAX] = { "i586" , "x86_64" , "arm" , "", ""};
|
||||||
|
|
||||||
static struct configTag *firstconfigtag = NULL, *configtag = NULL;
|
static struct configTag *firstconfigtag = NULL, *configtag = NULL;
|
||||||
char *query;
|
char *query;
|
||||||
char *query_package;
|
char *query_package;
|
||||||
char *query_repository;
|
char *query_repository;
|
||||||
char *query_arch;
|
char *query_arch;
|
||||||
|
int query_archs[ARCHS_MAX];
|
||||||
|
|
||||||
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_sources = 0;
|
||||||
|
|
||||||
/* Converts a hex character to its integer value */
|
/* Converts a hex character to its integer value */
|
||||||
char from_hex(char ch) {
|
char from_hex(char ch) {
|
||||||
@ -170,6 +175,15 @@ void printInputForm() {
|
|||||||
printf("]]></queryform>");
|
printf("]]></queryform>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int find_query_arch(char* arch) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < ARCHS_MAX; i++) {
|
||||||
|
if (!strcmp(arch, ARCHS[i]) && query_archs[i]) return i;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
void printQueryData() {
|
void printQueryData() {
|
||||||
|
|
||||||
int a, i, j, k, numresults = 0;
|
int a, i, j, k, numresults = 0;
|
||||||
@ -182,46 +196,54 @@ void printQueryData() {
|
|||||||
if (query[i] == ' ') query[i] = '%';
|
if (query[i] == ' ') query[i] = '%';
|
||||||
}
|
}
|
||||||
|
|
||||||
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++) {
|
||||||
|
if (find_query_arch(query_repositories[i]->arch[a]) >= 0) {
|
||||||
snprintf(dbname, PATH_MAX, "%sdistromatic.db", query_repositories[i]->repository_dir);
|
snprintf(dbname, PATH_MAX, "%sdistromatic.db", query_repositories[i]->repository_dir);
|
||||||
if (sqlite3_open_v2(dbname, (sqlite3**)&query_repositories[i]->db, SQLITE_OPEN_READONLY, NULL)) {
|
if (sqlite3_open_v2(dbname, (sqlite3**)&query_repositories[i]->db, SQLITE_OPEN_READONLY, NULL)) {
|
||||||
if (query_repositories[i]->db) sqlite3_close(query_repositories[i]->db);
|
if (query_repositories[i]->db) sqlite3_close(query_repositories[i]->db);
|
||||||
query_repositories[i]->db = NULL;
|
query_repositories[i]->db = NULL;
|
||||||
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 (find_query_arch(query_repositories[i]->arch[a]) >= 0) {
|
||||||
(search_arm && !strcmp(query_repositories[i]->arch[a],"arm")) ||
|
if (!query_repositories[i]->db[a]) {
|
||||||
(search_x86_64 && !strcmp(query_repositories[i]->arch[a],"x86_64"))) {
|
snprintf(dbname, PATH_MAX, "%s%s-%s.db",
|
||||||
snprintf(sql, PATH_MAX,
|
query_repositories[i]->repository_dir, query_repositories[i]->tag, query_repositories[i]->arch[a]);
|
||||||
"SELECT * FROM packages_%s WHERE name LIKE '%%%s%%' OR summary LIKE '%%%s%%' OR description LIKE '%%%s%%' OR version LIKE '%%%s%%' "
|
if (sqlite3_open_v2(dbname, (sqlite3**)&query_repositories[i]->db[a], SQLITE_OPEN_READONLY, NULL)) {
|
||||||
"ORDER BY name = '%s' DESC, name LIKE '%s%%' DESC, name LIKE '%%%s%%' DESC, "
|
if (query_repositories[i]->db) sqlite3_close(query_repositories[i]->db[a]);
|
||||||
"groupdescr LIKE 'Graphical Desktop/%%' DESC, groupdescr LIKE 'Applications/%%' DESC, "
|
query_repositories[i]->db[a] = NULL;
|
||||||
"groupdescr LIKE 'Development/%%' ASC, groupdescr LIKE 'Documentation%%' ASC, groupdescr LIKE 'System/Libraries%%' ASC, "
|
fprintf(stderr, "ERROR: unable to open sqlite3 db %s; ignoring.\n", dbname);
|
||||||
"name LIKE '%%-devel' ASC, name LIKE '%%-debug' ASC "
|
}
|
||||||
"LIMIT 100",
|
}
|
||||||
query_repositories[i]->arch[a], query, query, query, query, query, query);
|
if (query_repositories[i]->db[a]) {
|
||||||
if (query_repositories[i]->db &&
|
snprintf(sql, PATH_MAX,
|
||||||
(sqlite3_prepare_v2((sqlite3*)query_repositories[i]->db, sql, strlen(sql), &statement, NULL) == SQLITE_OK)) {
|
"SELECT * FROM packages WHERE name LIKE '%%%s%%' OR summary LIKE '%%%s%%' OR description LIKE '%%%s%%' OR version LIKE '%%%s%%' "
|
||||||
while (sqlite3_step(statement) == SQLITE_ROW) {
|
"ORDER BY name = '%s' DESC, name LIKE '%s%%' DESC, name LIKE '%%%s%%' DESC, "
|
||||||
numresults++;
|
"groupdescr LIKE 'Graphical Desktop/%%' DESC, groupdescr LIKE 'Applications/%%' DESC, "
|
||||||
printf("<div style='position:relative'><hr><br><div style='display:inline;color:white;background-color:green'> %s </div> "
|
"groupdescr LIKE 'Development/%%' ASC, groupdescr LIKE 'Documentation%%' ASC, groupdescr LIKE 'System/Libraries%%' ASC, "
|
||||||
"<div style='display:inline;color:black;background-color:yellow'> %s </div> "
|
"name LIKE '%%-devel' ASC, name LIKE '%%-debug' ASC "
|
||||||
"<div style='display:inline;color:black;background-color:lightblue'> %s </div><br>"
|
"LIMIT 100", query, query, query, query, query, query);
|
||||||
"<b>%s</b> %s-%s<br>%s",
|
if (sqlite3_prepare_v2((sqlite3*)query_repositories[i]->db[a], sql, strlen(sql), &statement, NULL) == SQLITE_OK) {
|
||||||
query_repositories[i]->arch[a],
|
while (sqlite3_step(statement) == SQLITE_ROW) {
|
||||||
query_repositories[i]->tag,
|
numresults++;
|
||||||
sqlite3_column_text(statement,7),
|
printf("<div style='position:relative'><hr><br><div style='display:inline;color:white;background-color:green'> %s </div> "
|
||||||
sqlite3_column_text(statement,1),
|
"<div style='display:inline;color:black;background-color:yellow'> %s </div> "
|
||||||
sqlite3_column_text(statement,4),
|
"<div style='display:inline;color:black;background-color:lightblue'> %s </div><br>"
|
||||||
sqlite3_column_text(statement,5),
|
"<b>%s</b> %s-%s<br>%s",
|
||||||
sqlite3_column_text(statement,6));
|
query_repositories[i]->arch[a],
|
||||||
|
query_repositories[i]->tag,
|
||||||
|
sqlite3_column_text(statement,7),
|
||||||
|
sqlite3_column_text(statement,1),
|
||||||
|
sqlite3_column_text(statement,4),
|
||||||
|
sqlite3_column_text(statement,5),
|
||||||
|
sqlite3_column_text(statement,6));
|
||||||
|
|
||||||
printf("<br><br><div style='text-align:justify;text-justify:inter-word;font-style:italic'>%s</div>",
|
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 */
|
/* install */
|
||||||
/* printf("<div align=right style='position:absolute;top:5px;right:0;padding:5px;'>"
|
/* printf("<div align=right style='position:absolute;top:5px;right:0;padding:5px;'>"
|
||||||
@ -233,7 +255,7 @@ void printQueryData() {
|
|||||||
sqlite3_column_text(statement,1));*/
|
sqlite3_column_text(statement,1));*/
|
||||||
|
|
||||||
/* download */
|
/* download */
|
||||||
printf("<div style='display:inline;background-color:green'>"
|
printf("<div style='display:inline;background-color:green'>"
|
||||||
"<a href=\"%s%s/SRPMS.base/%s-%s-%s.src.rpm\" style=\"color:white\"> Download </a></div>",
|
"<a href=\"%s%s/SRPMS.base/%s-%s-%s.src.rpm\" style=\"color:white\"> Download </a></div>",
|
||||||
query_repositories[i]->download_prefix,
|
query_repositories[i]->download_prefix,
|
||||||
query_repositories[i]->download_dir,
|
query_repositories[i]->download_dir,
|
||||||
@ -241,18 +263,18 @@ void printQueryData() {
|
|||||||
sqlite3_column_text(statement,4),
|
sqlite3_column_text(statement,4),
|
||||||
sqlite3_column_text(statement,5));
|
sqlite3_column_text(statement,5));
|
||||||
/* details */
|
/* details */
|
||||||
printf(" <div style='display:inline;background-color:lightblue;font-weight:strong'>"
|
printf(" <div style='display:inline;background-color:lightblue;font-weight:strong'>"
|
||||||
"<a href='javascript:distroquery_request("
|
"<a href='javascript:distroquery_request("
|
||||||
"\"repository=%s&package=%s&arch=%s\")' style=\"color:black\"> Details </a></div>",
|
"\"repository=%s&package=%s&arch=%s\")' style=\"color:black\"> Details </a></div>",
|
||||||
query_repositories[i]->tag,
|
query_repositories[i]->tag,
|
||||||
sqlite3_column_text(statement,1),
|
sqlite3_column_text(statement,1),
|
||||||
query_repositories[i]->arch[a]);
|
query_repositories[i]->arch[a]);
|
||||||
|
|
||||||
printf("</div></div><br>");
|
printf("</div></div><br>");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("\n");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -262,8 +284,16 @@ void printQueryData() {
|
|||||||
"ORDER BY name = '%s' DESC, name LIKE '%s%%' DESC, name LIKE '%%%s%%' DESC LIMIT 100",
|
"ORDER BY name = '%s' DESC, name LIKE '%s%%' DESC, name LIKE '%%%s%%' DESC LIMIT 100",
|
||||||
query, query, query, query, query, query);
|
query, query, query, query, query, query);
|
||||||
for (i = 0; query_repositories[i] != NULL; i++) {
|
for (i = 0; query_repositories[i] != NULL; i++) {
|
||||||
if (query_repositories[i]->db &&
|
if (!query_repositories[i]->db[ARCHS_MAX]) {
|
||||||
(sqlite3_prepare_v2((sqlite3*)query_repositories[i]->db, sql, strlen(sql), &statement, NULL) == SQLITE_OK)) {
|
snprintf(dbname, PATH_MAX, "%s%s-sources.db", query_repositories[i]->repository_dir, query_repositories[i]->tag);
|
||||||
|
if (sqlite3_open_v2(dbname, (sqlite3**)&query_repositories[i]->db[ARCHS_MAX], SQLITE_OPEN_READONLY, NULL)) {
|
||||||
|
if (query_repositories[i]->db) sqlite3_close(query_repositories[i]->db[a]);
|
||||||
|
query_repositories[i]->db[ARCHS_MAX] = NULL;
|
||||||
|
fprintf(stderr, "ERROR: unable to open sqlite3 db %s; ignoring.\n", dbname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (query_repositories[i]->db[ARCHS_MAX] &&
|
||||||
|
(sqlite3_prepare_v2((sqlite3*)query_repositories[i]->db[ARCHS_MAX], 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:black;background-color:red'> Source </div> "
|
printf("<hr><br><div style='display:inline;color:black;background-color:red'> Source </div> "
|
||||||
@ -282,7 +312,6 @@ void printQueryData() {
|
|||||||
sqlite3_column_text(statement,9));
|
sqlite3_column_text(statement,9));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("\n");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("<hr>");
|
printf("<hr>");
|
||||||
@ -291,8 +320,12 @@ void printQueryData() {
|
|||||||
printf("<querystatus><![CDATA[%d result(s) shown.]]></querystatus>", numresults);
|
printf("<querystatus><![CDATA[%d result(s) shown.]]></querystatus>", numresults);
|
||||||
|
|
||||||
for (i = 0; query_repositories[i] != NULL; i++) {
|
for (i = 0; query_repositories[i] != NULL; i++) {
|
||||||
sqlite3_close((sqlite3*)query_repositories[i]->db);
|
for (a = 0; a <= ARCHS_MAX && query_repositories[i]->arch[a]; a++) {
|
||||||
query_repositories[i]->db = NULL;
|
if (query_repositories[i]->db[a]) {
|
||||||
|
sqlite3_close((sqlite3*)query_repositories[i]->db[a]);
|
||||||
|
query_repositories[i]->db[a] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -300,23 +333,24 @@ void printPackageData() {
|
|||||||
|
|
||||||
int a, i, j, k, numresults = 0;
|
int a, i, j, k, numresults = 0;
|
||||||
char dbname[PATH_MAX];
|
char dbname[PATH_MAX];
|
||||||
|
sqlite3 *db;
|
||||||
sqlite3_stmt *statement;
|
sqlite3_stmt *statement;
|
||||||
char sql[PATH_MAX];
|
char sql[PATH_MAX];
|
||||||
struct configTag* ct = findRepositoryByTag(query_repository);
|
struct configTag* ct = findRepositoryByTag(query_repository);
|
||||||
|
|
||||||
printf("<queryreply><![CDATA[");
|
printf("<queryreply><![CDATA[");
|
||||||
|
|
||||||
snprintf(dbname, PATH_MAX, "%sdistromatic.db", ct->repository_dir);
|
snprintf(dbname, PATH_MAX, "%s%s-%s.db", ct->repository_dir, ct->tag, query_arch);
|
||||||
if (sqlite3_open_v2(dbname, (sqlite3**)&ct->db, SQLITE_OPEN_READONLY, NULL)) {
|
if (sqlite3_open_v2(dbname, &db, SQLITE_OPEN_READONLY, NULL)) {
|
||||||
if (ct->db) sqlite3_close(ct->db);
|
if (db) sqlite3_close(db);
|
||||||
ct->db = NULL;
|
db = NULL;
|
||||||
fprintf(stderr, "ERROR: unable to open sqlite3 db %s; aborting.\n", dbname);
|
fprintf(stderr, "ERROR: unable to open sqlite3 db %s; aborting.\n", dbname);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(sql, PATH_MAX, "SELECT * FROM packages_%s WHERE name = '%s'", query_arch, query_package);
|
snprintf(sql, PATH_MAX, "SELECT * FROM packages WHERE name = '%s'", query_package);
|
||||||
if (ct->db &&
|
if (db &&
|
||||||
(sqlite3_prepare_v2((sqlite3*)ct->db, sql, strlen(sql), &statement, NULL) == SQLITE_OK)) {
|
(sqlite3_prepare_v2(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("<hr><br><div style='display:inline;color:white;background-color:green'> %s </div> "
|
||||||
@ -364,8 +398,8 @@ void printPackageData() {
|
|||||||
printf("<hr><br>%d result(s) found.", numresults);*/
|
printf("<hr><br>%d result(s) found.", numresults);*/
|
||||||
printf("]]></queryreply>");
|
printf("]]></queryreply>");
|
||||||
|
|
||||||
sqlite3_close(ct->db);
|
sqlite3_close(db);
|
||||||
ct->db = NULL;
|
db = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void parse_request_variables(char *data) {
|
void parse_request_variables(char *data) {
|
||||||
@ -393,11 +427,11 @@ void parse_request_variables(char *data) {
|
|||||||
} else if (!strcmp(vartok, "search_devel")) {
|
} else if (!strcmp(vartok, "search_devel")) {
|
||||||
search_devel = (strstr(valuetok, "false") != valuetok);
|
search_devel = (strstr(valuetok, "false") != valuetok);
|
||||||
} else if (!strcmp(vartok, "search_i586")) {
|
} else if (!strcmp(vartok, "search_i586")) {
|
||||||
search_i586 = (strstr(valuetok, "false") != valuetok);
|
query_archs[0] = strstr(valuetok, "false") != valuetok;
|
||||||
} else if (!strcmp(vartok, "search_x86_64")) {
|
} else if (!strcmp(vartok, "search_x86_64")) {
|
||||||
search_x86_64 = (strstr(valuetok, "false") != valuetok);
|
query_archs[1] = strstr(valuetok, "false") != valuetok;
|
||||||
} else if (!strcmp(vartok, "search_arm")) {
|
} else if (!strcmp(vartok, "search_arm")) {
|
||||||
search_arm = (strstr(valuetok, "false") != valuetok);
|
query_archs[2] = strstr(valuetok, "false") != valuetok;
|
||||||
} else if (!strcmp(vartok, "search_sources")) {
|
} else if (!strcmp(vartok, "search_sources")) {
|
||||||
search_sources = (strstr(valuetok, "false") != valuetok);
|
search_sources = (strstr(valuetok, "false") != valuetok);
|
||||||
}
|
}
|
||||||
@ -429,6 +463,9 @@ main(int argc, char *argv[])
|
|||||||
// char *configfile = NULL;
|
// char *configfile = NULL;
|
||||||
char *data;
|
char *data;
|
||||||
|
|
||||||
|
// install backtrace handler
|
||||||
|
signal(SIGSEGV, backtraceHandler);
|
||||||
|
|
||||||
printf("Content-Type: text/xml;charset=utf-8\n\n<distroquery>");
|
printf("Content-Type: text/xml;charset=utf-8\n\n<distroquery>");
|
||||||
|
|
||||||
firstconfigtag = read_configuration(DEFAULT_CONFIGFILE);
|
firstconfigtag = read_configuration(DEFAULT_CONFIGFILE);
|
||||||
|
@ -77,6 +77,26 @@ static int debug_log = 0;
|
|||||||
static struct configDefaults configdefaults;
|
static struct configDefaults configdefaults;
|
||||||
static struct configTag *firstconfigtag = NULL;
|
static struct configTag *firstconfigtag = NULL;
|
||||||
|
|
||||||
|
/* Obtain a backtrace and print it to stdout. */
|
||||||
|
void backtraceHandler(int sig)
|
||||||
|
{
|
||||||
|
void *array[10];
|
||||||
|
size_t size;
|
||||||
|
char **strings;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
size = backtrace (array, 10);
|
||||||
|
strings = (char**)backtrace_symbols (array, size);
|
||||||
|
|
||||||
|
fprintf(stderr, "Obtained %zd stack frames.\n", size);
|
||||||
|
|
||||||
|
for (i = 0; i < size; i++)
|
||||||
|
fprintf(stderr, "%s\n", strings[i]);
|
||||||
|
|
||||||
|
free (strings);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
struct configTag* findRepositoryByTag(const char *tag)
|
struct configTag* findRepositoryByTag(const char *tag)
|
||||||
{
|
{
|
||||||
struct configTag *ct = firstconfigtag;
|
struct configTag *ct = firstconfigtag;
|
||||||
|
@ -39,7 +39,7 @@ struct configTag {
|
|||||||
struct fileTree *filetree[ARCHS_MAX];
|
struct fileTree *filetree[ARCHS_MAX];
|
||||||
struct headerStats stats;
|
struct headerStats stats;
|
||||||
struct configTag *next;
|
struct configTag *next;
|
||||||
void *db;
|
void *db[ARCHS_MAX + 1];
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -38,5 +38,6 @@ char *htmlcleanNoBr(char *source,char *dest,unsigned int max);
|
|||||||
int scansdir(const char *dir, struct dirent ***namelist,
|
int scansdir(const char *dir, struct dirent ***namelist,
|
||||||
int (*select)(const struct dirent *),
|
int (*select)(const struct dirent *),
|
||||||
int (*compar)(const struct dirent **, const struct dirent **));
|
int (*compar)(const struct dirent **, const struct dirent **));
|
||||||
|
void backtraceHandler(int sig);
|
||||||
|
|
||||||
#endif /* FUNCTIONS_H */
|
#endif /* FUNCTIONS_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user