Annotation of rpm2html/sql.c, revision 1.41
1.1 veillard 1: /*
2: * sql.c: front-end for MySQL database
3: */
4:
1.2 veillard 5: #include "config.h"
6:
7: #include <stdio.h>
8: #include <stdlib.h>
9: #include <sys/types.h>
10: #include <sys/stat.h>
11: #ifdef HAVE_FCNTL_H
12: #include <fcntl.h>
13: #endif
1.1 veillard 14: #include <stdio.h>
15: #include <stdlib.h>
1.2 veillard 16: #include <string.h>
1.28 daniel 17: #include <time.h>
1.2 veillard 18: #ifdef HAVE_UNISTD_H
19: #include <unistd.h>
20: #endif
21: /********
22: #include <rpm/rpmlib.h>
23: ********/
24:
1.1 veillard 25: #include <mysql/mysql.h>
1.16 veillard 26: #include <mysql/errmsg.h>
1.2 veillard 27: #include "rpm2html.h"
1.26 veillard 28: #include "rpmdata.h"
1.2 veillard 29: /********
30: #include "rpmdata.h"
31: ********/
1.1 veillard 32: #include "sql.h"
1.28 daniel 33: #include "html.h"
1.1 veillard 34:
1.39 daniel 35: /* #define SQL_DEBUG_TIMING */
1.31 veillard 36:
1.26 veillard 37: #define SQL_MAX_DISTRIBS 500
38:
1.1 veillard 39: /************************************************************************
40: * *
41: * Generic inititialisation/close of the DB *
42: * *
43: ************************************************************************/
44:
45: static MYSQL *sql = NULL;
1.16 veillard 46: static const char *myhost, *mybase, *myuser, *mypasswd;
1.1 veillard 47:
1.11 veillard 48: int init_sql(const char *host, const char *base, const char *user, const char *passwd) {
1.16 veillard 49: int attempts = 0;
50:
51: /*
52: * Close the previous connection if any
53: */
54: if (sql != NULL) {
55: close_sql();
56: if (myhost != NULL) free((char *) myhost);
57: myhost = NULL;
58: if (mybase != NULL) free((char *) mybase);
59: mybase = NULL;
60: if (myuser != NULL) free((char *) myuser);
61: myuser = NULL;
62: if (mypasswd != NULL) free((char *) mypasswd);
63: mypasswd = NULL;
64: }
65:
1.11 veillard 66: if (host == NULL)
67: host = getenv("MySQL_HOST");
68: if (host == NULL)
69: host = "localhost";
70: if (base == NULL)
71: base = getenv("MySQL_BASE");
1.1 veillard 72: if (base == NULL)
73: base = "rpmfind";
74: if (passwd == NULL)
75: passwd = getenv("MySQL_PASS");
76: if (user == NULL)
77: user = getenv("MySQL_USER");
78: if (user == NULL)
79: user = getenv("USER");
80: if (user == NULL)
81: user = getenv("USERNAME");
82: if (user == NULL)
83: user = getenv("LOGNAME");
84: sql = mysql_init(NULL);
85: if (mysql_errno(sql)) {
86: fprintf(stderr, "mysql_init failed: %s\n", mysql_error(sql));
87: return(-1);
88: }
1.16 veillard 89: for (attempts = 0; ;attempts ++) {
90: mysql_real_connect(sql, host, user, passwd, base, 0, NULL, 0);
91: if (mysql_errno(sql)) {
1.26 veillard 92: if ((attempts == 0) && (passwd == NULL)) {
93: fprintf(stderr, "No passwd defined, use MySQL_PASS env\n");
94: }
1.16 veillard 95: if (attempts >= 20) {
96: fprintf(stderr,
97: "mysql: connect as %s to %s on host %s failed: %s\n",
98: user, base, host, mysql_error(sql));
1.24 daniel 99: return(-1);
100: } else {
101: fprintf(stderr,
102: "mysql: retrying connect as %s to %s on host %s failed: %s\n",
103: user, base, host, mysql_error(sql));
1.16 veillard 104: }
105: } else {
106: break;
107: }
108: sleep(15);
1.1 veillard 109: }
1.16 veillard 110: myhost = strdup(host);
111: mybase = strdup(base);
112: myuser = strdup(user);
113: mypasswd = strdup(passwd);
1.2 veillard 114: sql_check_tables();
1.1 veillard 115: return(0);
116: }
117:
118: int close_sql(void) {
119: mysql_close(sql);
120: if (mysql_errno(sql)) {
121: fprintf(stderr, "mysql_close failed: %s\n", mysql_error(sql));
122: return(-1);
123: }
1.16 veillard 124: sql = NULL;
1.1 veillard 125: return(0);
126: }
127:
1.16 veillard 128: int restart_sql(void) {
129: int attempts = 0;
130:
131: /*
132: * Close the previous connection if any
133: */
134: if (sql != NULL) {
135: close_sql();
136: sql = NULL;
137: }
138:
139: sql = mysql_init(NULL);
140: if (mysql_errno(sql)) {
141: fprintf(stderr, "mysql_init failed: %s\n", mysql_error(sql));
142: return(-1);
143: }
144: for (attempts = 0; ;attempts ++) {
145: mysql_real_connect(sql, myhost, myuser, mypasswd, mybase, 0, NULL, 0);
146: if (mysql_errno(sql)) {
147: if (attempts >= 20) {
148: fprintf(stderr,
149: "mysql: reconnect as %s to %s on host %s failed: %s\n",
150: myuser, mybase, myhost, mysql_error(sql));
151: return(-1);
152: }
153: } else {
154: break;
155: }
156: sleep(15);
157: }
158: sql_check_tables();
159: return(0);
160: }
161:
162: /*
163: * Handle disconnects by doing a reconnect and a retry.
164: */
165: int do_sql_query(const char *query, int len) {
166: int res;
167:
168: if (sql == NULL) {
169: res = restart_sql();
170: if (res != 0)
171: return(res);
172: }
173: res = mysql_real_query(sql, query, len);
1.19 daniel 174: if ((res == CR_SERVER_GONE_ERROR) || (res == CR_SERVER_LOST)) {
1.16 veillard 175: res = restart_sql();
176: if (res != 0)
177: return(res);
178: res = mysql_real_query(sql, query, len);
179: }
180: return(res);
181: }
182:
1.1 veillard 183: /************************************************************************
184: * *
185: * Generic functions to access the tables *
186: * *
187: ************************************************************************/
188:
1.6 veillard 189: #define MAX_QUERY 8000
190: #define SMALL_QUERY 500
1.1 veillard 191:
192: int sql_update_id(const char *table, int id,
193: const char *field, const char *value) {
194: MYSQL_RES *result;
1.6 veillard 195: char query[MAX_QUERY];
1.1 veillard 196: int nb_fields = 0;
1.6 veillard 197: int left = MAX_QUERY - 1;
198: int len;
199: char *end;
1.1 veillard 200:
201: if ((table == NULL) ||
202: (field == NULL) || (value == NULL))
203: return(-1);
204:
1.6 veillard 205: len = snprintf(query, left, "UPDATE %s SET %s='", table, field);
206: if (len < 0) {
207: fprintf(stderr, "sql_update_id : %s(%d).%s overflow\n",
208: table, id, field);
209: return(-1);
210: }
211: end = &query[len];
212: left -= len;
213: len = strlen(value);
214: if (len * 2 >= left) {
215: fprintf(stderr, "sql_update_id : %s(%d).%s overflow\n",
216: table, id, field);
217: return(-1);
218: }
219: len = mysql_escape_string(end, value, len);
220: left -= len;
221: if (left <= 0) {
222: fprintf(stderr, "sql_update_id : %s(%d).%s overflow\n",
223: table, id, field);
224: return(-1);
225: }
226: end += len;
227: len = snprintf(end, left, "' WHERE ID=%d", id);
228: if (len < 0) {
229: fprintf(stderr, "sql_update_id : %s(%d).%s overflow\n",
230: table, id, field);
231: return(-1);
232: }
233: end += len;
234: query[MAX_QUERY - 1] = 0;
235:
1.16 veillard 236: if (do_sql_query(query, (unsigned int) (end - query))) {
1.1 veillard 237: printf("sql_update_id: UPDATE %s %d failed: %s\n",
238: table, id, mysql_error(sql));
239: return(-1);
240: }
241: result = mysql_store_result(sql);
242: if (result != NULL) {
243: nb_fields = mysql_num_fields(result);
244: mysql_free_result(result);
245: } else {
246: nb_fields = 1;
247: }
248: if(mysql_errno(sql)) {
249: fprintf(stderr, "sql_update_id UPDATE error: %s\n",
250: mysql_error(sql));
251: return(-1);
252: }
253: return(nb_fields);
254: }
255:
256: int sql_blind_insert(const char *table, const char *key,
257: const char *value, int id) {
258: MYSQL_RES *result;
1.6 veillard 259: char query[MAX_QUERY];
260: int left = MAX_QUERY - 1;
261: int len;
262: char *end;
1.8 veillard 263: int insert = -1;
1.1 veillard 264:
1.2 veillard 265: if ((table == NULL) ||
1.1 veillard 266: (key == NULL) || (value == NULL))
267: return(-1);
268:
269: /*
270: * Search first for the ID if it already exists
271: */
1.2 veillard 272: if (id > 0) {
1.6 veillard 273: len = snprintf(query, left, "INSERT INTO %s (ID, %s) VALUES (%d, '",
274: table, key, id);
275: if (len < 0) {
276: fprintf(stderr, "sql_blind_insert : %s(%d).%s overflow\n",
277: table, id, key);
278: return(-1);
279: }
280: end = &query[len];
281: left -= len;
282: len = strlen(value);
283: if (len * 2 >= left) {
284: fprintf(stderr, "sql_blind_insert : %s(%d).%s overflow\n",
285: table, id, key);
286: return(-1);
287: }
288: len = mysql_escape_string(end, value, len);
289: left -= len;
290: if (left <= 0) {
291: fprintf(stderr, "sql_blind_insert : %s(%d).%s overflow\n",
292: table, id, key);
293: return(-1);
294: }
295: end += len;
296: len = snprintf(end, left, "')");
297: if (len < 0) {
298: fprintf(stderr, "sql_blind_insert : %s(%d).%s overflow\n",
299: table, id, key);
300: return(-1);
301: }
302: end += len;
303: query[MAX_QUERY - 1] = 0;
304:
1.2 veillard 305: } else {
1.6 veillard 306: len = snprintf(query, left, "INSERT INTO %s (%s) VALUES ('",
307: table, key);
308: if (len < 0) {
309: fprintf(stderr, "sql_blind_insert : %s.%s overflow\n",
310: table, key);
311: return(-1);
312: }
313: end = &query[len];
314: left -= len;
315: len = strlen(value);
316: if (len * 2 >= left) {
317: fprintf(stderr, "sql_blind_insert : %s.%s overflow\n",
318: table, key);
319: return(-1);
320: }
321: len = mysql_escape_string(end, value, len);
322: left -= len;
323: if (left <= 0) {
324: fprintf(stderr, "sql_blind_insert : %s.%s overflow\n",
325: table, key);
326: return(-1);
327: }
328: end += len;
329: len = snprintf(end, left, "')");
330: if (len < 0) {
331: fprintf(stderr, "sql_blind_insert : %s.%s overflow\n",
332: table, key);
333: return(-1);
334: }
335: end += len;
336: query[MAX_QUERY - 1] = 0;
337:
1.2 veillard 338: }
1.6 veillard 339: query[MAX_QUERY - 1] = 0;
1.16 veillard 340: if (do_sql_query(query, (unsigned int) (end - query))) {
1.6 veillard 341: #ifdef SQL_DEBUG
342: fprintf(stderr, "sql_blind_insert Error: %s\n", mysql_error(sql));
343: #endif
1.1 veillard 344: return(-1);
345: }
346: result = mysql_store_result(sql);
1.8 veillard 347: insert = mysql_insert_id(sql);
1.1 veillard 348: if (result) {
349: mysql_free_result(result);
1.8 veillard 350: return(insert);
1.1 veillard 351: }
352: if(mysql_errno(sql)) {
353: fprintf(stderr, "sql_blind_insert Error: %s\n", mysql_error(sql));
354: return(-1);
355: }
1.8 veillard 356: return(insert);
1.1 veillard 357: }
358:
359: int sql_update(const char *table, const char *name,
360: const char *field, const char *value) {
361: MYSQL_RES *result;
362: MYSQL_ROW row;
1.6 veillard 363: char query[MAX_QUERY];
1.1 veillard 364: int id;
365: int nb_fields = 0;
1.6 veillard 366: int left = MAX_QUERY - 1;
367: int len;
368: char *end;
1.1 veillard 369:
370: if ((name == NULL) || (table == NULL) ||
371: (field == NULL) || (value == NULL))
372: return(-1);
373:
374: /*
375: * Search first for the ID if it already exists
376: */
1.6 veillard 377: snprintf(query, MAX_QUERY - 1, "SELECT ID FROM %s WHERE Name='%s'", table, name);
378: query[MAX_QUERY - 1] = 0;
1.1 veillard 379: if (mysql_query(sql,query)) {
380: printf("sql_update: SELECT failed\n");
381: return(-1);
382: }
383:
384: result = mysql_use_result(sql);
385: if (result) {
386: while((row = mysql_fetch_row(result)))
387: {
388: if (row[0] == NULL) {
389: printf("sql_update: select ID for %s returns NULL !\n", name);
390: return(-1);
391: }
392: if (sscanf(row[0], "%d", &id) != 1) {
393: printf("sql_update: ID non numeric %s\n", row[0]);
394: return(-1);
395: }
1.6 veillard 396:
397: left = MAX_QUERY - 1;
398: len = snprintf(query, left, "UPDATE %s SET %s='", table, field);
399: if (len < 0) {
400: fprintf(stderr, "sql_update : %s(%d).%s overflow\n",
401: table, id, field);
402: return(-1);
403: }
404: end = &query[len];
405: left -= len;
406: len = strlen(value);
407: if (len * 2 >= left) {
408: fprintf(stderr, "sql_update : %s(%d).%s overflow\n",
409: table, id, field);
410: return(-1);
411: }
412: len = mysql_escape_string(end, value, len);
413: left -= len;
414: if (left <= 0) {
415: fprintf(stderr, "sql_update : %s(%d).%s overflow\n",
416: table, id, field);
417: return(-1);
418: }
419: end += len;
420: len = snprintf(end, left, "' WHERE ID=%d", id);
421: if (len < 0) {
422: fprintf(stderr, "sql_update : %s(%d).%s overflow\n",
423: table, id, field);
424: return(-1);
425: }
426: end += len;
427: query[MAX_QUERY - 1] = 0;
428:
1.1 veillard 429: mysql_free_result(result);
1.16 veillard 430: if (do_sql_query(query, (unsigned int) (end - query))) {
1.2 veillard 431: printf("sql_update: UPDATE failed: %s\n", mysql_error(sql));
1.1 veillard 432: return(-1);
433: }
434: result = mysql_store_result(sql);
435: if (result != NULL) {
436: nb_fields = mysql_num_fields(result);
437: mysql_free_result(result);
438: } else {
1.2 veillard 439: return(1);
1.1 veillard 440: }
441: /* Do not loop ... only the first */
442: return(nb_fields);
443: }
444: mysql_free_result(result);
1.2 veillard 445: if (nb_fields == 0) {
446: /*
447: * Propagate an insert
448: */
1.6 veillard 449: snprintf(query, MAX_QUERY - 1,
1.2 veillard 450: "INSERT INTO %s (Name,%s) VALUES ('%s','%s')",
451: table, field, name, value);
1.6 veillard 452: query[MAX_QUERY - 1] = 0;
1.2 veillard 453: mysql_free_result(result);
454: if (mysql_query(sql, query)) {
455: printf("sql_update: INSERT failed: %s\n", mysql_error(sql));
456: return(-1);
457: }
458: result = mysql_store_result(sql);
459: if (result != NULL) {
460: nb_fields = mysql_num_fields(result);
461: mysql_free_result(result);
462: } else {
463: return(1);
464: }
465: }
1.1 veillard 466: }
467: if(mysql_errno(sql)) {
468: fprintf(stderr, "sql_update Error: %s\n", mysql_error(sql));
469: return(-1);
470: }
471: return(nb_fields);
472: }
473:
1.6 veillard 474: int sql_get_key(const char *table, const char *name, const char *value) {
1.1 veillard 475: int id;
476: MYSQL_RES *result;
477: MYSQL_ROW row;
1.38 veillard 478: char query[MAX_QUERY];
479: int left = MAX_QUERY - 1;
480: int len;
481: char *end;
1.1 veillard 482:
483: if ((table == NULL) || (name == NULL))
484: return(-1);
485:
1.38 veillard 486:
1.1 veillard 487: /*
488: * Search first for the ID if it already exists
489: */
1.38 veillard 490: len = snprintf(query, left, "SELECT ID FROM %s WHERE %s='",
491: table, name);
492: if (len < 0) {
493: fprintf(stderr, "sql_get_key : %s(%s).%s overflow\n",
494: table, name, value);
495: return(-1);
496: }
497: end = &query[len];
498: left -= len;
499: len = strlen(value);
500: if (len * 2 >= left) {
501: fprintf(stderr, "sql_get_key : %s(%s).%s overflow\n",
502: table, name, value);
503: return(-1);
504: }
505: len = mysql_escape_string(end, value, len);
506: left -= len;
507: if (left <= 0) {
508: fprintf(stderr, "sql_get_key : %s(%s).%s overflow\n",
509: table, name, value);
510: return(-1);
511: }
512: end += len;
513: len = snprintf(end, left, "'");
514: if (len < 0) {
515: fprintf(stderr, "sql_get_key : %s(%s).%s overflow\n",
516: table, name, value);
517: return(-1);
518: }
519: end += len;
520: query[MAX_QUERY - 1] = 0;
521:
1.1 veillard 522: if (mysql_query(sql,query)) {
1.38 veillard 523: printf("sql_get_key: SELECT %s failed %s\n", name, mysql_error(sql));
1.1 veillard 524: return(-1);
525: }
526:
527: result = mysql_use_result(sql);
528: if (result) {
529: while((row = mysql_fetch_row(result)))
530: {
531: /*
532: * Lookup the first ID and return it
533: */
534: if (row[0] == NULL) {
535: mysql_free_result(result);
1.38 veillard 536: printf("sql_get_key: select returns NULL !\n");
1.1 veillard 537: return(-1);
538: }
539: if (sscanf(row[0], "%d", &id) != 1) {
540: mysql_free_result(result);
1.38 veillard 541: printf("sql_get_key: ID non numeric %s\n", row[0]);
1.1 veillard 542: return(-1);
543: }
544: mysql_free_result(result);
545: return(id);
546: }
547: mysql_free_result(result);
548: }
549: if(mysql_errno(sql)) {
550: fprintf(stderr, "Error: %s\n", mysql_error(sql));
551: return(-1);
552: }
553:
554: /*
555: * Do a creation
556: */
557:
1.6 veillard 558: query[SMALL_QUERY - 1] = 0;
1.38 veillard 559: len = snprintf(query, left, "INSERT INTO %s (%s) VALUES ('",
560: table, name);
561: if (len < 0) {
562: fprintf(stderr, "sql_get_key : %s(%s).%s overflow\n",
563: table, name, value);
564: return(-1);
565: }
566: end = &query[len];
567: left -= len;
568: len = strlen(value);
569: if (len * 2 >= left) {
570: fprintf(stderr, "sql_get_key : %s(%s).%s overflow\n",
571: table, name, value);
572: return(-1);
573: }
574: len = mysql_escape_string(end, value, len);
575: left -= len;
576: if (left <= 0) {
577: fprintf(stderr, "sql_get_key : %s(%s).%s overflow\n",
578: table, name, value);
579: return(-1);
580: }
581: end += len;
582: len = snprintf(end, left, "')");
583: if (len < 0) {
584: fprintf(stderr, "sql_get_key : %s(%s).%s overflow\n",
585: table, name, value);
586: return(-1);
587: }
588: end += len;
589: query[MAX_QUERY - 1] = 0;
590:
1.1 veillard 591: if (mysql_query(sql,query)) {
1.2 veillard 592: printf("sql_get_key: INSERT %s failed %s\n", name, mysql_error(sql));
1.1 veillard 593: return(-1);
594: }
595: id = mysql_insert_id(sql);
596: result = mysql_store_result(sql);
597: if (result != NULL)
598: mysql_free_result(result);
599: return(id);
600: }
601:
602: int sql_read_key(const char *table, const char *name) {
603: int id;
604: MYSQL_RES *result;
605: MYSQL_ROW row;
1.6 veillard 606: char query[SMALL_QUERY];
1.1 veillard 607:
608: if ((table == NULL) || (name == NULL))
609: return(-1);
610:
611: /*
612: * Search for the ID it has to exist
613: */
1.6 veillard 614: snprintf(query, SMALL_QUERY - 1, "SELECT ID FROM %s WHERE Name='%s'", table, name);
615: query[SMALL_QUERY - 1] = 0;
1.2 veillard 616: if (mysql_query(sql,query)) {
1.38 veillard 617: printf("sql_read_key: SELECT %s failed %s\n", name, mysql_error(sql));
1.2 veillard 618: return(-1);
619: }
620:
621: result = mysql_use_result(sql);
622: if (result) {
623: while((row = mysql_fetch_row(result)))
624: {
625: /*
626: * Lookup the first ID and return it
627: */
628: if (row[0] == NULL) {
629: mysql_free_result(result);
1.38 veillard 630: printf("sql_read_key: select returns NULL !\n");
1.2 veillard 631: return(-1);
632: }
633: if (sscanf(row[0], "%d", &id) != 1) {
634: mysql_free_result(result);
1.38 veillard 635: printf("sql_read_key: ID non numeric %s\n", row[0]);
1.2 veillard 636: return(-1);
637: }
638: mysql_free_result(result);
639: return(id);
640: }
641: mysql_free_result(result);
642: }
643: if(mysql_errno(sql)) {
644: fprintf(stderr, "Error: %s\n", mysql_error(sql));
645: return(-1);
646: }
647: return(-1);
648: }
649:
650: int sql_read_info_key(const char *table, const char *name, const char *value) {
651: int id;
652: MYSQL_RES *result;
653: MYSQL_ROW row;
1.6 veillard 654: char query[SMALL_QUERY];
1.2 veillard 655:
656: if ((table == NULL) || (name == NULL) || (value == NULL))
657: return(-1);
658:
659: /*
660: * Search for the ID it has to exist
661: */
1.6 veillard 662: snprintf(query, SMALL_QUERY - 1, "SELECT ID FROM %s WHERE %s='%s'", table, name, value);
663: query[SMALL_QUERY - 1] = 0;
1.1 veillard 664: if (mysql_query(sql,query)) {
1.38 veillard 665: printf("sql_read_info_key: SELECT %s failed %s\n", name, mysql_error(sql));
1.1 veillard 666: return(-1);
667: }
668:
669: result = mysql_use_result(sql);
670: if (result) {
671: while((row = mysql_fetch_row(result)))
672: {
673: /*
674: * Lookup the first ID and return it
675: */
676: if (row[0] == NULL) {
677: mysql_free_result(result);
1.38 veillard 678: printf("sql_read_info_key: select returns NULL !\n");
1.1 veillard 679: return(-1);
680: }
681: if (sscanf(row[0], "%d", &id) != 1) {
682: mysql_free_result(result);
1.38 veillard 683: printf("sql_read_info_key: ID non numeric %s\n", row[0]);
1.1 veillard 684: return(-1);
685: }
686: mysql_free_result(result);
687: return(id);
688: }
689: mysql_free_result(result);
690: }
691: if(mysql_errno(sql)) {
692: fprintf(stderr, "Error: %s\n", mysql_error(sql));
693: return(-1);
694: }
695: return(-1);
696: }
697:
698: /************************************************************************
699: * *
700: * Tables handling *
701: * *
702: ************************************************************************/
703:
1.2 veillard 704: int sql_rebuild_config(void) {
705: const char *query =
706: "CREATE TABLE Config ( \n\
707: ID int(11) NOT NULL auto_increment, \n\
708: Name varchar(50) NOT NULL, \n\
709: Value varchar(255), \n\
710: PRIMARY KEY (ID), \n\
711: KEY Name (Name(10)) \n\
712: )";
713:
714: if (mysql_query(sql,query)) {
715: printf("sql_rebuild_config: CREATE TABLE Config failed %s\n",
716: mysql_error(sql));
717: return(-1);
718: }
719: return(0);
720: }
721:
1.1 veillard 722: int sql_rebuild_vendors(void) {
723: const char *query =
724: "CREATE TABLE Vendors ( \n\
725: ID int(11) NOT NULL auto_increment, \n\
726: Name varchar(255) NOT NULL, \n\
727: URL varchar(255), \n\
728: Key1 text, \n\
729: Key2 text, \n\
730: Key3 text, \n\
731: Description text, \n\
732: PRIMARY KEY (ID), \n\
733: KEY Name (Name(10)) \n\
734: )";
735:
736: if (mysql_query(sql,query)) {
1.2 veillard 737: printf("sql_rebuild_vendors: CREATE TABLE Vendors failed %s\n",
1.1 veillard 738: mysql_error(sql));
739: return(-1);
740: }
741: return(0);
742: }
743:
1.36 veillard 744: int sql_rebuild_distributions(void) {
745: const char *query =
746: "CREATE TABLE Distributions ( \n\
747: ID int(11) NOT NULL auto_increment, \n\
748: Name varchar(255) NOT NULL, \n\
749: URL varchar(255), \n\
750: Key1 text, \n\
751: Key2 text, \n\
752: Key3 text, \n\
753: Description text, \n\
754: PRIMARY KEY (ID), \n\
755: KEY Name (Name(10)) \n\
756: )";
757:
758: if (mysql_query(sql,query)) {
759: printf("sql_rebuild_ditributions: CREATE TABLE Distributions failed %s\n",
760: mysql_error(sql));
761: return(-1);
762: }
763: return(0);
764: }
765:
1.1 veillard 766: int sql_rebuild_mirrors(void) {
767: const char *query =
768: "CREATE TABLE Mirrors ( \n\
769: ID int(11), \n\
770: URL varchar(255) NOT NULL, \n\
771: Country int(11), \n\
772: UNIQUE(URL) \n\
773: )";
774:
775: if (mysql_query(sql,query)) {
1.2 veillard 776: printf("sql_rebuild_mirrors: CREATE TABLE Mirrors failed %s\n",
777: mysql_error(sql));
778: return(-1);
779: }
780: return(0);
781: }
782:
783: int sql_rebuild_metadata(void) {
784: const char *query =
785: "CREATE TABLE Metadata ( \n\
786: URL varchar(255) NOT NULL, \n\
787: Maintainer int(11), \n\
788: Country int(11), \n\
789: UNIQUE(URL) \n\
790: )";
791:
792: if (mysql_query(sql,query)) {
793: printf("sql_rebuild_metadata: CREATE TABLE Metadata failed %s\n",
1.1 veillard 794: mysql_error(sql));
795: return(-1);
796: }
797: return(0);
798: }
799:
800: int sql_rebuild_distribs(void) {
801: const char *query =
802: "CREATE TABLE Distribs ( \n\
803: ID int(11) NOT NULL auto_increment, \n\
804: Name varchar(255) NOT NULL, \n\
805: Vendor int(11), \n\
1.2 veillard 806: Directory varchar(255), \n\
1.1 veillard 807: Path varchar(100) NOT NULL, \n\
808: URL varchar(255), \n\
809: URLSrc varchar(255), \n\
1.9 veillard 810: Html varchar(8), \n\
811: Color varchar(10), \n\
1.1 veillard 812: Key1 text, \n\
813: Key2 text, \n\
814: Description text, \n\
815: PRIMARY KEY (ID), \n\
816: KEY Name (Name(10)) \n\
817: )";
818:
819: if (mysql_query(sql,query)) {
1.2 veillard 820: printf("sql_rebuild_distribs: CREATE TABLE Distribs failed %s\n",
821: mysql_error(sql));
822: return(-1);
823: }
824: return(0);
825: }
826:
827: int sql_rebuild_packages(void) {
828: const char *query =
829: "CREATE TABLE Packages ( \n\
830: ID int(11) NOT NULL auto_increment, \n\
831: filename varchar(255) NOT NULL, \n\
832: Name varchar(50) NOT NULL, \n\
833: Version varchar(50) NOT NULL, \n\
834: Release varchar(50) NOT NULL, \n\
1.6 veillard 835: Arch varchar(15) NOT NULL, \n\
1.2 veillard 836: Dist int(11), \n\
837: URL varchar(255), \n\
838: URLSrc varchar(255), \n\
839: Vendor int(11), \n\
840: Packager int(11), \n\
841: Category varchar(255), \n\
842: Summary varchar(255), \n\
843: Description text, \n\
844: Copyright varchar(255), \n\
1.25 veillard 845: Date int(11), \n\
1.41 ! veillard 846: Size int(11), \n\
1.33 veillard 847: Os varchar(12), \n\
1.2 veillard 848: PRIMARY KEY (ID), \n\
1.7 veillard 849: KEY filename (filename(80)), \n\
850: KEY Name (Name(15)) \n\
1.2 veillard 851: )";
852:
853: if (mysql_query(sql,query)) {
854: printf("sql_rebuild_packages: CREATE TABLE Packages failed %s\n",
855: mysql_error(sql));
856: return(-1);
857: }
858: return(0);
859: }
860:
861: int sql_rebuild_files(void) {
862: const char *query =
863: "CREATE TABLE Files ( \n\
1.6 veillard 864: ID int(11) NOT NULL, \n\
1.7 veillard 865: Path varchar(35) NOT NULL, \n\
866: UNIQUE KEY id (ID,Path(35)), \n\
1.6 veillard 867: INDEX (ID), \n\
868: INDEX (Path) \n\
1.2 veillard 869: )";
870:
871: if (mysql_query(sql,query)) {
872: printf("sql_rebuild_files: CREATE TABLE Files failed %s\n",
1.1 veillard 873: mysql_error(sql));
874: return(-1);
875: }
876: return(0);
877: }
878:
1.8 veillard 879: int sql_rebuild_provides(void) {
880: const char *query =
881: "CREATE TABLE Provides ( \n\
882: ID int(11) NOT NULL, \n\
883: Resource varchar(35) NOT NULL, \n\
884: UNIQUE KEY id (ID,Resource(35)), \n\
885: INDEX (ID), \n\
886: INDEX (Resource) \n\
887: )";
888:
889: if (mysql_query(sql,query)) {
1.21 daniel 890: printf("sql_rebuild_provides: CREATE TABLE Provides failed %s\n",
1.8 veillard 891: mysql_error(sql));
892: return(-1);
893: }
894: return(0);
895: }
896:
897: int sql_rebuild_requires(void) {
898: const char *query =
899: "CREATE TABLE Requires ( \n\
900: ID int(11) NOT NULL, \n\
901: Resource varchar(35) NOT NULL, \n\
902: Rel char(2), \n\
903: Value varchar(20), \n\
904: UNIQUE KEY id (ID,Resource(35)), \n\
905: INDEX (ID), \n\
906: INDEX (Resource) \n\
907: )";
908:
909: if (mysql_query(sql,query)) {
1.21 daniel 910: printf("sql_rebuild_requires: CREATE TABLE Requires failed %s\n",
911: mysql_error(sql));
912: return(-1);
913: }
914: return(0);
915: }
916:
917: int sql_rebuild_queries(void) {
918: const char *query =
919: "CREATE TABLE Queries ( \n\
920: ID int(11) NOT NULL auto_increment,\n\
921: Value varchar(50) NOT NULL, \n\
922: Count int(11) NOT NULL, \n\
923: Results int(11) NOT NULL, \n\
924: UNIQUE KEY id (ID,Value(35)), \n\
925: INDEX (ID), \n\
926: INDEX (Value) \n\
927: )";
928:
929: if (mysql_query(sql,query)) {
930: printf("sql_rebuild_queries: CREATE TABLE Queries failed %s\n",
1.8 veillard 931: mysql_error(sql));
932: return(-1);
933: }
934: return(0);
935: }
936:
1.1 veillard 937:
938: int sql_check_tables(void) {
939: const char *query = "SHOW TABLES";
940: MYSQL_RES *result;
941: MYSQL_ROW row;
1.2 veillard 942: int config = 0;
1.1 veillard 943: int distribs = 0;
1.8 veillard 944: int requires = 0;
945: int provides = 0;
1.1 veillard 946: int vendors = 0;
947: int mirrors = 0;
1.2 veillard 948: int metadata = 0;
949: int packages = 0;
950: int files = 0;
1.21 daniel 951: int queries = 0;
1.36 veillard 952: int distributions = 0;
1.2 veillard 953:
1.1 veillard 954: int rebuilt = 0;
955:
956: if (mysql_query(sql,query)) {
1.2 veillard 957: printf("sql_check_tables: SHOW TABLES failed %s\n",
1.1 veillard 958: mysql_error(sql));
959: return(-1);
960: }
961:
962: result = mysql_use_result(sql);
963: if (result) {
964: while((row = mysql_fetch_row(result)))
965: {
966: if (row[0] == NULL) {
967: mysql_free_result(result);
968: printf("sql_check_tables: SHOW TABLES returns NULL !\n");
969: return(-1);
970: }
1.2 veillard 971: if (!strcmp(row[0], "Config"))
972: config = 1;
1.1 veillard 973: if (!strcmp(row[0], "Distribs"))
974: distribs = 1;
975: if (!strcmp(row[0], "Vendors"))
976: vendors = 1;
977: if (!strcmp(row[0], "Mirrors"))
978: mirrors = 1;
1.2 veillard 979: if (!strcmp(row[0], "Metadata"))
980: metadata = 1;
981: if (!strcmp(row[0], "Packages"))
982: packages = 1;
983: if (!strcmp(row[0], "Files"))
984: files = 1;
1.8 veillard 985: if (!strcmp(row[0], "Requires"))
986: requires = 1;
987: if (!strcmp(row[0], "Provides"))
988: provides = 1;
1.21 daniel 989: if (!strcmp(row[0], "Queries"))
990: queries = 1;
1.36 veillard 991: if (!strcmp(row[0], "Distributions"))
992: distributions = 1;
1.1 veillard 993: }
994: mysql_free_result(result);
995: }
996: if(mysql_errno(sql)) {
997: fprintf(stderr, "Error: %s\n", mysql_error(sql));
998: return(-1);
999: }
1000:
1.2 veillard 1001: if (!config) {
1002: fprintf(stderr, "Table Config disapeared: rebuilding it\n");
1003: if (!sql_rebuild_config())
1004: rebuilt++;
1005: }
1.1 veillard 1006: if (!vendors) {
1007: fprintf(stderr, "Table Vendors disapeared: rebuilding it\n");
1008: if (!sql_rebuild_vendors())
1009: rebuilt++;
1010: }
1011: if (!distribs) {
1012: fprintf(stderr, "Table Distribs disapeared: rebuilding it\n");
1013: if (!sql_rebuild_distribs())
1014: rebuilt++;
1015: }
1016: if (!mirrors) {
1017: fprintf(stderr, "Table Mirrors disapeared: rebuilding it\n");
1018: if (!sql_rebuild_mirrors())
1019: rebuilt++;
1020: }
1.2 veillard 1021: if (!metadata) {
1022: fprintf(stderr, "Table Metadata disapeared: rebuilding it\n");
1023: if (!sql_rebuild_metadata())
1024: rebuilt++;
1025: }
1026: if (!packages) {
1027: fprintf(stderr, "Table Packages disapeared: rebuilding it\n");
1028: if (!sql_rebuild_packages())
1029: rebuilt++;
1030: }
1031: if (!files) {
1032: fprintf(stderr, "Table Files disapeared: rebuilding it\n");
1033: if (!sql_rebuild_files())
1034: rebuilt++;
1035: }
1.8 veillard 1036: if (!requires) {
1037: fprintf(stderr, "Table Requires disapeared: rebuilding it\n");
1038: if (!sql_rebuild_requires())
1039: rebuilt++;
1040: }
1041: if (!provides) {
1042: fprintf(stderr, "Table Provides disapeared: rebuilding it\n");
1043: if (!sql_rebuild_provides())
1.21 daniel 1044: rebuilt++;
1045: }
1046: if (!queries) {
1047: fprintf(stderr, "Table Queries disapeared: rebuilding it\n");
1048: if (!sql_rebuild_queries())
1.8 veillard 1049: rebuilt++;
1050: }
1.36 veillard 1051: if (!distributions) {
1052: fprintf(stderr, "Table Distributions disapeared: rebuilding it\n");
1053: if (!sql_rebuild_distributions())
1054: rebuilt++;
1055: }
1.1 veillard 1056: return(rebuilt);
1057: }
1058:
1059: /************************************************************************
1060: * *
1061: * Specific rpm2html functions *
1062: * *
1063: ************************************************************************/
1064:
1.5 veillard 1065: int sql_add_dist_mirror(int distrib, const char *URL, int country) {
1.1 veillard 1066: if (URL == NULL)
1067: return(-1);
1068: if (distrib < 0)
1069: return(-1);
1070: return(sql_blind_insert("Mirrors", "URL", URL, distrib));
1071: }
1072:
1.5 veillard 1073: int sql_add_mirror(const char *Name, const char *URL, int country) {
1.1 veillard 1074: int distrib;
1075:
1076: if ((Name == NULL) || (URL == NULL))
1077: return(-1);
1078: distrib = sql_read_key("Distribs", Name);
1079: if (distrib < 0)
1080: return(distrib);
1081: return(sql_blind_insert("Mirrors", "URL", URL, distrib));
1082: }
1083:
1.6 veillard 1084: int sql_add_file(const char *filename, int package) {
1085: if ((filename == NULL) || (package <= 0))
1086: return(-1);
1.7 veillard 1087: if (strlen(filename) > 35)
1088: return(0);
1.6 veillard 1089:
1090: return(sql_blind_insert("Files", "Path", filename, package));
1091: }
1092:
1.8 veillard 1093: int sql_add_provides(int package, const char *resource) {
1094: if ((resource == NULL) || (package <= 0))
1095: return(-1);
1096: if (strlen(resource) > 35)
1097: return(0);
1098:
1099: return(sql_blind_insert("Provides", "Resource", resource, package));
1100: }
1101:
1.14 veillard 1102: int sql_add_requires(int package, const char *resource, rpm_dep_flag rel,
1.8 veillard 1103: const char *value) {
1104: int record;
1105: if ((resource == NULL) || (package <= 0))
1106: return(-1);
1107: if (strlen(resource) > 35)
1108: return(0);
1109:
1110: record = sql_blind_insert("Requires", "Resource", resource, package);
1.14 veillard 1111: if ((rel != RPM2HTML_REQ_NONE) && (value != NULL) &&
1112: (strlen(value) <= 50)) {
1.8 veillard 1113: char query[SMALL_QUERY];
1.14 veillard 1114:
1115: switch (rel) {
1116: case RPM2HTML_REQ_LT:
1117: snprintf(query, SMALL_QUERY - 1,
1118: "UPDATE Requires SET Rel='<',Value='%s' WHERE ID=%d",
1119: value, record);
1.15 daniel 1120: break;
1.14 veillard 1121: case RPM2HTML_REQ_LEQ:
1122: snprintf(query, SMALL_QUERY - 1,
1123: "UPDATE Requires SET Rel='<=',Value='%s' WHERE ID=%d",
1124: value, record);
1.15 daniel 1125: break;
1.14 veillard 1126: case RPM2HTML_REQ_GT:
1127: snprintf(query, SMALL_QUERY - 1,
1128: "UPDATE Requires SET Rel='>',Value='%s' WHERE ID=%d",
1129: value, record);
1.15 daniel 1130: break;
1.14 veillard 1131: case RPM2HTML_REQ_GEQ:
1132: snprintf(query, SMALL_QUERY - 1,
1133: "UPDATE Requires SET Rel='>=',Value='%s' WHERE ID=%d",
1134: value, record);
1.15 daniel 1135: break;
1.14 veillard 1136: case RPM2HTML_REQ_EQU:
1137: snprintf(query, SMALL_QUERY - 1,
1138: "UPDATE Requires SET Rel='=',Value='%s' WHERE ID=%d",
1139: value, record);
1.15 daniel 1140: break;
1.14 veillard 1141: case RPM2HTML_REQ_NONE:
1142: query[0] = 0;
1143: }
1.8 veillard 1144: query[SMALL_QUERY - 1] = 0;
1145: if (mysql_query(sql,query)) {
1.38 veillard 1146: printf("sql_add_requires: UPDATE Requires %d failed %s\n",
1.8 veillard 1147: record, mysql_error(sql));
1148: return(record);
1149: }
1150: }
1151: return(record);
1152: }
1153:
1.34 veillard 1154: int sql_add_vendor(const char *Name, const char *URL, const char *Description) {
1155: int id;
1156:
1157: if (Name == NULL)
1158: return(-1);
1159:
1160: id = sql_get_key("Vendors", "Name", Name);
1161: if (id <= 0) {
1162: id = sql_blind_insert("Vendors", "Name", Name, 0);
1163: if (id <= 0)
1164: return(id);
1165: }
1166: if (URL != NULL)
1167: sql_update_id("Vendors", id, "URL", URL);
1168: if (Description != NULL)
1169: sql_update_id("Vendors", id,
1170: "Description", Description);
1171:
1172: return(id);
1173: }
1174:
1.36 veillard 1175: int sql_add_distribution(const char *Name, const char *URL, const char *Description) {
1176: int id;
1177:
1178: if (Name == NULL)
1179: return(-1);
1180:
1181: id = sql_get_key("Distributions", "Name", Name);
1182: if (id <= 0) {
1183: id = sql_blind_insert("Distributions", "Name", Name, 0);
1184: if (id <= 0)
1185: return(id);
1186: }
1187: if (URL != NULL)
1188: sql_update_id("Distributions", id, "URL", URL);
1189: if (Description != NULL)
1190: sql_update_id("Distributions", id,
1191: "Description", Description);
1192:
1193: return(id);
1194: }
1195:
1.34 veillard 1196:
1.5 veillard 1197: int sql_add_package(const char *filename,
1.2 veillard 1198: const char *Name, const char *Version, const char *Release,
1.6 veillard 1199: const char *Arch,
1200: int dist, const char *URL, const char *URLSrc, int vendor,
1.2 veillard 1201: const char *Packager, const char *Category, const char *Summary,
1.41 ! veillard 1202: const char *Description, const char *Copyright, int Date, int Size,
1.36 veillard 1203: const char *Os, const char *Distribution) {
1.2 veillard 1204: int id;
1205: int nb_fields = 0;
1.35 veillard 1206: char installed_filename[500];
1.2 veillard 1207:
1.35 veillard 1208: if (filename == NULL) {
1209: sprintf(installed_filename, "localbase/%s-%s-%s.%s.rpm",
1210: Name,Version,Release,Arch);
1211: filename = installed_filename;
1212: }
1.6 veillard 1213:
1214: if (dist < 0)
1.2 veillard 1215: return(-1);
1.6 veillard 1216: if ((Name == NULL) || (Version == NULL) || (Release == NULL) ||
1217: (Arch == NULL))
1218: return(-1);
1219:
1220: id = sql_get_key("Packages", "filename", filename);
1.2 veillard 1221: if (id <= 0)
1222: return(-1);
1223: nb_fields = 1;
1.8 veillard 1224:
1225: if (rpm2htmlVerbose > 1)
1226: printf("Adding %s ID %d\n", filename, id);
1227:
1.2 veillard 1228: if (Name != NULL)
1.6 veillard 1229: nb_fields += sql_update_id("Packages", id, "Name", Name);
1.2 veillard 1230: if (Version != NULL)
1231: nb_fields += sql_update_id("Packages", id, "Version", Version);
1232: if (Release != NULL)
1233: nb_fields += sql_update_id("Packages", id, "Release", Release);
1.6 veillard 1234: if (Release != NULL)
1235: nb_fields += sql_update_id("Packages", id, "Arch", Arch);
1.2 veillard 1236: if (Category != NULL)
1237: nb_fields += sql_update_id("Packages", id, "Category", Category);
1238: if (URL != NULL)
1239: nb_fields += sql_update_id("Packages", id, "URL", URL);
1240: if (URLSrc != NULL)
1241: nb_fields += sql_update_id("Packages", id, "URLSrc", URLSrc);
1.17 veillard 1242: if (dist >= 0) {
1243: char str[30];
1244: snprintf(str, 30, "%d", dist);
1245: str[29] = 0;
1246: nb_fields += sql_update_id("Packages", id, "Dist", str);
1247: }
1.38 veillard 1248: if (Summary != NULL) {
1.2 veillard 1249: nb_fields += sql_update_id("Packages", id, "Summary", Summary);
1.38 veillard 1250: }
1251: if (Description != NULL) {
1.2 veillard 1252: nb_fields += sql_update_id("Packages", id,
1253: "Description", Description);
1.38 veillard 1254: }
1.2 veillard 1255: if (Copyright != NULL)
1256: nb_fields += sql_update_id("Packages", id, "Copyright", Copyright);
1.25 veillard 1257: if (Date != 0) {
1258: char str[30];
1259: snprintf(str, 30, "%d", Date);
1260: str[29] = 0;
1261: nb_fields += sql_update_id("Packages", id, "Date", str);
1262: }
1.41 ! veillard 1263: if (Size != 0) {
! 1264: char str[30];
! 1265: snprintf(str, 30, "%d", Size);
! 1266: str[29] = 0;
! 1267: nb_fields += sql_update_id("Packages", id, "Size", str);
! 1268: }
1.38 veillard 1269: if (Os != NULL) {
1.33 veillard 1270: nb_fields += sql_update_id("Packages", id, "Os", Os);
1.38 veillard 1271: }
1.34 veillard 1272: if (Packager != NULL) {
1273: char str[30];
1.35 veillard 1274: int packager = sql_add_vendor(Packager, NULL, NULL);
1.34 veillard 1275:
1.35 veillard 1276: if (packager > 0) {
1277: snprintf(str, 30, "%d", packager);
1.34 veillard 1278: str[29] = 0;
1.35 veillard 1279: nb_fields += sql_update_id("Packages", id, "Packager", str);
1.34 veillard 1280: }
1281: }
1.36 veillard 1282: if (Distribution != NULL) {
1283: char str[30];
1284: int packager = sql_add_distribution(Distribution, NULL, NULL);
1285:
1286: if (packager > 0) {
1287: snprintf(str, 30, "%d", packager);
1288: str[29] = 0;
1289: nb_fields += sql_update_id("Packages", id, "Vendor", str);
1290: }
1291: }
1292: /***************
1293: if (vendor > 0) {
1294: char str[30];
1295: snprintf(str, 30, "%d", vendor);
1296: str[29] = 0;
1297: nb_fields += sql_update_id("Packages", id, "Vendor", str);
1298: }
1299: ***************/
1.2 veillard 1300:
1.6 veillard 1301: return(id);
1.17 veillard 1302: }
1303:
1304: int sql_get_distrib_by_name(const char *Name) {
1305: int ret;
1306:
1307: if (Name == NULL)
1308: return(-1);
1309: ret = sql_read_key("Distribs", Name);
1310:
1.18 daniel 1311: #ifdef SQL_DEBUG
1.17 veillard 1312: fprintf(stderr, "sql_get_distrib_by_name(%s) => %d\n", Name, ret);
1.18 daniel 1313: #endif
1.17 veillard 1314:
1315: return(ret);
1316: }
1317:
1318: int sql_get_distrib_by_directory(const char *Directory) {
1319: int ret;
1320:
1321: if (Directory == NULL)
1322: return(-1);
1323:
1324: ret = sql_get_key("Distribs", "Directory", Directory);
1325:
1.18 daniel 1326: #ifdef SQL_DEBUG
1.17 veillard 1327: fprintf(stderr, "sql_get_distrib_by_directory(%s) => %d\n", Directory, ret);
1.18 daniel 1328: #endif
1.17 veillard 1329:
1330: return(ret);
1.2 veillard 1331: }
1332:
1.5 veillard 1333: int sql_add_distrib(const char *Name, const char *Vendor,
1.2 veillard 1334: const char *Directory, const char *Path, const char *URL,
1.9 veillard 1335: const char *URLSrc, const char *Description,
1336: const char *Html, const char *Color) {
1.1 veillard 1337: int id, vendor;
1338: int nb_fields = 0;
1339: char VendorStr[15];
1340:
1341: if (Name == NULL)
1342: return(-1);
1343:
1.6 veillard 1344: id = sql_get_key("Distribs", "Name", Name);
1.1 veillard 1345: nb_fields = 1;
1346: if (Vendor != NULL) {
1.6 veillard 1347: vendor = sql_get_key("Vendors", "Name", Vendor);
1.1 veillard 1348: sprintf(VendorStr, "%d", vendor);
1349: nb_fields += sql_update_id("Distribs", id, "Vendor", VendorStr);
1350: }
1.2 veillard 1351: if (Directory != NULL)
1352: nb_fields += sql_update_id("Distribs", id, "Directory", Directory);
1.1 veillard 1353: if (Path != NULL)
1354: nb_fields += sql_update_id("Distribs", id, "Path", Path);
1355: if (URL != NULL)
1356: nb_fields += sql_update_id("Distribs", id, "URL", URL);
1357: if (URLSrc != NULL)
1358: nb_fields += sql_update_id("Distribs", id, "URLSrc", URLSrc);
1.9 veillard 1359: if (Html != NULL)
1360: nb_fields += sql_update_id("Distribs", id, "Html", Html);
1361: if (Color != NULL)
1362: nb_fields += sql_update_id("Distribs", id, "Color", Color);
1.1 veillard 1363: if (Description != NULL)
1364: nb_fields += sql_update_id("Distribs", id,
1365: "Description", Description);
1366:
1367: return(nb_fields);
1368: }
1369:
1.5 veillard 1370: void sql_add_config_info(const char *name, const char *value) {
1.2 veillard 1371: sql_update("Config", name, "Value", value);
1372: }
1373:
1.5 veillard 1374: void sql_add_metadata_base(const char *URL) {
1.2 veillard 1375: sql_blind_insert("Metadata", "URL", URL, -1);
1376: }
1377:
1.6 veillard 1378: /************************************************************************
1379: * *
1.8 veillard 1380: * Cleanup functions *
1381: * *
1382: ************************************************************************/
1383:
1384: int sql_remove_package(int id) {
1385: char query[SMALL_QUERY];
1386:
1387: if (id <= 0)
1388: return(-1);
1389:
1390: /*
1391: * remove the ID from the package list
1392: */
1393: snprintf(query, SMALL_QUERY - 1, "DELETE FROM Packages WHERE ID=%d", id);
1394: query[SMALL_QUERY - 1] = 0;
1395: if (mysql_query(sql,query)) {
1.38 veillard 1396: printf("sql_remove_package: DELETE package %d failed %s\n", id, mysql_error(sql));
1.8 veillard 1397: return(-1);
1398: }
1399: if(mysql_errno(sql)) {
1400: fprintf(stderr, "Error: %s\n", mysql_error(sql));
1401: return(-1);
1402: }
1403:
1404: /*
1405: * remove the associated files from the Files list
1406: */
1407: snprintf(query, SMALL_QUERY - 1, "DELETE FROM Files WHERE ID=%d", id);
1408: query[SMALL_QUERY - 1] = 0;
1409: if (mysql_query(sql,query)) {
1.38 veillard 1410: printf("sql_remove_package: DELETE Files %d failed %s\n", id, mysql_error(sql));
1.8 veillard 1411: return(-1);
1412: }
1413: if(mysql_errno(sql)) {
1414: fprintf(stderr, "Error: %s\n", mysql_error(sql));
1415: return(-1);
1416: }
1417:
1418: /*
1419: * remove the associated Provides entries
1420: */
1421: snprintf(query, SMALL_QUERY - 1, "DELETE FROM Provides WHERE ID=%d", id);
1422: query[SMALL_QUERY - 1] = 0;
1423: if (mysql_query(sql,query)) {
1.38 veillard 1424: printf("sql_remove_package: DELETE Provides %d failed %s\n", id, mysql_error(sql));
1.8 veillard 1425: return(-1);
1426: }
1427: if(mysql_errno(sql)) {
1428: fprintf(stderr, "Error: %s\n", mysql_error(sql));
1429: return(-1);
1430: }
1431:
1432: /*
1433: * remove the associated Requires entries
1434: */
1435: snprintf(query, SMALL_QUERY - 1, "DELETE FROM Requires WHERE ID=%d", id);
1436: query[SMALL_QUERY - 1] = 0;
1437: if (mysql_query(sql,query)) {
1.38 veillard 1438: printf("sql_remove_package: DELETE Requires %d failed %s\n", id, mysql_error(sql));
1.8 veillard 1439: return(-1);
1440: }
1441: if(mysql_errno(sql)) {
1442: fprintf(stderr, "Error: %s\n", mysql_error(sql));
1443: return(-1);
1444: }
1445:
1446: return(-1);
1447: }
1448:
1449: int sql_check_packages(void) {
1450: MYSQL_RES *result;
1451: MYSQL_ROW row;
1.20 daniel 1452: char *query = "SELECT filename,ID FROM Packages";
1.8 veillard 1453: struct stat buf;
1454: int id;
1.22 daniel 1455: int ids[2500]; /* Do not remove more than 2500 package per run */
1.8 veillard 1456: int index;
1457: int total = 0;
1458:
1459: if (rpm2htmlVerbose)
1460: printf("Database cleanup\n");
1461: index = 0;
1462: /*
1463: * Search first for the ID if it already exists
1464: */
1465: if (mysql_query(sql,query)) {
1466: printf("sql_check_packages: SELECT from Packages failed: %s\n",
1467: mysql_error(sql));
1468: return(-1);
1469: }
1470:
1471: result = mysql_use_result(sql);
1472: if (result) {
1473: while((row = mysql_fetch_row(result)))
1474: {
1475: if ((row[0] == NULL) || (row[1] == NULL)) {
1476: printf("sql_check_packages: Path or ID is NULL !\n");
1477: continue;
1478: }
1.35 veillard 1479: if (!strncmp(row[0], "localbase", 9))
1480: continue;
1481:
1.8 veillard 1482: if ((stat(row[0], &buf) < 0) || (buf.st_size < 50)) {
1483: /*
1484: * Need to remove the package from the database.
1485: */
1486: if (sscanf(row[1], "%d", &id) != 1) {
1487: printf("sql_check_packages: ID non numeric %s\n", row[1]);
1488: continue;
1489: }
1490: ids[index++] = id;
1.20 daniel 1491: if (rpm2htmlVerbose)
1.8 veillard 1492: printf("Removing %s ID %d\n", row[0], id);
1.22 daniel 1493: if (index >= 2500)
1.8 veillard 1494: break;
1495: }
1496: }
1497: mysql_free_result(result);
1498: }
1499: if(mysql_errno(sql)) {
1500: fprintf(stderr, "sql_update Error: %s\n", mysql_error(sql));
1501: return(-1);
1502: }
1503:
1504: /*
1505: * Do the cleanup.
1506: */
1.20 daniel 1507: if (rpm2htmlVerbose)
1508: printf("Database cleanup : removing %d entries...\n", index);
1.8 veillard 1509: for (id = 0;id < index;id++) {
1510: sql_remove_package(ids[id]);
1511: }
1512:
1.34 veillard 1513: printf("Database cleanup : removed %d entries\n", index);
1.8 veillard 1514: return(total);
1515: }
1516:
1517: /************************************************************************
1.26 veillard 1518: * *
1519: * Package lists extraction *
1520: * *
1521: ************************************************************************/
1522: int sqlDirListInitialized = 0;
1523: rpmDirPtr sqlDirList[SQL_MAX_DISTRIBS];
1.35 veillard 1524: int sqlVendorListInitialized = 0;
1525: int sqlVendorListLen;
1526: char **sqlVendorList;
1.36 veillard 1527: int sqlDistributionListInitialized = 0;
1528: int sqlDistributionListLen;
1529: char **sqlDistributionList;
1.40 veillard 1530: int sqlResourceListInitialized = 0;
1531: int sqlResourceListLen = 0;
1532: int sqlResourceListMax = 0;
1533: char **sqlResourceList;
1534:
1535: char *
1536: sqlRpmAnalyzeResourceRow(MYSQL_ROW row) {
1537: const char *name;
1538: char **tmp, *ret;
1539:
1540: if (row == NULL)
1541: return(NULL);
1542: name = row[0];
1543: if (name == NULL)
1544: return(NULL);
1545:
1546: if (sqlResourceListLen >= sqlResourceListMax) {
1547: sqlResourceListMax *= 2;
1548: tmp = (char **) debugRealloc(sqlResourceList,
1549: (sqlResourceListMax) * sizeof(char *));
1550: if (sqlResourceList == NULL) {
1551: fprintf(stderr, "sqlInitSqlResourceList Error: out of memory\n");
1552: return(NULL);
1553: }
1554: sqlResourceList = tmp;
1555: }
1556:
1557: ret = sqlResourceList[sqlResourceListLen++] = debugStrdup(name);
1558: return(ret);
1559: }
1560:
1561: void
1562: sqlInitSqlResourceList(void) {
1563: MYSQL_RES *result;
1564: MYSQL_ROW row;
1565: char *query;
1566: int i;
1567:
1568: if (sqlResourceListInitialized != 0)
1569: return;
1570:
1571: if (rpm2htmlVerbose)
1572: printf("sqlInitSqlResourceList query\n");
1573:
1574: /*
1575: * Allocate the array
1576: */
1577: sqlResourceListLen = 0;
1578: sqlResourceListMax = 1000;
1579: sqlResourceList = (char **) debugMalloc((sqlResourceListMax) *
1580: sizeof(char *));
1581: if (sqlResourceList == NULL) {
1582: fprintf(stderr, "sqlInitSqlResourceList Error: out of memory\n");
1583: return;
1584: }
1585:
1586: /*
1587: * query the database for the values
1588: */
1589: query = "select Resource from Provides group by Resource";
1590:
1591: if (mysql_query(sql,query)) {
1592: printf("sqlInitSqlResourceList: SELECT from Provides failed: %s\n",
1593: mysql_error(sql));
1594: return;
1595: }
1596:
1597: i = 0;
1598: result = mysql_use_result(sql);
1599: if (result) {
1600: while((row = mysql_fetch_row(result)))
1601: {
1602: if (sqlRpmAnalyzeResourceRow(row) != NULL)
1603: i++;
1604: }
1605: mysql_free_result(result);
1606: }
1607: if(mysql_errno(sql)) {
1608: fprintf(stderr, "sqlInitSqlResourceList Error: %s\n", mysql_error(sql));
1609: return;
1610: }
1611:
1612:
1613: if (rpm2htmlVerbose)
1614: printf("sqlInitSqlResourceList done: %d entries\n", i);
1615: sqlResourceListInitialized++;
1616: return;
1617: }
1.36 veillard 1618:
1619: char *
1620: sqlRpmAnalyzeDistributionRow(MYSQL_ROW row) {
1621: const char *id;
1622: const char *name;
1623: char **tmp;
1624: int distribution;
1625:
1626: if (row == NULL)
1627: return(NULL);
1628: id = row[0];
1629: name = row[1];
1630: if ((id == NULL) || (name == NULL))
1631: return(NULL);
1632:
1633: if (sscanf(id, "%d", &distribution) != 1)
1634: return(NULL);
1635: if ((distribution <= 0) || (distribution > 100000)) {
1636: fprintf(stderr, "Dist number out of range %d\n", distribution);
1637: return(NULL);
1638: }
1639: if (distribution >= sqlDistributionListLen) {
1640: int i = sqlDistributionListLen;
1641: sqlDistributionListLen = distribution + 100;
1642: tmp = (char **) debugRealloc(sqlDistributionList,
1643: (sqlDistributionListLen) * sizeof(char *));
1644: if (sqlDistributionList == NULL) {
1645: fprintf(stderr, "sqlInitSqlDistributionList Error: out of memory\n");
1646: return(NULL);
1647: }
1648: sqlDistributionList = tmp;
1649: memset(&sqlDistributionList[i], 0, sizeof(char *) * (sqlDistributionListLen - i));
1650: }
1651:
1652: sqlDistributionList[distribution] = debugStrdup(name);
1653: return(sqlDistributionList[distribution]);
1654: }
1655:
1656: void
1657: sqlInitSqlDistributionList(void) {
1658: MYSQL_RES *result;
1659: MYSQL_ROW row;
1660: char *query;
1661: int i;
1662:
1663: if (sqlDistributionListInitialized != 0)
1664: return;
1665:
1666: if (rpm2htmlVerbose)
1667: printf("sqlInitSqlDistributionList query\n");
1668:
1669: /*
1670: * Allocate the array
1671: */
1672: sqlDistributionListLen = 100;
1673: sqlDistributionList = (char **) debugMalloc((sqlDistributionListLen) * sizeof(char *));
1674: if (sqlDistributionList == NULL) {
1675: fprintf(stderr, "sqlInitSqlDistributionList Error: out of memory\n");
1676: return;
1677: }
1.40 veillard 1678: memset(sqlDistributionList, 0, (sqlDistributionListLen) * sizeof(char *));
1679:
1.36 veillard 1680: /*
1681: * query the database for the values
1682: */
1683: query = "select ID,Name from Distributions";
1684:
1685: if (mysql_query(sql,query)) {
1686: printf("sqlInitSqlDistributionList: SELECT from Distributions failed: %s\n",
1687: mysql_error(sql));
1688: return;
1689: }
1690:
1691: i = 0;
1692: result = mysql_use_result(sql);
1693: if (result) {
1694: while((row = mysql_fetch_row(result)))
1695: {
1696: if (sqlRpmAnalyzeDistributionRow(row) != NULL)
1697: i++;
1698: }
1699: mysql_free_result(result);
1700: }
1701: if(mysql_errno(sql)) {
1702: fprintf(stderr, "sqlInitSqlDistributionList Error: %s\n", mysql_error(sql));
1703: return;
1704: }
1705:
1706:
1707: if (rpm2htmlVerbose)
1708: printf("sqlInitSqlDistributionList done: %d entries\n", i);
1709: sqlDistributionListInitialized++;
1710: return;
1711: }
1712:
1.35 veillard 1713:
1714: char *
1715: sqlRpmAnalyzeVendorRow(MYSQL_ROW row) {
1716: const char *id;
1717: const char *name;
1718: char **tmp;
1719: int vendor;
1720:
1721: if (row == NULL)
1722: return(NULL);
1723: id = row[0];
1724: name = row[1];
1725: if ((id == NULL) || (name == NULL))
1726: return(NULL);
1727:
1728: if (sscanf(id, "%d", &vendor) != 1)
1729: return(NULL);
1730: if ((vendor <= 0) || (vendor > 100000)) {
1731: fprintf(stderr, "Dist number out of range %d\n", vendor);
1732: return(NULL);
1733: }
1734: if (vendor >= sqlVendorListLen) {
1735: int i = sqlVendorListLen;
1736: sqlVendorListLen = vendor + 100;
1737: tmp = (char **) debugRealloc(sqlVendorList,
1738: (sqlVendorListLen) * sizeof(char *));
1739: if (sqlVendorList == NULL) {
1740: fprintf(stderr, "sqlInitSqlVendorList Error: out of memory\n");
1741: return(NULL);
1742: }
1743: sqlVendorList = tmp;
1744: memset(&sqlVendorList[i], 0, sizeof(char *) * (sqlVendorListLen - i));
1745: }
1746:
1747: sqlVendorList[vendor] = debugStrdup(name);
1748: return(sqlVendorList[vendor]);
1749: }
1750:
1751: void
1752: sqlInitSqlVendorList(void) {
1753: MYSQL_RES *result;
1754: MYSQL_ROW row;
1755: char *query;
1756: int i;
1757:
1758: if (sqlVendorListInitialized != 0)
1759: return;
1760:
1761: if (rpm2htmlVerbose)
1762: printf("sqlInitSqlVendorList query\n");
1763:
1764: /*
1765: * Allocate the array
1766: */
1767: sqlVendorListLen = 100;
1768: sqlVendorList = (char **) debugMalloc((sqlVendorListLen) * sizeof(char *));
1769: if (sqlVendorList == NULL) {
1770: fprintf(stderr, "sqlInitSqlVendorList Error: out of memory\n");
1771: return;
1772: }
1773:
1774: /*
1775: * query the database for the values
1776: */
1777: query = "select ID,Name from Vendors";
1778:
1779: if (mysql_query(sql,query)) {
1.36 veillard 1780: printf("sqlInitSqlVendorList: SELECT from Vendors failed: %s\n",
1.35 veillard 1781: mysql_error(sql));
1782: return;
1783: }
1784:
1785: i = 0;
1786: result = mysql_use_result(sql);
1787: if (result) {
1788: while((row = mysql_fetch_row(result)))
1789: {
1790: if (sqlRpmAnalyzeVendorRow(row) != NULL)
1791: i++;
1792: }
1793: mysql_free_result(result);
1794: }
1795: if(mysql_errno(sql)) {
1796: fprintf(stderr, "sqlInitSqlVendorList Error: %s\n", mysql_error(sql));
1797: return;
1798: }
1799:
1800:
1801: if (rpm2htmlVerbose)
1802: printf("sqlInitSqlVendorList done: %d entries\n", i);
1803: sqlVendorListInitialized++;
1804: return;
1805: }
1.26 veillard 1806:
1807: rpmDirPtr
1808: sqlRpmAnalyzeDirRow(MYSQL_ROW row) {
1809: rpmDirPtr ret;
1810: const char *id;
1811: const char *name;
1812: const char *vendor;
1813: const char *directory;
1814: const char *path;
1815: const char *url;
1816: const char *urlSrc;
1817: const char *html;
1818: const char *color;
1819: int dist;
1820:
1821: if (row == NULL)
1822: return(NULL);
1823: id = row[0];
1824: name = row[1];
1825: vendor = row[2];
1826: directory = row[3];
1827: path = row[4];
1828: url = row[5];
1829: urlSrc = row[6];
1830: html = row[7];
1831: color = row[8];
1832: if ((id == NULL) || (name == NULL) ||
1833: (directory == NULL) || (path == NULL) || (url == NULL))
1834: return(NULL);
1835:
1836: if (sscanf(id, "%d", &dist) != 1)
1837: return(NULL);
1838: if ((dist <= 0) || (dist > SQL_MAX_DISTRIBS)) {
1839: fprintf(stderr, "Dist number out of range %d\n", dist);
1840: return(NULL);
1841: }
1842:
1843:
1844: ret = (rpmDirPtr) debugMalloc(sizeof(rpmDir));
1845: if (ret == NULL)
1846: return(NULL);
1847: memset(ret, 0, sizeof(rpmDir));
1848: /* Generic stuff */
1.28 daniel 1849: if (rpm2html_dir != NULL)
1.26 veillard 1850: ret->dir = debugStrdup(rpm2html_dir);
1.28 daniel 1851: if (rpm2html_host != NULL)
1.26 veillard 1852: ret->host = debugStrdup(rpm2html_host);
1.28 daniel 1853: if (rpm2html_maint != NULL)
1.26 veillard 1854: ret->maint = debugStrdup(rpm2html_maint);
1.28 daniel 1855: if (rpm2html_mail != NULL)
1.26 veillard 1856: ret->mail = debugStrdup(rpm2html_mail);
1.28 daniel 1857: if (rpm2html_url != NULL)
1.26 veillard 1858: ret->url = debugStrdup(rpm2html_url);
1859: /* specific stuff */
1860: ret->no = dist;
1861: ret->rpmdir = debugStrdup(directory);
1862: ret->subdir = debugStrdup(path);
1863: ret->name = debugStrdup(name);
1864: ret->ftp = debugStrdup(url);
1865: if (color != NULL)
1866: ret->color = debugStrdup(color);
1.28 daniel 1867: else
1868: ret->color = debugStrdup("#ffffff");
1.26 veillard 1869: if (urlSrc != NULL)
1870: ret->ftpsrc = debugStrdup(urlSrc);
1871: return(ret);
1872: }
1873:
1874: void
1875: sqlInitSqlDirList(void) {
1.28 daniel 1876: char host[200];
1.26 veillard 1877: rpmDirPtr cur;
1878: MYSQL_RES *result;
1879: MYSQL_ROW row;
1880: char *query;
1881: int i;
1882:
1883: if (sqlDirListInitialized != 0)
1884: return;
1885:
1.28 daniel 1886: gethostname(host, sizeof(host));
1887: currentTime = time(NULL);
1888: rpm2html_rpm2html_thishost = &host[0];
1889: readConfigSql();
1890: if (rpm2html_host == NULL) {
1891: rpm2html_host = strdup(rpm2html_rpm2html_thishost);
1892: }
1.26 veillard 1893: for (i = 0; i < SQL_MAX_DISTRIBS;i++)
1894: sqlDirList[i] = NULL;
1895:
1896: if (rpm2htmlVerbose)
1897: printf("sqlInitSqlDirList query\n");
1898:
1.29 veillard 1899: query = "select ID,Name,Vendor,Directory,Path,URL,URLSrc,Html,Color from Distribs";
1.26 veillard 1900:
1901: if (mysql_query(sql,query)) {
1902: printf("sqlInitSqlDirList: SELECT from Packages failed: %s\n",
1903: mysql_error(sql));
1904: return;
1905: }
1906:
1907: i = 0;
1908: result = mysql_use_result(sql);
1909: if (result) {
1910: while((row = mysql_fetch_row(result)))
1911: {
1912: cur = sqlRpmAnalyzeDirRow(row);
1913: if (cur != NULL) {
1914: sqlDirList[cur->no] = cur;
1915: i++;
1916: }
1917: }
1918: mysql_free_result(result);
1919: }
1920: if(mysql_errno(sql)) {
1921: fprintf(stderr, "sqlInitSqlDirList Error: %s\n", mysql_error(sql));
1922: return;
1923: }
1924:
1925: if (rpm2htmlVerbose)
1926: printf("sqlInitSqlDirList done: %d entries\n", i);
1927: sqlDirListInitialized++;
1928: return;
1929: }
1930:
1931: rpmDataPtr
1932: sqlRpmAnalyzeRow(MYSQL_ROW row) {
1933: rpmDataPtr ret;
1934: const char *id;
1935: const char *name;
1936: const char *version;
1937: const char *release;
1938: const char *arch;
1939: const char *date;
1940: const char *summary;
1941: const char *filename;
1942: const char *distrib;
1.30 daniel 1943: const char *group;
1.33 veillard 1944: const char *os;
1.35 veillard 1945: const char *packager;
1.36 veillard 1946: const char *vendor;
1.26 veillard 1947: int dist;
1948:
1949: if (row == NULL)
1950: return(NULL);
1951: id = row[0];
1952: name = row[1];
1953: version = row[2];
1954: release = row[3];
1955: arch = row[4];
1956: date = row[5];
1957: summary = row[6];
1958: filename = row[7];
1959: distrib = row[8];
1.30 daniel 1960: group = row[9];
1.33 veillard 1961: os = row[10];
1.35 veillard 1962: packager = row[11];
1.36 veillard 1963: vendor = row[12];
1.26 veillard 1964: if ((id == NULL) || (name == NULL) || (version == NULL) ||
1965: (release == NULL) || (arch == NULL) || (date == NULL) ||
1966: (summary == NULL) || (filename == NULL) || (distrib == NULL))
1967: return(NULL);
1968:
1969: ret = (rpmDataPtr) debugMalloc(sizeof(rpmData));
1970: if (ret == NULL)
1971: return(NULL);
1972: memset(ret, 0, sizeof(rpmData));
1973: ret->name = debugStrdup(name);
1974: ret->version = debugStrdup(version);
1975: ret->release = debugStrdup(release);
1976: ret->arch = debugStrdup(arch);
1977: ret->summary = debugStrdup(summary);
1978: ret->name = debugStrdup(name);
1979: ret->filename = debugStrdup(filename);
1.33 veillard 1980: if (os == NULL)
1981: ret->os = debugStrdup("Linux");
1982: else
1983: ret->os = debugStrdup(os);
1.30 daniel 1984: if (group != NULL)
1985: ret->group = debugStrdup(group);
1.26 veillard 1986: sscanf(date, "%d", (int *) &(ret->date));
1.35 veillard 1987: if (packager != NULL) {
1988: int tmp = 0;
1989: sscanf(packager, "%d", (int *) &tmp);
1990: if ((tmp > 0) && (tmp < sqlVendorListLen)) {
1991: if (sqlVendorList[tmp] != NULL)
1992: ret->vendor = debugStrdup(sqlVendorList[tmp]);
1993: }
1994: }
1.36 veillard 1995: if (vendor != NULL) {
1996: int tmp = 0;
1997: sscanf(vendor, "%d", (int *) &tmp);
1998: if ((tmp > 0) && (tmp < sqlDistributionListLen)) {
1999: if (sqlVendorList[tmp] != NULL)
2000: ret->distribution = debugStrdup(sqlDistributionList[tmp]);
2001: }
2002: }
1.35 veillard 2003: if (ret->vendor == NULL)
2004: ret->vendor = debugStrdup("Unknown");
2005: if (ret->distribution == NULL)
2006: ret->distribution = debugStrdup("Unknown");
1.26 veillard 2007: sscanf(distrib, "%d", &dist);
2008: ret->dir = sqlDirList[dist];
1.28 daniel 2009: if ((ret->dir != NULL) && (ret->dir->rpmdir != NULL)) {
2010: int len = strlen(ret->dir->rpmdir);
2011: if (!strncmp(ret->filename, ret->dir->rpmdir, len)) {
2012: char *start, *end;
2013: start = &(ret->filename[len]);
2014: while (*start == '/') start++;
2015: end = &start[strlen(start) - 1];
2016: while ((end >= start) && (*end != '/')) end--;
2017: if (end > start) {
2018: char *tmp;
2019: tmp = debugMalloc((end - start) + 1);
2020: if (tmp != NULL) {
2021: strncpy(tmp, start, end - start);
2022: tmp[end - start] = 0;
2023: ret->subdir = tmp;
2024: }
2025: }
2026: }
2027: }
1.26 veillard 2028: return(ret);
2029: }
2030:
2031: rpmDataPtr
2032: sqlRpmByDate(void) {
2033: rpmDataPtr list = NULL;
2034: rpmDataPtr cur, last = NULL;
2035: MYSQL_RES *result;
2036: MYSQL_ROW row;
2037: char *query;
2038:
2039: sqlInitSqlDirList();
1.35 veillard 2040: sqlInitSqlVendorList();
1.36 veillard 2041: sqlInitSqlDistributionList();
1.26 veillard 2042: if (rpm2htmlVerbose)
2043: printf("sqlRpmByDate query\n");
2044:
1.35 veillard 2045: query = "select ID,Name,Version,Release,Arch,Date,Summary,filename,Dist,Category,Os,Packager,Vendor from Packages where Date IS NOT NULL and Date < UNIX_TIMESTAMP() + 300000 order by Date desc limit 1000";
1.26 veillard 2046:
2047: /*
2048: * Search first for the ID if it already exists
2049: */
2050: if (mysql_query(sql,query)) {
2051: printf("sqlRpmByDate: SELECT from Packages failed: %s\n",
2052: mysql_error(sql));
2053: return(NULL);
2054: }
2055:
2056: result = mysql_use_result(sql);
2057: if (result) {
2058: while((row = mysql_fetch_row(result)))
2059: {
2060: cur = sqlRpmAnalyzeRow(row);
2061: if (cur != NULL) {
2062: if (last == NULL)
2063: list = cur;
2064: else
2065: last->next = cur;
2066: last = cur;
2067: }
2068: }
2069: mysql_free_result(result);
2070: }
2071: if(mysql_errno(sql)) {
2072: fprintf(stderr, "sqlRpmByDate Error: %s\n", mysql_error(sql));
2073: return(NULL);
2074: }
2075:
2076: if (rpm2htmlVerbose)
2077: printf("sqlRpmByDate done\n");
2078: return(list);
2079: }
2080:
1.29 veillard 2081: rpmDataPtr
2082: sqlRpmAll(void) {
2083: rpmDataPtr list = NULL;
2084: rpmDataPtr cur, last = NULL;
2085: MYSQL_RES *result;
2086: MYSQL_ROW row;
2087: char *query;
2088:
2089: sqlInitSqlDirList();
1.35 veillard 2090: sqlInitSqlVendorList();
1.36 veillard 2091: sqlInitSqlDistributionList();
1.29 veillard 2092: if (rpm2htmlVerbose)
2093: printf("sqlRpmAll query\n");
2094:
1.35 veillard 2095: query = "select ID,Name,Version,Release,Arch,Date,Summary,filename,Dist,Category,Os,Packager,Vendor from Packages";
1.29 veillard 2096:
2097: /*
2098: * Search first for the ID if it already exists
2099: */
2100: if (mysql_query(sql,query)) {
2101: printf("sqlRpmByDate: SELECT from Packages failed: %s\n",
2102: mysql_error(sql));
2103: return(NULL);
2104: }
2105:
2106: result = mysql_use_result(sql);
2107: if (result) {
2108: while((row = mysql_fetch_row(result)))
2109: {
2110: cur = sqlRpmAnalyzeRow(row);
2111: if (cur != NULL) {
2112: if (last == NULL)
2113: list = cur;
2114: else
2115: last->next = cur;
2116: last = cur;
1.32 daniel 2117:
2118: rpmAddSoftware(cur);
1.29 veillard 2119: }
2120: }
2121: mysql_free_result(result);
2122: }
2123: if(mysql_errno(sql)) {
2124: fprintf(stderr, "sqlRpmByDate Error: %s\n", mysql_error(sql));
2125: return(NULL);
2126: }
2127:
2128: if (rpm2htmlVerbose)
2129: printf("sqlRpmAll done\n");
2130: return(list);
2131: }
2132:
1.26 veillard 2133: /************************************************************************
1.8 veillard 2134: * *
1.6 veillard 2135: * Export functions *
2136: * *
2137: ************************************************************************/
2138:
1.41 ! veillard 2139: void sql_dump_rdf(const char *resource) {
! 2140: MYSQL_RES *result;
! 2141: MYSQL_ROW row;
! 2142: char query[SMALL_QUERY];
! 2143: FILE *rdf;
! 2144: char *filename;
! 2145: char *dist;
! 2146: char *name;
! 2147: char *version;
! 2148: char *release;
! 2149: char *arch;
! 2150: char *os;
! 2151: char *packager;
! 2152: char *date;
! 2153: char *size;
! 2154: char *subdir;
! 2155: int distrib;
! 2156:
! 2157: if (resource == NULL)
! 2158: return;
! 2159: if (!rpm2html_dump_rdf_resources)
! 2160: return;
! 2161: if ((rpm2html_host == NULL) || (rpm2html_url == NULL))
! 2162: return;
! 2163:
! 2164: snprintf(query, SMALL_QUERY,
! 2165: "select filename,Dist,Name,Version,Release,Arch,Os,Packager,Date,Size from Packages where Name=\"%s\"",
! 2166: resource);
! 2167: query[SMALL_QUERY - 1] = 0;
! 2168: if (mysql_query(sql, query)) {
! 2169: printf("sql_dump_rdf: SELECT from Packages failed: %s\n",
! 2170: mysql_error(sql));
! 2171: return;
! 2172: }
! 2173: result = mysql_use_result(sql);
! 2174: if (result == NULL) {
! 2175: printf("sql_dump_rdf: SELECT from Packages failed: %s\n",
! 2176: mysql_error(sql));
! 2177: return;
! 2178: }
! 2179: while((row = mysql_fetch_row(result))) {
! 2180: filename = row[0];
! 2181: dist = row[1];
! 2182: name = row[2];
! 2183: version = row[3];
! 2184: release = row[4];
! 2185: arch = row[5];
! 2186: os = row[6];
! 2187: packager = row[7];
! 2188: date = row[8];
! 2189: size = row[9];
! 2190: if ((filename == NULL) || (dist == NULL) || (name == NULL) ||
! 2191: (version == NULL) || (release == NULL) || (arch == NULL) ||
! 2192: (os == NULL) || (packager == NULL) || (date == NULL) ||
! 2193: (size == NULL)) {
! 2194: continue;
! 2195: }
! 2196: if (sscanf(dist, "%d", &distrib) != 1)
! 2197: continue;
! 2198: if ((distrib < 1) || (distrib >= SQL_MAX_DISTRIBS) ||
! 2199: (sqlDirList[distrib] == NULL))
! 2200: continue;
! 2201:
! 2202: subdir = sqlDirList[distrib]->subdir;
! 2203: /*************
! 2204: int len = strlen(ret->dir->rpmdir);
! 2205: if (!strncmp(ret->filename, ret->dir->rpmdir, len)) {
! 2206: char *start, *end;
! 2207: start = &(ret->filename[len]);
! 2208: while (*start == '/') start++;
! 2209: end = &start[strlen(start) - 1];
! 2210: while ((end >= start) && (*end != '/')) end--;
! 2211: if (end > start) {
! 2212: char *tmp;
! 2213: tmp = debugMalloc((end - start) + 1);
! 2214: if (tmp != NULL) {
! 2215: strncpy(tmp, start, end - start);
! 2216: tmp[end - start] = 0;
! 2217: ret->subdir = tmp;
! 2218: }
! 2219: }
! 2220: }
! 2221: ******************/
! 2222: }
! 2223: }
! 2224:
1.6 veillard 2225: void sql_show_config(void) {
2226: MYSQL_RES *result;
2227: MYSQL_ROW row;
1.8 veillard 2228: int id, i;
2229: int index = 0;
2230: int ids[500];
2231: char query[SMALL_QUERY];
1.6 veillard 2232:
2233:
1.8 veillard 2234: printf(";\n; Configuration file for rpm2html\n");
2235: printf("; http://rpmfind.net/linux/rpm2html/\n;\n\n");
2236: mysql_query(sql,"SELECT Name,Value FROM Config");
1.6 veillard 2237: result = mysql_use_result(sql);
2238:
2239: while((row = mysql_fetch_row(result)))
2240: {
1.8 veillard 2241: if (row[0] == NULL) {
2242: printf("\n");
2243: } else {
2244: if (!strcmp(row[0], "maint"))
2245: printf("; maintainer of the local rpm mirror\n");
2246: else if (!strcmp(row[0], "mail"))
2247: printf("; mail for the maintainer\n");
2248: else if (!strcmp(row[0], "dir"))
2249: printf("; Directory to store the HTML pages produced\n");
2250: else if (!strcmp(row[0], "url"))
2251: printf("; The relative URL for front pages\n");
2252: else if (!strcmp(row[0], "header"))
2253: printf("; Extra link in the navigation bar\n");
2254: else if (!strcmp(row[0], "html"))
2255: printf("; Export the local packages in HTML format\n");
2256: else if (!strcmp(row[0], "tree"))
2257: printf("; Build the tree for the distributions\n");
2258: else if (!strcmp(row[0], "rdf"))
2259: printf("; Export the local packages in RDF format\n");
2260: else if (!strcmp(row[0], "rdf_dir"))
2261: printf("; Directory to store the RDf tree\n");
2262: else if (!strcmp(row[0], "rdf_resources"))
2263: printf("; Compile a list of resources in RDF format\n");
2264: else if (!strcmp(row[0], "rdf_resources_dir"))
2265: printf("; Directory to store the RDf resources tree\n");
2266:
1.6 veillard 2267: if (row[1] == NULL)
1.8 veillard 2268: printf("%s\n\n", row[0]);
1.6 veillard 2269: else
1.8 veillard 2270: printf("%s=%s\n\n", row[0], row[1]);
2271: }
2272: }
2273: mysql_free_result(result);
2274: if(mysql_errno(sql)) {
2275: fprintf(stderr, "Error: %s\n", mysql_error(sql));
2276: }
2277:
2278: /*
2279: * Dump the Metadata
2280: */
2281: printf(";\n; The metadata mirrors list\n;\n\n[metadata]\n");
2282: mysql_query(sql,"SELECT URL FROM Metadata");
2283: result = mysql_use_result(sql);
2284:
2285: while((row = mysql_fetch_row(result)))
2286: {
2287: if (row[0] != NULL) {
2288: printf("mirror=%s\n", row[0]);
1.6 veillard 2289: }
2290: }
1.8 veillard 2291: mysql_free_result(result);
1.6 veillard 2292: if(mysql_errno(sql)) {
2293: fprintf(stderr, "Error: %s\n", mysql_error(sql));
2294: }
2295:
1.8 veillard 2296: /*
2297: * Dump the distributions informations
2298: * 1/ collect the list of IDs for the distribs
2299: */
2300: printf("\n\n;\n; The distribution list\n;\n\n");
2301: mysql_query(sql,"SELECT ID FROM Distribs");
2302: result = mysql_use_result(sql);
2303:
2304: while((row = mysql_fetch_row(result)))
2305: {
2306: if (row[0] != NULL) {
2307: if (sscanf(row[0], "%d", &id) == 1) {
2308: ids[index++] = id;
2309: }
2310: }
2311: }
2312: mysql_free_result(result);
2313:
2314: /*
2315: * Dump each distribution separately.
2316: */
2317: for (i = 0;i < index;i++) {
2318:
2319: snprintf(query, SMALL_QUERY - 1,
1.10 veillard 2320: "SELECT Directory,Name,Vendor,Path,URL,URLSrc,Description,Html,Color \
1.8 veillard 2321: FROM Distribs WHERE ID=%d", ids[i]);
2322: query[SMALL_QUERY - 1] = 0;
2323: if (mysql_query(sql,query)) {
2324: printf("sql_show_config: SELECT Distrib %d failed: %s\n",
2325: ids[i], mysql_error(sql));
2326: continue;
2327: }
2328:
2329: result = mysql_use_result(sql);
2330: if (result) {
2331: while((row = mysql_fetch_row(result)))
2332: {
2333: if (row[0] == NULL)
2334: break;
2335: printf("[%s]\n", row[0]);
2336: if (row[1] != NULL)
2337: printf("name=%s\n", row[1]);
2338: if (row[3] != NULL)
2339: printf("subdir=%s\n", row[3]);
2340: if (row[4] != NULL)
2341: printf("ftp=%s\n", row[4]);
2342: if (row[5] != NULL)
2343: printf("ftpsrc=%s\n", row[5]);
1.10 veillard 2344: if (row[7] != NULL)
2345: printf("html=%s\n", row[7]);
2346: if (row[8] != NULL)
2347: printf("color=%s\n", row[8]);
1.8 veillard 2348: }
2349: }
2350: mysql_free_result(result);
1.12 veillard 2351:
2352: /*
2353: * Extract the mirrors for this distribution.
2354: */
2355: snprintf(query, SMALL_QUERY - 1,
2356: "SELECT URL FROM Mirrors WHERE ID=%d", ids[i]);
2357: query[SMALL_QUERY - 1] = 0;
2358: if (mysql_query(sql,query)) {
2359: printf("sql_show_config: SELECT Mirrors %d failed: %s\n",
2360: ids[i], mysql_error(sql));
2361: printf("\n\n");
2362: continue;
2363: }
2364: result = mysql_use_result(sql);
2365: if (result) {
2366: while((row = mysql_fetch_row(result)))
2367: {
2368: if (row[0] == NULL)
2369: continue;
2370: printf("mirror=%s\n", row[0]);
2371: }
2372: }
2373: mysql_free_result(result);
2374:
1.8 veillard 2375: printf("\n\n");
2376: }
2377:
2378: printf(";\n; End of the configuration file for rpm2html\n;\n");
1.6 veillard 2379: }
2380:
2381: void sql_show_metadata(void) {
2382: MYSQL_RES *result;
2383: MYSQL_ROW row;
2384:
2385:
2386: mysql_query(sql,"SELECT URL FROM Metadata");
2387: result = mysql_use_result(sql);
2388:
2389: while((row = mysql_fetch_row(result)))
2390: {
2391: if (row[0] == NULL)
2392: printf("NULL !\n");
2393: else {
2394: printf("%s\n", row[0]);
2395: }
2396: }
2397: if(mysql_errno(sql)) {
2398: fprintf(stderr, "Error: %s\n", mysql_error(sql));
2399: }
2400:
2401: }
2402:
2403: void sql_show_mirrors(void) {
2404: MYSQL_RES *result;
2405: MYSQL_ROW row;
2406:
2407:
2408: mysql_query(sql,"SELECT URL FROM Mirrors");
2409: result = mysql_use_result(sql);
2410:
2411: while((row = mysql_fetch_row(result)))
2412: {
2413: if (row[0] == NULL)
2414: printf("NULL !\n");
2415: else {
2416: printf("%s\n", row[0]);
2417: }
2418: }
2419: if(mysql_errno(sql)) {
2420: fprintf(stderr, "Error: %s\n", mysql_error(sql));
2421: }
2422: }
2423:
1.5 veillard 2424: void sql_show_vendors(void) {
1.1 veillard 2425: MYSQL_RES *result;
2426: MYSQL_ROW row;
2427:
2428:
2429: mysql_query(sql,"SELECT Name, URL FROM Vendors");
2430: result = mysql_use_result(sql);
2431:
2432: while((row = mysql_fetch_row(result)))
2433: {
2434: if (row[0] == NULL)
2435: printf("NULL !\n");
2436: else {
2437: if (row[1] == NULL)
2438: printf("%s : no url\n", row[0]);
2439: else
2440: printf("%s : %s\n", row[0], row[1]);
2441: }
2442: }
2443: if(mysql_errno(sql)) {
2444: fprintf(stderr, "Error: %s\n", mysql_error(sql));
2445: }
2446:
2447: }
2448:
1.5 veillard 2449: void sql_show_distribs(void) {
1.1 veillard 2450: MYSQL_RES *result;
2451: MYSQL_ROW row;
2452:
2453:
2454: mysql_query(sql,"SELECT Name, Path, URL FROM Distribs");
2455: result = mysql_use_result(sql);
2456:
2457: while((row = mysql_fetch_row(result)))
2458: {
2459: if (row[0] == NULL)
2460: printf("NULL !\n");
2461: else {
2462: if (row[1] == NULL)
2463: printf("%s : no Path\n", row[0]);
2464: else {
2465: if (row[2] == NULL)
2466: printf("%s : %s : no url\n", row[0], row[1]);
2467: else
2468: printf("%s : %s : %s\n", row[0], row[1], row[2]);
2469: }
2470: }
2471: }
2472: if(mysql_errno(sql)) {
2473: fprintf(stderr, "Error: %s\n", mysql_error(sql));
2474: }
2475:
2476: }
2477:
1.5 veillard 2478: int sql_show_table_stats(const char *table, const char *key) {
1.6 veillard 2479: char query[MAX_QUERY];
1.2 veillard 2480: MYSQL_RES *result;
2481: MYSQL_ROW row;
2482: int res;
2483:
2484: /*
2485: * Search first for the ID if it already exists
2486: */
1.6 veillard 2487: snprintf(query, MAX_QUERY - 1, "SELECT COUNT(%s) FROM %s", key, table);
2488: query[MAX_QUERY - 1] = 0;
1.2 veillard 2489: if (mysql_query(sql,query)) {
1.5 veillard 2490: printf("sql_show_table_stats: SELECT COUNT failed: %s\n",
1.2 veillard 2491: mysql_error(sql));
2492: return(-1);
2493: }
2494:
2495: result = mysql_use_result(sql);
2496: if (result) {
2497: while((row = mysql_fetch_row(result)))
2498: {
2499: /*
2500: * Lookup the value and return it
2501: */
2502: if (row[0] == NULL) {
2503: mysql_free_result(result);
1.5 veillard 2504: printf("sql_show_table_stats: select count returns NULL !\n");
1.2 veillard 2505: return(-1);
2506: }
2507: if (sscanf(row[0], "%d", &res) != 1) {
2508: mysql_free_result(result);
1.5 veillard 2509: printf("sql_show_table_stats: value non numeric %s\n", row[0]);
1.2 veillard 2510: return(-1);
2511: }
2512: mysql_free_result(result);
2513: if (res <= 0)
2514: printf(" %s is empty\n", table);
2515: else
2516: printf(" %s contains %d records\n", table, res);
2517: return(res);
2518: }
2519: mysql_free_result(result);
2520: }
2521: if(mysql_errno(sql)) {
1.5 veillard 2522: fprintf(stderr, "sql_show_stats error: %s\n", mysql_error(sql));
1.2 veillard 2523: }
2524: return(-1);
2525: }
2526:
1.5 veillard 2527: int sql_show_stats(void) {
1.2 veillard 2528: const char *query = "SHOW TABLES";
2529: MYSQL_RES *result;
2530: MYSQL_ROW row;
2531:
2532: int tables = 0;
2533: int records = 0;
2534:
2535: if (mysql_query(sql,query)) {
2536: printf("sql_check_tables: SHOW TABLES failed %s\n",
2537: mysql_error(sql));
2538: return(-1);
2539: }
2540:
2541: result = mysql_use_result(sql);
2542: if (result) {
2543: while((row = mysql_fetch_row(result)))
2544: {
2545: if (row[0] == NULL) {
2546: mysql_free_result(result);
2547: printf("sql_check_tables: SHOW TABLES returns NULL !\n");
2548: return(-1);
2549: }
2550: tables++;
2551: }
2552: mysql_free_result(result);
2553: }
2554: if(mysql_errno(sql)) {
1.5 veillard 2555: fprintf(stderr, "sql_show_stats error: %s\n", mysql_error(sql));
1.2 veillard 2556: }
2557: printf("%d tables in use\n", tables);
1.5 veillard 2558: records += sql_show_table_stats("Config", "Name");
2559: records += sql_show_table_stats("Distribs", "Name");
2560: records += sql_show_table_stats("Vendors", "Name");
2561: records += sql_show_table_stats("Mirrors", "URL");
2562: records += sql_show_table_stats("Metadata", "URL");
2563: records += sql_show_table_stats("Packages", "Name");
1.8 veillard 2564: records += sql_show_table_stats("Requires", "Resource");
2565: records += sql_show_table_stats("Provides", "Resource");
1.5 veillard 2566: records += sql_show_table_stats("Files", "Path");
1.2 veillard 2567: printf("Total: %d records\n", records);
2568: return(records);
2569: }
2570:
1.26 veillard 2571: void sql_show_latests(void) {
2572: rpmDataPtr list;
2573:
2574: list = sqlRpmByDate();
2575: if (list == NULL) {
2576: fprintf(stderr, "no package in database\n");
2577: return;
2578: }
1.28 daniel 2579: dumpRpmByDate(list, 0);
1.29 veillard 2580: }
2581:
1.40 veillard 2582:
2583: void sql_show_resources(void) {
2584: int i;
2585:
2586: sqlInitSqlDirList();
2587: sqlInitSqlResourceList();
2588: for (i = 0;i < sqlResourceListLen;i++) {
2589: if (sqlResourceList[i] == NULL)
2590: break;
2591: dumpRessRedirHtml(sqlResourceList[i]);
1.41 ! veillard 2592: if (rpm2html_dump_rdf_resources)
! 2593: sql_dump_rdf(sqlResourceList[i]);
1.40 veillard 2594: }
2595: fprintf(stderr, "Dumped %d redirrect resource pages\n", i);
2596: }
2597:
1.29 veillard 2598: void sql_show_all(void) {
2599: rpmDataPtr list;
1.31 veillard 2600: #ifdef SQL_DEBUG_TIMING
2601: time_t cur, last;
1.29 veillard 2602:
1.31 veillard 2603: last = time(NULL);
2604: #endif
1.29 veillard 2605: list = sqlRpmAll();
2606: if (list == NULL) {
2607: fprintf(stderr, "no package in database\n");
2608: return;
2609: }
1.31 veillard 2610: #ifdef SQL_DEBUG_TIMING
2611: cur = time(NULL);
2612: fprintf(stderr, "sqlRpmAll took %d seconds\n", (int)(cur - last));
2613: last = cur;
2614: #endif
2615:
2616: rpmNameSort(&list, 0);
2617: dumpRpmByName(rpmSoftwareList, 0);
2618:
2619: #ifdef SQL_DEBUG_TIMING
2620: cur = time(NULL);
2621: fprintf(stderr, "dumpRpmByName took %d seconds\n", (int)(cur - last));
2622: last = cur;
2623: #endif
2624:
2625: rpmGroupSort(&list, 0);
1.32 daniel 2626: dumpRpmByGroups(rpmSoftwareList, 0);
1.31 veillard 2627:
2628: #ifdef SQL_DEBUG_TIMING
2629: cur = time(NULL);
2630: fprintf(stderr, "dumpRpmByGroups took %d seconds\n", (int)(cur - last));
2631: last = cur;
2632: #endif
1.35 veillard 2633:
2634: rpmVendorSort(&list, 0);
2635: dumpRpmByVendors(list, 0);
2636:
2637: #ifdef SQL_DEBUG_TIMING
2638: cur = time(NULL);
2639: fprintf(stderr, "dumpRpmByVendors took %d seconds\n", (int)(cur - last));
1.36 veillard 2640: last = cur;
2641: #endif
2642:
2643: rpmDistribSort(&list, 0);
2644: dumpRpmByDistribs(list, 0);
2645:
2646: #ifdef SQL_DEBUG_TIMING
2647: cur = time(NULL);
2648: fprintf(stderr, "dumpRpmByDistribs took %d seconds\n", (int)(cur - last));
1.35 veillard 2649: last = cur;
2650: #endif
2651:
1.39 daniel 2652: rpmDateSort(&list, 0);
1.37 veillard 2653: dumpRpmByDate(list, 0);
2654:
2655: #ifdef SQL_DEBUG_TIMING
2656: cur = time(NULL);
2657: fprintf(stderr, "dumpRpmByDate took %d seconds\n", (int)(cur - last));
2658: last = cur;
2659: #endif
2660:
1.40 veillard 2661: rpmdataCleanup();
2662: sleep(30);
1.26 veillard 2663: }
2664:
1.2 veillard 2665: /************************************************************************
2666: * *
2667: * rpm2html configuration functions *
2668: * *
2669: ************************************************************************/
2670:
2671: int readConfigSql(void) {
1.6 veillard 2672: char query[MAX_QUERY];
1.3 veillard 2673: MYSQL_RES *result;
2674: MYSQL_ROW row;
1.4 veillard 2675: int dir = 0;
1.3 veillard 2676:
1.2 veillard 2677: /*
1.3 veillard 2678: * General configuration informations
1.2 veillard 2679: */
1.6 veillard 2680: snprintf(query, MAX_QUERY - 1, "SELECT Name,Value FROM Config");
2681: query[MAX_QUERY - 1] = 0;
1.3 veillard 2682: if (mysql_query(sql,query)) {
2683: printf("sql_check_tables: SELECT Config failed %s\n",
2684: mysql_error(sql));
2685: return(-1);
2686: }
2687:
2688: result = mysql_use_result(sql);
2689: if (result) {
2690: while((row = mysql_fetch_row(result)))
2691: {
2692: if ((row[0] == NULL) || (row[1] == NULL)) {
2693: fprintf(stderr, "readConfigSql : found NULL value\n");
2694: continue;
2695: }
1.4 veillard 2696: if (!strcmp(row[0], "dir"))
2697: dir = 1;
1.3 veillard 2698: addConfigEntry(RPM2HTML_NAME, row[0], row[1]);
2699: }
2700: mysql_free_result(result);
2701: }
2702: if(mysql_errno(sql)) {
1.5 veillard 2703: fprintf(stderr, "sql_show_stats error: %s\n", mysql_error(sql));
1.4 veillard 2704: }
2705: if (dir == 0) {
2706: fprintf(stderr, "readConfigSql : no directory\n");
2707: return(-1);
1.3 veillard 2708: }
2709:
2710: /*
2711: * The metadata mirror list.
2712: */
1.6 veillard 2713: snprintf(query, MAX_QUERY - 1, "SELECT URL FROM Metadata");
2714: query[MAX_QUERY - 1] = 0;
1.3 veillard 2715: if (mysql_query(sql,query)) {
2716: printf("sql_check_tables: SELECT Metadata failed %s\n",
2717: mysql_error(sql));
2718: return(-1);
2719: }
2720:
2721: result = mysql_use_result(sql);
2722: if (result) {
2723: while((row = mysql_fetch_row(result)))
2724: {
2725: if (row[0] == NULL) {
2726: fprintf(stderr, "readConfigSql : found NULL metadata\n");
2727: continue;
2728: }
2729: addConfigEntry("metadata", "mirror", row[0]);
2730: }
2731: mysql_free_result(result);
2732: }
2733: if(mysql_errno(sql)) {
1.5 veillard 2734: fprintf(stderr, "sql_show_stats error: %s\n", mysql_error(sql));
1.3 veillard 2735: }
2736:
2737: /*
2738: * The distribution lists
2739: */
1.6 veillard 2740: snprintf(query, MAX_QUERY - 1, "SELECT Directory,Name,URL,URLSrc,Path FROM Distribs");
2741: query[MAX_QUERY - 1] = 0;
1.3 veillard 2742: if (mysql_query(sql,query)) {
2743: printf("sql_check_tables: SELECT Distribs failed %s\n",
2744: mysql_error(sql));
2745: return(-1);
2746: }
2747:
2748: result = mysql_use_result(sql);
2749: if (result) {
2750: while((row = mysql_fetch_row(result)))
2751: {
2752: if (row[0] == NULL) {
2753: fprintf(stderr, "readConfigSql : found NULL distro\n");
2754: continue;
2755: }
2756:
2757: if (row[1] != NULL)
2758: addConfigEntry(row[0], "name", row[1]);
2759: if (row[2] != NULL)
2760: addConfigEntry(row[0], "ftp", row[2]);
2761: if (row[3] != NULL)
2762: addConfigEntry(row[0], "ftp", row[3]);
2763: if (row[4] != NULL)
2764: addConfigEntry(row[0], "subdir", row[4]);
2765: }
2766: mysql_free_result(result);
2767: }
2768: if(mysql_errno(sql)) {
1.5 veillard 2769: fprintf(stderr, "sql_show_stats error: %s\n", mysql_error(sql));
1.3 veillard 2770: }
2771:
2772: /*
2773: * The Mirrors
2774: */
1.6 veillard 2775: snprintf(query, MAX_QUERY - 1, "SELECT Distribs.Directory,Mirrors.URL FROM Distribs,Mirrors WHERE Distribs.ID = Mirrors.ID");
2776: query[MAX_QUERY - 1] = 0;
1.3 veillard 2777: if (mysql_query(sql,query)) {
2778: printf("sql_check_tables: SELECT Distribs failed %s\n",
2779: mysql_error(sql));
2780: return(-1);
2781: }
2782:
2783: result = mysql_use_result(sql);
2784: if (result) {
2785: while((row = mysql_fetch_row(result)))
2786: {
2787: if ((row[0] == NULL) || (row[1] == NULL)) {
2788: fprintf(stderr, "readConfigSql : found NULL mirror\n");
2789: continue;
2790: }
2791:
2792: addConfigEntry(row[0], "mirror", row[1]);
2793: }
2794: mysql_free_result(result);
2795: }
2796: if(mysql_errno(sql)) {
1.5 veillard 2797: fprintf(stderr, "sql_show_stats error: %s\n", mysql_error(sql));
1.3 veillard 2798: }
2799:
1.5 veillard 2800: /*
2801: * TODO: add the language(s) stuff
2802: */
1.3 veillard 2803: return(0);
1.2 veillard 2804: }
2805:
2806: void sqlConfigEntry(const char *rpmdir, const char *name, const char *value) {
2807: int distrib;
2808:
2809: if (rpm2htmlVerbose > 1)
2810: printf("sqlConfigEntry(\"%s\", \"%s\", \"%s\")\n", rpmdir, name, value);
2811:
2812: /*
2813: * case of global option for rpm2html.
2814: */
2815: if (!strcasecmp(rpmdir, RPM2HTML_NAME)) {
1.5 veillard 2816: sql_add_config_info(name, value);
1.2 veillard 2817: return;
2818: }
2819:
2820: /*
2821: * Options for the metadata mirrors.
2822: */
2823: if (!strcasecmp(rpmdir, "metadata")) {
2824: if (!strcasecmp(name, "mirror")) {
1.5 veillard 2825: sql_add_metadata_base(value);
1.2 veillard 2826: } else {
2827: printf("Config file : %s entry for [metadata] ignored\n", name);
2828: }
2829: return;
2830: }
2831:
2832: /*
2833: * option for a directory.
2834: */
2835: if (!strcasecmp(name, "name")) {
1.9 veillard 2836: sql_add_distrib(value, NULL, rpmdir, NULL, NULL, NULL, NULL,
2837: NULL, NULL);
1.2 veillard 2838: } else if (!strcasecmp(name, "subdir")) {
2839: distrib = sql_read_info_key("Distribs", "Directory", rpmdir);
2840: if (distrib > 0)
2841: sql_update_id("Distribs", distrib, "Path", value);
2842: } else if (!strcasecmp(name, "url")) {
2843: distrib = sql_read_info_key("Distribs", "Directory", rpmdir);
2844: if (distrib > 0)
2845: sql_update_id("Distribs", distrib, "URL", value);
2846: } else if (!strcasecmp(name, "ftp")) {
2847: distrib = sql_read_info_key("Distribs", "Directory", rpmdir);
2848: if (distrib > 0)
2849: sql_update_id("Distribs", distrib, "URL", value);
2850: } else if (!strcasecmp(name, "ftpsrc")) {
2851: distrib = sql_read_info_key("Distribs", "Directory", rpmdir);
2852: if (distrib > 0)
2853: sql_update_id("Distribs", distrib, "URLSrc", value);
1.9 veillard 2854: } else if (!strcasecmp(name, "html")) {
2855: distrib = sql_read_info_key("Distribs", "Directory", rpmdir);
2856: if (distrib > 0)
2857: sql_update_id("Distribs", distrib, "Html", value);
2858: } else if (!strcasecmp(name, "color")) {
2859: distrib = sql_read_info_key("Distribs", "Directory", rpmdir);
2860: if (distrib > 0)
2861: sql_update_id("Distribs", distrib, "Color", value);
1.2 veillard 2862: } else if (!strcasecmp(name, "mirror")) {
2863: distrib = sql_read_info_key("Distribs", "Directory", rpmdir);
2864: if (distrib > 0)
1.5 veillard 2865: sql_add_dist_mirror(distrib, value, 0);
1.2 veillard 2866: } else {
2867: printf("Config file : %s entry for [%s] ignored\n", name, rpmdir);
2868: }
2869: }
1.1 veillard 2870:
Webmaster