Magellan Linux

Contents of /branches/mage-next/src/sql/convert_databases_meta.sh

Parent Directory Parent Directory | Revision Log Revision Log


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