add Slovak translation (Stanislav Meduna <stano@trillian.eunet.sk>)
[tools/librpm-tizen.git] / convertdb.c
1 /* This converts an old style (rpm 1.x) database to the new style */
2
3 #include "system.h"
4
5 #include "build/rpmbuild.h"
6
7 #include "falloc.h"
8 #include "oldrpmdb.h"
9 #include "oldheader.h"
10
11 int convertDB(void);
12
13 int convertDB(void) {
14     struct oldrpmdb olddb;
15     rpmdb db;
16     struct oldrpmdbLabel * packageLabels, * label;
17     struct oldrpmdbPackageInfo package;
18     Header dbentry;
19     char * group;
20     char * gif;
21     int gifSize;
22     char ** fileList;
23     char ** fileMD5List;
24     char ** fileLinktoList;
25     int_32 * fileSizeList;
26     int_32 * fileUIDList;
27     int_32 * fileGIDList;
28     int_32 * fileMtimesList;
29     int_32 * fileFlagsList;
30     int_16 * fileModesList;
31     int_16 * fileRDevsList;
32     char * fileStatesList;
33     char * preun, * postun;
34     int i, j;
35     
36     if (exists("/var/lib/rpm/packages.rpm")) {
37         rpmError(RPMERR_NOCREATEDB, _("RPM database already exists"));
38         return 0;
39     }
40
41     if (oldrpmdbOpen(&olddb)) {
42         rpmError(RPMERR_OLDDBMISSING, _("Old db is missing"));
43         return 0;
44     }
45
46     /* if any of the indexes exist, get rid of them */
47     unlink("/var/lib/rpm/nameindex.rpm");
48     unlink("/var/lib/rpm/groupindex.rpm");
49     unlink("/var/lib/rpm/packageindex.rpm");
50     unlink("/var/lib/rpm/fileindex.rpm");
51
52     if (rpmdbOpen("", &db, O_RDWR | O_CREAT, 0644)) {
53         rpmError(RPMERR_DBOPEN, _("failed to create RPM database /var/lib/rpm"));
54         return 0;
55     }
56
57     packageLabels = oldrpmdbGetAllLabels(&olddb);
58     if (!packageLabels) {
59         rpmError(RPMERR_OLDDBCORRUPT, _("Old db is corrupt"));
60         rpmdbClose(db);
61         unlink("/var/lib/rpm/packages.rpm");
62         oldrpmdbClose(&olddb);
63         return 0;
64     }
65
66     for (label = packageLabels; label; label = label->next) {
67         if (oldrpmdbGetPackageInfo(&olddb, *label, &package)) {
68             fprintf(stderr, _("oldrpmdbGetPackageInfo failed &olddb = %p olddb.packages = %p\n"), &olddb, olddb.packages);
69             exit(1);
70         }
71
72         group = oldrpmdbGetPackageGroup(&olddb, *label);
73         preun = oldrpmdbGetPackagePreun(&olddb, *label);
74         postun = oldrpmdbGetPackagePostun(&olddb, *label);
75
76         dbentry = headerNew();
77         headerAddEntry(dbentry, RPMTAG_NAME, RPM_STRING_TYPE, package.name, 1);
78         headerAddEntry(dbentry, RPMTAG_VERSION, RPM_STRING_TYPE, package.version, 1);
79         headerAddEntry(dbentry, RPMTAG_RELEASE, RPM_STRING_TYPE, package.release, 1);
80         headerAddEntry(dbentry, RPMTAG_DESCRIPTION, RPM_STRING_TYPE, 
81                  package.description, 1);
82         headerAddEntry(dbentry, RPMTAG_BUILDTIME, RPM_INT32_TYPE, &package.buildTime, 1);
83         headerAddEntry(dbentry, RPMTAG_BUILDHOST, RPM_STRING_TYPE, package.buildHost, 1);
84         headerAddEntry(dbentry, RPMTAG_INSTALLTIME, RPM_INT32_TYPE, 
85                  &package.installTime, 1);
86         headerAddEntry(dbentry, RPMTAG_DISTRIBUTION, RPM_STRING_TYPE, 
87                  package.distribution, 1);
88         headerAddEntry(dbentry, RPMTAG_VENDOR, RPM_STRING_TYPE, package.vendor, 1);
89         headerAddEntry(dbentry, RPMTAG_SIZE, RPM_INT32_TYPE, &package.size, 1);
90         headerAddEntry(dbentry, RPMTAG_LICENSE, RPM_STRING_TYPE, package.copyright, 1);
91         headerAddEntry(dbentry, RPMTAG_GROUP, RPM_STRING_TYPE, group, 1);
92
93         if (preun) {
94             headerAddEntry(dbentry, RPMTAG_PREUN, RPM_STRING_TYPE, preun, 1);
95             free(preun);
96         }
97         if (postun) {
98             headerAddEntry(dbentry, RPMTAG_POSTUN, RPM_STRING_TYPE, postun, 1);
99             free(postun);
100         }
101
102         gif = oldrpmdbGetPackageGif(&olddb, *label, &gifSize);
103         if (gif) {
104             headerAddEntry(dbentry, RPMTAG_GIF, RPM_BIN_TYPE, gif, gifSize);
105             free(gif);
106         }
107
108         if (package.fileCount) {
109             /* some packages have no file lists */
110
111             fileList = malloc(sizeof(char *) * package.fileCount);
112             fileLinktoList = malloc(sizeof(char *) * package.fileCount);
113             fileMD5List = malloc(sizeof(char *) * package.fileCount);
114             fileSizeList = malloc(sizeof(int_32) * package.fileCount);
115             fileUIDList = malloc(sizeof(int_32) * package.fileCount);
116             fileGIDList = malloc(sizeof(int_32) * package.fileCount);
117             fileMtimesList = malloc(sizeof(int_32) * package.fileCount);
118             fileFlagsList = malloc(sizeof(int_32) * package.fileCount);
119             fileModesList = malloc(sizeof(int_16) * package.fileCount);
120             fileRDevsList = malloc(sizeof(int_16) * package.fileCount);
121             fileStatesList = malloc(sizeof(char) * package.fileCount);
122
123             /* reverse the file list while we're at it */
124             j = package.fileCount - 1;
125             for (i = 0; i < package.fileCount; i++, j--) {
126                 fileList[j] = package.files[i].path;
127                 fileMD5List[j] = package.files[i].md5;
128                 fileSizeList[j] = package.files[i].size;
129                 fileUIDList[j] = package.files[i].uid;
130                 fileGIDList[j] = package.files[i].gid;
131                 fileMtimesList[j] = package.files[i].mtime;
132                 fileModesList[j] = package.files[i].mode;
133                 fileRDevsList[j] = package.files[i].rdev;
134                 fileStatesList[j] = package.files[i].state;
135
136                 if (package.files[i].linkto)
137                     fileLinktoList[j] = package.files[i].linkto;
138                 else
139                     fileLinktoList[j] = "";
140                 
141                 fileFlagsList[j] = 0;
142                 if (package.files[i].isdoc) 
143                     fileFlagsList[j] |= RPMFILE_DOC;
144                 if (package.files[i].isconf)
145                     fileFlagsList[j] |= RPMFILE_CONFIG;
146             }
147
148             headerAddEntry(dbentry, RPMTAG_FILENAMES, RPM_STRING_ARRAY_TYPE, fileList, 
149                      package.fileCount);
150             headerAddEntry(dbentry, RPMTAG_FILELINKTOS, RPM_STRING_ARRAY_TYPE, 
151                      fileLinktoList, package.fileCount);
152             headerAddEntry(dbentry, RPMTAG_FILEMD5S, RPM_STRING_ARRAY_TYPE, fileMD5List, 
153                      package.fileCount);
154             headerAddEntry(dbentry, RPMTAG_FILESIZES, RPM_INT32_TYPE, fileSizeList, 
155                      package.fileCount);
156             headerAddEntry(dbentry, RPMTAG_FILEUIDS, RPM_INT32_TYPE, fileUIDList, 
157                      package.fileCount);
158             headerAddEntry(dbentry, RPMTAG_FILEGIDS, RPM_INT32_TYPE, fileGIDList, 
159                      package.fileCount);
160             headerAddEntry(dbentry, RPMTAG_FILEMTIMES, RPM_INT32_TYPE, fileMtimesList, 
161                      package.fileCount);
162             headerAddEntry(dbentry, RPMTAG_FILEFLAGS, RPM_INT32_TYPE, fileFlagsList, 
163                      package.fileCount);
164             headerAddEntry(dbentry, RPMTAG_FILEMODES, RPM_INT16_TYPE, fileModesList, 
165                      package.fileCount);
166             headerAddEntry(dbentry, RPMTAG_FILERDEVS, RPM_INT16_TYPE, fileRDevsList, 
167                      package.fileCount);
168             headerAddEntry(dbentry, RPMTAG_FILESTATES, RPM_INT8_TYPE, fileStatesList, 
169                      package.fileCount);
170
171             free(fileList);
172             free(fileLinktoList);
173             free(fileMD5List);
174             free(fileSizeList);
175             free(fileUIDList);
176             free(fileGIDList);
177             free(fileMtimesList);
178             free(fileFlagsList);
179             free(fileModesList);
180             free(fileRDevsList);
181             free(fileStatesList);
182         }
183
184         rpmdbAdd(db, dbentry);
185
186         free(group);
187         headerFree(dbentry);
188
189         oldrpmdbFreePackageInfo(package);
190     }
191
192     oldrpmdbClose(&olddb);
193     rpmdbClose(db);
194
195     return 1;
196 }
197
198 int main(int argc, char ** argv) {
199     if (argc != 1) {
200         fprintf(stderr, _("rpmconvert: no arguments expected"));
201         exit(1);
202     }
203
204     rpmReadConfigFiles(NULL, NULL, NULL, 0);
205
206     printf(_("rpmconvert 1.0 - converting database in /var/lib/rpm\n"));
207     convertDB();
208
209     exit(0);
210 }