e59716e5842ee9f54cf6538cb4416c23d3b80622
[platform/upstream/libsolv.git] / tools / repomdxml2solv.c
1 /*
2  * Copyright (c) 2007-2009, Novell Inc.
3  *
4  * This program is licensed under the BSD license, read LICENSE.BSD
5  * for further information
6  */
7
8 #include <sys/types.h>
9 #include <limits.h>
10 #include <fcntl.h>
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14 #include <unistd.h>
15
16 #include "pool.h"
17 #include "repo.h"
18 #include "chksum.h"
19 #include "repo_repomdxml.h"
20 #include "common_write.h"
21
22 static void
23 usage(int status)
24 {
25   fprintf(stderr, "\nUsage:\n"
26           "repomdxml2solv [-q query]\n"
27           "  reads a 'repomd.xml' file from <stdin> and writes a .solv file to <stdout>\n"
28           "  -q : query a repomd data entry\n"
29           "  -h : print help & exit\n"
30          );
31    exit(status);
32 }
33
34 static void
35 doquery(Pool *pool, Repo *repo, const char *query)
36 {
37   Id id, type = 0;
38   char qbuf[256];
39   const char *qp;
40   Dataiterator di;
41
42   qp = strchr(query, ':');
43   if (qp)
44     {
45       type = pool_strn2id(pool, query, qp - query, 0);
46       if (!type)
47         exit(0);
48       qp++;
49     }
50   else
51     qp = query;
52   snprintf(qbuf, sizeof(qbuf), "repository:repomd:%s", qp);
53   id = pool_str2id(pool, qbuf, 0);
54   if (!id)
55     exit(0);
56   dataiterator_init(&di, pool, repo, SOLVID_META, id, 0, 0);
57   dataiterator_prepend_keyname(&di, REPOSITORY_REPOMD);
58   while (dataiterator_step(&di))
59     {
60       if (type)
61         {
62           dataiterator_setpos_parent(&di);
63           if (pool_lookup_id(pool, SOLVID_POS, REPOSITORY_REPOMD_TYPE) != type)
64             continue;
65         }
66       switch (di.key->type)
67         {
68         case REPOKEY_TYPE_ID:
69         case REPOKEY_TYPE_CONSTANTID:
70           printf("%s\n", pool_id2str(pool, di.kv.id));
71           break;
72         case REPOKEY_TYPE_STR:
73           printf("%s\n", di.kv.str);
74           break;
75         case REPOKEY_TYPE_NUM:
76           printf("%d\n", di.kv.num);
77           break;
78         case REPOKEY_TYPE_MD5:
79         case REPOKEY_TYPE_SHA1:
80         case REPOKEY_TYPE_SHA256:
81           printf("%s:%s\n", sat_chksum_type2str(di.key->type), repodata_chk2str(di.data, di.key->type, (unsigned char *)di.kv.str));
82           break;
83         default:
84           break;
85         }
86     }
87   dataiterator_free(&di);
88 }
89
90 int
91 main(int argc, char **argv)
92 {
93   int c, flags = 0;
94   const char *query = 0;
95   
96   Pool *pool = pool_create();
97   Repo *repo = repo_create(pool, "<stdin>");
98
99   while ((c = getopt (argc, argv, "hq:")) >= 0)
100     {
101       switch(c)
102         {
103         case 'h':
104           usage(0);
105           break;
106         case 'q':
107           query = optarg;
108           break;
109         default:
110           usage(1);
111           break;
112         }
113     }
114   repo_add_repomdxml(repo, stdin, flags);
115   if (query)
116     doquery(pool, repo, query);
117   else
118     tool_write(repo, 0, 0);
119   pool_free(pool);
120   exit(0);
121 }