5 # Debian-specific script to upgrade the database between releases
6 # Roland Mas <lolando@debian.org>
16 use vars qw/$dbh @reqlist $query/ ;
17 use vars qw/$sys_default_domain $sys_scm_host $sys_download_host
18 $sys_shell_host $sys_users_host $sys_docs_host $sys_lists_host
19 $sys_dns1_host $sys_dns2_host $FTPINCOMING_DIR $FTPFILES_DIR
20 $sys_urlroot $sf_cache_dir $sys_name $sys_themeroot
21 $sys_news_group $sys_dbhost $sys_dbname $sys_dbuser $sys_dbpasswd
22 $sys_ldap_base_dn $sys_ldap_host $admin_password
23 $server_admin $domain_name $newsadmin_groupid $statsadmin_groupid
26 require ("/etc/gforge/local.pl") ;
27 $libdir="/usr/share/gforge/lib";
28 $sqldir="/usr/share/gforge/db";
29 require ("$libdir/sqlparser.pm") ; # Our magic SQL parser
30 require ("$libdir/sqlhelper.pm") ; # Our SQL functions
31 require ("$libdir/include.pl"); # Some other functions
35 $dbh->{AutoCommit} = 0;
36 $dbh->{RaiseError} = 1;
38 my ($sth, @array, $version, $path, $target) ;
40 # Do we have at least the basic schema?
41 # Create Sourceforge database
42 if (! &table_exists ($dbh, 'groups')) { # No 'groups' table
43 # Installing SF 2.6 from scratch
44 &debug ("Creating initial Sourceforge database from files.") ;
46 &create_metadata_table ("2.5.9999") ;
48 $query = "SELECT count(*) from debian_meta_data where key = 'current-path'";
50 $sth = $dbh->prepare ($query) ;
52 @array = $sth->fetchrow_array () ;
55 $query = "INSERT INTO debian_meta_data (key, value) VALUES ('current-path', 'scratch-to-2.6')" ;
57 $sth = $dbh->prepare ($query) ;
64 } else { # A 'groups' table exists
65 if (! &table_exists ($dbh, 'debian_meta_data')) { # No 'debian_meta_data' table
66 # If we're here, we're upgrading from 2.5-7 or earlier
67 # We therefore need to create the table
68 &create_metadata_table ("2.5-7+just+before+8") ;
71 $version = &get_db_version ;
72 if (&is_lesser ($version, "2.5.9999")) {
73 &debug ("Found an old (2.5) database, will upgrade to 2.6") ;
75 $query = "SELECT count(*) from debian_meta_data where key = 'current-path'";
77 $sth = $dbh->prepare ($query) ;
79 @array = $sth->fetchrow_array () ;
83 $query = "INSERT INTO debian_meta_data (key, value) VALUES ('current-path', '2.5-to-2.6')" ;
84 $sth = $dbh->prepare ($query) ;
92 $query = "SELECT count(*) from debian_meta_data where key = 'current-path'";
93 $sth = $dbh->prepare ($query) ;
95 @array = $sth->fetchrow_array () ;
101 $query = "SELECT value from debian_meta_data where key = 'current-path'";
102 $sth = $dbh->prepare ($query) ;
104 @array = $sth->fetchrow_array () ;
111 ($path eq 'scratch-to-2.6') && do {
112 &update_with_sql ("sf-2.6-complete", "2.5.9999.1+global+data+done") ;
114 $version = &get_db_version ;
115 $target = "2.5.9999.2+local+data+done" ;
116 if (&is_lesser ($version, $target)) {
117 &debug ("Adding local data.") ;
119 do "/etc/gforge/local.pl" or die "Cannot read /etc/gforge/local.pl" ;
121 my ($login, $md5pwd, $unixpwd, $email, $noreplymail, $date) ;
124 $md5pwd = 'INVALID' ;
125 $unixpwd = 'INVALID' ;
126 $email = $server_admin ;
127 $noreplymail="noreply\@$domain_name" ;
131 "UPDATE groups SET homepage = '$domain_name/admin/' where group_id = 1",
132 "UPDATE groups SET homepage = '$domain_name/news/' where group_id = 2",
133 "UPDATE groups SET homepage = '$domain_name/stats/' where group_id = 3",
134 "UPDATE groups SET homepage = '$domain_name/peerrating/' where group_id = 4",
135 "UPDATE users SET email = '$noreplymail' where user_id = 100",
136 "INSERT INTO users VALUES (101,'$login','$email','$md5pwd','Sourceforge admin','A','/bin/bash','$unixpwd','N',2000,'shell',$date,'',1,0,NULL,NULL,0,'','GMT', 1, 0)",
137 "SELECT setval ('\"users_pk_seq\"', 102, 'f')",
138 "INSERT INTO user_group (user_id, group_id, admin_flags) VALUES (101, 1, 'A')",
139 "INSERT INTO user_group (user_id, group_id, admin_flags) VALUES (101, 2, 'A')",
140 "INSERT INTO user_group (user_id, group_id, admin_flags) VALUES (101, 3, 'A')",
141 "INSERT INTO user_group (user_id, group_id, admin_flags) VALUES (101, 4, 'A')"
144 foreach my $s (@reqlist) {
147 $sth = $dbh->prepare ($query) ;
153 &update_db_version ($target) ;
158 $version = &get_db_version ;
159 $target = "2.5.9999.3+skills+done" ;
160 if (&is_lesser ($version, $target)) {
161 &debug ("Inserting skills.") ;
163 foreach my $skill (split m/;/, "Ada;C;C++;HTML;LISP;Perl;PHP;Python;SQL") {
164 push @reqlist, "INSERT INTO people_skill (name) VALUES ('$skill')" ;
167 foreach my $s (@reqlist) {
170 $sth = $dbh->prepare ($query) ;
176 &update_db_version ($target) ;
181 $version = &get_db_version ;
182 $target = "2.6-0+checkpoint+1" ;
183 if (&is_lesser ($version, $target)) {
184 $query = "DELETE FROM debian_meta_data WHERE key = 'current-path'" ;
186 $sth = $dbh->prepare ($query) ;
190 &update_db_version ($target) ;
198 ($path eq '2.5-to-2.6') && do {
200 $version = &get_db_version ;
202 if (&is_lesser ($version, $target)) {
203 &debug ("Adding row to people_job_category.") ;
204 $query = "INSERT INTO people_job_category VALUES (100, 'Undefined', 0)" ;
205 $sth = $dbh->prepare ($query) ;
209 &update_db_version ($target) ;
214 $version = &get_db_version ;
216 if (&is_lesser ($version, $target)) {
217 &debug ("Adding row to supported_languages.") ;
218 $query = "INSERT INTO supported_languages VALUES (15, 'Korean', 'Korean.class', 'Korean', 'kr')" ;
219 $sth = $dbh->prepare ($query) ;
223 &update_db_version ($target) ;
228 $version = &get_db_version ;
230 if (&is_lesser ($version, $target)) {
231 &debug ("Fixing unix_box entries.") ;
233 $query = "update groups set unix_box = 'shell'" ;
234 $sth = $dbh->prepare ($query) ;
238 $query = "update users set unix_box = 'shell'" ;
239 $sth = $dbh->prepare ($query) ;
243 &debug ("Also fixing a few sequences.") ;
245 &bump_sequence_to ($dbh, "bug_pk_seq", 100) ;
246 &bump_sequence_to ($dbh, "project_task_pk_seq", 100) ;
248 &update_db_version ($target) ;
253 $version = &get_db_version ;
255 if (&is_lesser ($version, $target)) {
256 &debug ("Adding rows to supported_languages.") ;
258 "INSERT INTO supported_languages VALUES (16,'Bulgarian','Bulgarian.class','Bulgarian','bg')",
259 "INSERT INTO supported_languages VALUES (17,'Greek','Greek.class','Greek','el')",
260 "INSERT INTO supported_languages VALUES (18,'Indonesian','Indonesian.class','Indonesian','id')",
261 "INSERT INTO supported_languages VALUES (19,'Portuguese (Brazillian)','PortugueseBrazillian.class','PortugueseBrazillian', 'br')",
262 "INSERT INTO supported_languages VALUES (20,'Polish','Polish.class','Polish','pl')",
263 "INSERT INTO supported_languages VALUES (21,'Portuguese','Portuguese.class','Portuguese', 'pt')",
264 "INSERT INTO supported_languages VALUES (22,'Russian','Russian.class','Russian','ru')"
267 foreach my $s (@reqlist) {
270 $sth = $dbh->prepare ($query) ;
276 &update_db_version ($target) ;
281 $version = &get_db_version ;
283 if (&is_lesser ($version, $target)) {
284 &debug ("Fixing unix_uid entries.") ;
286 $query = "UPDATE users SET unix_uid = nextval ('unix_uid_seq') WHERE unix_status != 'N' AND status != 'P' AND unix_uid = 0" ;
287 $sth = $dbh->prepare ($query) ;
291 &update_db_version ($target) ;
296 $version = &get_db_version ;
297 $target = "2.5.9999.1+temp+data+dropped" ;
298 if (&is_lesser ($version, $target)) {
299 &debug ("Preparing to upgrade your database - dropping temporary tables") ;
301 my @tables = qw/ user_metric_tmp1_1 user_metric_tmp1_2
302 user_metric_tmp1_3 user_metric_tmp1_4
303 user_metric_tmp1_5 user_metric_tmp1_6
304 user_metric_tmp1_7 user_metric_tmp1_8 user_metric1
305 user_metric2 user_metric3 user_metric4 user_metric5
306 user_metric6 user_metric7 user_metric8
307 project_counts_tmp project_metric_tmp
308 project_metric_tmp1 project_counts_weekly_tmp
309 project_metric_weekly_tmp project_metric_weekly_tmp1
312 my @sequences = qw/ user_metric1_ranking_seq
313 user_metric2_ranking_seq user_metric3_ranking_seq
314 user_metric4_ranking_seq user_metric5_ranking_seq
315 user_metric6_ranking_seq user_metric7_ranking_seq
316 user_metric8_ranking_seq project_metric_weekly_seq
317 trove_treesum_trove_treesum_seq
318 project_metric_tmp1_pk_seq / ;
320 my @indexes = qw/ idx_project_metric_group
321 idx_project_metric_weekly_group
322 user_metric_history_date_userid / ;
324 foreach my $table (@tables) {
325 &drop_table_if_exists ($dbh, $table) ;
328 foreach my $sequence (@sequences) {
329 &drop_sequence_if_exists ($dbh, $sequence) ;
332 foreach my $index (@indexes) {
333 &drop_index_if_exists ($dbh, $index) ;
336 &update_db_version ($target) ;
341 $version = &get_db_version ;
342 $target = "2.5.9999.2+data+upgraded" ;
343 if (&is_lesser ($version, $target)) {
344 &debug ("Upgrading your database scheme from 2.5") ;
347 "ALTER TABLE groups DROP CONSTRAINT groups_pkey",
348 "ALTER TABLE users DROP CONSTRAINT users_pkey",
350 foreach my $s (@reqlist) {
353 $sth = $dbh->prepare ($query) ;
358 @reqlist = @{ &parse_sql_file ("$sqldir/sf2.5-to-sf2.6.sql") } ;
359 foreach my $s (@reqlist) {
362 $sth = $dbh->prepare ($query) ;
368 &update_db_version ($target) ;
373 $version = &get_db_version ;
374 $target = "2.5.9999.3+artifact+transcoded" ;
375 if (&is_lesser ($version, $target)) {
376 &debug ("Transcoding the artifact data fields") ;
378 $query = "SELECT id,bin_data FROM artifact_file ORDER BY id ASC" ;
380 $sth = $dbh->prepare ($query) ;
382 while (@array = $sth->fetchrow_array) {
383 my $query2 = "UPDATE artifact_file SET bin_data='" ;
384 $query2 .= encode_base64 (decode_entities ($array [1])) ;
385 $query2 .= "' WHERE id=" ;
386 $query2 .= $array [0] ;
389 my $sth2 =$dbh->prepare ($query2) ;
396 &update_db_version ($target) ;
401 $version = &get_db_version ;
402 $target = "2.5.9999.4+groups+inserted" ;
403 if (&is_lesser ($version, $target)) {
404 &debug ("Inserting missing groups") ;
407 "INSERT INTO groups (group_name, homepage,
408 is_public, status, unix_group_name,
409 unix_box, http_domain, short_description,
410 cvs_box, license, register_purpose,
411 license_other, register_time, rand_hash,
412 use_mail, use_survey, use_forum, use_pm,
413 use_cvs, use_news, type, use_docman,
414 new_task_address, send_all_tasks,
416 VALUES ('Stats', '$domain_name/top/', 0,
417 'A', 'stats', 'shell', NULL, NULL, 'cvs',
418 'website', NULL, NULL, 0, NULL, 1, 0, 0, 0, 0,
420 "INSERT INTO groups (group_name, homepage,
421 is_public, status, unix_group_name,
422 unix_box, http_domain, short_description,
423 cvs_box, license, register_purpose,
424 license_other, register_time, rand_hash,
425 use_mail, use_survey, use_forum, use_pm,
426 use_cvs, use_news, type, use_docman,
427 new_task_address, send_all_tasks,
429 VALUES ('Peer Ratings', '$domain_name/people/', 0,
430 'A', 'peerrating', 'shell', NULL, NULL, 'cvs1',
431 'website', NULL, NULL, 0, NULL, 1, 0, 0, 0, 0,
435 foreach my $s (@reqlist) {
438 $sth = $dbh->prepare ($query) ;
443 &update_db_version ($target) ;
448 $version = &get_db_version ;
449 $target = "2.6-0+checkpoint+1" ;
450 if (&is_lesser ($version, $target)) {
451 $query = "DELETE FROM debian_meta_data WHERE key = 'current-path'" ;
453 $sth = $dbh->prepare ($query) ;
457 &update_db_version ($target) ;
466 $version = &get_db_version ;
467 $target = "2.6-0+checkpoint+2" ;
468 if (&is_lesser ($version, $target)) {
469 &debug ("Updating permissions on system groups.") ;
470 $query = "UPDATE groups SET group_name='Site Admin', is_public=1 WHERE group_id=1" ;
472 $sth = $dbh->prepare ($query) ;
475 $query = "UPDATE groups SET group_name='Site News Admin', is_public=1 WHERE group_id=$sys_news_group" ;
477 $sth = $dbh->prepare ($query) ;
481 &update_db_version ($target) ;
486 $version = &get_db_version ;
487 $target = "2.6-0+checkpoint+3" ;
488 if (&is_lesser ($version, $target)) {
489 &debug ("Creating table group_cvs_history.") ;
490 $query = "CREATE TABLE group_cvs_history (
491 id integer DEFAULT nextval('group_cvs_history_pk_seq'::text) NOT NULL,
492 group_id integer DEFAULT '0' NOT NULL,
493 user_name character varying(80) DEFAULT '' NOT NULL,
494 cvs_commits integer DEFAULT '0' NOT NULL,
495 cvs_commits_wk integer DEFAULT '0' NOT NULL,
496 cvs_adds integer DEFAULT '0' NOT NULL,
497 cvs_adds_wk integer DEFAULT '0' NOT NULL,
500 $sth = $dbh->prepare ($query) ;
504 &update_db_version ($target) ;
509 $version = &get_db_version ;
510 $target = "2.6-0+checkpoint+4" ;
511 if (&is_lesser ($version, $target)) {
512 &debug ("Registering Savannah themes.") ;
514 $query = "SELECT max(theme_id) FROM themes" ;
516 $sth = $dbh->prepare ($query) ;
518 @array = $sth->fetchrow_array () ;
520 my $maxid = $array [0] ;
522 &bump_sequence_to ($dbh, "themes_pk_seq", $maxid) ;
525 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_codex', 'Savannah CodeX')",
526 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_forest', 'Savannah Forest')",
527 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_reverse', 'Savannah Reverse')",
528 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_sad', 'Savannah Sad')",
529 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_savannah', 'Savannah Original')",
530 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_slashd', 'Savannah SlashDot')",
531 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_startrek', 'Savannah StarTrek')",
532 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_transparent', 'Savannah Transparent')",
533 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_water', 'Savannah Water')",
534 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_www.gnu.org', 'Savannah www.gnu.org')"
536 foreach my $s (@reqlist) {
539 $sth = $dbh->prepare ($query) ;
545 &update_db_version ($target) ;
550 $version = &get_db_version ;
551 $target = "2.6-0+checkpoint+5" ;
552 if (&is_lesser ($version, $target)) {
553 &debug ("Registering yet another Savannah theme.") ;
555 $query = "INSERT INTO themes (dirname, fullname) VALUES ('savannah_darkslate', 'Savannah Dark Slate')";
557 $sth = $dbh->prepare ($query) ;
561 &update_db_version ($target) ;
566 $version = &get_db_version ;
567 $target = "2.6-0+checkpoint+6" ;
568 if (&is_lesser ($version, $target)) {
569 &debug ("Updating language codes.") ;
572 "UPDATE supported_languages SET language_code='en' where classname='English'",
573 "UPDATE supported_languages SET language_code='ja' where classname='Japanese'",
574 "UPDATE supported_languages SET language_code='iw' where classname='Hebrew'",
575 "UPDATE supported_languages SET language_code='es' where classname='Spanish'",
576 "UPDATE supported_languages SET language_code='th' where classname='Thai'",
577 "UPDATE supported_languages SET language_code='de' where classname='German'",
578 "UPDATE supported_languages SET language_code='it' where classname='Italian'",
579 "UPDATE supported_languages SET language_code='no' where classname='Norwegian'",
580 "UPDATE supported_languages SET language_code='sv' where classname='Swedish'",
581 "UPDATE supported_languages SET language_code='zh' where classname='Chinese'",
582 "UPDATE supported_languages SET language_code='nl' where classname='Dutch'",
583 "UPDATE supported_languages SET language_code='eo' where classname='Esperanto'",
584 "UPDATE supported_languages SET language_code='ca' where classname='Catalan'",
585 "UPDATE supported_languages SET language_code='ko' where classname='Korean'",
586 "UPDATE supported_languages SET language_code='bg' where classname='Bulgarian'",
587 "UPDATE supported_languages SET language_code='el' where classname='Greek'",
588 "UPDATE supported_languages SET language_code='id' where classname='Indonesian'",
589 "UPDATE supported_languages SET language_code='pt' where classname='Portuguese (Brazillian)'",
590 "UPDATE supported_languages SET language_code='pl' where classname='Polish'",
591 "UPDATE supported_languages SET language_code='pt' where classname='Portuguese'",
592 "UPDATE supported_languages SET language_code='ru' where classname='Russian'",
593 "UPDATE supported_languages SET language_code='fr' where classname='French'"
595 foreach my $s (@reqlist) {
598 $sth = $dbh->prepare ($query) ;
603 &update_db_version ($target) ;
608 $version = &get_db_version ;
609 $target = "2.6-0+checkpoint+7" ;
610 if (&is_lesser ($version, $target)) {
611 &debug ("Fixing artifact-related views.") ;
613 &drop_view_if_exists ($dbh, "artifact_file_user_vw") ;
614 &drop_view_if_exists ($dbh, "artifact_history_user_vw") ;
615 &drop_view_if_exists ($dbh, "artifact_message_user_vw") ;
616 &drop_view_if_exists ($dbh, "artifactperm_artgrouplist_vw") ;
617 &drop_view_if_exists ($dbh, "artifactperm_user_vw") ;
618 &drop_view_if_exists ($dbh, "artifact_vw") ;
621 "CREATE VIEW artifact_file_user_vw as SELECT af.id, af.artifact_id, af.description, af.bin_data, af.filename, af.filesize, af.filetype, af.adddate, af.submitted_by, users.user_name, users.realname FROM artifact_file af, users WHERE (af.submitted_by = users.user_id)",
622 "CREATE VIEW artifact_history_user_vw as SELECT ah.id, ah.artifact_id, ah.field_name, ah.old_value, ah.entrydate, users.user_name FROM artifact_history ah, users WHERE (ah.mod_by = users.user_id)",
623 "CREATE VIEW artifact_message_user_vw as SELECT am.id, am.artifact_id, am.from_email, am.body, am.adddate, users.user_id, users.email, users.user_name, users.realname FROM artifact_message am, users WHERE (am.submitted_by = users.user_id)",
624 "CREATE VIEW artifactperm_artgrouplist_vw as SELECT agl.group_artifact_id, agl.name, agl.description, agl.group_id, ap.user_id, ap.perm_level FROM artifact_perm ap, artifact_group_list agl WHERE (ap.group_artifact_id = agl.group_artifact_id)",
625 "CREATE VIEW artifactperm_user_vw as SELECT ap.id, ap.group_artifact_id, ap.user_id, ap.perm_level, users.user_name, users.realname FROM artifact_perm ap, users WHERE (users.user_id = ap.user_id)",
626 "CREATE VIEW artifact_vw as SELECT artifact.artifact_id, artifact.group_artifact_id, artifact.status_id, artifact.category_id, artifact.artifact_group_id, artifact.resolution_id, artifact.priority, artifact.submitted_by, artifact.assigned_to, artifact.open_date, artifact.close_date, artifact.summary, artifact.details, u.user_name AS assigned_unixname, u.realname AS assigned_realname, u.email AS assigned_email, u2.user_name AS submitted_unixname, u2.realname AS submitted_realname, u2.email AS submitted_email, artifact_status.status_name, artifact_category.category_name, artifact_group.group_name, artifact_resolution.resolution_name FROM users u, users u2, artifact, artifact_status, artifact_category, artifact_group, artifact_resolution WHERE ((((((artifact.assigned_to = u.user_id) AND (artifact.submitted_by = u2.user_id)) AND (artifact.status_id = artifact_status.id)) AND (artifact.category_id = artifact_category.id)) AND (artifact.artifact_group_id = artifact_group.id)) AND (artifact.resolution_id = artifact_resolution.id))"
628 foreach my $s (@reqlist) {
631 $sth = $dbh->prepare ($query) ;
636 &update_db_version ($target) ;
641 $version = &get_db_version ;
642 $target = "2.6-0+checkpoint+8" ;
643 if (&is_lesser ($version, $target)) {
644 &debug ("Adding integrity constraints between the Trove map tables.") ;
647 "ALTER TABLE trove_group_link ADD CONSTRAINT tgl_group_id_fk FOREIGN KEY (group_id) REFERENCES groups(group_id) MATCH FULL",
648 "ALTER TABLE trove_group_link ADD CONSTRAINT tgl_cat_id_fk FOREIGN KEY (trove_cat_id) REFERENCES trove_cat(trove_cat_id) MATCH FULL",
649 "ALTER TABLE trove_agg ADD CONSTRAINT trove_agg_cat_id_fk FOREIGN KEY (trove_cat_id) REFERENCES trove_cat(trove_cat_id) MATCH FULL",
650 "ALTER TABLE trove_agg ADD CONSTRAINT trove_agg_group_id_fk FOREIGN KEY (group_id) REFERENCES groups(group_id) MATCH FULL",
651 "DELETE FROM trove_treesums WHERE trove_cat_id NOT IN (SELECT trove_cat_id FROM trove_cat)",
652 "ALTER TABLE trove_treesums ADD CONSTRAINT trove_treesums_cat_id_fk FOREIGN KEY (trove_cat_id) REFERENCES trove_cat(trove_cat_id) MATCH FULL",
654 foreach my $s (@reqlist) {
657 $sth = $dbh->prepare ($query) ;
662 &update_db_version ($target) ;
667 $version = &get_db_version ;
668 $target = "2.6-0+checkpoint+9" ;
669 if (&is_lesser ($version, $target)) {
670 &debug ("Adding extra fields to the groups table.") ;
673 "ALTER TABLE groups ADD COLUMN use_ftp integer",
674 "ALTER TABLE groups ALTER COLUMN use_ftp SET DEFAULT 1",
675 "UPDATE groups SET use_ftp = 1",
676 "ALTER TABLE groups ADD COLUMN use_tracker integer",
677 "ALTER TABLE groups ALTER COLUMN use_tracker SET DEFAULT 1",
678 "UPDATE groups SET use_tracker = 1",
679 "ALTER TABLE groups ADD COLUMN use_frs integer",
680 "ALTER TABLE groups ALTER COLUMN use_frs SET DEFAULT 1",
681 "UPDATE groups SET use_frs = 1",
682 "ALTER TABLE groups ADD COLUMN use_stats integer",
683 "ALTER TABLE groups ALTER COLUMN use_stats SET DEFAULT 1",
684 "UPDATE groups SET use_stats = 1",
685 "ALTER TABLE groups ADD COLUMN enable_pserver integer",
686 "ALTER TABLE groups ALTER COLUMN enable_pserver SET DEFAULT 1",
687 "UPDATE groups SET enable_pserver = 1",
688 "ALTER TABLE groups ADD COLUMN enable_anoncvs integer",
689 "ALTER TABLE groups ALTER COLUMN enable_anoncvs SET DEFAULT 1",
690 "UPDATE groups SET enable_anoncvs = 1",
692 foreach my $s (@reqlist) {
695 $sth = $dbh->prepare ($query) ;
700 &update_db_version ($target) ;
705 $version = &get_db_version ;
706 $target = "2.6-0+checkpoint+10" ;
707 if (&is_lesser ($version, $target)) {
708 &debug ("Updating supported_languages table.") ;
711 "ALTER TABLE supported_languages RENAME COLUMN language_code TO language_code_old",
712 "ALTER TABLE supported_languages ADD COLUMN language_code character(5)",
713 "UPDATE supported_languages SET language_code = language_code_old",
714 "ALTER TABLE supported_languages DROP COLUMN language_code_old",
715 "UPDATE supported_languages SET language_code='pt_BR', classname='PortugueseBrazilian', name='Pt. Brazilian', filename='PortugueseBrazilian.class' where classname='PortugueseBrazillian'",
717 foreach my $s (@reqlist) {
720 $sth = $dbh->prepare ($query) ;
725 &update_db_version ($target) ;
730 $version = &get_db_version ;
731 $target = "2.6-0+checkpoint+11" ;
732 if (&is_lesser ($version, $target)) {
733 &debug ("Adding tables for the plugin subsystem.") ;
736 "CREATE SEQUENCE plugins_pk_seq",
737 "CREATE TABLE plugins (plugin_id integer DEFAULT nextval('plugins_pk_seq'::text) NOT NULL, plugin_name varchar(32) UNIQUE NOT NULL, plugin_desc text, CONSTRAINT plugins_pkey PRIMARY KEY (plugin_id))",
738 "CREATE SEQUENCE group_plugin_pk_seq",
739 "CREATE TABLE group_plugin (group_plugin_id integer DEFAULT nextval('group_plugin_pk_seq'::text) NOT NULL, group_id integer, plugin_id integer, CONSTRAINT group_plugin_pkey PRIMARY KEY (group_plugin_id), CONSTRAINT group_plugin_group_id_fk FOREIGN KEY (group_id) REFERENCES groups(group_id) MATCH FULL, CONSTRAINT group_plugin_plugin_id_fk FOREIGN KEY (plugin_id) REFERENCES plugins(plugin_id) MATCH FULL)",
740 "CREATE SEQUENCE user_plugin_pk_seq",
741 "CREATE TABLE user_plugin (user_plugin_id integer DEFAULT nextval('user_plugin_pk_seq'::text) NOT NULL, user_id integer, plugin_id integer, CONSTRAINT user_plugin_pkey PRIMARY KEY (user_plugin_id), CONSTRAINT user_plugin_user_id_fk FOREIGN KEY (user_id) REFERENCES users(user_id) MATCH FULL, CONSTRAINT user_plugin_plugin_id_fk FOREIGN KEY (plugin_id) REFERENCES plugins(plugin_id) MATCH FULL)",
743 foreach my $s (@reqlist) {
746 $sth = $dbh->prepare ($query) ;
751 &update_db_version ($target) ;
756 &update_with_sql("20021125", "2.6-0+checkpoint+12") ;
757 &update_with_sql("20021212", "2.6-0+checkpoint+13") ;
758 &update_with_sql("20021213-1", "2.6-0+checkpoint+14") ;
760 $version = &get_db_version ;
761 $target = "2.6-0+checkpoint+15" ;
762 if (&is_lesser ($version, $target)) {
763 &debug ("Transcoding documentation data fields") ;
764 $query = "SELECT docid,data FROM doc_data ORDER BY docid ASC" ;
766 $sth = $dbh->prepare ($query) ;
768 while (@array = $sth->fetchrow_array) {
769 my $query2 = "UPDATE doc_data SET data='" ;
770 $query2 .= encode_base64 (decode_entities ($array [1])) ;
771 $query2 .= "', filename='file".$array [0].".html'";
772 $query2 .= ", filetype='text/html'";
773 $query2 .= " WHERE docid=" ;
774 $query2 .= $array [0] ;
777 my $sth2 =$dbh->prepare ($query2) ;
784 &update_db_version ($target) ;
789 &update_with_sql("20021214", "2.6-0+checkpoint+16") ;
790 &update_with_sql("20021215", "2.6-0+checkpoint+17") ;
791 &update_with_sql("20021216", "2.6-0+checkpoint+18") ;
792 &update_with_sql("20021223-2", "2.6-0+checkpoint+19") ;
793 &update_with_sql("20030102-2", "2.6-0+checkpoint+20") ;
794 &update_with_sql("20030105", "2.6-0+checkpoint+21") ;
795 &update_with_sql("20030107", "2.6-0+checkpoint+22") ;
796 &update_with_sql("20030109", "2.6-0+checkpoint+23") ;
798 $version = &get_db_version ;
799 $target = "2.6-0+checkpoint+24" ;
800 if (&is_lesser ($version, $target)) {
802 &debug ("Adjusting language sequences") ;
804 $query = "SELECT max(language_id) FROM supported_languages" ;
805 $sth = $dbh->prepare ($query) ;
807 @array = $sth->fetchrow_array () ;
809 my $maxid = $array [0] ;
810 &bump_sequence_to ($dbh, "supported_languages_pk_seq", $maxid) ;
812 &debug ("Upgrading with 20030112.sql") ;
814 @reqlist = @{ &parse_sql_file ("$sqldir/20030112.sql") } ;
815 foreach my $s (@reqlist) {
818 $sth = $dbh->prepare ($query) ;
824 &update_db_version ($target) ;
829 &update_with_sql("20030113-2", "2.6-0+checkpoint+25") ;
830 &update_with_sql("20030131", "2.6-0+checkpoint+26") ;
831 &update_with_sql("20030209", "2.6-0+checkpoint+27") ;
832 &update_with_sql("20030312", "2.6-0+checkpoint+28") ;
834 $version = &get_db_version ;
835 $target = "2.6-0+checkpoint+29" ;
836 if (&is_lesser ($version, $target)) {
837 &debug ("Registering KDE theme.") ;
839 $query = "INSERT INTO themes (dirname, fullname) VALUES ('kde', 'KDE')";
841 $sth = $dbh->prepare ($query) ;
845 &update_db_version ($target) ;
851 $version = &get_db_version ;
852 $target = "2.6-0+checkpoint+30" ;
853 if (&is_lesser ($version, $target)) {
854 &debug ("Registering Dark Aqua theme.") ;
856 $query = "INSERT INTO themes (dirname, fullname) VALUES ('darkaqua', 'Dark Aqua')";
858 $sth = $dbh->prepare ($query) ;
862 &update_db_version ($target) ;
868 &update_with_sql("20030513", "2.6-0+checkpoint+31") ;
870 $version = &get_db_version ;
872 if (&is_lesser ($version, $target)) {
873 &debug ("Database schema is now version 3.0-1.") ;
875 &update_db_version ($target) ;
880 &update_with_sql("20030822", "3.0-7") ;
881 &update_with_sql("20031105", "3.1-0+1") ;
882 &update_with_sql("20031124", "3.1-0+1.1") ;
883 &update_with_sql("20031129", "3.1-0+2") ;
884 &update_with_sql("20031126", "3.1-0+3") ;
885 &update_with_sql("20031205", "3.2.1-0+2") ;
886 &update_with_sql("20040130", "3.2.1-0+3") ;
887 &update_with_sql("20040204", "3.2.1-0+4") ;
888 &update_with_sql("20040315", "3.2.1-0+5") ;
889 &update_with_sql("200403251", "3.3.0-0+0") ;
890 &update_with_sql("200403252", "3.3.0-0+1") ;
891 &update_with_sql("20040507", "3.3.0-0+3") ;
892 &update_with_sql("20040722", "3.3.0-0+4") ;
893 &update_with_sql("20040804", "3.3.0-0+6") ;
894 &update_with_sql("20040826", "3.3.0-0+7") ;
896 $version = &get_db_version ;
897 $target = "3.3.0-2+1" ;
898 if (&is_lesser ($version, $target)) {
899 &debug ("Migrating forum names") ;
901 $query = "SELECT group_forum_id,forum_name FROM forum_group_list" ;
903 $sth = $dbh->prepare ($query) ;
905 while (@array = $sth->fetchrow_array) {
906 my $forumid = $array[0] ;
907 my $oldname = $array[1] ;
909 my $newname = lc $oldname ;
910 $newname =~ s/[^_.0-9a-z-]/-/g ;
912 my $query2 = "UPDATE forum_group_list SET forum_name='$newname' WHERE group_forum_id=$forumid" ;
914 my $sth2 =$dbh->prepare ($query2) ;
920 &update_db_version ($target) ;
925 $version = &get_db_version ;
926 $target = "3.3.0-2+2" ;
927 if (&is_lesser ($version, $target)) {
928 &debug ("Migrating permissions to RBAC") ;
931 'Admin' => { 'projectadmin'=>'A', 'frs'=>'1', 'scm'=>'1', 'docman'=>'1', 'forumadmin'=>'2', 'forum'=>'2', 'trackeradmin'=>'2', 'tracker'=>'2', 'pmadmin'=>'2', 'pm'=>'2' },
932 'Senior Developer' => { 'projectadmin'=>'0', 'frs'=>'1', 'scm'=>'1', 'docman'=>'1', 'forumadmin'=>'2', 'forum'=>'2', 'trackeradmin'=>'2', 'tracker'=>'2', 'pmadmin'=>'2', 'pm'=>'2' },
933 'Junior Developer' => { 'projectadmin'=>'0', 'frs'=>'0', 'scm'=>'1', 'docman'=>'0', 'forumadmin'=>'0', 'forum'=>'1', 'trackeradmin'=>'0', 'tracker'=>'1', 'pmadmin'=>'0', 'pm'=>'1' },
934 'Doc Writer' => { 'projectadmin'=>'0', 'frs'=>'0', 'scm'=>'0', 'docman'=>'1', 'forumadmin'=>'0', 'forum'=>'1', 'trackeradmin'=>'0', 'tracker'=>'0', 'pmadmin'=>'0', 'pm'=>'0' },
935 'Support Tech' => { 'projectadmin'=>'0', 'frs'=>'0', 'scm'=>'0', 'docman'=>'1', 'forumadmin'=>'0', 'forum'=>'1', 'trackeradmin'=>'0', 'tracker'=>'2', 'pmadmin'=>'0', 'pm'=>'0' }
938 $query = "SELECT group_id FROM groups where status != 'P'" ;
940 $sth = $dbh->prepare ($query) ;
942 while (@array = $sth->fetchrow_array) {
943 my $group_id = $array[0] ;
945 my ($query2, $sth2, @array2, $admin_rid, $jd_rid, %roledata) ;
946 foreach my $rname (keys %$defaultroles) {
947 $query2 = "SELECT nextval('role_role_id_seq'::text)" ;
949 $sth2 =$dbh->prepare ($query2) ;
951 @array2 = $sth2->fetchrow_array ;
952 my $rid = $array2[0] ;
954 if ($rname eq 'Admin') {
956 } elsif ($rname eq 'Junior Developer') {
960 $query2 = "INSERT INTO role (role_id, group_id, role_name)
961 VALUES ($rid, $group_id, '$rname')" ;
963 $sth2 =$dbh->prepare ($query2) ;
967 foreach my $section (keys %{$defaultroles->{$rname}}) {
968 if ($section eq 'forum') {
969 $query2 = "SELECT group_forum_id
970 FROM forum_group_list
971 WHERE group_id = $group_id" ;
973 $sth2 =$dbh->prepare ($query2) ;
975 while (@array2 = $sth2->fetchrow_array) {
976 $roledata{'forum'}{$array2[0]} = $defaultroles->{$rname}{'forum'} ;
979 } elsif ($section eq 'pm') {
980 $query2 = "SELECT group_project_id
981 FROM project_group_list
982 WHERE group_id = $group_id" ;
984 $sth2 =$dbh->prepare ($query2) ;
986 while (@array2 = $sth2->fetchrow_array) {
987 $roledata{'pm'}{$array2[0]} = $defaultroles->{$rname}{'pm'} ;
990 } elsif ($section eq 'tracker') {
991 $query2 = "SELECT group_artifact_id
992 FROM artifact_group_list
993 WHERE group_id = $group_id" ;
995 $sth2 =$dbh->prepare ($query2) ;
997 while (@array2 = $sth2->fetchrow_array) {
998 $roledata{'tracker'}{$array2[0]} = $defaultroles->{$rname}{'tracker'} ;
1002 $roledata{$section}{0} = $defaultroles->{$rname}{$section} ;
1005 foreach my $rd_it (keys %{$roledata{$section}}) {
1006 $query2 = "INSERT INTO role_setting (role_id, section_name, ref_id, value)
1007 VALUES ($rid, '$section', $rd_it, '$roledata{$section}{$rd_it}')" ;
1008 # &debug ($query2) ;
1009 $sth2 =$dbh->prepare ($query2) ;
1018 # affecter le rôle Admin aux admins, JD aux autres
1019 $query2 = "SELECT user_id, admin_flags FROM user_group WHERE group_id = $group_id" ;
1020 # &debug ($query2) ;
1021 $sth2 =$dbh->prepare ($query2) ;
1023 while (@array2 = $sth2->fetchrow_array) {
1024 my $uid = $array2[0] ;
1025 my $adminflags = $array2[1] ;
1028 $adminflags =~ s/\s//g ;
1029 if ($adminflags eq 'A') {
1034 $rname = 'Junior Developer' ;
1039 admin_flags = '$defaultroles->{$rname}{'projectadmin'}',
1040 forum_flags = '$defaultroles->{$rname}{'forumadmin'}',
1041 project_flags = '$defaultroles->{$rname}{'pmadmin'}',
1042 doc_flags = '$defaultroles->{$rname}{'docman'}',
1043 cvs_flags = '$defaultroles->{$rname}{'scm'}',
1044 release_flags = '$defaultroles->{$rname}{'frs'}',
1045 artifact_flags = '$defaultroles->{$rname}{'trackeradmin'}'
1046 WHERE user_id = $uid AND group_id = $group_id" ,
1048 SET perm_level=$defaultroles->{$rname}{'forum'}
1049 WHERE group_forum_id IN (
1050 SELECT group_forum_id
1051 FROM forum_group_list
1052 WHERE group_id=$group_id)
1054 "UPDATE project_perm
1055 SET perm_level=$defaultroles->{$rname}{'pm'}
1056 WHERE group_project_id IN (
1057 SELECT group_project_id
1058 FROM project_group_list
1059 WHERE group_id=$group_id)
1061 "UPDATE artifact_perm
1062 SET perm_level=$defaultroles->{$rname}{'tracker'}
1063 WHERE group_artifact_id IN (
1064 SELECT group_artifact_id
1065 FROM artifact_group_list
1066 WHERE group_id=$group_id)
1069 foreach my $query3 (@reqlist3) {
1070 # &debug ($query3) ;
1071 my $sth3 = $dbh->prepare ($query3) ;
1080 &update_db_version ($target) ;
1085 &update_with_sql("20040914", "3.3.0-2+4") ;
1086 &update_with_sql("20041001", "3.3.0-2+4+1") ;
1087 &update_with_sql("20041005", "3.3.0-2+5") ;
1088 &update_with_sql("20041006", "3.3.0-2+6") ;
1089 &update_with_sql("20041014", "3.3.0-3") ;
1090 &update_with_sql("20041020", "3.3.0-4") ;
1091 &update_with_sql("20040729", "4.0.0-0") ;
1093 $version = &get_db_version ;
1094 $target = "4.0.0-0+1" ;
1095 if (&is_lesser ($version, $target)) {
1096 &debug ("Granting read access permissions to NSS") ;
1098 @reqlist = ( "GRANT SELECT ON nss_passwd TO ${sys_dbuser}_nss",
1099 "GRANT SELECT ON nss_groups TO ${sys_dbuser}_nss",
1100 "GRANT SELECT ON nss_usergroups TO ${sys_dbuser}_nss",
1102 foreach my $s (@reqlist) {
1105 $sth = $dbh->prepare ($query) ;
1111 &update_db_version ($target) ;
1116 $version = &get_db_version ;
1117 $target = "4.0.0-0+2" ;
1118 if (&is_lesser ($version, $target)) {
1119 &debug ("Upgrading with 20041031.sql") ;
1121 @reqlist = @{ &parse_sql_file ("$sqldir/20041031.sql") } ;
1122 foreach my $s (@reqlist) {
1125 $sth = $dbh->prepare ($query) ;
1131 &debug ("Granting read access permissions to NSS") ;
1133 @reqlist = ( "GRANT SELECT ON mta_users TO ${sys_dbuser}_mta",
1134 "GRANT SELECT ON mta_lists TO ${sys_dbuser}_mta",
1136 foreach my $s (@reqlist) {
1139 $sth = $dbh->prepare ($query) ;
1145 &update_db_version ($target) ;
1150 &update_with_sql("20041104", "4.0.0-0+3") ;
1151 &update_with_sql("20041108", "4.0.0-0+4") ;
1152 &update_with_sql("20041124", "4.0.2-0+0") ;
1154 $version = &get_db_version ;
1155 $target = "4.0.2-0+1" ;
1156 if (&is_lesser ($version, $target)) {
1157 &debug ("Creating automatic commit notification mailing-lists") ;
1160 $query = "SELECT group_id, unix_group_name FROM groups WHERE status='A' ORDER BY group_id" ;
1162 $sth = $dbh->prepare ($query) ;
1164 while (@array = $sth->fetchrow_array) {
1165 my $group_id = $array[0] ;
1166 my $group_name = $array[1] ;
1168 my $query2 = "SELECT count(*) FROM mail_group_list
1169 WHERE group_id = $group_id
1170 AND list_name = '".$group_name."-commits'" ;
1171 # &debug ($query2) ;
1172 my $sth2 =$dbh->prepare ($query2) ;
1174 my @array2 = $sth2->fetchrow_array ;
1176 if ($array2[0] == 0) {
1177 my $listname = $group_name."-commits" ;
1178 my $listpw = substr (Digest::MD5::md5_base64 ($listname . rand(1)), 0, 16) ;
1181 $query2 = "SELECT user_id FROM user_group
1182 WHERE admin_flags = 'A'
1183 AND group_id = $group_id" ;
1184 # &debug ($query2) ;
1185 $sth2 =$dbh->prepare ($query2) ;
1187 my $group_admin = -1 ;
1188 if (@array2 = $sth2->fetchrow_array) {
1189 $group_admin = $array2[0] ;
1193 $query2 = "INSERT INTO mail_group_list (group_id, list_name, is_public, password, list_admin, status, description)
1194 VALUES ($group_id, '$listname', 1, '$listpw', $group_admin, 1, 'commits')" ;
1195 # &debug ($query2) ;
1196 $sth2 =$dbh->prepare ($query2) ;
1203 &update_db_version ($target) ;
1208 &update_with_sql("20050115", "4.0.2-0+3") ;
1210 # We got this at upgrade
1212 #DBD::Pg::st execute failed: ERREUR: la relation avec l'OID 387345 n'existe pas at /usr/share/gforge/bin/db-upgrade.pl line 1970.
1213 #Transaction aborted because DBD::Pg::st execute failed: ERREUR: la relation avec l'OID 387345 n'existe pas at /usr/share/gforge/bin/db-upgrade.pl line 1970.
1214 #Transaction aborted because DBD::Pg::st execute failed: ERREUR: la relation avec l'OID 387345 n'existe pas at /usr/share/gforge/bin/db-upgrade.pl line 1970.
1215 #Last SQL query was:
1216 #update project_task SET last_modified_date=EXTRACT(EPOCH FROM now())::integer;
1218 #Your database schema is at version 4.0.2-0+5
1220 # This is a hack to disconnect and reconnect the DB and solve the problem
1226 $dbh->{AutoCommit} = 0;
1227 $dbh->{RaiseError} = 1;
1229 &update_with_sql("20050130", "4.0.2-0+5") ;
1230 &update_with_sql("20050212", "4.0.2-0+6") ;
1232 $version = &get_db_version ;
1233 $target = "4.0.2-0+7" ;
1234 if (&is_lesser ($version, $target)) {
1235 &debug ("Upgrading with 20050214-nss.sql") ;
1237 @reqlist = @{ &parse_sql_file ("$sqldir/20050214-nss.sql") } ;
1238 foreach my $s (@reqlist) {
1240 $query =~ s/TO gforge_nss;/TO ${sys_dbuser}_nss;/ ;
1242 $sth = $dbh->prepare ($query) ;
1248 &update_db_version ($target) ;
1253 &update_with_sql("20050224-2", "4.1-0") ;
1255 $version = &get_db_version ;
1257 if (&is_lesser ($version, $target)) {
1258 &debug ("Upgrading with 20050225-nsssetup.sql") ;
1260 @reqlist = @{ &parse_sql_file ("$sqldir/20050225-nsssetup.sql") } ;
1261 foreach my $s (@reqlist) {
1263 $query =~ s/TO gforge_nss;/TO ${sys_dbuser}_nss;/ ;
1265 $sth = $dbh->prepare ($query) ;
1271 &update_db_version ($target) ;
1276 &update_with_sql("20050311", "4.1-2") ;
1277 &update_with_sql("20050315", "4.1-3") ;
1278 &update_with_sql("20050325-2", "4.1-4") ;
1280 $version = &get_db_version ;
1282 if (&is_lesser ($version, $target)) {
1283 &debug ("Converting trackers to use their extra fields") ;
1285 $query = "SELECT group_id,group_artifact_id,use_resolution FROM artifact_group_list" ;
1287 $sth = $dbh->prepare ($query) ;
1289 while (@array = $sth->fetchrow_array) {
1290 my $group_id = $array[0] ;
1291 my $gaid = $array[1] ;
1292 my $ur = $array[2] ;
1294 # Ajout du champ Category
1295 my $query2 = "SELECT nextval('artifact_extra_field_list_extra_field_id_seq'::text)" ;
1296 # &debug ($query2) ;
1297 my $sth2 = $dbh->prepare ($query2) ;
1299 my @array2 = $sth2->fetchrow_array ;
1301 my $aefid = $array2[0] ;
1303 $query2 = "INSERT INTO artifact_extra_field_list (extra_field_id, group_artifact_id,field_name,field_type)
1304 VALUES ($aefid, $gaid, 'Category', 1)" ;
1305 # &debug ($query2) ;
1306 $sth2 =$dbh->prepare ($query2) ;
1309 $query2 = "SELECT id, category_name FROM artifact_category WHERE group_artifact_id=$gaid" ;
1310 # &debug ($query2) ;
1311 $sth2 = $dbh->prepare ($query2) ;
1314 while (@array2 = $sth2->fetchrow_array) {
1315 my $cat_id = $array2[0] ;
1316 my $catname = $array2[1] ;
1318 if ($catname eq '') { $catname = '[empty]' ; }
1320 my $query3 = "SELECT nextval('artifact_extra_field_elements_element_id_seq'::text)" ;
1321 # &debug ($query3) ;
1322 my $sth3 = $dbh->prepare ($query3) ;
1324 my @array3 = $sth3->fetchrow_array ;
1326 my $efeid = $array3[0] ;
1328 $query3 = "INSERT INTO artifact_extra_field_elements (element_id, extra_field_id, element_name, status_id)
1329 VALUES ($efeid, $aefid, ?, 0)" ;
1330 # &debug ($query3) ;
1331 $sth3 =$dbh->prepare ($query3) ;
1332 $sth3->execute ($catname) ;
1335 $query3 = "INSERT INTO artifact_extra_field_data (artifact_id,field_data,extra_field_id)
1336 SELECT artifact_id,$efeid,$aefid FROM artifact
1337 WHERE category_id=$cat_id" ;
1338 # &debug ($query3) ;
1339 $sth3 =$dbh->prepare ($query3) ;
1343 $query3 = "UPDATE artifact_history SET old_value=?,field_name='Category'
1344 WHERE old_value='$cat_id' AND field_name='category_id'" ;
1345 # &debug ($query3) ;
1346 $sth3 =$dbh->prepare ($query3) ;
1347 $sth3->execute ($catname) ;
1352 # Ajout du champ Group
1353 $query2 = "SELECT nextval('artifact_extra_field_list_extra_field_id_seq'::text)" ;
1354 # &debug ($query2) ;
1355 $sth2 = $dbh->prepare ($query2) ;
1357 @array2 = $sth2->fetchrow_array ;
1359 $aefid = $array2[0] ;
1361 $query2 = "INSERT INTO artifact_extra_field_list (extra_field_id, group_artifact_id,field_name,field_type)
1362 VALUES ($aefid, $gaid, 'Group', 1)" ;
1363 # &debug ($query2) ;
1364 $sth2 =$dbh->prepare ($query2) ;
1367 $query2 = "SELECT id, group_name FROM artifact_group WHERE group_artifact_id=$gaid" ;
1368 # &debug ($query2) ;
1369 $sth2 = $dbh->prepare ($query2) ;
1372 while (@array2 = $sth2->fetchrow_array) {
1373 my $grp_id = $array2[0] ;
1374 my $grpname = $array2[1] ;
1376 if ($grpname eq '') { $grpname = '[empty]' ; }
1378 my $query3 = "SELECT nextval('artifact_extra_field_elements_element_id_seq'::text)" ;
1379 # &debug ($query3) ;
1380 my $sth3 = $dbh->prepare ($query3) ;
1382 my @array3 = $sth3->fetchrow_array ;
1384 my $efeid = $array3[0] ;
1386 $query3 = "INSERT INTO artifact_extra_field_elements (element_id, extra_field_id, element_name, status_id)
1387 VALUES ($efeid, $aefid, ?, 0)" ;
1388 # &debug ($query3) ;
1389 $sth3 =$dbh->prepare ($query3) ;
1390 $sth3->execute ($grpname) ;
1393 $query3 = "INSERT INTO artifact_extra_field_data (artifact_id,field_data,extra_field_id)
1394 SELECT artifact_id,$efeid,$aefid FROM artifact
1395 WHERE artifact_group_id=$grp_id" ;
1396 # &debug ($query3) ;
1397 $sth3 =$dbh->prepare ($query3) ;
1401 $query3 = "UPDATE artifact_history SET old_value=?,field_name='Group'
1402 WHERE old_value='$grp_id' AND field_name='artifact_group_id'" ;
1403 # &debug ($query3) ;
1404 $sth3 =$dbh->prepare ($query3) ;
1405 $sth3->execute ($grpname) ;
1410 # Ajout du champ Resolution (s'il existe, cf. $ur)
1412 $query2 = "SELECT nextval('artifact_extra_field_list_extra_field_id_seq'::text)" ;
1413 # &debug ($query2) ;
1414 $sth2 = $dbh->prepare ($query2) ;
1416 @array2 = $sth2->fetchrow_array ;
1418 $aefid = $array2[0] ;
1420 $query2 = "INSERT INTO artifact_extra_field_list (extra_field_id, group_artifact_id,field_name,field_type)
1421 VALUES ($aefid, $gaid, 'Resolution', 1)" ;
1422 # &debug ($query2) ;
1423 $sth2 =$dbh->prepare ($query2) ;
1426 $query2 = "SELECT id, resolution_name FROM artifact_resolution" ;
1427 # &debug ($query2) ;
1428 $sth2 = $dbh->prepare ($query2) ;
1431 while (@array2 = $sth2->fetchrow_array) {
1432 my $res_id = $array2[0] ;
1433 my $resname = $array2[1] ;
1435 if ($resname eq '') { $resname = '[empty]' ; }
1437 my $query3 = "SELECT nextval('artifact_extra_field_elements_element_id_seq'::text)" ;
1438 # &debug ($query3) ;
1439 my $sth3 = $dbh->prepare ($query3) ;
1441 my @array3 = $sth3->fetchrow_array ;
1443 my $efeid = $array3[0] ;
1445 $query3 = "INSERT INTO artifact_extra_field_elements (element_id, extra_field_id, element_name, status_id)
1446 VALUES ($efeid, $aefid, ?, 0)" ;
1447 # &debug ($query3) ;
1448 $sth3 =$dbh->prepare ($query3) ;
1449 $sth3->execute ($resname) ;
1452 $query3 = "INSERT INTO artifact_extra_field_data (artifact_id,field_data,extra_field_id)
1453 SELECT artifact_id,$efeid,$aefid FROM artifact
1454 WHERE resolution_id=$res_id and group_artifact_id=$gaid" ;
1455 # &debug ($query3) ;
1456 $sth3 =$dbh->prepare ($query3) ;
1460 $query3 = "UPDATE artifact_history SET old_value=?,field_name='Resolution'
1461 WHERE old_value='$res_id' AND field_name='resolution_id'" ;
1462 # &debug ($query3) ;
1463 $sth3 =$dbh->prepare ($query3) ;
1464 $sth3->execute ($resname) ;
1471 &update_db_version ($target) ;
1476 &update_with_sql("20050325-5", "4.1-6") ;
1477 &update_with_sql("20050605", "4.1-7") ;
1479 $version = &get_db_version ;
1481 if (&is_lesser ($version, $target)) {
1482 &debug ("Creating aliases for the extra fields") ;
1484 $query = "ALTER TABLE artifact_extra_field_list ADD COLUMN alias TEXT" ;
1486 $sth = $dbh->prepare ($query) ;
1490 my %reserved_alias = (
1499 $query = "SELECT field_name, alias, group_artifact_id, extra_field_id FROM artifact_extra_field_list" ;
1501 $sth = $dbh->prepare ($query) ;
1503 while (@array = $sth->fetchrow_array) {
1504 my $name = $array[0] ;
1505 my $alias = $array[1] ;
1506 my $gaid = $array[2] ;
1507 my $efid = $array[3] ;
1510 my $newalias = lc $name ;
1511 $newalias =~ s/\s/_/g ;
1512 $newalias =~ s/[^_a-z]//g ;
1514 if ($newalias ne "") {
1515 if ($reserved_alias{$newalias}) {
1516 $newalias = "extra_" . $newalias ;
1523 $candidate = $newalias ;
1524 $candidate .= $count if ($count > 0) ;
1525 my $query2 = "SELECT count(*) FROM artifact_extra_field_list WHERE group_artifact_id=$gaid AND LOWER(alias)='$candidate' AND extra_field_id <> $efid" ;
1526 # &debug ($query2) ;
1527 my $sth2 =$dbh->prepare ($query2) ;
1529 my @array2 = $sth2->fetchrow_array ;
1530 if ($array2[0] == 0) {
1537 } until ($conflict == 0) ;
1539 my $query2 = "UPDATE artifact_extra_field_list SET alias='$candidate' WHERE extra_field_id=$efid" ;
1540 # &debug ($query2) ;
1541 my $sth2 =$dbh->prepare ($query2) ;
1550 &update_db_version ($target) ;
1555 &update_with_sql("20050628", "4.1-9") ;
1556 &update_with_sql("20050711", "4.5-1") ;
1557 &update_with_sql("20050906","4.5-2");
1558 &update_with_sql("20050804-1","4.5-3");
1560 $version = &get_db_version ;
1562 if (&is_lesser ($version, $target)) {
1563 &debug ("Updating document sizes") ;
1565 $query = "SELECT docid, data FROM doc_data" ;
1567 $sth = $dbh->prepare ($query) ;
1569 while (@array = $sth->fetchrow_array) {
1570 my $docid = $array[0] ;
1571 my $b64data = $array[1] ;
1572 my $data = decode_base64 ($b64data) ;
1573 my $size = length ($data) ;
1575 my $query2 = "UPDATE doc_data SET filesize=$size WHERE docid=$docid" ;
1576 # &debug ($query2) ;
1577 my $sth2 =$dbh->prepare ($query2) ;
1583 &update_db_version ($target) ;
1588 $version = &get_db_version ;
1589 $target = "4.5.14-3" ;
1590 if (&is_lesser ($version, $target)) {
1591 &debug ("Setting up time tracking") ;
1593 if (&table_exists ($dbh, "rep_time_category")) {
1594 &debug ("...already set up.") ;
1596 &drop_table_if_exists ($dbh, "rep_time_category") ;
1597 &drop_sequence_if_exists ($dbh, "rep_time_category_time_code_seq") ;
1598 &drop_table_if_exists ($dbh, "rep_time_tracking") ;
1599 &drop_table_if_exists ($dbh, "rep_users_added_daily") ;
1600 &drop_table_if_exists ($dbh, "rep_users_added_weekly") ;
1601 &drop_table_if_exists ($dbh, "rep_users_added_monthly") ;
1602 &drop_table_if_exists ($dbh, "rep_users_cum_daily") ;
1603 &drop_table_if_exists ($dbh, "rep_users_cum_weekly") ;
1604 &drop_table_if_exists ($dbh, "rep_users_cum_monthly") ;
1605 &drop_table_if_exists ($dbh, "rep_groups_added_daily") ;
1606 &drop_table_if_exists ($dbh, "rep_groups_added_weekly") ;
1607 &drop_table_if_exists ($dbh, "rep_groups_added_monthly") ;
1608 &drop_table_if_exists ($dbh, "rep_groups_cum_daily") ;
1609 &drop_table_if_exists ($dbh, "rep_groups_cum_weekly") ;
1610 &drop_table_if_exists ($dbh, "rep_groups_cum_monthly") ;
1611 &drop_view_if_exists ($dbh, "rep_group_act_oa_vw") ;
1612 &drop_view_if_exists ($dbh, "rep_user_act_oa_vw") ;
1613 &drop_view_if_exists ($dbh, "rep_site_act_daily_vw") ;
1614 &drop_view_if_exists ($dbh, "rep_site_act_weekly_vw") ;
1615 &drop_view_if_exists ($dbh, "rep_site_act_monthly_vw") ;
1616 &drop_table_if_exists ($dbh, "rep_user_act_daily") ;
1617 &drop_table_if_exists ($dbh, "rep_user_act_weekly") ;
1618 &drop_table_if_exists ($dbh, "rep_user_act_monthly") ;
1619 &drop_table_if_exists ($dbh, "rep_group_act_daily") ;
1620 &drop_index_if_exists ($dbh, "repgroupactdaily_daily") ;
1621 &drop_table_if_exists ($dbh, "rep_group_act_weekly") ;
1622 &drop_index_if_exists ($dbh, "repgroupactweekly_weekly") ;
1623 &drop_table_if_exists ($dbh, "rep_group_act_monthly") ;
1624 &drop_index_if_exists ($dbh, "repgroupactmonthly_monthly") ;
1626 @reqlist = @{ &parse_sql_file ("$sqldir/timetracking-init.sql") } ;
1627 foreach my $s (@reqlist) {
1630 $sth = $dbh->prepare ($query) ;
1637 &update_db_version ($target) ;
1642 # I had to increase versions from 4.5.14 to 4.5.15
1643 # The activity view is created by 20060216-nocommit
1644 # If the view doesn't exists apply
1645 if (! &view_exists ($dbh, 'activity_vw')) {
1646 &update_with_sql("20050812","4.5.15-10merge");
1647 &update_with_sql("20050822-2","4.5.15-11merge");
1648 &update_with_sql("20050823","4.5.15-12merge");
1649 &update_with_sql("20050824","4.5.15-13merge");
1650 &update_with_sql("20050831","4.5.15-14merge");
1652 &update_with_sql("20060113","4.5.15-15");
1653 &update_with_sql("20060214","4.5.15-16");
1654 &update_with_sql("20060216-2-debian-nocommit","4.5.15-17");
1657 $version = &get_db_version ;
1658 $target = "4.5.15-21" ;
1659 if (&is_lesser ($version, $target)) {
1660 &debug ("Fixing past mistakes in role naming") ;
1662 my $defaultroles_restricted = {
1663 'Admin' => { 'projectadmin'=>'A', 'frs'=>'1', 'scm'=>'1', 'docman'=>'1', 'forumadmin'=>'2', 'trackeradmin'=>'2', 'pmadmin'=>'2' },
1664 'Senior Developer' => { 'projectadmin'=>'0', 'frs'=>'1', 'scm'=>'1', 'docman'=>'1', 'forumadmin'=>'2', 'trackeradmin'=>'2', 'pmadmin'=>'2' },
1665 'Junior Developer' => { 'projectadmin'=>'0', 'frs'=>'0', 'scm'=>'1', 'docman'=>'0', 'forumadmin'=>'0', 'trackeradmin'=>'0', 'pmadmin'=>'0' },
1666 'Doc Writer' => { 'projectadmin'=>'0', 'frs'=>'0', 'scm'=>'0', 'docman'=>'1', 'forumadmin'=>'0', 'trackeradmin'=>'0', 'pmadmin'=>'0' },
1667 'Support Tech' => { 'projectadmin'=>'0', 'frs'=>'0', 'scm'=>'0', 'docman'=>'1', 'forumadmin'=>'0', 'trackeradmin'=>'0', 'pmadmin'=>'0' }
1670 foreach my $drname (keys %{$defaultroles_restricted}) {
1671 $query = "UPDATE role SET role_name='$drname' WHERE role_id IN (SELECT role.role_id" ;
1676 foreach my $setting (keys %{$defaultroles_restricted->{$drname}}) {
1677 $value = $defaultroles_restricted->{$drname}->{$setting} ;
1678 $from .= ", role_setting rs_$setting" ;
1679 $where .= "role.role_id = rs_$setting.role_id AND rs_$setting.section_name='$setting' AND " ;
1680 $where .= "rs_$setting.value = '$value' \nAND " ;
1682 $query .= "\nFROM role$from" ;
1683 $query .= "\nWHERE $where role.role_name='rname')";
1684 push @reqlist, $query;
1687 foreach my $s (@reqlist) {
1690 $sth = $dbh->prepare ($query) ;
1696 &update_db_version ($target) ;
1701 &update_with_sql("20051103_transiciel_motscle_document","4.6-1");
1703 &update_with_sql("20070924-forum-perm","4.6.99-1");
1704 &update_with_sql("20070924-project-perm","4.6.99-2");
1705 &update_with_sql("20070924-artifact-perm","4.6.99-3");
1707 $version = &get_db_version ;
1708 $target = "4.6.99-4" ;
1709 if (&is_lesser ($version, $target)) {
1710 &debug ("Dropping old translations table") ;
1712 &drop_table_if_exists ($dbh, "tmp_lang") ;
1714 &update_db_version ($target) ;
1719 $version = &get_db_version ;
1720 $target = "4.6.99-5" ;
1721 if (&is_lesser ($version, $target)) {
1722 &debug ("Updating available themes") ;
1724 my @obsolete_themes = qw/ classic debian savannah
1725 savannah_codex savannah_forest
1726 savannah_reverse savannah_sad
1727 savannah_savannah savannah_slashd
1729 savannah_transparent savannah_water
1730 savannah_www.gnu.org
1731 savannah_darkslate forged kde
1734 my $otids = join (',', map { "'$_'" } @obsolete_themes) ;
1736 $query = "UPDATE users SET theme_id=1 WHERE theme_id IN
1737 (SELECT theme_id FROM themes WHERE dirname IN ($otids))" ;
1738 push @reqlist, $query;
1740 $query = "DELETE FROM themes WHERE dirname IN ($otids)" ;
1741 push @reqlist, $query;
1744 'gforge-classic' => 'GForge classic',
1745 'gforge-simple-theme' => 'GForge simple',
1746 'lite' => 'GForge lite'
1749 foreach my $dir (sort keys %new_themes) {
1750 $query = "INSERT INTO themes (dirname, fullname) VALUES ('$dir', '$new_themes{$dir}')" ;
1751 push @reqlist, $query;
1754 foreach my $s (@reqlist) {
1757 $sth = $dbh->prepare ($query) ;
1763 &update_db_version ($target) ;
1768 $version = &get_db_version ;
1769 $target = "4.6.99-6" ;
1770 if (&is_lesser ($version, $target)) {
1771 &debug ("DROP UNIQUE INDEX never UNIQUE") ;
1772 &drop_index_if_exists ($dbh, "statsaggsitebygrp_oid") ;
1773 &drop_index_if_exists ($dbh, "statsprojectmetric_oid") ;
1774 &drop_index_if_exists ($dbh, "statsagglogobygrp_oid") ;
1775 &drop_index_if_exists ($dbh, "statsprojectdevelop_oid") ;
1776 &drop_index_if_exists ($dbh, "statssubdpages_oid") ;
1777 &drop_index_if_exists ($dbh, "statscvsgrp_oid") ;
1778 &drop_index_if_exists ($dbh, "statsproject_oid") ;
1779 &drop_index_if_exists ($dbh, "statssite_oid") ;
1780 &drop_index_if_exists ($dbh, "statssitepgsbyday_oid") ;
1781 &update_db_version ($target) ;
1786 &update_with_sql("20090327_create_table_project_tags","4.6.99-7");
1787 &update_with_sql("20090402-add-projecttags-constraints","4.7.99-1");
1788 &update_with_sql("20090402-forum-attachment-types","4.7.99-2");
1790 &update_with_sql("20090507-add_artifact_workflow","4.8.99-1");
1791 &update_with_sql("20090507-add_element_pos","4.8.99-2");
1792 &update_with_sql("20090507-add_project_query","4.8.99-3");
1793 &update_with_sql("20090507-browse_list","4.8.99-4");
1795 $version = &get_db_version ;
1796 $target = "4.8.99-5" ;
1797 if (&is_lesser ($version, $target)) {
1798 &debug ("Initialising tracker workflows") ;
1801 $query = "SELECT group_id, artifact_group_list.group_artifact_id, element_id, artifact_extra_field_elements.extra_field_id
1802 FROM artifact_extra_field_list, artifact_extra_field_elements, artifact_group_list
1803 WHERE artifact_extra_field_list.extra_field_id=artifact_extra_field_elements.extra_field_id
1804 AND artifact_group_list.group_artifact_id = artifact_extra_field_list.group_artifact_id
1807 $sth = $dbh->prepare ($query) ;
1809 while (@array = $sth->fetchrow_array) {
1810 my $gid = $array[0];
1811 my $gaid = $array[1];
1812 my $eid = $array[2];
1814 my $query2 = "SELECT extra_field_id
1815 FROM artifact_extra_field_list
1816 WHERE group_artifact_id=$gaid
1818 ORDER BY field_type ASC" ;
1819 my $sth2 = $dbh->prepare ($query2) ;
1822 if (my @array2 = $sth2->fetchrow_array) {
1823 my $efid = $array2[0];
1826 $query2 = "SELECT element_id,element_name,status_id
1827 FROM artifact_extra_field_elements
1828 WHERE extra_field_id = $efid
1829 ORDER BY element_pos ASC, element_id ASC" ;
1831 $sth2 = $dbh->prepare ($query2) ;
1833 while (@array2 = $sth2->fetchrow_array) {
1834 my $eid2 = $array2[0];
1835 if ($eid2 != $eid) {
1836 my $query3 = "INSERT INTO artifact_workflow_event
1837 (group_artifact_id, field_id, from_value_id, to_value_id)
1838 VALUES ($gaid, $efid, $eid, $eid2)";
1840 my $sth3 = $dbh->prepare ($query3) ;
1843 $query3 = "INSERT INTO artifact_workflow_event
1844 (group_artifact_id, field_id, from_value_id, to_value_id)
1845 VALUES ($gaid, $efid, $eid2, $eid)";
1847 $sth3 = $dbh->prepare ($query3) ;
1853 my $query3 = "INSERT INTO artifact_workflow_event
1854 (group_artifact_id, field_id, from_value_id, to_value_id)
1855 VALUES ($gaid, $efid, 100, $eid)";
1857 my $sth3 = $dbh->prepare ($query3) ;
1865 &update_db_version ($target) ;
1870 &update_with_sql("20100308-forum-attachment-types","4.8.99-6");
1872 $version = &get_db_version ;
1873 $target = "4.8.99-7" ;
1874 if (&is_lesser ($version, $target)) {
1875 &debug ("Granting read access permissions to NSS and MTA") ;
1877 @reqlist = ( "GRANT SELECT ON nss_passwd TO ${sys_dbuser}_nss",
1878 "GRANT SELECT ON nss_groups TO ${sys_dbuser}_nss",
1879 "GRANT SELECT ON nss_usergroups TO ${sys_dbuser}_nss",
1880 "GRANT SELECT ON mta_users TO ${sys_dbuser}_mta",
1881 "GRANT SELECT ON mta_lists TO ${sys_dbuser}_mta",
1883 foreach my $s (@reqlist) {
1886 $sth = $dbh->prepare ($query) ;
1892 &update_db_version ($target) ;
1897 &update_with_sql("20100330-add-system-event","5.0.0-1");
1898 &update_with_sql("20100331-alter-system-event","5.0.0-2");
1899 &update_with_sql("20100505-alter-user-preference","5.0.1-1");
1900 &update_with_sql("20100506-add-widgets","5.0.1-2");
1901 &update_with_sql("20100517-add-project-widgets","5.0.1-3");
1902 &update_with_sql("20100518-pfo-rbac","5.0.1-4");
1903 &update_with_sql("20100524-pfo-rbac","5.0.1-5");
1904 &update_with_sql("20100606-clean-perm-views","5.0.1-6");
1905 &update_with_sql("20100610-pfo-rbac","5.0.1-7");
1906 &update_with_sql("20100730-docman","5.0.1-8");
1907 &update_with_sql("20100924-theme","5.0.1-9");
1908 &update_with_sql("20100926-pfo-rbac","5.0.1-10");
1909 &update_with_sql("20100927-pfo-rbac","5.0.1-11");
1910 &update_with_sql("20101012-docman-webdav","5.0.51-1");
1911 &update_with_sql("20101021-pfo-rbac","5.0.51-2");
1912 &update_with_sql("20101025-ipv6","5.0.51-3");
1914 $version = &get_db_version ;
1915 $target = "5.0.51-4" ;
1916 if (&is_lesser ($version, $target)) {
1917 &debug ("Granting read access permissions to NSS and MTA") ;
1919 @reqlist = ( "GRANT SELECT ON nss_passwd TO ${sys_dbuser}_nss",
1920 "GRANT SELECT ON nss_groups TO ${sys_dbuser}_nss",
1921 "GRANT SELECT ON nss_usergroups TO ${sys_dbuser}_nss",
1922 "GRANT SELECT ON mta_users TO ${sys_dbuser}_mta",
1923 "GRANT SELECT ON mta_lists TO ${sys_dbuser}_mta",
1925 foreach my $s (@reqlist) {
1928 $sth = $dbh->prepare ($query) ;
1934 &update_db_version ($target) ;
1939 &update_with_sql("20101027-docman-lock","5.0.51-5");
1940 &update_with_sql("20101105-pfo-rbac","5.0.51-6");
1941 &update_with_sql("20101029-docman-monitoring","5.0.51-7");
1942 &update_with_sql("20100402_add_query_options","5.0.51-8");
1943 &update_with_sql("20101024-docman-createonline","5.0.51-9");
1944 &update_with_sql("20101213-project-template","5.0.51-10");
1945 &update_with_sql("20110110-pw-size","5.0.51-11");
1946 &update_with_sql("20110405-forum_attachment_fix-bug284","5.0.51-12");
1947 &update_with_sql("20110408-anonymous-read-news","5.0.51-13");
1948 &update_with_sql("20110414-move-news-forums-to-own-project","5.0.51-14");
1950 ########################### INSERT HERE #################################
1952 # There should be a commit at the end of every block above.
1953 # If there is not, then it might be symptomatic of a problem.
1954 # For safety, we roll back.
1959 warn "Transaction aborted because $@" ;
1960 &debug ("Transaction aborted because $@") ;
1961 &debug ("Last SQL query was:\n$query\n(end of query)") ;
1963 my $version = &get_db_version ;
1965 &debug ("Your database schema is at version $version") ;
1967 &debug ("Couldn't get your database schema version.") ;
1969 &debug ("Please report this bug on the Debian bug-tracking system.") ;
1970 &debug ("Please include the previous messages as well to help debugging.") ;
1971 &debug ("You should not worry too much about this,") ;
1972 &debug ("your DB is still in a consistent state and should be usable.") ;
1979 sub get_pg_version () {
1981 if (-x '/usr/bin/pg_lsclusters' ) {
1982 $command = q(/usr/bin/pg_lsclusters | grep 5432 | grep online | cut -d' ' -f1) ;
1984 $command = q(dpkg -s postgresql | awk '/^Version: / { print $2 }') ;
1986 my $version = qx($command) ;
1991 sub create_metadata_table ( $ ) {
1992 my $v = shift || "2.5-7+just+before+8" ;
1994 my ($query, $sth, @array) ;
1996 # Let's create this table if we have it not
1997 if (! &table_exists ($dbh, 'debian_meta_data')) {
1998 &debug ("Creating debian_meta_data table.") ;
1999 $query = "CREATE TABLE debian_meta_data (key varchar primary key, value text not null)" ;
2001 $sth = $dbh->prepare ($query) ;
2006 $query = "SELECT count(*) FROM debian_meta_data WHERE key = 'db-version'";
2008 $sth = $dbh->prepare ($query) ;
2010 @array = $sth->fetchrow_array () ;
2013 # Empty table? We'll have to fill it up a bit
2015 if ($array [0] == 0) {
2016 &debug ("Inserting first data into debian_meta_data table.") ;
2017 $query = "INSERT INTO debian_meta_data (key, value) VALUES ('db-version', '$v')" ;
2019 $sth = $dbh->prepare ($query) ;
2025 sub update_db_version ( $ ) {
2026 my $v = shift or die "Not enough arguments" ;
2028 $query = "UPDATE debian_meta_data SET value = '$v' WHERE key = 'db-version'" ;
2029 my $sth = $dbh->prepare ($query) ;
2034 sub get_db_version () {
2035 $query = "SELECT value FROM debian_meta_data WHERE key = 'db-version'" ;
2037 my $sth = $dbh->prepare ($query) ;
2039 my @array = $sth->fetchrow_array () ;
2042 my $version = $array [0] ;
2047 sub update_with_sql ( $$ ) {
2048 my $sqlfile = shift or die "Not enough arguments" ;
2049 my $target = shift or die "Not enough arguments" ;
2050 my $version = &get_db_version ;
2051 if (&is_lesser ($version, $target)) {
2052 &debug ("Upgrading database with $sqlfile.sql") ;
2054 @reqlist = @{ &parse_sql_file ("$sqldir/$sqlfile.sql") } ;
2055 foreach my $s (@reqlist) {
2058 my $sth = $dbh->prepare ($query) ;
2064 &update_db_version ($target) ;