Contents of /branches/mage-next/usr/lib/mage/convert_databases.sh
Parent Directory | Revision Log
Revision 2525 -
(show annotations)
(download)
(as text)
Wed Jan 29 10:42:21 2014 UTC (10 years, 7 months ago) by niro
File MIME type: application/x-sh
File size: 12013 byte(s)
Wed Jan 29 10:42:21 2014 UTC (10 years, 7 months ago) by niro
File MIME type: application/x-sh
File size: 12013 byte(s)
-open mage-next branch
1 | #!/bin/bash |
2 | |
3 | : ${MAGERC="/etc/mage.rc"} |
4 | |
5 | source /etc/mage.rc.global |
6 | source ${MAGERC} |
7 | source ${MLIBDIR}/mage4.functions.sh |
8 | source ${MLIBDIR}/smage2.functions.sh |
9 | source ${MLIBDIR}/sql_functions.sh |
10 | |
11 | die() |
12 | { |
13 | echo -e "Exited ${BASH_SOURCE} at line no ${BASH_LINENO}." |
14 | echo -e "$@" |
15 | exit 1 |
16 | } |
17 | |
18 | sql() |
19 | { |
20 | local sqlcmd="$*" |
21 | [[ -z ${sqlcmd} ]] && die "no sqlcmd given." |
22 | |
23 | sqlite3 -nullvalue 'NULL' -list -separator '|' ${DBFILE} << EOF || die "error running '$@'" |
24 | ${sqlcmd}; |
25 | EOF |
26 | } |
27 | |
28 | create_database_layout() |
29 | { |
30 | sql "create table categories(id integer primary key, pcat text unique)" |
31 | sql "create table packages(id integer primary key, |
32 | pname text, |
33 | pver text, |
34 | pbuild text, |
35 | pcat_id numeric, |
36 | state text, |
37 | provide text, |
38 | pkgtype text |
39 | )" |
40 | sql "create table depends(id integer primary key, pkg_id numeric, relation text, pcat_id numeric, pname text, pver text, pbuild text)" |
41 | sql "create table sdepends(id integer primary key, pkg_id numeric, relation text, pcat_id numeric, pname text, pver text, pbuild text)" |
42 | sql "create table packages_info(id integer primary key, pkg_id numeric, arch text, md5 text, mtime numeric, homepage text, description text, size numeric)" |
43 | #sql "create table packages_content(id integer primary key, pkginfo_id numeric, char text, dirs text, files text, pipes text, symlinks text)" |
44 | sql "create table packages_content(id integer primary key, pkginfo_id numeric, char blob, dirs blob, files blob, pipes blob, symlinks blob)" |
45 | sql "create table packages_routines(id integer primary key, |
46 | pkg_id numeric, |
47 | mincludes text, |
48 | preinstall text, |
49 | postinstall text, |
50 | preremove text, |
51 | postremove text, |
52 | extra_functions text, |
53 | extra_vars text)" |
54 | } |
55 | |
56 | convert_mage_db() |
57 | { |
58 | local i |
59 | local magefile |
60 | local pcat |
61 | local pname |
62 | local pver |
63 | local pbuild |
64 | local pcatid |
65 | local state |
66 | local preinstall |
67 | local postinstall |
68 | local preremove |
69 | local postremove |
70 | local pkgid |
71 | local dep |
72 | local PKGNAME |
73 | local STATE |
74 | local DESCRIPTION |
75 | local HOMEPAGE |
76 | local DEPEND |
77 | local SDEPEND |
78 | local PROVIDE |
79 | local PKGTYPE |
80 | local preinstall |
81 | local postinstall |
82 | local preremove |
83 | local postremove |
84 | local sym |
85 | local depname |
86 | local depver |
87 | local depbuild |
88 | local depcat |
89 | local depcatid |
90 | local md5file |
91 | local md5sum |
92 | |
93 | # create categories |
94 | for i in virtual ${MAGEDIR}/* |
95 | do |
96 | pcat="$(basename ${i})" |
97 | case ${pcat} in |
98 | include|profiles) continue;; |
99 | esac |
100 | |
101 | sql "insert into categories (pcat) values('${pcat}')" |
102 | done |
103 | |
104 | # create packages |
105 | for magefile in $(find ${MAGEDIR} -type f -name *.mage| sort) |
106 | do |
107 | case ${DEBUG} in |
108 | 1|true) echo "converting ${magefile}" ;; |
109 | esac |
110 | pcat="$(magename2pcat ${magefile})" |
111 | pname="$(magename2pname ${magefile})" |
112 | pver="$(magename2pver ${magefile})" |
113 | pbuild="$(magename2pbuild ${magefile})" |
114 | # substitute r from pbuild |
115 | pbuild="${pbuild/r/}" |
116 | |
117 | smagesource ${magefile} |
118 | |
119 | pcatid=$(sql "select id from categories where pcat='${pcat}'") |
120 | sql "insert into packages( |
121 | pname, |
122 | pver, |
123 | pbuild, |
124 | pcat_id, |
125 | state, |
126 | provide, |
127 | pkgtype |
128 | ) |
129 | values( |
130 | '${pname}', |
131 | '${pver}', |
132 | '${pbuild}', |
133 | '${pcatid}', |
134 | '${STATE}', |
135 | '${PROVIDE}', |
136 | '${PKGTYPE}' |
137 | )" |
138 | |
139 | pkgid=$(sql "select id from packages where pname='${pname}' and pver='${pver}' and pbuild='${pbuild}'") |
140 | # depends |
141 | while read sym dep |
142 | do |
143 | [[ -z ${dep} ]] && continue |
144 | depcat="$(dep2pcat ${dep})" |
145 | depcatid=$(sql "select id from categories where pcat='${depcat}'") |
146 | depname="$(dep2pname ${dep})" |
147 | depver="$(dep2pver ${dep})" |
148 | sql "insert into depends(pkg_id, |
149 | relation, |
150 | pcat_id, |
151 | pname, |
152 | pver, |
153 | pbuild) |
154 | values('${pkgid}', |
155 | '${sym}', |
156 | '${depcatid}', |
157 | '${depname}', |
158 | '${depver}', |
159 | '${depbuild}')" |
160 | done << EOF |
161 | ${DEPEND} |
162 | EOF |
163 | # sdepends |
164 | while read sym dep |
165 | do |
166 | [[ -z ${dep} ]] && continue |
167 | depcat="$(dep2pcat ${dep})" |
168 | depcatid=$(sql "select id from categories where pcat='${depcat}'") |
169 | depname="$(dep2pname ${dep})" |
170 | depver="$(dep2pver ${dep})" |
171 | sql "insert into sdepends(pkg_id, |
172 | relation, |
173 | pcat_id, |
174 | pname, |
175 | pver, |
176 | pbuild) |
177 | values('${pkgid}', |
178 | '${sym}', |
179 | '${depcatid}', |
180 | '${depname}', |
181 | '${depver}', |
182 | '${depbuild}')" |
183 | done << EOF |
184 | ${SDEPEND} |
185 | EOF |
186 | |
187 | for arch in i686 x86_64 |
188 | do |
189 | md5file="${MAGEDIR}/${pcat}/${pname}/md5/${pname}-${pver}-${arch}-r${pbuild}.md5" |
190 | [[ -f ${md5file} ]] && md5sum="$(cat ${md5file} | cut -d' ' -f1)" |
191 | |
192 | # fix descriptions |
193 | DESCRIPTION="$(echo ${DESCRIPTION} | sed s:\':\'\':g)" |
194 | |
195 | sql "insert into packages_info(pkg_id, arch, md5, description, homepage) |
196 | values('${pkgid}','${arch}','${md5sum}','${DESCRIPTION}','${HOMEPAGE}')" |
197 | done |
198 | |
199 | mincludes="$(grep -r 'minclude ' ${magefile} | cut -d: -f2 | sed s:minclude\ ::)" |
200 | |
201 | # |
202 | # install routines & includes |
203 | # |
204 | # needs special magic: the last line of typeset has no ';' |
205 | # but to eval the function we must append it |
206 | # so this sed deletes the last line of the typeset output |
207 | # and replaces it with an ;} and a newline between |
208 | # |
209 | # but we will not add this fun when no postinstall etc are given |
210 | # -> [[ -n $(typeset -f postinstall ]] && |
211 | # |
212 | # also the character ' is a problem while importing to sql |
213 | # because we use ' as escape char. so we replace it with '' |
214 | # |
215 | # $([[ -n $(typeset -f postinstall) ]] && echo -e "$(typeset -f postinstall | sed s:\':\'\':g | sed '$d');\n}") |
216 | # |
217 | sql "insert into packages_routines(pkg_id, |
218 | mincludes, |
219 | postinstall, |
220 | preinstall, |
221 | preremove, |
222 | postremove) |
223 | values('${pkgid}', |
224 | '${mincludes}', |
225 | '$([[ -n $(typeset -f postinstall) ]] && echo -e "$(typeset -f postinstall | sed s:\':\'\':g | sed '$d');\n}")', |
226 | '$([[ -n $(typeset -f preinstall) ]] && echo -e "$(typeset -f preinstall | sed s:\':\'\':g | sed '$d');\n}")', |
227 | '$([[ -n $(typeset -f preremove) ]] && echo -e "$(typeset -f preremove | sed s:\':\'\':g | sed '$d');\n}")', |
228 | '$([[ -n $(typeset -f postremove) ]] && echo -e "$(typeset -f postremove | sed s:\':\'\':g | sed '$d');\n}")')" |
229 | |
230 | unset PKGNAME |
231 | unset DEPEND |
232 | unset SDEPEND |
233 | unset PROVIDE |
234 | |
235 | # unset these functions |
236 | unset -f preinstall |
237 | unset -f postinstall |
238 | unset -f preremove |
239 | unset -f postremove |
240 | done |
241 | } |
242 | |
243 | |
244 | convert_install_db() |
245 | { |
246 | local i |
247 | local magefile |
248 | local pcat |
249 | local pname |
250 | local pver |
251 | local pbuild |
252 | local pcatid |
253 | local state |
254 | local preinstall |
255 | local postinstall |
256 | local preremove |
257 | local postremove |
258 | local pkgid |
259 | local dep |
260 | local PKGNAME |
261 | local STATE |
262 | local DESCRIPTION |
263 | local HOMEPAGE |
264 | local DEPEND |
265 | local SDEPEND |
266 | local PROVIDE |
267 | local PKGTYPE |
268 | local preinstall |
269 | local postinstall |
270 | local preremove |
271 | local postremove |
272 | local sym |
273 | local depname |
274 | local depver |
275 | local depbuild |
276 | local depcat |
277 | local depcatid |
278 | local md5file |
279 | local md5sum |
280 | local pkginfoid |
281 | local entrydir |
282 | |
283 | # create categories |
284 | for i in virtual ${INSTALLDB}/* |
285 | do |
286 | pcat="$(basename ${i})" |
287 | case ${pcat} in |
288 | include|profiles) continue;; |
289 | esac |
290 | |
291 | sql "insert into categories (pcat) values('${pcat}')" |
292 | done |
293 | |
294 | # create packages |
295 | for magefile in $(find ${INSTALLDB} -type f -name *.mage| sort) |
296 | do |
297 | case ${DEBUG} in |
298 | 1|true) echo "converting ${magefile}" ;; |
299 | esac |
300 | |
301 | pcat="$(magename2pcat ${magefile})" |
302 | pname="$(magename2pname ${magefile})" |
303 | pver="$(magename2pver ${magefile})" |
304 | pbuild="$(magename2pbuild ${magefile})" |
305 | # substitute r from pbuild |
306 | pbuild="${pbuild/r/}" |
307 | |
308 | source ${magefile} |
309 | |
310 | pcatid=$(sql "select id from categories where pcat='${pcat}'") |
311 | sql "insert into packages( |
312 | pname, |
313 | pver, |
314 | pbuild, |
315 | pcat_id, |
316 | state, |
317 | provide, |
318 | pkgtype |
319 | ) |
320 | values( |
321 | '${pname}', |
322 | '${pver}', |
323 | '${pbuild}', |
324 | '${pcatid}', |
325 | '${STATE}', |
326 | '${PROVIDE}', |
327 | '${PKGTYPE}' |
328 | )" |
329 | |
330 | pkgid=$(sql "select id from packages where pname='${pname}' and pver='${pver}' and pbuild='${pbuild}'") |
331 | # depends |
332 | while read sym dep |
333 | do |
334 | [[ -z ${dep} ]] && continue |
335 | depcat="$(dep2pcat ${dep})" |
336 | depcatid=$(sql "select id from categories where pcat='${depcat}'") |
337 | depname="$(dep2pname ${dep})" |
338 | depver="$(dep2pver ${dep})" |
339 | sql "insert into depends(pkg_id, |
340 | relation, |
341 | pcat_id, |
342 | pname, |
343 | pver, |
344 | pbuild) |
345 | values('${pkgid}', |
346 | '${sym}', |
347 | '${depcatid}', |
348 | '${depname}', |
349 | '${depver}', |
350 | '${depbuild}')" |
351 | done << EOF |
352 | ${DEPEND} |
353 | EOF |
354 | # sdepends |
355 | while read sym dep |
356 | do |
357 | [[ -z ${dep} ]] && continue |
358 | depcat="$(dep2pcat ${dep})" |
359 | depcatid=$(sql "select id from categories where pcat='${depcat}'") |
360 | depname="$(dep2pname ${dep})" |
361 | depver="$(dep2pver ${dep})" |
362 | sql "insert into sdepends(pkg_id, |
363 | relation, |
364 | pcat_id, |
365 | pname, |
366 | pver, |
367 | pbuild) |
368 | values('${pkgid}', |
369 | '${sym}', |
370 | '${depcatid}', |
371 | '${depname}', |
372 | '${depver}', |
373 | '${depbuild}')" |
374 | done << EOF |
375 | ${SDEPEND} |
376 | EOF |
377 | |
378 | DESCRIPTION="$(echo ${DESCRIPTION} | sed s:\':\'\':g)" |
379 | sql "insert into packages_info(pkg_id, arch, md5, description, homepage) |
380 | values('${pkgid}','${ARCH}','${md5sum}','${DESCRIPTION}','${HOMEPAGE}')" |
381 | |
382 | |
383 | # install routines & includes |
384 | sql "insert into packages_routines(pkg_id, |
385 | mincludes, |
386 | postinstall, |
387 | preinstall, |
388 | preremove, |
389 | postremove) |
390 | values('${pkgid}', |
391 | '${mincludes}', |
392 | '$(typeset -f postinstall | sed s:\':\'\':g)', |
393 | '$(typeset -f preinstall | sed s:\':\'\':g)', |
394 | '$(typeset -f preremove | sed s:\':\'\':g)', |
395 | '$(typeset -f postremove | sed s:\':\'\':g)')" |
396 | |
397 | #### #### |
398 | # record contents # |
399 | #### #### |
400 | pkginfoid=$(sql "select id from packages_info where pkg_id='${pkgid}' and arch='${ARCH}'") |
401 | entrydir="$(dirname ${magefile})" |
402 | # sql "insert into packages_content(pkginfo_id, |
403 | # char, |
404 | # dirs, |
405 | # files, |
406 | # pipes, |
407 | # symlinks) |
408 | # values('${pkginfoid}', |
409 | # '$(< ${entrydir}/.char)', |
410 | # '$(< ${entrydir}/.dirs)', |
411 | # '$(< ${entrydir}/.files)', |
412 | # '$(< ${entrydir}/.pipes)', |
413 | # '$(< ${entrydir}/.symlinks)')" |
414 | sql "insert into packages_content(pkginfo_id, |
415 | char, |
416 | dirs, |
417 | files, |
418 | pipes, |
419 | symlinks) |
420 | values('${pkginfoid}', |
421 | 'records/${pkginfoid}/char.bz2', |
422 | 'records/${pkginfoid}/dirs.bz2', |
423 | 'records/${pkginfoid}/files.bz2', |
424 | 'records/${pkginfoid}/pipes.bz2', |
425 | 'records/${pkginfoid}/symlinks.bz2')" |
426 | # create compressed content files |
427 | local entryfile |
428 | for entryfile in char dirs files pipes symlinks |
429 | do |
430 | install -d $(dirname ${DBFILE})/records/${pkginfoid} |
431 | cat ${entrydir}/.${entryfile} | bzip2 -9 >> $(dirname ${DBFILE})/records/${pkginfoid}/${entryfile}.bz2 |
432 | done |
433 | |
434 | unset PKGNAME |
435 | unset DEPEND |
436 | unset SDEPEND |
437 | unset PROVIDE |
438 | |
439 | # unset these functions |
440 | unset -f preinstall |
441 | unset -f postinstall |
442 | unset -f preremove |
443 | unset -f postremove |
444 | done |
445 | } |
446 | |
447 | convert_virtual_defaults() |
448 | { |
449 | local virtual |
450 | local package |
451 | local vcat |
452 | local vname |
453 | local pcat |
454 | local pname |
455 | |
456 | sql "create table virtual_defaults(id integer primary key, vcat text,vname text, pcat text, pname text)" |
457 | |
458 | while read virtual package |
459 | do |
460 | vcat="$(dirname ${virtual})" |
461 | vname="$(basename ${virtual})" |
462 | pcat="$(dirname ${package})" |
463 | pname="$(basename ${package})" |
464 | |
465 | sql "insert into virtual_defaults(vcat,vname,pcat,pname) values('${vcat}','${vname}','${pcat}','${pname}')" |
466 | done < /etc/mage-profile/virtuals.defaults |
467 | } |
468 | |
469 | |
470 | # packages db |
471 | #DBFILE=/home/tjoke/DATABASES/mage6.sql |
472 | #create_database_layout |
473 | #convert_mage_db |
474 | |
475 | # virtual default |
476 | #DBFILE=/home/tjoke/DATABASES/virtuals6.sql |
477 | #convert_virtual_defaults |
478 | |
479 | # # install db |
480 | # DBFILE=/home/tjoke/DATABASES/install6.sql |
481 | # create_database_layout |
482 | # convert_install_db |
483 | |
484 | |
485 | METHOD="$1" |
486 | DBFILE="$2" |
487 | |
488 | [[ -z ${METHOD} ]] && die "No method given. Use --install, --packages or --virtual for your appropiate task" |
489 | [[ -z ${DBFILE} ]] && die "No database given." |
490 | |
491 | case $1 in |
492 | --install|-i) |
493 | create_database_layout |
494 | convert_install_db |
495 | ;; |
496 | --packages|-p) |
497 | create_database_layout |
498 | convert_mage_db |
499 | ;; |
500 | --virtuals|-v) |
501 | convert_virtual_defaults |
502 | ;; |
503 | *) die "Unkown method." ;; |
504 | esac |
Properties
Name | Value |
---|---|
svn:executable | * |