Annotation of rpm2html/sql.c, revision 1.13
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>
17: #ifdef HAVE_UNISTD_H
18: #include <unistd.h>
19: #endif
20: /********
21: #include <rpm/rpmlib.h>
22: ********/
23:
1.1 veillard 24: #include <mysql/mysql.h>
1.2 veillard 25: #include "rpm2html.h"
26: /********
27: #include "rpmdata.h"
28: ********/
1.1 veillard 29: #include "sql.h"
30:
1.8 veillard 31: #ifdef STANDALONE
32: static int rpm2htmlVerbose = 1;
33: #endif
34:
1.1 veillard 35: /************************************************************************
36: * *
37: * Generic inititialisation/close of the DB *
38: * *
39: ************************************************************************/
40:
41: static MYSQL *sql = NULL;
42:
1.11 veillard 43: int init_sql(const char *host, const char *base, const char *user, const char *passwd) {
44: if (host == NULL)
45: host = getenv("MySQL_HOST");
46: if (host == NULL)
47: host = "localhost";
48: if (base == NULL)
49: base = getenv("MySQL_BASE");
1.1 veillard 50: if (base == NULL)
51: base = "rpmfind";
52: if (passwd == NULL)
53: passwd = getenv("MySQL_PASS");
54: if (user == NULL)
55: user = getenv("MySQL_USER");
56: if (user == NULL)
57: user = getenv("USER");
58: if (user == NULL)
59: user = getenv("USERNAME");
60: if (user == NULL)
61: user = getenv("LOGNAME");
62: sql = mysql_init(NULL);
63: if (mysql_errno(sql)) {
64: fprintf(stderr, "mysql_init failed: %s\n", mysql_error(sql));
65: return(-1);
66: }
1.11 veillard 67: mysql_real_connect(sql, host, user, passwd, base, 0, NULL, 0);
1.1 veillard 68: if (mysql_errno(sql)) {
1.11 veillard 69: fprintf(stderr, "mysql: connect as %s to %s on host %s failed: %s\n",
70: user, base, host, mysql_error(sql));
1.1 veillard 71: return(-1);
72: }
1.2 veillard 73: sql_check_tables();
1.1 veillard 74: return(0);
75: }
76:
77: int close_sql(void) {
78: mysql_close(sql);
79: if (mysql_errno(sql)) {
80: fprintf(stderr, "mysql_close failed: %s\n", mysql_error(sql));
81: return(-1);
82: }
83: return(0);
84: }
85:
86: /************************************************************************
87: * *
88: * Generic functions to access the tables *
89: * *
90: ************************************************************************/
91:
1.6 veillard 92: #define MAX_QUERY 8000
93: #define SMALL_QUERY 500
1.1 veillard 94:
95: int sql_update_id(const char *table, int id,
96: const char *field, const char *value) {
97: MYSQL_RES *result;
1.6 veillard 98: char query[MAX_QUERY];
1.1 veillard 99: int nb_fields = 0;
1.6 veillard 100: int left = MAX_QUERY - 1;
101: int len;
102: char *end;
1.1 veillard 103:
104: if ((table == NULL) ||
105: (field == NULL) || (value == NULL))
106: return(-1);
107:
1.6 veillard 108: len = snprintf(query, left, "UPDATE %s SET %s='", table, field);
109: if (len < 0) {
110: fprintf(stderr, "sql_update_id : %s(%d).%s overflow\n",
111: table, id, field);
112: return(-1);
113: }
114: end = &query[len];
115: left -= len;
116: len = strlen(value);
117: if (len * 2 >= left) {
118: fprintf(stderr, "sql_update_id : %s(%d).%s overflow\n",
119: table, id, field);
120: return(-1);
121: }
122: len = mysql_escape_string(end, value, len);
123: left -= len;
124: if (left <= 0) {
125: fprintf(stderr, "sql_update_id : %s(%d).%s overflow\n",
126: table, id, field);
127: return(-1);
128: }
129: end += len;
130: len = snprintf(end, left, "' WHERE ID=%d", id);
131: if (len < 0) {
132: fprintf(stderr, "sql_update_id : %s(%d).%s overflow\n",
133: table, id, field);
134: return(-1);
135: }
136: end += len;
137: query[MAX_QUERY - 1] = 0;
138:
139: if (mysql_real_query(sql, query, (unsigned int) (end - query))) {
1.1 veillard 140: printf("sql_update_id: UPDATE %s %d failed: %s\n",
141: table, id, mysql_error(sql));
142: return(-1);
143: }
144: result = mysql_store_result(sql);
145: if (result != NULL) {
146: nb_fields = mysql_num_fields(result);
147: mysql_free_result(result);
148: } else {
149: nb_fields = 1;
150: }
151: if(mysql_errno(sql)) {
152: fprintf(stderr, "sql_update_id UPDATE error: %s\n",
153: mysql_error(sql));
154: return(-1);
155: }
156: return(nb_fields);
157: }
158:
159: int sql_blind_insert(const char *table, const char *key,
160: const char *value, int id) {
161: MYSQL_RES *result;
1.6 veillard 162: char query[MAX_QUERY];
163: int left = MAX_QUERY - 1;
164: int len;
165: char *end;
1.8 veillard 166: int insert = -1;
1.1 veillard 167:
1.2 veillard 168: if ((table == NULL) ||
1.1 veillard 169: (key == NULL) || (value == NULL))
170: return(-1);
171:
172: /*
173: * Search first for the ID if it already exists
174: */
1.2 veillard 175: if (id > 0) {
1.6 veillard 176: len = snprintf(query, left, "INSERT INTO %s (ID, %s) VALUES (%d, '",
177: table, key, id);
178: if (len < 0) {
179: fprintf(stderr, "sql_blind_insert : %s(%d).%s overflow\n",
180: table, id, key);
181: return(-1);
182: }
183: end = &query[len];
184: left -= len;
185: len = strlen(value);
186: if (len * 2 >= left) {
187: fprintf(stderr, "sql_blind_insert : %s(%d).%s overflow\n",
188: table, id, key);
189: return(-1);
190: }
191: len = mysql_escape_string(end, value, len);
192: left -= len;
193: if (left <= 0) {
194: fprintf(stderr, "sql_blind_insert : %s(%d).%s overflow\n",
195: table, id, key);
196: return(-1);
197: }
198: end += len;
199: len = snprintf(end, left, "')");
200: if (len < 0) {
201: fprintf(stderr, "sql_blind_insert : %s(%d).%s overflow\n",
202: table, id, key);
203: return(-1);
204: }
205: end += len;
206: query[MAX_QUERY - 1] = 0;
207:
1.2 veillard 208: } else {
1.6 veillard 209: len = snprintf(query, left, "INSERT INTO %s (%s) VALUES ('",
210: table, key);
211: if (len < 0) {
212: fprintf(stderr, "sql_blind_insert : %s.%s overflow\n",
213: table, key);
214: return(-1);
215: }
216: end = &query[len];
217: left -= len;
218: len = strlen(value);
219: if (len * 2 >= left) {
220: fprintf(stderr, "sql_blind_insert : %s.%s overflow\n",
221: table, key);
222: return(-1);
223: }
224: len = mysql_escape_string(end, value, len);
225: left -= len;
226: if (left <= 0) {
227: fprintf(stderr, "sql_blind_insert : %s.%s overflow\n",
228: table, key);
229: return(-1);
230: }
231: end += len;
232: len = snprintf(end, left, "')");
233: if (len < 0) {
234: fprintf(stderr, "sql_blind_insert : %s.%s overflow\n",
235: table, key);
236: return(-1);
237: }
238: end += len;
239: query[MAX_QUERY - 1] = 0;
240:
1.2 veillard 241: }
1.6 veillard 242: query[MAX_QUERY - 1] = 0;
243: if (mysql_real_query(sql, query, (unsigned int) (end - query))) {
244: #ifdef SQL_DEBUG
245: fprintf(stderr, "sql_blind_insert Error: %s\n", mysql_error(sql));
246: #endif
1.1 veillard 247: return(-1);
248: }
249: result = mysql_store_result(sql);
1.8 veillard 250: insert = mysql_insert_id(sql);
1.1 veillard 251: if (result) {
252: mysql_free_result(result);
1.8 veillard 253: return(insert);
1.1 veillard 254: }
255: if(mysql_errno(sql)) {
256: fprintf(stderr, "sql_blind_insert Error: %s\n", mysql_error(sql));
257: return(-1);
258: }
1.8 veillard 259: return(insert);
1.1 veillard 260: }
261:
262: int sql_update(const char *table, const char *name,
263: const char *field, const char *value) {
264: MYSQL_RES *result;
265: MYSQL_ROW row;
1.6 veillard 266: char query[MAX_QUERY];
1.1 veillard 267: int id;
268: int nb_fields = 0;
1.6 veillard 269: int left = MAX_QUERY - 1;
270: int len;
271: char *end;
1.1 veillard 272:
273: if ((name == NULL) || (table == NULL) ||
274: (field == NULL) || (value == NULL))
275: return(-1);
276:
277: /*
278: * Search first for the ID if it already exists
279: */
1.6 veillard 280: snprintf(query, MAX_QUERY - 1, "SELECT ID FROM %s WHERE Name='%s'", table, name);
281: query[MAX_QUERY - 1] = 0;
1.1 veillard 282: if (mysql_query(sql,query)) {
283: printf("sql_update: SELECT failed\n");
284: return(-1);
285: }
286:
287: result = mysql_use_result(sql);
288: if (result) {
289: while((row = mysql_fetch_row(result)))
290: {
291: if (row[0] == NULL) {
292: printf("sql_update: select ID for %s returns NULL !\n", name);
293: return(-1);
294: }
295: if (sscanf(row[0], "%d", &id) != 1) {
296: printf("sql_update: ID non numeric %s\n", row[0]);
297: return(-1);
298: }
1.6 veillard 299:
300: left = MAX_QUERY - 1;
301: len = snprintf(query, left, "UPDATE %s SET %s='", table, field);
302: if (len < 0) {
303: fprintf(stderr, "sql_update : %s(%d).%s overflow\n",
304: table, id, field);
305: return(-1);
306: }
307: end = &query[len];
308: left -= len;
309: len = strlen(value);
310: if (len * 2 >= left) {
311: fprintf(stderr, "sql_update : %s(%d).%s overflow\n",
312: table, id, field);
313: return(-1);
314: }
315: len = mysql_escape_string(end, value, len);
316: left -= len;
317: if (left <= 0) {
318: fprintf(stderr, "sql_update : %s(%d).%s overflow\n",
319: table, id, field);
320: return(-1);
321: }
322: end += len;
323: len = snprintf(end, left, "' WHERE ID=%d", id);
324: if (len < 0) {
325: fprintf(stderr, "sql_update : %s(%d).%s overflow\n",
326: table, id, field);
327: return(-1);
328: }
329: end += len;
330: query[MAX_QUERY - 1] = 0;
331:
1.1 veillard 332: mysql_free_result(result);
1.6 veillard 333: if (mysql_real_query(sql, query, (unsigned int) (end - query))) {
1.2 veillard 334: printf("sql_update: UPDATE failed: %s\n", mysql_error(sql));
1.1 veillard 335: return(-1);
336: }
337: result = mysql_store_result(sql);
338: if (result != NULL) {
339: nb_fields = mysql_num_fields(result);
340: mysql_free_result(result);
341: } else {
1.2 veillard 342: return(1);
1.1 veillard 343: }
344: /* Do not loop ... only the first */
345: return(nb_fields);
346: }
347: mysql_free_result(result);
1.2 veillard 348: if (nb_fields == 0) {
349: /*
350: * Propagate an insert
351: */
1.6 veillard 352: snprintf(query, MAX_QUERY - 1,
1.2 veillard 353: "INSERT INTO %s (Name,%s) VALUES ('%s','%s')",
354: table, field, name, value);
1.6 veillard 355: query[MAX_QUERY - 1] = 0;
1.2 veillard 356: mysql_free_result(result);
357: if (mysql_query(sql, query)) {
358: printf("sql_update: INSERT failed: %s\n", mysql_error(sql));
359: return(-1);
360: }
361: result = mysql_store_result(sql);
362: if (result != NULL) {
363: nb_fields = mysql_num_fields(result);
364: mysql_free_result(result);
365: } else {
366: return(1);
367: }
368: }
1.1 veillard 369: }
370: if(mysql_errno(sql)) {
371: fprintf(stderr, "sql_update Error: %s\n", mysql_error(sql));
372: return(-1);
373: }
374: return(nb_fields);
375: }
376:
1.6 veillard 377: int sql_get_key(const char *table, const char *name, const char *value) {
1.1 veillard 378: int id;
379: MYSQL_RES *result;
380: MYSQL_ROW row;
1.6 veillard 381: char query[SMALL_QUERY];
1.1 veillard 382:
383: if ((table == NULL) || (name == NULL))
384: return(-1);
385:
386: /*
387: * Search first for the ID if it already exists
388: */
1.6 veillard 389: snprintf(query, SMALL_QUERY - 1, "SELECT ID FROM %s WHERE %s='%s'",
390: table, name, value);
391: query[SMALL_QUERY - 1] = 0;
1.1 veillard 392: if (mysql_query(sql,query)) {
393: printf("sql_create: SELECT %s failed %s\n", name, mysql_error(sql));
394: return(-1);
395: }
396:
397: result = mysql_use_result(sql);
398: if (result) {
399: while((row = mysql_fetch_row(result)))
400: {
401: /*
402: * Lookup the first ID and return it
403: */
404: if (row[0] == NULL) {
405: mysql_free_result(result);
406: printf("sql_create: select returns NULL !\n");
407: return(-1);
408: }
409: if (sscanf(row[0], "%d", &id) != 1) {
410: mysql_free_result(result);
411: printf("sql_create: ID non numeric %s\n", row[0]);
412: return(-1);
413: }
414: mysql_free_result(result);
415: return(id);
416: }
417: mysql_free_result(result);
418: }
419: if(mysql_errno(sql)) {
420: fprintf(stderr, "Error: %s\n", mysql_error(sql));
421: return(-1);
422: }
423:
424: /*
425: * Do a creation
426: */
427:
1.6 veillard 428: snprintf(query, SMALL_QUERY - 1, "INSERT INTO %s (%s) VALUES ('%s')",
429: table, name, value);
430: query[SMALL_QUERY - 1] = 0;
1.1 veillard 431: if (mysql_query(sql,query)) {
1.2 veillard 432: printf("sql_get_key: INSERT %s failed %s\n", name, mysql_error(sql));
1.1 veillard 433: return(-1);
434: }
435: id = mysql_insert_id(sql);
436: result = mysql_store_result(sql);
437: if (result != NULL)
438: mysql_free_result(result);
439: return(id);
440: }
441:
442: int sql_read_key(const char *table, const char *name) {
443: int id;
444: MYSQL_RES *result;
445: MYSQL_ROW row;
1.6 veillard 446: char query[SMALL_QUERY];
1.1 veillard 447:
448: if ((table == NULL) || (name == NULL))
449: return(-1);
450:
451: /*
452: * Search for the ID it has to exist
453: */
1.6 veillard 454: snprintf(query, SMALL_QUERY - 1, "SELECT ID FROM %s WHERE Name='%s'", table, name);
455: query[SMALL_QUERY - 1] = 0;
1.2 veillard 456: if (mysql_query(sql,query)) {
457: printf("sql_create: SELECT %s failed %s\n", name, mysql_error(sql));
458: return(-1);
459: }
460:
461: result = mysql_use_result(sql);
462: if (result) {
463: while((row = mysql_fetch_row(result)))
464: {
465: /*
466: * Lookup the first ID and return it
467: */
468: if (row[0] == NULL) {
469: mysql_free_result(result);
470: printf("sql_create: select returns NULL !\n");
471: return(-1);
472: }
473: if (sscanf(row[0], "%d", &id) != 1) {
474: mysql_free_result(result);
475: printf("sql_create: ID non numeric %s\n", row[0]);
476: return(-1);
477: }
478: mysql_free_result(result);
479: return(id);
480: }
481: mysql_free_result(result);
482: }
483: if(mysql_errno(sql)) {
484: fprintf(stderr, "Error: %s\n", mysql_error(sql));
485: return(-1);
486: }
487: return(-1);
488: }
489:
490: int sql_read_info_key(const char *table, const char *name, const char *value) {
491: int id;
492: MYSQL_RES *result;
493: MYSQL_ROW row;
1.6 veillard 494: char query[SMALL_QUERY];
1.2 veillard 495:
496: if ((table == NULL) || (name == NULL) || (value == NULL))
497: return(-1);
498:
499: /*
500: * Search for the ID it has to exist
501: */
1.6 veillard 502: snprintf(query, SMALL_QUERY - 1, "SELECT ID FROM %s WHERE %s='%s'", table, name, value);
503: query[SMALL_QUERY - 1] = 0;
1.1 veillard 504: if (mysql_query(sql,query)) {
505: printf("sql_create: SELECT %s failed %s\n", name, mysql_error(sql));
506: return(-1);
507: }
508:
509: result = mysql_use_result(sql);
510: if (result) {
511: while((row = mysql_fetch_row(result)))
512: {
513: /*
514: * Lookup the first ID and return it
515: */
516: if (row[0] == NULL) {
517: mysql_free_result(result);
518: printf("sql_create: select returns NULL !\n");
519: return(-1);
520: }
521: if (sscanf(row[0], "%d", &id) != 1) {
522: mysql_free_result(result);
523: printf("sql_create: ID non numeric %s\n", row[0]);
524: return(-1);
525: }
526: mysql_free_result(result);
527: return(id);
528: }
529: mysql_free_result(result);
530: }
531: if(mysql_errno(sql)) {
532: fprintf(stderr, "Error: %s\n", mysql_error(sql));
533: return(-1);
534: }
535: return(-1);
536: }
537:
538: /************************************************************************
539: * *
540: * Tables handling *
541: * *
542: ************************************************************************/
543:
1.2 veillard 544: int sql_rebuild_config(void) {
545: const char *query =
546: "CREATE TABLE Config ( \n\
547: ID int(11) NOT NULL auto_increment, \n\
548: Name varchar(50) NOT NULL, \n\
549: Value varchar(255), \n\
550: PRIMARY KEY (ID), \n\
551: KEY Name (Name(10)) \n\
552: )";
553:
554: if (mysql_query(sql,query)) {
555: printf("sql_rebuild_config: CREATE TABLE Config failed %s\n",
556: mysql_error(sql));
557: return(-1);
558: }
559: return(0);
560: }
561:
1.1 veillard 562: int sql_rebuild_vendors(void) {
563: const char *query =
564: "CREATE TABLE Vendors ( \n\
565: ID int(11) NOT NULL auto_increment, \n\
566: Name varchar(255) NOT NULL, \n\
567: URL varchar(255), \n\
568: Key1 text, \n\
569: Key2 text, \n\
570: Key3 text, \n\
571: Description text, \n\
572: PRIMARY KEY (ID), \n\
573: KEY Name (Name(10)) \n\
574: )";
575:
576: if (mysql_query(sql,query)) {
1.2 veillard 577: printf("sql_rebuild_vendors: CREATE TABLE Vendors failed %s\n",
1.1 veillard 578: mysql_error(sql));
579: return(-1);
580: }
581: return(0);
582: }
583:
584: int sql_rebuild_mirrors(void) {
585: const char *query =
586: "CREATE TABLE Mirrors ( \n\
587: ID int(11), \n\
588: URL varchar(255) NOT NULL, \n\
589: Country int(11), \n\
590: UNIQUE(URL) \n\
591: )";
592:
593: if (mysql_query(sql,query)) {
1.2 veillard 594: printf("sql_rebuild_mirrors: CREATE TABLE Mirrors failed %s\n",
595: mysql_error(sql));
596: return(-1);
597: }
598: return(0);
599: }
600:
601: int sql_rebuild_metadata(void) {
602: const char *query =
603: "CREATE TABLE Metadata ( \n\
604: URL varchar(255) NOT NULL, \n\
605: Maintainer int(11), \n\
606: Country int(11), \n\
607: UNIQUE(URL) \n\
608: )";
609:
610: if (mysql_query(sql,query)) {
611: printf("sql_rebuild_metadata: CREATE TABLE Metadata failed %s\n",
1.1 veillard 612: mysql_error(sql));
613: return(-1);
614: }
615: return(0);
616: }
617:
618: int sql_rebuild_distribs(void) {
619: const char *query =
620: "CREATE TABLE Distribs ( \n\
621: ID int(11) NOT NULL auto_increment, \n\
622: Name varchar(255) NOT NULL, \n\
623: Vendor int(11), \n\
1.2 veillard 624: Directory varchar(255), \n\
1.1 veillard 625: Path varchar(100) NOT NULL, \n\
626: URL varchar(255), \n\
627: URLSrc varchar(255), \n\
1.9 veillard 628: Html varchar(8), \n\
629: Color varchar(10), \n\
1.1 veillard 630: Key1 text, \n\
631: Key2 text, \n\
632: Description text, \n\
633: PRIMARY KEY (ID), \n\
634: KEY Name (Name(10)) \n\
635: )";
636:
637: if (mysql_query(sql,query)) {
1.2 veillard 638: printf("sql_rebuild_distribs: CREATE TABLE Distribs failed %s\n",
639: mysql_error(sql));
640: return(-1);
641: }
642: return(0);
643: }
644:
645: int sql_rebuild_packages(void) {
646: const char *query =
647: "CREATE TABLE Packages ( \n\
648: ID int(11) NOT NULL auto_increment, \n\
649: filename varchar(255) NOT NULL, \n\
650: Name varchar(50) NOT NULL, \n\
651: Version varchar(50) NOT NULL, \n\
652: Release varchar(50) NOT NULL, \n\
1.6 veillard 653: Arch varchar(15) NOT NULL, \n\
1.2 veillard 654: Dist int(11), \n\
655: URL varchar(255), \n\
656: URLSrc varchar(255), \n\
657: Vendor int(11), \n\
658: Packager int(11), \n\
659: Category varchar(255), \n\
660: Summary varchar(255), \n\
661: Description text, \n\
662: Copyright varchar(255), \n\
663: PRIMARY KEY (ID), \n\
1.7 veillard 664: KEY filename (filename(80)), \n\
665: KEY Name (Name(15)) \n\
1.2 veillard 666: )";
667:
668: if (mysql_query(sql,query)) {
669: printf("sql_rebuild_packages: CREATE TABLE Packages failed %s\n",
670: mysql_error(sql));
671: return(-1);
672: }
673: return(0);
674: }
675:
676: int sql_rebuild_files(void) {
677: const char *query =
678: "CREATE TABLE Files ( \n\
1.6 veillard 679: ID int(11) NOT NULL, \n\
1.7 veillard 680: Path varchar(35) NOT NULL, \n\
681: UNIQUE KEY id (ID,Path(35)), \n\
1.6 veillard 682: INDEX (ID), \n\
683: INDEX (Path) \n\
1.2 veillard 684: )";
685:
686: if (mysql_query(sql,query)) {
687: printf("sql_rebuild_files: CREATE TABLE Files failed %s\n",
1.1 veillard 688: mysql_error(sql));
689: return(-1);
690: }
691: return(0);
692: }
693:
1.8 veillard 694: int sql_rebuild_provides(void) {
695: const char *query =
696: "CREATE TABLE Provides ( \n\
697: ID int(11) NOT NULL, \n\
698: Resource varchar(35) NOT NULL, \n\
699: UNIQUE KEY id (ID,Resource(35)), \n\
700: INDEX (ID), \n\
701: INDEX (Resource) \n\
702: )";
703:
704: if (mysql_query(sql,query)) {
705: printf("sql_rebuild_files: CREATE TABLE Provides failed %s\n",
706: mysql_error(sql));
707: return(-1);
708: }
709: return(0);
710: }
711:
712: int sql_rebuild_requires(void) {
713: const char *query =
714: "CREATE TABLE Requires ( \n\
715: ID int(11) NOT NULL, \n\
716: Resource varchar(35) NOT NULL, \n\
717: Rel char(2), \n\
718: Value varchar(20), \n\
719: UNIQUE KEY id (ID,Resource(35)), \n\
720: INDEX (ID), \n\
721: INDEX (Resource) \n\
722: )";
723:
724: if (mysql_query(sql,query)) {
725: printf("sql_rebuild_files: CREATE TABLE Requires failed %s\n",
726: mysql_error(sql));
727: return(-1);
728: }
729: return(0);
730: }
731:
1.1 veillard 732:
733: int sql_check_tables(void) {
734: const char *query = "SHOW TABLES";
735: MYSQL_RES *result;
736: MYSQL_ROW row;
1.2 veillard 737: int config = 0;
1.1 veillard 738: int distribs = 0;
1.8 veillard 739: int requires = 0;
740: int provides = 0;
1.1 veillard 741: int vendors = 0;
742: int mirrors = 0;
1.2 veillard 743: int metadata = 0;
744: int packages = 0;
745: int files = 0;
746:
1.1 veillard 747: int rebuilt = 0;
748:
749: if (mysql_query(sql,query)) {
1.2 veillard 750: printf("sql_check_tables: SHOW TABLES failed %s\n",
1.1 veillard 751: mysql_error(sql));
752: return(-1);
753: }
754:
755: result = mysql_use_result(sql);
756: if (result) {
757: while((row = mysql_fetch_row(result)))
758: {
759: if (row[0] == NULL) {
760: mysql_free_result(result);
761: printf("sql_check_tables: SHOW TABLES returns NULL !\n");
762: return(-1);
763: }
1.2 veillard 764: if (!strcmp(row[0], "Config"))
765: config = 1;
1.1 veillard 766: if (!strcmp(row[0], "Distribs"))
767: distribs = 1;
768: if (!strcmp(row[0], "Vendors"))
769: vendors = 1;
770: if (!strcmp(row[0], "Mirrors"))
771: mirrors = 1;
1.2 veillard 772: if (!strcmp(row[0], "Metadata"))
773: metadata = 1;
774: if (!strcmp(row[0], "Packages"))
775: packages = 1;
776: if (!strcmp(row[0], "Files"))
777: files = 1;
1.8 veillard 778: if (!strcmp(row[0], "Requires"))
779: requires = 1;
780: if (!strcmp(row[0], "Provides"))
781: provides = 1;
1.1 veillard 782: }
783: mysql_free_result(result);
784: }
785: if(mysql_errno(sql)) {
786: fprintf(stderr, "Error: %s\n", mysql_error(sql));
787: return(-1);
788: }
789:
1.2 veillard 790: if (!config) {
791: fprintf(stderr, "Table Config disapeared: rebuilding it\n");
792: if (!sql_rebuild_config())
793: rebuilt++;
794: }
1.1 veillard 795: if (!vendors) {
796: fprintf(stderr, "Table Vendors disapeared: rebuilding it\n");
797: if (!sql_rebuild_vendors())
798: rebuilt++;
799: }
800: if (!distribs) {
801: fprintf(stderr, "Table Distribs disapeared: rebuilding it\n");
802: if (!sql_rebuild_distribs())
803: rebuilt++;
804: }
805: if (!mirrors) {
806: fprintf(stderr, "Table Mirrors disapeared: rebuilding it\n");
807: if (!sql_rebuild_mirrors())
808: rebuilt++;
809: }
1.2 veillard 810: if (!metadata) {
811: fprintf(stderr, "Table Metadata disapeared: rebuilding it\n");
812: if (!sql_rebuild_metadata())
813: rebuilt++;
814: }
815: if (!packages) {
816: fprintf(stderr, "Table Packages disapeared: rebuilding it\n");
817: if (!sql_rebuild_packages())
818: rebuilt++;
819: }
820: if (!files) {
821: fprintf(stderr, "Table Files disapeared: rebuilding it\n");
822: if (!sql_rebuild_files())
823: rebuilt++;
824: }
1.8 veillard 825: if (!requires) {
826: fprintf(stderr, "Table Requires disapeared: rebuilding it\n");
827: if (!sql_rebuild_requires())
828: rebuilt++;
829: }
830: if (!provides) {
831: fprintf(stderr, "Table Provides disapeared: rebuilding it\n");
832: if (!sql_rebuild_provides())
833: rebuilt++;
834: }
1.1 veillard 835: return(rebuilt);
836: }
837:
838: /************************************************************************
839: * *
840: * Specific rpm2html functions *
841: * *
842: ************************************************************************/
843:
1.5 veillard 844: int sql_add_dist_mirror(int distrib, const char *URL, int country) {
1.1 veillard 845: if (URL == NULL)
846: return(-1);
847: if (distrib < 0)
848: return(-1);
849: return(sql_blind_insert("Mirrors", "URL", URL, distrib));
850: }
851:
1.5 veillard 852: int sql_add_mirror(const char *Name, const char *URL, int country) {
1.1 veillard 853: int distrib;
854:
855: if ((Name == NULL) || (URL == NULL))
856: return(-1);
857: distrib = sql_read_key("Distribs", Name);
858: if (distrib < 0)
859: return(distrib);
860: return(sql_blind_insert("Mirrors", "URL", URL, distrib));
861: }
862:
1.6 veillard 863: int sql_add_file(const char *filename, int package) {
864: if ((filename == NULL) || (package <= 0))
865: return(-1);
1.7 veillard 866: if (strlen(filename) > 35)
867: return(0);
1.6 veillard 868:
869: return(sql_blind_insert("Files", "Path", filename, package));
870: }
871:
1.8 veillard 872: int sql_add_provides(int package, const char *resource) {
873: if ((resource == NULL) || (package <= 0))
874: return(-1);
875: if (strlen(resource) > 35)
876: return(0);
877:
878: return(sql_blind_insert("Provides", "Resource", resource, package));
879: }
880:
1.13 ! veillard 881: int sql_add_requires(int package, const char *resource, int rel,
1.8 veillard 882: const char *value) {
883: int record;
884: if ((resource == NULL) || (package <= 0))
885: return(-1);
886: if (strlen(resource) > 35)
887: return(0);
888:
889: record = sql_blind_insert("Requires", "Resource", resource, package);
890: if ((rel != NULL) && (value != NULL) &&
891: (strlen(rel) <= 2) && (strlen(value) <= 20)) {
892: char query[SMALL_QUERY];
893: snprintf(query, SMALL_QUERY - 1,
894: "UPDATE Requires SET Rel='%s',Value='%s' WHERE ID=%d",
895: rel, value, record);
896: query[SMALL_QUERY - 1] = 0;
897: if (mysql_query(sql,query)) {
898: printf("sql_create: UPDATE Requires %d failed %s\n",
899: record, mysql_error(sql));
900: return(record);
901: }
902: }
903: return(record);
904: }
905:
1.5 veillard 906: int sql_add_package(const char *filename,
1.2 veillard 907: const char *Name, const char *Version, const char *Release,
1.6 veillard 908: const char *Arch,
909: int dist, const char *URL, const char *URLSrc, int vendor,
1.2 veillard 910: const char *Packager, const char *Category, const char *Summary,
911: const char *Description, const char *Copyright) {
912: int id;
1.6 veillard 913: /* int packager;
914: char intStr[15]; */
1.2 veillard 915: int nb_fields = 0;
916:
1.6 veillard 917: if (filename == NULL)
1.2 veillard 918: return(-1);
1.6 veillard 919:
920: if (dist < 0)
1.2 veillard 921: return(-1);
1.6 veillard 922: if ((Name == NULL) || (Version == NULL) || (Release == NULL) ||
923: (Arch == NULL))
924: return(-1);
925:
926: id = sql_get_key("Packages", "filename", filename);
1.2 veillard 927: if (id <= 0)
928: return(-1);
929: nb_fields = 1;
1.8 veillard 930:
931: if (rpm2htmlVerbose > 1)
932: printf("Adding %s ID %d\n", filename, id);
933:
1.2 veillard 934: /*******
935: if (Packager != NULL) {
936: packager = sql_get_key("People", Packager);
937: sprintf(intStr, "%d", packager);
938: nb_fields += sql_update_id("Distribs", id, "Packager", intStr);
939: }
940: *******/
941: if (Name != NULL)
1.6 veillard 942: nb_fields += sql_update_id("Packages", id, "Name", Name);
1.2 veillard 943: if (Version != NULL)
944: nb_fields += sql_update_id("Packages", id, "Version", Version);
945: if (Release != NULL)
946: nb_fields += sql_update_id("Packages", id, "Release", Release);
1.6 veillard 947: if (Release != NULL)
948: nb_fields += sql_update_id("Packages", id, "Arch", Arch);
1.2 veillard 949: if (Category != NULL)
950: nb_fields += sql_update_id("Packages", id, "Category", Category);
951: if (URL != NULL)
952: nb_fields += sql_update_id("Packages", id, "URL", URL);
953: if (URLSrc != NULL)
954: nb_fields += sql_update_id("Packages", id, "URLSrc", URLSrc);
955: if (Summary != NULL)
956: nb_fields += sql_update_id("Packages", id, "Summary", Summary);
957: if (Description != NULL)
958: nb_fields += sql_update_id("Packages", id,
959: "Description", Description);
960: if (Copyright != NULL)
961: nb_fields += sql_update_id("Packages", id, "Copyright", Copyright);
962:
1.6 veillard 963: return(id);
1.2 veillard 964: }
965:
1.5 veillard 966: int sql_add_distrib(const char *Name, const char *Vendor,
1.2 veillard 967: const char *Directory, const char *Path, const char *URL,
1.9 veillard 968: const char *URLSrc, const char *Description,
969: const char *Html, const char *Color) {
1.1 veillard 970: int id, vendor;
971: int nb_fields = 0;
972: char VendorStr[15];
973:
974: if (Name == NULL)
975: return(-1);
976:
1.6 veillard 977: id = sql_get_key("Distribs", "Name", Name);
1.1 veillard 978: nb_fields = 1;
979: if (Vendor != NULL) {
1.6 veillard 980: vendor = sql_get_key("Vendors", "Name", Vendor);
1.1 veillard 981: sprintf(VendorStr, "%d", vendor);
982: nb_fields += sql_update_id("Distribs", id, "Vendor", VendorStr);
983: }
1.2 veillard 984: if (Directory != NULL)
985: nb_fields += sql_update_id("Distribs", id, "Directory", Directory);
1.1 veillard 986: if (Path != NULL)
987: nb_fields += sql_update_id("Distribs", id, "Path", Path);
988: if (URL != NULL)
989: nb_fields += sql_update_id("Distribs", id, "URL", URL);
990: if (URLSrc != NULL)
991: nb_fields += sql_update_id("Distribs", id, "URLSrc", URLSrc);
1.9 veillard 992: if (Html != NULL)
993: nb_fields += sql_update_id("Distribs", id, "Html", Html);
994: if (Color != NULL)
995: nb_fields += sql_update_id("Distribs", id, "Color", Color);
1.1 veillard 996: if (Description != NULL)
997: nb_fields += sql_update_id("Distribs", id,
998: "Description", Description);
999:
1000: return(nb_fields);
1001: }
1002:
1.5 veillard 1003: int sql_add_vendor(const char *Name, const char *URL, const char *Description) {
1.1 veillard 1004: int id;
1005: int nb_fields = 0;
1006:
1007: if (Name == NULL)
1008: return(-1);
1009:
1.6 veillard 1010: id = sql_get_key("Vendors", "Name", Name);
1.1 veillard 1011: nb_fields = 1;
1012: if (URL != NULL)
1013: nb_fields += sql_update_id("Vendors", id, "URL", URL);
1014: if (Description != NULL)
1015: nb_fields += sql_update_id("Vendors", id,
1016: "Description", Description);
1017:
1018: return(nb_fields);
1019: }
1020:
1.5 veillard 1021: void sql_add_config_info(const char *name, const char *value) {
1.2 veillard 1022: sql_update("Config", name, "Value", value);
1023: }
1024:
1.5 veillard 1025: void sql_add_metadata_base(const char *URL) {
1.2 veillard 1026: sql_blind_insert("Metadata", "URL", URL, -1);
1027: }
1028:
1.6 veillard 1029: /************************************************************************
1030: * *
1.8 veillard 1031: * Cleanup functions *
1032: * *
1033: ************************************************************************/
1034:
1035: int sql_remove_package(int id) {
1036: char query[SMALL_QUERY];
1037:
1038: if (id <= 0)
1039: return(-1);
1040:
1041: /*
1042: * remove the ID from the package list
1043: */
1044: snprintf(query, SMALL_QUERY - 1, "DELETE FROM Packages WHERE ID=%d", id);
1045: query[SMALL_QUERY - 1] = 0;
1046: if (mysql_query(sql,query)) {
1047: printf("sql_create: DELETE package %d failed %s\n", id, mysql_error(sql));
1048: return(-1);
1049: }
1050: if(mysql_errno(sql)) {
1051: fprintf(stderr, "Error: %s\n", mysql_error(sql));
1052: return(-1);
1053: }
1054:
1055: /*
1056: * remove the associated files from the Files list
1057: */
1058: snprintf(query, SMALL_QUERY - 1, "DELETE FROM Files WHERE ID=%d", id);
1059: query[SMALL_QUERY - 1] = 0;
1060: if (mysql_query(sql,query)) {
1061: printf("sql_create: DELETE Files %d failed %s\n", id, mysql_error(sql));
1062: return(-1);
1063: }
1064: if(mysql_errno(sql)) {
1065: fprintf(stderr, "Error: %s\n", mysql_error(sql));
1066: return(-1);
1067: }
1068:
1069: /*
1070: * remove the associated Provides entries
1071: */
1072: snprintf(query, SMALL_QUERY - 1, "DELETE FROM Provides WHERE ID=%d", id);
1073: query[SMALL_QUERY - 1] = 0;
1074: if (mysql_query(sql,query)) {
1075: printf("sql_create: DELETE Provides %d failed %s\n", id, mysql_error(sql));
1076: return(-1);
1077: }
1078: if(mysql_errno(sql)) {
1079: fprintf(stderr, "Error: %s\n", mysql_error(sql));
1080: return(-1);
1081: }
1082:
1083: /*
1084: * remove the associated Requires entries
1085: */
1086: snprintf(query, SMALL_QUERY - 1, "DELETE FROM Requires WHERE ID=%d", id);
1087: query[SMALL_QUERY - 1] = 0;
1088: if (mysql_query(sql,query)) {
1089: printf("sql_create: DELETE Requires %d failed %s\n", id, mysql_error(sql));
1090: return(-1);
1091: }
1092: if(mysql_errno(sql)) {
1093: fprintf(stderr, "Error: %s\n", mysql_error(sql));
1094: return(-1);
1095: }
1096:
1097: return(-1);
1098: }
1099:
1100: int sql_check_packages(void) {
1101: MYSQL_RES *result;
1102: MYSQL_ROW row;
1103: char *query = "SELECT filename,ID FROM Packages LIMIT 500";
1104: struct stat buf;
1105: int id;
1106: int ids[500];
1107: int index;
1108: int total = 0;
1109:
1110: if (rpm2htmlVerbose)
1111: printf("Database cleanup\n");
1112: rescan:
1113: index = 0;
1114: /*
1115: * Search first for the ID if it already exists
1116: */
1117: if (mysql_query(sql,query)) {
1118: printf("sql_check_packages: SELECT from Packages failed: %s\n",
1119: mysql_error(sql));
1120: return(-1);
1121: }
1122:
1123: result = mysql_use_result(sql);
1124: if (result) {
1125: while((row = mysql_fetch_row(result)))
1126: {
1127: if ((row[0] == NULL) || (row[1] == NULL)) {
1128: printf("sql_check_packages: Path or ID is NULL !\n");
1129: continue;
1130: }
1131: if ((stat(row[0], &buf) < 0) || (buf.st_size < 50)) {
1132: /*
1133: * Need to remove the package from the database.
1134: */
1135: if (sscanf(row[1], "%d", &id) != 1) {
1136: printf("sql_check_packages: ID non numeric %s\n", row[1]);
1137: continue;
1138: }
1139: ids[index++] = id;
1140: if (rpm2htmlVerbose > 1)
1141: printf("Removing %s ID %d\n", row[0], id);
1142: if (index >= 500)
1143: break;
1144: }
1145: }
1146: mysql_free_result(result);
1147: }
1148: if(mysql_errno(sql)) {
1149: fprintf(stderr, "sql_update Error: %s\n", mysql_error(sql));
1150: return(-1);
1151: }
1152:
1153: /*
1154: * Do the cleanup.
1155: */
1156: for (id = 0;id < index;id++) {
1157: sql_remove_package(ids[id]);
1158: }
1159:
1160: total += index;
1161: if (index >= 500)
1162: goto rescan;
1163: if (rpm2htmlVerbose)
1164: printf("Database cleanup : removed %d entries\n", total);
1165: return(total);
1166: }
1167:
1168: /************************************************************************
1169: * *
1.6 veillard 1170: * Export functions *
1171: * *
1172: ************************************************************************/
1173:
1174: void sql_show_config(void) {
1175: MYSQL_RES *result;
1176: MYSQL_ROW row;
1.8 veillard 1177: int id, i;
1178: int index = 0;
1179: int ids[500];
1180: char query[SMALL_QUERY];
1.6 veillard 1181:
1182:
1.8 veillard 1183: printf(";\n; Configuration file for rpm2html\n");
1184: printf("; http://rpmfind.net/linux/rpm2html/\n;\n\n");
1185: mysql_query(sql,"SELECT Name,Value FROM Config");
1.6 veillard 1186: result = mysql_use_result(sql);
1187:
1188: while((row = mysql_fetch_row(result)))
1189: {
1.8 veillard 1190: if (row[0] == NULL) {
1191: printf("\n");
1192: } else {
1193: if (!strcmp(row[0], "maint"))
1194: printf("; maintainer of the local rpm mirror\n");
1195: else if (!strcmp(row[0], "mail"))
1196: printf("; mail for the maintainer\n");
1197: else if (!strcmp(row[0], "dir"))
1198: printf("; Directory to store the HTML pages produced\n");
1199: else if (!strcmp(row[0], "url"))
1200: printf("; The relative URL for front pages\n");
1201: else if (!strcmp(row[0], "header"))
1202: printf("; Extra link in the navigation bar\n");
1203: else if (!strcmp(row[0], "html"))
1204: printf("; Export the local packages in HTML format\n");
1205: else if (!strcmp(row[0], "tree"))
1206: printf("; Build the tree for the distributions\n");
1207: else if (!strcmp(row[0], "rdf"))
1208: printf("; Export the local packages in RDF format\n");
1209: else if (!strcmp(row[0], "rdf_dir"))
1210: printf("; Directory to store the RDf tree\n");
1211: else if (!strcmp(row[0], "rdf_resources"))
1212: printf("; Compile a list of resources in RDF format\n");
1213: else if (!strcmp(row[0], "rdf_resources_dir"))
1214: printf("; Directory to store the RDf resources tree\n");
1215:
1.6 veillard 1216: if (row[1] == NULL)
1.8 veillard 1217: printf("%s\n\n", row[0]);
1.6 veillard 1218: else
1.8 veillard 1219: printf("%s=%s\n\n", row[0], row[1]);
1220: }
1221: }
1222: mysql_free_result(result);
1223: if(mysql_errno(sql)) {
1224: fprintf(stderr, "Error: %s\n", mysql_error(sql));
1225: }
1226:
1227: /*
1228: * Dump the Metadata
1229: */
1230: printf(";\n; The metadata mirrors list\n;\n\n[metadata]\n");
1231: mysql_query(sql,"SELECT URL FROM Metadata");
1232: result = mysql_use_result(sql);
1233:
1234: while((row = mysql_fetch_row(result)))
1235: {
1236: if (row[0] != NULL) {
1237: printf("mirror=%s\n", row[0]);
1.6 veillard 1238: }
1239: }
1.8 veillard 1240: mysql_free_result(result);
1.6 veillard 1241: if(mysql_errno(sql)) {
1242: fprintf(stderr, "Error: %s\n", mysql_error(sql));
1243: }
1244:
1.8 veillard 1245: /*
1246: * Dump the distributions informations
1247: * 1/ collect the list of IDs for the distribs
1248: */
1249: printf("\n\n;\n; The distribution list\n;\n\n");
1250: mysql_query(sql,"SELECT ID FROM Distribs");
1251: result = mysql_use_result(sql);
1252:
1253: while((row = mysql_fetch_row(result)))
1254: {
1255: if (row[0] != NULL) {
1256: if (sscanf(row[0], "%d", &id) == 1) {
1257: ids[index++] = id;
1258: }
1259: }
1260: }
1261: mysql_free_result(result);
1262:
1263: /*
1264: * Dump each distribution separately.
1265: */
1266: for (i = 0;i < index;i++) {
1267:
1268: snprintf(query, SMALL_QUERY - 1,
1.10 veillard 1269: "SELECT Directory,Name,Vendor,Path,URL,URLSrc,Description,Html,Color \
1.8 veillard 1270: FROM Distribs WHERE ID=%d", ids[i]);
1271: query[SMALL_QUERY - 1] = 0;
1272: if (mysql_query(sql,query)) {
1273: printf("sql_show_config: SELECT Distrib %d failed: %s\n",
1274: ids[i], mysql_error(sql));
1275: continue;
1276: }
1277:
1278: result = mysql_use_result(sql);
1279: if (result) {
1280: while((row = mysql_fetch_row(result)))
1281: {
1282: if (row[0] == NULL)
1283: break;
1284: printf("[%s]\n", row[0]);
1285: if (row[1] != NULL)
1286: printf("name=%s\n", row[1]);
1287: if (row[3] != NULL)
1288: printf("subdir=%s\n", row[3]);
1289: if (row[4] != NULL)
1290: printf("ftp=%s\n", row[4]);
1291: if (row[5] != NULL)
1292: printf("ftpsrc=%s\n", row[5]);
1.10 veillard 1293: if (row[7] != NULL)
1294: printf("html=%s\n", row[7]);
1295: if (row[8] != NULL)
1296: printf("color=%s\n", row[8]);
1.8 veillard 1297: }
1298: }
1299: mysql_free_result(result);
1.12 veillard 1300:
1301: /*
1302: * Extract the mirrors for this distribution.
1303: */
1304: snprintf(query, SMALL_QUERY - 1,
1305: "SELECT URL FROM Mirrors WHERE ID=%d", ids[i]);
1306: query[SMALL_QUERY - 1] = 0;
1307: if (mysql_query(sql,query)) {
1308: printf("sql_show_config: SELECT Mirrors %d failed: %s\n",
1309: ids[i], mysql_error(sql));
1310: printf("\n\n");
1311: continue;
1312: }
1313: result = mysql_use_result(sql);
1314: if (result) {
1315: while((row = mysql_fetch_row(result)))
1316: {
1317: if (row[0] == NULL)
1318: continue;
1319: printf("mirror=%s\n", row[0]);
1320: }
1321: }
1322: mysql_free_result(result);
1323:
1.8 veillard 1324: printf("\n\n");
1325: }
1326:
1327: printf(";\n; End of the configuration file for rpm2html\n;\n");
1.6 veillard 1328: }
1329:
1330: void sql_show_metadata(void) {
1331: MYSQL_RES *result;
1332: MYSQL_ROW row;
1333:
1334:
1335: mysql_query(sql,"SELECT URL FROM Metadata");
1336: result = mysql_use_result(sql);
1337:
1338: while((row = mysql_fetch_row(result)))
1339: {
1340: if (row[0] == NULL)
1341: printf("NULL !\n");
1342: else {
1343: printf("%s\n", row[0]);
1344: }
1345: }
1346: if(mysql_errno(sql)) {
1347: fprintf(stderr, "Error: %s\n", mysql_error(sql));
1348: }
1349:
1350: }
1351:
1352: void sql_show_mirrors(void) {
1353: MYSQL_RES *result;
1354: MYSQL_ROW row;
1355:
1356:
1357: mysql_query(sql,"SELECT URL FROM Mirrors");
1358: result = mysql_use_result(sql);
1359:
1360: while((row = mysql_fetch_row(result)))
1361: {
1362: if (row[0] == NULL)
1363: printf("NULL !\n");
1364: else {
1365: printf("%s\n", row[0]);
1366: }
1367: }
1368: if(mysql_errno(sql)) {
1369: fprintf(stderr, "Error: %s\n", mysql_error(sql));
1370: }
1371: }
1372:
1.5 veillard 1373: void sql_show_vendors(void) {
1.1 veillard 1374: MYSQL_RES *result;
1375: MYSQL_ROW row;
1376:
1377:
1378: mysql_query(sql,"SELECT Name, URL FROM Vendors");
1379: result = mysql_use_result(sql);
1380:
1381: while((row = mysql_fetch_row(result)))
1382: {
1383: if (row[0] == NULL)
1384: printf("NULL !\n");
1385: else {
1386: if (row[1] == NULL)
1387: printf("%s : no url\n", row[0]);
1388: else
1389: printf("%s : %s\n", row[0], row[1]);
1390: }
1391: }
1392: if(mysql_errno(sql)) {
1393: fprintf(stderr, "Error: %s\n", mysql_error(sql));
1394: }
1395:
1396: }
1397:
1.5 veillard 1398: void sql_show_distribs(void) {
1.1 veillard 1399: MYSQL_RES *result;
1400: MYSQL_ROW row;
1401:
1402:
1403: mysql_query(sql,"SELECT Name, Path, URL FROM Distribs");
1404: result = mysql_use_result(sql);
1405:
1406: while((row = mysql_fetch_row(result)))
1407: {
1408: if (row[0] == NULL)
1409: printf("NULL !\n");
1410: else {
1411: if (row[1] == NULL)
1412: printf("%s : no Path\n", row[0]);
1413: else {
1414: if (row[2] == NULL)
1415: printf("%s : %s : no url\n", row[0], row[1]);
1416: else
1417: printf("%s : %s : %s\n", row[0], row[1], row[2]);
1418: }
1419: }
1420: }
1421: if(mysql_errno(sql)) {
1422: fprintf(stderr, "Error: %s\n", mysql_error(sql));
1423: }
1424:
1425: }
1426:
1.5 veillard 1427: int sql_show_table_stats(const char *table, const char *key) {
1.6 veillard 1428: char query[MAX_QUERY];
1.2 veillard 1429: MYSQL_RES *result;
1430: MYSQL_ROW row;
1431: int res;
1432:
1433: /*
1434: * Search first for the ID if it already exists
1435: */
1.6 veillard 1436: snprintf(query, MAX_QUERY - 1, "SELECT COUNT(%s) FROM %s", key, table);
1437: query[MAX_QUERY - 1] = 0;
1.2 veillard 1438: if (mysql_query(sql,query)) {
1.5 veillard 1439: printf("sql_show_table_stats: SELECT COUNT failed: %s\n",
1.2 veillard 1440: mysql_error(sql));
1441: return(-1);
1442: }
1443:
1444: result = mysql_use_result(sql);
1445: if (result) {
1446: while((row = mysql_fetch_row(result)))
1447: {
1448: /*
1449: * Lookup the value and return it
1450: */
1451: if (row[0] == NULL) {
1452: mysql_free_result(result);
1.5 veillard 1453: printf("sql_show_table_stats: select count returns NULL !\n");
1.2 veillard 1454: return(-1);
1455: }
1456: if (sscanf(row[0], "%d", &res) != 1) {
1457: mysql_free_result(result);
1.5 veillard 1458: printf("sql_show_table_stats: value non numeric %s\n", row[0]);
1.2 veillard 1459: return(-1);
1460: }
1461: mysql_free_result(result);
1462: if (res <= 0)
1463: printf(" %s is empty\n", table);
1464: else
1465: printf(" %s contains %d records\n", table, res);
1466: return(res);
1467: }
1468: mysql_free_result(result);
1469: }
1470: if(mysql_errno(sql)) {
1.5 veillard 1471: fprintf(stderr, "sql_show_stats error: %s\n", mysql_error(sql));
1.2 veillard 1472: }
1473: return(-1);
1474: }
1475:
1.5 veillard 1476: int sql_show_stats(void) {
1.2 veillard 1477: const char *query = "SHOW TABLES";
1478: MYSQL_RES *result;
1479: MYSQL_ROW row;
1480:
1481: int tables = 0;
1482: int records = 0;
1483:
1484: if (mysql_query(sql,query)) {
1485: printf("sql_check_tables: SHOW TABLES failed %s\n",
1486: mysql_error(sql));
1487: return(-1);
1488: }
1489:
1490: result = mysql_use_result(sql);
1491: if (result) {
1492: while((row = mysql_fetch_row(result)))
1493: {
1494: if (row[0] == NULL) {
1495: mysql_free_result(result);
1496: printf("sql_check_tables: SHOW TABLES returns NULL !\n");
1497: return(-1);
1498: }
1499: tables++;
1500: }
1501: mysql_free_result(result);
1502: }
1503: if(mysql_errno(sql)) {
1.5 veillard 1504: fprintf(stderr, "sql_show_stats error: %s\n", mysql_error(sql));
1.2 veillard 1505: }
1506: printf("%d tables in use\n", tables);
1.5 veillard 1507: records += sql_show_table_stats("Config", "Name");
1508: records += sql_show_table_stats("Distribs", "Name");
1509: records += sql_show_table_stats("Vendors", "Name");
1510: records += sql_show_table_stats("Mirrors", "URL");
1511: records += sql_show_table_stats("Metadata", "URL");
1512: records += sql_show_table_stats("Packages", "Name");
1.8 veillard 1513: records += sql_show_table_stats("Requires", "Resource");
1514: records += sql_show_table_stats("Provides", "Resource");
1.5 veillard 1515: records += sql_show_table_stats("Files", "Path");
1.2 veillard 1516: printf("Total: %d records\n", records);
1517: return(records);
1518: }
1519:
1520: /************************************************************************
1521: * *
1522: * rpm2html configuration functions *
1523: * *
1524: ************************************************************************/
1525: #ifndef STANDALONE
1526:
1527: int readConfigSql(void) {
1.6 veillard 1528: char query[MAX_QUERY];
1.3 veillard 1529: MYSQL_RES *result;
1530: MYSQL_ROW row;
1.4 veillard 1531: int dir = 0;
1.3 veillard 1532:
1.2 veillard 1533: /*
1.3 veillard 1534: * General configuration informations
1.2 veillard 1535: */
1.6 veillard 1536: snprintf(query, MAX_QUERY - 1, "SELECT Name,Value FROM Config");
1537: query[MAX_QUERY - 1] = 0;
1.3 veillard 1538: if (mysql_query(sql,query)) {
1539: printf("sql_check_tables: SELECT Config failed %s\n",
1540: mysql_error(sql));
1541: return(-1);
1542: }
1543:
1544: result = mysql_use_result(sql);
1545: if (result) {
1546: while((row = mysql_fetch_row(result)))
1547: {
1548: if ((row[0] == NULL) || (row[1] == NULL)) {
1549: fprintf(stderr, "readConfigSql : found NULL value\n");
1550: continue;
1551: }
1.4 veillard 1552: if (!strcmp(row[0], "dir"))
1553: dir = 1;
1.3 veillard 1554: addConfigEntry(RPM2HTML_NAME, row[0], row[1]);
1555: }
1556: mysql_free_result(result);
1557: }
1558: if(mysql_errno(sql)) {
1.5 veillard 1559: fprintf(stderr, "sql_show_stats error: %s\n", mysql_error(sql));
1.4 veillard 1560: }
1561: if (dir == 0) {
1562: fprintf(stderr, "readConfigSql : no directory\n");
1563: return(-1);
1.3 veillard 1564: }
1565:
1566: /*
1567: * The metadata mirror list.
1568: */
1.6 veillard 1569: snprintf(query, MAX_QUERY - 1, "SELECT URL FROM Metadata");
1570: query[MAX_QUERY - 1] = 0;
1.3 veillard 1571: if (mysql_query(sql,query)) {
1572: printf("sql_check_tables: SELECT Metadata failed %s\n",
1573: mysql_error(sql));
1574: return(-1);
1575: }
1576:
1577: result = mysql_use_result(sql);
1578: if (result) {
1579: while((row = mysql_fetch_row(result)))
1580: {
1581: if (row[0] == NULL) {
1582: fprintf(stderr, "readConfigSql : found NULL metadata\n");
1583: continue;
1584: }
1585: addConfigEntry("metadata", "mirror", row[0]);
1586: }
1587: mysql_free_result(result);
1588: }
1589: if(mysql_errno(sql)) {
1.5 veillard 1590: fprintf(stderr, "sql_show_stats error: %s\n", mysql_error(sql));
1.3 veillard 1591: }
1592:
1593: /*
1594: * The distribution lists
1595: */
1.6 veillard 1596: snprintf(query, MAX_QUERY - 1, "SELECT Directory,Name,URL,URLSrc,Path FROM Distribs");
1597: query[MAX_QUERY - 1] = 0;
1.3 veillard 1598: if (mysql_query(sql,query)) {
1599: printf("sql_check_tables: SELECT Distribs failed %s\n",
1600: mysql_error(sql));
1601: return(-1);
1602: }
1603:
1604: result = mysql_use_result(sql);
1605: if (result) {
1606: while((row = mysql_fetch_row(result)))
1607: {
1608: if (row[0] == NULL) {
1609: fprintf(stderr, "readConfigSql : found NULL distro\n");
1610: continue;
1611: }
1612:
1613: if (row[1] != NULL)
1614: addConfigEntry(row[0], "name", row[1]);
1615: if (row[2] != NULL)
1616: addConfigEntry(row[0], "ftp", row[2]);
1617: if (row[3] != NULL)
1618: addConfigEntry(row[0], "ftp", row[3]);
1619: if (row[4] != NULL)
1620: addConfigEntry(row[0], "subdir", row[4]);
1621: }
1622: mysql_free_result(result);
1623: }
1624: if(mysql_errno(sql)) {
1.5 veillard 1625: fprintf(stderr, "sql_show_stats error: %s\n", mysql_error(sql));
1.3 veillard 1626: }
1627:
1628: /*
1629: * The Mirrors
1630: */
1.6 veillard 1631: snprintf(query, MAX_QUERY - 1, "SELECT Distribs.Directory,Mirrors.URL FROM Distribs,Mirrors WHERE Distribs.ID = Mirrors.ID");
1632: query[MAX_QUERY - 1] = 0;
1.3 veillard 1633: if (mysql_query(sql,query)) {
1634: printf("sql_check_tables: SELECT Distribs failed %s\n",
1635: mysql_error(sql));
1636: return(-1);
1637: }
1638:
1639: result = mysql_use_result(sql);
1640: if (result) {
1641: while((row = mysql_fetch_row(result)))
1642: {
1643: if ((row[0] == NULL) || (row[1] == NULL)) {
1644: fprintf(stderr, "readConfigSql : found NULL mirror\n");
1645: continue;
1646: }
1647:
1648: addConfigEntry(row[0], "mirror", row[1]);
1649: }
1650: mysql_free_result(result);
1651: }
1652: if(mysql_errno(sql)) {
1.5 veillard 1653: fprintf(stderr, "sql_show_stats error: %s\n", mysql_error(sql));
1.3 veillard 1654: }
1655:
1.5 veillard 1656: /*
1657: * TODO: add the language(s) stuff
1658: */
1.3 veillard 1659: return(0);
1.2 veillard 1660: }
1661:
1662: void sqlConfigEntry(const char *rpmdir, const char *name, const char *value) {
1663: int distrib;
1664:
1665: if (rpm2htmlVerbose > 1)
1666: printf("sqlConfigEntry(\"%s\", \"%s\", \"%s\")\n", rpmdir, name, value);
1667:
1668: /*
1669: * case of global option for rpm2html.
1670: */
1671: if (!strcasecmp(rpmdir, RPM2HTML_NAME)) {
1.5 veillard 1672: sql_add_config_info(name, value);
1.2 veillard 1673: return;
1674: }
1675:
1676: /*
1677: * Options for the metadata mirrors.
1678: */
1679: if (!strcasecmp(rpmdir, "metadata")) {
1680: if (!strcasecmp(name, "mirror")) {
1.5 veillard 1681: sql_add_metadata_base(value);
1.2 veillard 1682: } else {
1683: printf("Config file : %s entry for [metadata] ignored\n", name);
1684: }
1685: return;
1686: }
1687:
1688: /*
1689: * option for a directory.
1690: */
1691: if (!strcasecmp(name, "name")) {
1.9 veillard 1692: sql_add_distrib(value, NULL, rpmdir, NULL, NULL, NULL, NULL,
1693: NULL, NULL);
1.2 veillard 1694: } else if (!strcasecmp(name, "subdir")) {
1695: distrib = sql_read_info_key("Distribs", "Directory", rpmdir);
1696: if (distrib > 0)
1697: sql_update_id("Distribs", distrib, "Path", value);
1698: } else if (!strcasecmp(name, "url")) {
1699: distrib = sql_read_info_key("Distribs", "Directory", rpmdir);
1700: if (distrib > 0)
1701: sql_update_id("Distribs", distrib, "URL", value);
1702: } else if (!strcasecmp(name, "ftp")) {
1703: distrib = sql_read_info_key("Distribs", "Directory", rpmdir);
1704: if (distrib > 0)
1705: sql_update_id("Distribs", distrib, "URL", value);
1706: } else if (!strcasecmp(name, "ftpsrc")) {
1707: distrib = sql_read_info_key("Distribs", "Directory", rpmdir);
1708: if (distrib > 0)
1709: sql_update_id("Distribs", distrib, "URLSrc", value);
1.9 veillard 1710: } else if (!strcasecmp(name, "html")) {
1711: distrib = sql_read_info_key("Distribs", "Directory", rpmdir);
1712: if (distrib > 0)
1713: sql_update_id("Distribs", distrib, "Html", value);
1714: } else if (!strcasecmp(name, "color")) {
1715: distrib = sql_read_info_key("Distribs", "Directory", rpmdir);
1716: if (distrib > 0)
1717: sql_update_id("Distribs", distrib, "Color", value);
1.2 veillard 1718: } else if (!strcasecmp(name, "mirror")) {
1719: distrib = sql_read_info_key("Distribs", "Directory", rpmdir);
1720: if (distrib > 0)
1.5 veillard 1721: sql_add_dist_mirror(distrib, value, 0);
1.2 veillard 1722: } else {
1723: printf("Config file : %s entry for [%s] ignored\n", name, rpmdir);
1724: }
1725: }
1726: #endif
1727:
1728: /************************************************************************
1729: * *
1730: * Main part when compiled standalone *
1731: * *
1732: ************************************************************************/
1733:
1.1 veillard 1734: #ifdef STANDALONE
1735: void usage(const char *name) {
1736: printf("%s: usage\n", name);
1.12 veillard 1737: printf(" config: dump a config file from the database\n");
1.6 veillard 1738: printf(" stats: show database usage statistics\n");
1.8 veillard 1739: printf(" stats: show database usage statistics\n");
1740: printf(" check: remove superfluous entries from the database\n");
1.1 veillard 1741: printf(" vendors: list the registered vendors\n");
1742: printf(" distribs: list the registered distribs\n");
1.6 veillard 1743: printf(" metadata: list the registered metadata servers\n");
1744: printf(" mirrors: list the registered mirrors\n");
1.2 veillard 1745: printf(" add distrib name [vendor [directory [path [url [ urlsrc [description]]]]]]\n");
1.1 veillard 1746: printf(" add vendor name [url [description]]\n");
1747: printf(" add mirror distrib url\n");
1748: exit(1);
1749: }
1750:
1751: int main(int argc, char **argv) {
1752: int res;
1753:
1754: if (argc < 2)
1755: usage(argv[0]);
1756:
1.11 veillard 1757: if (init_sql(NULL, NULL, NULL, NULL) < 0)
1.1 veillard 1758: exit(1);
1759:
1760: res = sql_check_tables();
1761: if (res > 0) {
1762: printf("rebuilt %d tables\n", res);
1763: }
1764:
1765: if (!strcmp(argv[1], "vendors"))
1.5 veillard 1766: sql_show_vendors();
1.6 veillard 1767: else if (!strcmp(argv[1], "metadata"))
1768: sql_show_metadata();
1769: else if (!strcmp(argv[1], "mirrors"))
1770: sql_show_mirrors();
1.1 veillard 1771: else if (!strcmp(argv[1], "distribs"))
1.5 veillard 1772: sql_show_distribs();
1.6 veillard 1773: else if (!strcmp(argv[1], "config"))
1774: sql_show_config();
1.2 veillard 1775: else if (!strcmp(argv[1], "stats"))
1.5 veillard 1776: sql_show_stats();
1.8 veillard 1777: else if (!strcmp(argv[1], "check"))
1778: sql_check_packages();
1.1 veillard 1779: else if (!strcmp(argv[1], "add")) {
1780: if (argc < 5)
1781: usage(argv[0]);
1782: if (!strcmp(argv[2], "distrib")) {
1783: char *Name = NULL;
1784: char *Path = NULL;
1.2 veillard 1785: char *Directory = NULL;
1.1 veillard 1786: char *Vendor = NULL;
1787: char *URL = NULL;
1788: char *URLSrc = NULL;
1789: char *Description = NULL;
1.9 veillard 1790: char *Color = NULL;
1791: char *Html = NULL;
1.1 veillard 1792: if ((argc > 3) && (argv[3][0] != 0))
1793: Name = argv[3];
1794: if ((argc > 4) && (argv[4][0] != 0))
1795: Vendor = argv[4];
1796: if ((argc > 5) && (argv[5][0] != 0))
1.2 veillard 1797: Directory = argv[5];
1.1 veillard 1798: if ((argc > 6) && (argv[6][0] != 0))
1.2 veillard 1799: Path = argv[6];
1.1 veillard 1800: if ((argc > 7) && (argv[7][0] != 0))
1.2 veillard 1801: URL = argv[7];
1.1 veillard 1802: if ((argc > 8) && (argv[8][0] != 0))
1.2 veillard 1803: URLSrc = argv[8];
1804: if ((argc > 9) && (argv[9][0] != 0))
1805: Description = argv[9];
1.5 veillard 1806: res = sql_add_distrib(Name, Vendor, Directory, Path,
1.9 veillard 1807: URL, URLSrc, Description, Color, Html);
1.1 veillard 1808: printf("updated %d fields\n", res);
1809: } else if (!strcmp(argv[2], "vendor")) {
1810: char *Name = NULL;
1811: char *URL = NULL;
1812: char *Description = NULL;
1813: if ((argc > 3) && (argv[3][0] != 0))
1814: Name = argv[3];
1815: if ((argc > 4) && (argv[4][0] != 0))
1816: URL = argv[4];
1817: if ((argc > 5) && (argv[5][0] != 0))
1818: Description = argv[5];
1.5 veillard 1819: res = sql_add_vendor(Name, URL, Description);
1.1 veillard 1820: printf("updated %d fields\n", res);
1821: } else if (!strcmp(argv[2], "mirror")) {
1822: char *Name = NULL;
1823: char *URL = NULL;
1824: if ((argc > 3) && (argv[3][0] != 0))
1825: Name = argv[3];
1826: if ((argc > 4) && (argv[4][0] != 0))
1827: URL = argv[4];
1.5 veillard 1828: res = sql_add_mirror(Name, URL, 0);
1.1 veillard 1829: printf("updated %d fields\n", res);
1830: }
1831: }
1832:
1833: if (close_sql() < 0)
1834: return(1);
1835: exit(0);
1836: }
1837:
1838: #endif
Webmaster