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 $libdir="/usr/share/gforge/lib";
27 $sqldir="/usr/share/gforge/db";
28 require ("$libdir/sqlparser.pm") ; # Our magic SQL parser
29 require ("$libdir/sqlhelper.pm") ; # Our SQL functions
30 require ("$libdir/include.pl"); # Some other functions
34 $dbh->{AutoCommit} = 0;
35 $dbh->{RaiseError} = 1;
37 my ($sth, @array, $version, $path, $target) ;
39 # Do we have at least the basic schema?
40 # Create Sourceforge database
41 if (! &table_exists ($dbh, 'groups')) { # No 'groups' table
42 # Installing SF 2.6 from scratch
43 &debug ("Creating initial Sourceforge database from files.") ;
45 &create_metadata_table ("2.5.9999") ;
47 $query = "SELECT count(*) from debian_meta_data where key = 'current-path'";
49 $sth = $dbh->prepare ($query) ;
51 @array = $sth->fetchrow_array () ;
54 $query = "INSERT INTO debian_meta_data (key, value) VALUES ('current-path', 'scratch-to-2.6')" ;
56 $sth = $dbh->prepare ($query) ;
63 } else { # A 'groups' table exists
64 if (! &table_exists ($dbh, 'debian_meta_data')) { # No 'debian_meta_data' table
65 # If we're here, we're upgrading from 2.5-7 or earlier
66 # We therefore need to create the table
67 &create_metadata_table ("2.5-7+just+before+8") ;
70 $version = &get_db_version ;
71 if (&is_lesser ($version, "2.5.9999")) {
72 &debug ("Found an old (2.5) database, will upgrade to 2.6") ;
74 $query = "SELECT count(*) from debian_meta_data where key = 'current-path'";
76 $sth = $dbh->prepare ($query) ;
78 @array = $sth->fetchrow_array () ;
82 $query = "INSERT INTO debian_meta_data (key, value) VALUES ('current-path', '2.5-to-2.6')" ;
83 $sth = $dbh->prepare ($query) ;
91 $query = "SELECT count(*) from debian_meta_data where key = 'current-path'";
92 $sth = $dbh->prepare ($query) ;
94 @array = $sth->fetchrow_array () ;
100 $query = "SELECT value from debian_meta_data where key = 'current-path'";
101 $sth = $dbh->prepare ($query) ;
103 @array = $sth->fetchrow_array () ;
110 ($path eq 'scratch-to-2.6') && do {
111 &update_with_sql ("sf-2.6-complete", "2.5.9999.1+global+data+done") ;
113 $version = &get_db_version ;
114 $target = "2.5.9999.2+local+data+done" ;
115 if (&is_lesser ($version, $target)) {
116 &debug ("Adding local data.") ;
118 my ($login, $md5pwd, $unixpwd, $email, $noreplymail, $date) ;
121 $md5pwd = 'INVALID' ;
122 $unixpwd = 'INVALID' ;
123 $email = $server_admin ;
124 $noreplymail="noreply\@$domain_name" ;
128 "UPDATE groups SET homepage = '$domain_name/admin/' where group_id = 1",
129 "UPDATE groups SET homepage = '$domain_name/news/' where group_id = 2",
130 "UPDATE groups SET homepage = '$domain_name/stats/' where group_id = 3",
131 "UPDATE groups SET homepage = '$domain_name/peerrating/' where group_id = 4",
132 "UPDATE users SET email = '$noreplymail' where user_id = 100",
133 "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)",
134 "SELECT setval ('\"users_pk_seq\"', 102, 'f')",
135 "INSERT INTO user_group (user_id, group_id, admin_flags) VALUES (101, 1, 'A')",
136 "INSERT INTO user_group (user_id, group_id, admin_flags) VALUES (101, 2, 'A')",
137 "INSERT INTO user_group (user_id, group_id, admin_flags) VALUES (101, 3, 'A')",
138 "INSERT INTO user_group (user_id, group_id, admin_flags) VALUES (101, 4, 'A')"
141 foreach my $s (@reqlist) {
144 $sth = $dbh->prepare ($query) ;
150 &update_db_version ($target) ;
155 $version = &get_db_version ;
156 $target = "2.5.9999.3+skills+done" ;
157 if (&is_lesser ($version, $target)) {
158 &debug ("Inserting skills.") ;
160 foreach my $skill (split m/;/, "Ada;C;C++;HTML;LISP;Perl;PHP;Python;SQL") {
161 push @reqlist, "INSERT INTO people_skill (name) VALUES ('$skill')" ;
164 foreach my $s (@reqlist) {
167 $sth = $dbh->prepare ($query) ;
173 &update_db_version ($target) ;
178 $version = &get_db_version ;
179 $target = "2.6-0+checkpoint+1" ;
180 if (&is_lesser ($version, $target)) {
181 $query = "DELETE FROM debian_meta_data WHERE key = 'current-path'" ;
183 $sth = $dbh->prepare ($query) ;
187 &update_db_version ($target) ;
195 ($path eq '2.5-to-2.6') && do {
197 $version = &get_db_version ;
199 if (&is_lesser ($version, $target)) {
200 &debug ("Adding row to people_job_category.") ;
201 $query = "INSERT INTO people_job_category VALUES (100, 'Undefined', 0)" ;
202 $sth = $dbh->prepare ($query) ;
206 &update_db_version ($target) ;
211 $version = &get_db_version ;
213 if (&is_lesser ($version, $target)) {
214 &debug ("Adding row to supported_languages.") ;
215 $query = "INSERT INTO supported_languages VALUES (15, 'Korean', 'Korean.class', 'Korean', 'kr')" ;
216 $sth = $dbh->prepare ($query) ;
220 &update_db_version ($target) ;
225 $version = &get_db_version ;
227 if (&is_lesser ($version, $target)) {
228 &debug ("Fixing unix_box entries.") ;
230 $query = "update groups set unix_box = 'shell'" ;
231 $sth = $dbh->prepare ($query) ;
235 $query = "update users set unix_box = 'shell'" ;
236 $sth = $dbh->prepare ($query) ;
240 &debug ("Also fixing a few sequences.") ;
242 &bump_sequence_to ($dbh, "bug_pk_seq", 100) ;
243 &bump_sequence_to ($dbh, "project_task_pk_seq", 100) ;
245 &update_db_version ($target) ;
250 $version = &get_db_version ;
252 if (&is_lesser ($version, $target)) {
253 &debug ("Adding rows to supported_languages.") ;
255 "INSERT INTO supported_languages VALUES (16,'Bulgarian','Bulgarian.class','Bulgarian','bg')",
256 "INSERT INTO supported_languages VALUES (17,'Greek','Greek.class','Greek','el')",
257 "INSERT INTO supported_languages VALUES (18,'Indonesian','Indonesian.class','Indonesian','id')",
258 "INSERT INTO supported_languages VALUES (19,'Portuguese (Brazillian)','PortugueseBrazillian.class','PortugueseBrazillian', 'br')",
259 "INSERT INTO supported_languages VALUES (20,'Polish','Polish.class','Polish','pl')",
260 "INSERT INTO supported_languages VALUES (21,'Portuguese','Portuguese.class','Portuguese', 'pt')",
261 "INSERT INTO supported_languages VALUES (22,'Russian','Russian.class','Russian','ru')"
264 foreach my $s (@reqlist) {
267 $sth = $dbh->prepare ($query) ;
273 &update_db_version ($target) ;
278 $version = &get_db_version ;
280 if (&is_lesser ($version, $target)) {
281 &debug ("Fixing unix_uid entries.") ;
283 $query = "UPDATE users SET unix_uid = nextval ('unix_uid_seq') WHERE unix_status != 'N' AND status != 'P' AND unix_uid = 0" ;
284 $sth = $dbh->prepare ($query) ;
288 &update_db_version ($target) ;
293 $version = &get_db_version ;
294 $target = "2.5.9999.1+temp+data+dropped" ;
295 if (&is_lesser ($version, $target)) {
296 &debug ("Preparing to upgrade your database - dropping temporary tables") ;
298 my @tables = qw/ user_metric_tmp1_1 user_metric_tmp1_2
299 user_metric_tmp1_3 user_metric_tmp1_4
300 user_metric_tmp1_5 user_metric_tmp1_6
301 user_metric_tmp1_7 user_metric_tmp1_8 user_metric1
302 user_metric2 user_metric3 user_metric4 user_metric5
303 user_metric6 user_metric7 user_metric8
304 project_counts_tmp project_metric_tmp
305 project_metric_tmp1 project_counts_weekly_tmp
306 project_metric_weekly_tmp project_metric_weekly_tmp1
309 my @sequences = qw/ user_metric1_ranking_seq
310 user_metric2_ranking_seq user_metric3_ranking_seq
311 user_metric4_ranking_seq user_metric5_ranking_seq
312 user_metric6_ranking_seq user_metric7_ranking_seq
313 user_metric8_ranking_seq project_metric_weekly_seq
314 trove_treesum_trove_treesum_seq
315 project_metric_tmp1_pk_seq / ;
317 my @indexes = qw/ idx_project_metric_group
318 idx_project_metric_weekly_group
319 user_metric_history_date_userid / ;
321 foreach my $table (@tables) {
322 &drop_table_if_exists ($dbh, $table) ;
325 foreach my $sequence (@sequences) {
326 &drop_sequence_if_exists ($dbh, $sequence) ;
329 foreach my $index (@indexes) {
330 &drop_index_if_exists ($dbh, $index) ;
333 &update_db_version ($target) ;
338 $version = &get_db_version ;
339 $target = "2.5.9999.2+data+upgraded" ;
340 if (&is_lesser ($version, $target)) {
341 &debug ("Upgrading your database scheme from 2.5") ;
344 "ALTER TABLE groups DROP CONSTRAINT groups_pkey",
345 "ALTER TABLE users DROP CONSTRAINT users_pkey",
347 foreach my $s (@reqlist) {
350 $sth = $dbh->prepare ($query) ;
355 @reqlist = @{ &parse_sql_file ("$sqldir/sf2.5-to-sf2.6.sql") } ;
356 foreach my $s (@reqlist) {
359 $sth = $dbh->prepare ($query) ;
365 &update_db_version ($target) ;
370 $version = &get_db_version ;
371 $target = "2.5.9999.3+artifact+transcoded" ;
372 if (&is_lesser ($version, $target)) {
373 &debug ("Transcoding the artifact data fields") ;
375 $query = "SELECT id,bin_data FROM artifact_file ORDER BY id ASC" ;
377 $sth = $dbh->prepare ($query) ;
379 while (@array = $sth->fetchrow_array) {
380 my $query2 = "UPDATE artifact_file SET bin_data='" ;
381 $query2 .= encode_base64 (decode_entities ($array [1])) ;
382 $query2 .= "' WHERE id=" ;
383 $query2 .= $array [0] ;
386 my $sth2 =$dbh->prepare ($query2) ;
393 &update_db_version ($target) ;
398 $version = &get_db_version ;
399 $target = "2.5.9999.4+groups+inserted" ;
400 if (&is_lesser ($version, $target)) {
401 &debug ("Inserting missing groups") ;
404 "INSERT INTO groups (group_name, homepage,
405 is_public, status, unix_group_name,
406 unix_box, http_domain, short_description,
407 cvs_box, license, register_purpose,
408 license_other, register_time, rand_hash,
409 use_mail, use_survey, use_forum, use_pm,
410 use_cvs, use_news, type, use_docman,
411 new_task_address, send_all_tasks,
413 VALUES ('Stats', '$domain_name/top/', 0,
414 'A', 'stats', 'shell', NULL, NULL, 'cvs',
415 'website', NULL, NULL, 0, NULL, 1, 0, 0, 0, 0,
417 "INSERT INTO groups (group_name, homepage,
418 is_public, status, unix_group_name,
419 unix_box, http_domain, short_description,
420 cvs_box, license, register_purpose,
421 license_other, register_time, rand_hash,
422 use_mail, use_survey, use_forum, use_pm,
423 use_cvs, use_news, type, use_docman,
424 new_task_address, send_all_tasks,
426 VALUES ('Peer Ratings', '$domain_name/people/', 0,
427 'A', 'peerrating', 'shell', NULL, NULL, 'cvs1',
428 'website', NULL, NULL, 0, NULL, 1, 0, 0, 0, 0,
432 foreach my $s (@reqlist) {
435 $sth = $dbh->prepare ($query) ;
440 &update_db_version ($target) ;
445 $version = &get_db_version ;
446 $target = "2.6-0+checkpoint+1" ;
447 if (&is_lesser ($version, $target)) {
448 $query = "DELETE FROM debian_meta_data WHERE key = 'current-path'" ;
450 $sth = $dbh->prepare ($query) ;
454 &update_db_version ($target) ;
463 $version = &get_db_version ;
464 $target = "2.6-0+checkpoint+2" ;
465 if (&is_lesser ($version, $target)) {
466 &debug ("Updating permissions on system groups.") ;
467 $query = "UPDATE groups SET group_name='Site Admin', is_public=1 WHERE group_id=1" ;
469 $sth = $dbh->prepare ($query) ;
472 $query = "UPDATE groups SET group_name='Site News Admin', is_public=1 WHERE group_id=$sys_news_group" ;
474 $sth = $dbh->prepare ($query) ;
478 &update_db_version ($target) ;
483 $version = &get_db_version ;
484 $target = "2.6-0+checkpoint+3" ;
485 if (&is_lesser ($version, $target)) {
486 &debug ("Creating table group_cvs_history.") ;
487 $query = "CREATE TABLE group_cvs_history (
488 id integer DEFAULT nextval('group_cvs_history_pk_seq'::text) NOT NULL,
489 group_id integer DEFAULT '0' NOT NULL,
490 user_name character varying(80) DEFAULT '' NOT NULL,
491 cvs_commits integer DEFAULT '0' NOT NULL,
492 cvs_commits_wk integer DEFAULT '0' NOT NULL,
493 cvs_adds integer DEFAULT '0' NOT NULL,
494 cvs_adds_wk integer DEFAULT '0' NOT NULL,
497 $sth = $dbh->prepare ($query) ;
501 &update_db_version ($target) ;
506 $version = &get_db_version ;
507 $target = "2.6-0+checkpoint+4" ;
508 if (&is_lesser ($version, $target)) {
509 &debug ("Registering Savannah themes.") ;
511 $query = "SELECT max(theme_id) FROM themes" ;
513 $sth = $dbh->prepare ($query) ;
515 @array = $sth->fetchrow_array () ;
517 my $maxid = $array [0] ;
519 &bump_sequence_to ($dbh, "themes_pk_seq", $maxid) ;
522 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_codex', 'Savannah CodeX')",
523 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_forest', 'Savannah Forest')",
524 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_reverse', 'Savannah Reverse')",
525 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_sad', 'Savannah Sad')",
526 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_savannah', 'Savannah Original')",
527 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_slashd', 'Savannah SlashDot')",
528 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_startrek', 'Savannah StarTrek')",
529 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_transparent', 'Savannah Transparent')",
530 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_water', 'Savannah Water')",
531 "INSERT INTO themes (dirname, fullname) VALUES ('savannah_www.gnu.org', 'Savannah www.gnu.org')"
533 foreach my $s (@reqlist) {
536 $sth = $dbh->prepare ($query) ;
542 &update_db_version ($target) ;
547 $version = &get_db_version ;
548 $target = "2.6-0+checkpoint+5" ;
549 if (&is_lesser ($version, $target)) {
550 &debug ("Registering yet another Savannah theme.") ;
552 $query = "INSERT INTO themes (dirname, fullname) VALUES ('savannah_darkslate', 'Savannah Dark Slate')";
554 $sth = $dbh->prepare ($query) ;
558 &update_db_version ($target) ;
563 $version = &get_db_version ;
564 $target = "2.6-0+checkpoint+6" ;
565 if (&is_lesser ($version, $target)) {
566 &debug ("Updating language codes.") ;
569 "UPDATE supported_languages SET language_code='en' where classname='English'",
570 "UPDATE supported_languages SET language_code='ja' where classname='Japanese'",
571 "UPDATE supported_languages SET language_code='iw' where classname='Hebrew'",
572 "UPDATE supported_languages SET language_code='es' where classname='Spanish'",
573 "UPDATE supported_languages SET language_code='th' where classname='Thai'",
574 "UPDATE supported_languages SET language_code='de' where classname='German'",
575 "UPDATE supported_languages SET language_code='it' where classname='Italian'",
576 "UPDATE supported_languages SET language_code='no' where classname='Norwegian'",
577 "UPDATE supported_languages SET language_code='sv' where classname='Swedish'",
578 "UPDATE supported_languages SET language_code='zh' where classname='Chinese'",
579 "UPDATE supported_languages SET language_code='nl' where classname='Dutch'",
580 "UPDATE supported_languages SET language_code='eo' where classname='Esperanto'",
581 "UPDATE supported_languages SET language_code='ca' where classname='Catalan'",
582 "UPDATE supported_languages SET language_code='ko' where classname='Korean'",
583 "UPDATE supported_languages SET language_code='bg' where classname='Bulgarian'",
584 "UPDATE supported_languages SET language_code='el' where classname='Greek'",
585 "UPDATE supported_languages SET language_code='id' where classname='Indonesian'",
586 "UPDATE supported_languages SET language_code='pt' where classname='Portuguese (Brazillian)'",
587 "UPDATE supported_languages SET language_code='pl' where classname='Polish'",
588 "UPDATE supported_languages SET language_code='pt' where classname='Portuguese'",
589 "UPDATE supported_languages SET language_code='ru' where classname='Russian'",
590 "UPDATE supported_languages SET language_code='fr' where classname='French'"
592 foreach my $s (@reqlist) {
595 $sth = $dbh->prepare ($query) ;
600 &update_db_version ($target) ;
605 $version = &get_db_version ;
606 $target = "2.6-0+checkpoint+7" ;
607 if (&is_lesser ($version, $target)) {
608 &debug ("Fixing artifact-related views.") ;
610 &drop_view_if_exists ($dbh, "artifact_file_user_vw") ;
611 &drop_view_if_exists ($dbh, "artifact_history_user_vw") ;
612 &drop_view_if_exists ($dbh, "artifact_message_user_vw") ;
613 &drop_view_if_exists ($dbh, "artifactperm_artgrouplist_vw") ;
614 &drop_view_if_exists ($dbh, "artifactperm_user_vw") ;
615 &drop_view_if_exists ($dbh, "artifact_vw") ;
618 "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)",
619 "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)",
620 "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)",
621 "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)",
622 "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)",
623 "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))"
625 foreach my $s (@reqlist) {
628 $sth = $dbh->prepare ($query) ;
633 &update_db_version ($target) ;
638 $version = &get_db_version ;
639 $target = "2.6-0+checkpoint+8" ;
640 if (&is_lesser ($version, $target)) {
641 &debug ("Adding integrity constraints between the Trove map tables.") ;
644 "ALTER TABLE trove_group_link ADD CONSTRAINT tgl_group_id_fk FOREIGN KEY (group_id) REFERENCES groups(group_id) MATCH FULL",
645 "ALTER TABLE trove_group_link ADD CONSTRAINT tgl_cat_id_fk FOREIGN KEY (trove_cat_id) REFERENCES trove_cat(trove_cat_id) MATCH FULL",
646 "ALTER TABLE trove_agg ADD CONSTRAINT trove_agg_cat_id_fk FOREIGN KEY (trove_cat_id) REFERENCES trove_cat(trove_cat_id) MATCH FULL",
647 "ALTER TABLE trove_agg ADD CONSTRAINT trove_agg_group_id_fk FOREIGN KEY (group_id) REFERENCES groups(group_id) MATCH FULL",
648 "DELETE FROM trove_treesums WHERE trove_cat_id NOT IN (SELECT trove_cat_id FROM trove_cat)",
649 "ALTER TABLE trove_treesums ADD CONSTRAINT trove_treesums_cat_id_fk FOREIGN KEY (trove_cat_id) REFERENCES trove_cat(trove_cat_id) MATCH FULL",
651 foreach my $s (@reqlist) {
654 $sth = $dbh->prepare ($query) ;
659 &update_db_version ($target) ;
664 $version = &get_db_version ;
665 $target = "2.6-0+checkpoint+9" ;
666 if (&is_lesser ($version, $target)) {
667 &debug ("Adding extra fields to the groups table.") ;
670 "ALTER TABLE groups ADD COLUMN use_ftp integer",
671 "ALTER TABLE groups ALTER COLUMN use_ftp SET DEFAULT 1",
672 "UPDATE groups SET use_ftp = 1",
673 "ALTER TABLE groups ADD COLUMN use_tracker integer",
674 "ALTER TABLE groups ALTER COLUMN use_tracker SET DEFAULT 1",
675 "UPDATE groups SET use_tracker = 1",
676 "ALTER TABLE groups ADD COLUMN use_frs integer",
677 "ALTER TABLE groups ALTER COLUMN use_frs SET DEFAULT 1",
678 "UPDATE groups SET use_frs = 1",
679 "ALTER TABLE groups ADD COLUMN use_stats integer",
680 "ALTER TABLE groups ALTER COLUMN use_stats SET DEFAULT 1",
681 "UPDATE groups SET use_stats = 1",
682 "ALTER TABLE groups ADD COLUMN enable_pserver integer",
683 "ALTER TABLE groups ALTER COLUMN enable_pserver SET DEFAULT 1",
684 "UPDATE groups SET enable_pserver = 1",
685 "ALTER TABLE groups ADD COLUMN enable_anoncvs integer",
686 "ALTER TABLE groups ALTER COLUMN enable_anoncvs SET DEFAULT 1",
687 "UPDATE groups SET enable_anoncvs = 1",
689 foreach my $s (@reqlist) {
692 $sth = $dbh->prepare ($query) ;
697 &update_db_version ($target) ;
702 $version = &get_db_version ;
703 $target = "2.6-0+checkpoint+10" ;
704 if (&is_lesser ($version, $target)) {
705 &debug ("Updating supported_languages table.") ;
708 "ALTER TABLE supported_languages RENAME COLUMN language_code TO language_code_old",
709 "ALTER TABLE supported_languages ADD COLUMN language_code character(5)",
710 "UPDATE supported_languages SET language_code = language_code_old",
711 "ALTER TABLE supported_languages DROP COLUMN language_code_old",
712 "UPDATE supported_languages SET language_code='pt_BR', classname='PortugueseBrazilian', name='Pt. Brazilian', filename='PortugueseBrazilian.class' where classname='PortugueseBrazillian'",
714 foreach my $s (@reqlist) {
717 $sth = $dbh->prepare ($query) ;
722 &update_db_version ($target) ;
727 $version = &get_db_version ;
728 $target = "2.6-0+checkpoint+11" ;
729 if (&is_lesser ($version, $target)) {
730 &debug ("Adding tables for the plugin subsystem.") ;
733 "CREATE SEQUENCE plugins_pk_seq",
734 "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))",
735 "CREATE SEQUENCE group_plugin_pk_seq",
736 "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)",
737 "CREATE SEQUENCE user_plugin_pk_seq",
738 "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)",
740 foreach my $s (@reqlist) {
743 $sth = $dbh->prepare ($query) ;
748 &update_db_version ($target) ;
753 &update_with_sql("20021125", "2.6-0+checkpoint+12") ;
754 &update_with_sql("20021212", "2.6-0+checkpoint+13") ;
755 &update_with_sql("20021213-1", "2.6-0+checkpoint+14") ;
757 $version = &get_db_version ;
758 $target = "2.6-0+checkpoint+15" ;
759 if (&is_lesser ($version, $target)) {
760 &debug ("Transcoding documentation data fields") ;
761 $query = "SELECT docid,data FROM doc_data ORDER BY docid ASC" ;
763 $sth = $dbh->prepare ($query) ;
765 while (@array = $sth->fetchrow_array) {
766 my $query2 = "UPDATE doc_data SET data='" ;
767 $query2 .= encode_base64 (decode_entities ($array [1])) ;
768 $query2 .= "', filename='file".$array [0].".html'";
769 $query2 .= ", filetype='text/html'";
770 $query2 .= " WHERE docid=" ;
771 $query2 .= $array [0] ;
774 my $sth2 =$dbh->prepare ($query2) ;
781 &update_db_version ($target) ;
786 &update_with_sql("20021214", "2.6-0+checkpoint+16") ;
787 &update_with_sql("20021215", "2.6-0+checkpoint+17") ;
788 &update_with_sql("20021216", "2.6-0+checkpoint+18") ;
789 &update_with_sql("20021223-2", "2.6-0+checkpoint+19") ;
790 &update_with_sql("20030102-2", "2.6-0+checkpoint+20") ;
791 &update_with_sql("20030105", "2.6-0+checkpoint+21") ;
792 &update_with_sql("20030107", "2.6-0+checkpoint+22") ;
793 &update_with_sql("20030109", "2.6-0+checkpoint+23") ;
795 $version = &get_db_version ;
796 $target = "2.6-0+checkpoint+24" ;
797 if (&is_lesser ($version, $target)) {
799 &debug ("Adjusting language sequences") ;
801 $query = "SELECT max(language_id) FROM supported_languages" ;
802 $sth = $dbh->prepare ($query) ;
804 @array = $sth->fetchrow_array () ;
806 my $maxid = $array [0] ;
807 &bump_sequence_to ($dbh, "supported_languages_pk_seq", $maxid) ;
809 &debug ("Upgrading with 20030112.sql") ;
811 @reqlist = @{ &parse_sql_file ("$sqldir/20030112.sql") } ;
812 foreach my $s (@reqlist) {
815 $sth = $dbh->prepare ($query) ;
821 &update_db_version ($target) ;
826 &update_with_sql("20030113-2", "2.6-0+checkpoint+25") ;
827 &update_with_sql("20030131", "2.6-0+checkpoint+26") ;
828 &update_with_sql("20030209", "2.6-0+checkpoint+27") ;
829 &update_with_sql("20030312", "2.6-0+checkpoint+28") ;
831 $version = &get_db_version ;
832 $target = "2.6-0+checkpoint+29" ;
833 if (&is_lesser ($version, $target)) {
834 &debug ("Registering KDE theme.") ;
836 $query = "INSERT INTO themes (dirname, fullname) VALUES ('kde', 'KDE')";
838 $sth = $dbh->prepare ($query) ;
842 &update_db_version ($target) ;
848 $version = &get_db_version ;
849 $target = "2.6-0+checkpoint+30" ;
850 if (&is_lesser ($version, $target)) {
851 &debug ("Registering Dark Aqua theme.") ;
853 $query = "INSERT INTO themes (dirname, fullname) VALUES ('darkaqua', 'Dark Aqua')";
855 $sth = $dbh->prepare ($query) ;
859 &update_db_version ($target) ;
865 &update_with_sql("20030513", "2.6-0+checkpoint+31") ;
867 $version = &get_db_version ;
869 if (&is_lesser ($version, $target)) {
870 &debug ("Database schema is now version 3.0-1.") ;
872 &update_db_version ($target) ;
877 &update_with_sql("20030822", "3.0-7") ;
878 &update_with_sql("20031105", "3.1-0+1") ;
879 &update_with_sql("20031124", "3.1-0+1.1") ;
880 &update_with_sql("20031129", "3.1-0+2") ;
881 &update_with_sql("20031126", "3.1-0+3") ;
882 &update_with_sql("20031205", "3.2.1-0+2") ;
883 &update_with_sql("20040130", "3.2.1-0+3") ;
884 &update_with_sql("20040204", "3.2.1-0+4") ;
885 &update_with_sql("20040315", "3.2.1-0+5") ;
886 &update_with_sql("200403251", "3.3.0-0+0") ;
887 &update_with_sql("200403252", "3.3.0-0+1") ;
888 &update_with_sql("20040507", "3.3.0-0+3") ;
889 &update_with_sql("20040722", "3.3.0-0+4") ;
890 &update_with_sql("20040804", "3.3.0-0+6") ;
891 &update_with_sql("20040826", "3.3.0-0+7") ;
893 $version = &get_db_version ;
894 $target = "3.3.0-2+1" ;
895 if (&is_lesser ($version, $target)) {
896 &debug ("Migrating forum names") ;
898 $query = "SELECT group_forum_id,forum_name FROM forum_group_list" ;
900 $sth = $dbh->prepare ($query) ;
902 while (@array = $sth->fetchrow_array) {
903 my $forumid = $array[0] ;
904 my $oldname = $array[1] ;
906 my $newname = lc $oldname ;
907 $newname =~ s/[^_.0-9a-z-]/-/g ;
909 my $query2 = "UPDATE forum_group_list SET forum_name='$newname' WHERE group_forum_id=$forumid" ;
911 my $sth2 =$dbh->prepare ($query2) ;
917 &update_db_version ($target) ;
922 $version = &get_db_version ;
923 $target = "3.3.0-2+2" ;
924 if (&is_lesser ($version, $target)) {
925 &debug ("Migrating permissions to RBAC") ;
928 'Admin' => { 'projectadmin'=>'A', 'frs'=>'1', 'scm'=>'1', 'docman'=>'1', 'forumadmin'=>'2', 'forum'=>'2', 'trackeradmin'=>'2', 'tracker'=>'2', 'pmadmin'=>'2', 'pm'=>'2' },
929 'Senior Developer' => { 'projectadmin'=>'0', 'frs'=>'1', 'scm'=>'1', 'docman'=>'1', 'forumadmin'=>'2', 'forum'=>'2', 'trackeradmin'=>'2', 'tracker'=>'2', 'pmadmin'=>'2', 'pm'=>'2' },
930 'Junior Developer' => { 'projectadmin'=>'0', 'frs'=>'0', 'scm'=>'1', 'docman'=>'0', 'forumadmin'=>'0', 'forum'=>'1', 'trackeradmin'=>'0', 'tracker'=>'1', 'pmadmin'=>'0', 'pm'=>'1' },
931 'Doc Writer' => { 'projectadmin'=>'0', 'frs'=>'0', 'scm'=>'0', 'docman'=>'1', 'forumadmin'=>'0', 'forum'=>'1', 'trackeradmin'=>'0', 'tracker'=>'0', 'pmadmin'=>'0', 'pm'=>'0' },
932 'Support Tech' => { 'projectadmin'=>'0', 'frs'=>'0', 'scm'=>'0', 'docman'=>'1', 'forumadmin'=>'0', 'forum'=>'1', 'trackeradmin'=>'0', 'tracker'=>'2', 'pmadmin'=>'0', 'pm'=>'0' }
935 $query = "SELECT group_id FROM groups where status != 'P'" ;
937 $sth = $dbh->prepare ($query) ;
939 while (@array = $sth->fetchrow_array) {
940 my $group_id = $array[0] ;
942 my ($query2, $sth2, @array2, $admin_rid, $jd_rid, %roledata) ;
943 foreach my $rname (keys %$defaultroles) {
944 $query2 = "SELECT nextval('role_role_id_seq'::text)" ;
946 $sth2 =$dbh->prepare ($query2) ;
948 @array2 = $sth2->fetchrow_array ;
949 my $rid = $array2[0] ;
951 if ($rname eq 'Admin') {
953 } elsif ($rname eq 'Junior Developer') {
957 $query2 = "INSERT INTO role (role_id, group_id, role_name)
958 VALUES ($rid, $group_id, '$rname')" ;
960 $sth2 =$dbh->prepare ($query2) ;
964 foreach my $section (keys %{$defaultroles->{$rname}}) {
965 if ($section eq 'forum') {
966 $query2 = "SELECT group_forum_id
967 FROM forum_group_list
968 WHERE group_id = $group_id" ;
970 $sth2 =$dbh->prepare ($query2) ;
972 while (@array2 = $sth2->fetchrow_array) {
973 $roledata{'forum'}{$array2[0]} = $defaultroles->{$rname}{'forum'} ;
976 } elsif ($section eq 'pm') {
977 $query2 = "SELECT group_project_id
978 FROM project_group_list
979 WHERE group_id = $group_id" ;
981 $sth2 =$dbh->prepare ($query2) ;
983 while (@array2 = $sth2->fetchrow_array) {
984 $roledata{'pm'}{$array2[0]} = $defaultroles->{$rname}{'pm'} ;
987 } elsif ($section eq 'tracker') {
988 $query2 = "SELECT group_artifact_id
989 FROM artifact_group_list
990 WHERE group_id = $group_id" ;
992 $sth2 =$dbh->prepare ($query2) ;
994 while (@array2 = $sth2->fetchrow_array) {
995 $roledata{'tracker'}{$array2[0]} = $defaultroles->{$rname}{'tracker'} ;
999 $roledata{$section}{0} = $defaultroles->{$rname}{$section} ;
1002 foreach my $rd_it (keys %{$roledata{$section}}) {
1003 $query2 = "INSERT INTO role_setting (role_id, section_name, ref_id, value)
1004 VALUES ($rid, '$section', $rd_it, '$roledata{$section}{$rd_it}')" ;
1005 # &debug ($query2) ;
1006 $sth2 =$dbh->prepare ($query2) ;
1015 # affecter le rôle Admin aux admins, JD aux autres
1016 $query2 = "SELECT user_id, admin_flags FROM user_group WHERE group_id = $group_id" ;
1017 # &debug ($query2) ;
1018 $sth2 =$dbh->prepare ($query2) ;
1020 while (@array2 = $sth2->fetchrow_array) {
1021 my $uid = $array2[0] ;
1022 my $adminflags = $array2[1] ;
1025 $adminflags =~ s/\s//g ;
1026 if ($adminflags eq 'A') {
1031 $rname = 'Junior Developer' ;
1036 admin_flags = '$defaultroles->{$rname}{'projectadmin'}',
1037 forum_flags = '$defaultroles->{$rname}{'forumadmin'}',
1038 project_flags = '$defaultroles->{$rname}{'pmadmin'}',
1039 doc_flags = '$defaultroles->{$rname}{'docman'}',
1040 cvs_flags = '$defaultroles->{$rname}{'scm'}',
1041 release_flags = '$defaultroles->{$rname}{'frs'}',
1042 artifact_flags = '$defaultroles->{$rname}{'trackeradmin'}'
1043 WHERE user_id = $uid AND group_id = $group_id" ,
1045 SET perm_level=$defaultroles->{$rname}{'forum'}
1046 WHERE group_forum_id IN (
1047 SELECT group_forum_id
1048 FROM forum_group_list
1049 WHERE group_id=$group_id)
1051 "UPDATE project_perm
1052 SET perm_level=$defaultroles->{$rname}{'pm'}
1053 WHERE group_project_id IN (
1054 SELECT group_project_id
1055 FROM project_group_list
1056 WHERE group_id=$group_id)
1058 "UPDATE artifact_perm
1059 SET perm_level=$defaultroles->{$rname}{'tracker'}
1060 WHERE group_artifact_id IN (
1061 SELECT group_artifact_id
1062 FROM artifact_group_list
1063 WHERE group_id=$group_id)
1066 foreach my $query3 (@reqlist3) {
1067 # &debug ($query3) ;
1068 my $sth3 = $dbh->prepare ($query3) ;
1077 &update_db_version ($target) ;
1082 &update_with_sql("20040914", "3.3.0-2+4") ;
1083 &update_with_sql("20041001", "3.3.0-2+4+1") ;
1084 &update_with_sql("20041005", "3.3.0-2+5") ;
1085 &update_with_sql("20041006", "3.3.0-2+6") ;
1086 &update_with_sql("20041014", "3.3.0-3") ;
1087 &update_with_sql("20041020", "3.3.0-4") ;
1088 &update_with_sql("20040729", "4.0.0-0") ;
1090 $version = &get_db_version ;
1091 $target = "4.0.0-0+1" ;
1092 if (&is_lesser ($version, $target)) {
1093 &debug ("Granting read access permissions to NSS") ;
1095 @reqlist = ( "GRANT SELECT ON nss_passwd TO ${sys_dbuser}_nss",
1096 "GRANT SELECT ON nss_groups TO ${sys_dbuser}_nss",
1097 "GRANT SELECT ON nss_usergroups TO ${sys_dbuser}_nss",
1099 foreach my $s (@reqlist) {
1102 $sth = $dbh->prepare ($query) ;
1108 &update_db_version ($target) ;
1113 $version = &get_db_version ;
1114 $target = "4.0.0-0+2" ;
1115 if (&is_lesser ($version, $target)) {
1116 &debug ("Upgrading with 20041031.sql") ;
1118 @reqlist = @{ &parse_sql_file ("$sqldir/20041031.sql") } ;
1119 foreach my $s (@reqlist) {
1122 $sth = $dbh->prepare ($query) ;
1128 &debug ("Granting read access permissions to NSS") ;
1130 @reqlist = ( "GRANT SELECT ON mta_users TO ${sys_dbuser}_mta",
1131 "GRANT SELECT ON mta_lists TO ${sys_dbuser}_mta",
1133 foreach my $s (@reqlist) {
1136 $sth = $dbh->prepare ($query) ;
1142 &update_db_version ($target) ;
1147 &update_with_sql("20041104", "4.0.0-0+3") ;
1148 &update_with_sql("20041108", "4.0.0-0+4") ;
1149 &update_with_sql("20041124", "4.0.2-0+0") ;
1151 $version = &get_db_version ;
1152 $target = "4.0.2-0+1" ;
1153 if (&is_lesser ($version, $target)) {
1154 &debug ("Creating automatic commit notification mailing-lists") ;
1157 $query = "SELECT group_id, unix_group_name FROM groups WHERE status='A' ORDER BY group_id" ;
1159 $sth = $dbh->prepare ($query) ;
1161 while (@array = $sth->fetchrow_array) {
1162 my $group_id = $array[0] ;
1163 my $group_name = $array[1] ;
1165 my $query2 = "SELECT count(*) FROM mail_group_list
1166 WHERE group_id = $group_id
1167 AND list_name = '".$group_name."-commits'" ;
1168 # &debug ($query2) ;
1169 my $sth2 =$dbh->prepare ($query2) ;
1171 my @array2 = $sth2->fetchrow_array ;
1173 if ($array2[0] == 0) {
1174 my $listname = $group_name."-commits" ;
1175 my $listpw = substr (Digest::MD5::md5_base64 ($listname . rand(1)), 0, 16) ;
1178 $query2 = "SELECT user_id FROM user_group
1179 WHERE admin_flags = 'A'
1180 AND group_id = $group_id" ;
1181 # &debug ($query2) ;
1182 $sth2 =$dbh->prepare ($query2) ;
1184 my $group_admin = -1 ;
1185 if (@array2 = $sth2->fetchrow_array) {
1186 $group_admin = $array2[0] ;
1190 $query2 = "INSERT INTO mail_group_list (group_id, list_name, is_public, password, list_admin, status, description)
1191 VALUES ($group_id, '$listname', 1, '$listpw', $group_admin, 1, 'commits')" ;
1192 # &debug ($query2) ;
1193 $sth2 =$dbh->prepare ($query2) ;
1200 &update_db_version ($target) ;
1205 &update_with_sql("20050115", "4.0.2-0+3") ;
1207 # We got this at upgrade
1209 #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.
1210 #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.
1211 #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.
1212 #Last SQL query was:
1213 #update project_task SET last_modified_date=EXTRACT(EPOCH FROM now())::integer;
1215 #Your database schema is at version 4.0.2-0+5
1217 # This is a hack to disconnect and reconnect the DB and solve the problem
1223 $dbh->{AutoCommit} = 0;
1224 $dbh->{RaiseError} = 1;
1226 &update_with_sql("20050130", "4.0.2-0+5") ;
1227 &update_with_sql("20050212", "4.0.2-0+6") ;
1229 $version = &get_db_version ;
1230 $target = "4.0.2-0+7" ;
1231 if (&is_lesser ($version, $target)) {
1232 &debug ("Upgrading with 20050214-nss.sql") ;
1234 @reqlist = @{ &parse_sql_file ("$sqldir/20050214-nss.sql") } ;
1235 foreach my $s (@reqlist) {
1237 $query =~ s/TO gforge_nss;/TO ${sys_dbuser}_nss;/ ;
1239 $sth = $dbh->prepare ($query) ;
1245 &update_db_version ($target) ;
1250 &update_with_sql("20050224-2", "4.1-0") ;
1252 $version = &get_db_version ;
1254 if (&is_lesser ($version, $target)) {
1255 &debug ("Upgrading with 20050225-nsssetup.sql") ;
1257 @reqlist = @{ &parse_sql_file ("$sqldir/20050225-nsssetup.sql") } ;
1258 foreach my $s (@reqlist) {
1260 $query =~ s/TO gforge_nss;/TO ${sys_dbuser}_nss;/ ;
1262 $sth = $dbh->prepare ($query) ;
1268 &update_db_version ($target) ;
1273 &update_with_sql("20050311", "4.1-2") ;
1274 &update_with_sql("20050315", "4.1-3") ;
1275 &update_with_sql("20050325-2", "4.1-4") ;
1277 $version = &get_db_version ;
1279 if (&is_lesser ($version, $target)) {
1280 &debug ("Converting trackers to use their extra fields") ;
1282 $query = "SELECT group_id,group_artifact_id,use_resolution FROM artifact_group_list" ;
1284 $sth = $dbh->prepare ($query) ;
1286 while (@array = $sth->fetchrow_array) {
1287 my $group_id = $array[0] ;
1288 my $gaid = $array[1] ;
1289 my $ur = $array[2] ;
1291 # Ajout du champ Category
1292 my $query2 = "SELECT nextval('artifact_extra_field_list_extra_field_id_seq'::text)" ;
1293 # &debug ($query2) ;
1294 my $sth2 = $dbh->prepare ($query2) ;
1296 my @array2 = $sth2->fetchrow_array ;
1298 my $aefid = $array2[0] ;
1300 $query2 = "INSERT INTO artifact_extra_field_list (extra_field_id, group_artifact_id,field_name,field_type)
1301 VALUES ($aefid, $gaid, 'Category', 1)" ;
1302 # &debug ($query2) ;
1303 $sth2 =$dbh->prepare ($query2) ;
1306 $query2 = "SELECT id, category_name FROM artifact_category WHERE group_artifact_id=$gaid" ;
1307 # &debug ($query2) ;
1308 $sth2 = $dbh->prepare ($query2) ;
1311 while (@array2 = $sth2->fetchrow_array) {
1312 my $cat_id = $array2[0] ;
1313 my $catname = $array2[1] ;
1315 if ($catname eq '') { $catname = '[empty]' ; }
1317 my $query3 = "SELECT nextval('artifact_extra_field_elements_element_id_seq'::text)" ;
1318 # &debug ($query3) ;
1319 my $sth3 = $dbh->prepare ($query3) ;
1321 my @array3 = $sth3->fetchrow_array ;
1323 my $efeid = $array3[0] ;
1325 $query3 = "INSERT INTO artifact_extra_field_elements (element_id, extra_field_id, element_name, status_id)
1326 VALUES ($efeid, $aefid, ?, 0)" ;
1327 # &debug ($query3) ;
1328 $sth3 =$dbh->prepare ($query3) ;
1329 $sth3->execute ($catname) ;
1332 $query3 = "INSERT INTO artifact_extra_field_data (artifact_id,field_data,extra_field_id)
1333 SELECT artifact_id,$efeid,$aefid FROM artifact
1334 WHERE category_id=$cat_id" ;
1335 # &debug ($query3) ;
1336 $sth3 =$dbh->prepare ($query3) ;
1340 $query3 = "UPDATE artifact_history SET old_value=?,field_name='Category'
1341 WHERE old_value='$cat_id' AND field_name='category_id'" ;
1342 # &debug ($query3) ;
1343 $sth3 =$dbh->prepare ($query3) ;
1344 $sth3->execute ($catname) ;
1349 # Ajout du champ Group
1350 $query2 = "SELECT nextval('artifact_extra_field_list_extra_field_id_seq'::text)" ;
1351 # &debug ($query2) ;
1352 $sth2 = $dbh->prepare ($query2) ;
1354 @array2 = $sth2->fetchrow_array ;
1356 $aefid = $array2[0] ;
1358 $query2 = "INSERT INTO artifact_extra_field_list (extra_field_id, group_artifact_id,field_name,field_type)
1359 VALUES ($aefid, $gaid, 'Group', 1)" ;
1360 # &debug ($query2) ;
1361 $sth2 =$dbh->prepare ($query2) ;
1364 $query2 = "SELECT id, group_name FROM artifact_group WHERE group_artifact_id=$gaid" ;
1365 # &debug ($query2) ;
1366 $sth2 = $dbh->prepare ($query2) ;
1369 while (@array2 = $sth2->fetchrow_array) {
1370 my $grp_id = $array2[0] ;
1371 my $grpname = $array2[1] ;
1373 if ($grpname eq '') { $grpname = '[empty]' ; }
1375 my $query3 = "SELECT nextval('artifact_extra_field_elements_element_id_seq'::text)" ;
1376 # &debug ($query3) ;
1377 my $sth3 = $dbh->prepare ($query3) ;
1379 my @array3 = $sth3->fetchrow_array ;
1381 my $efeid = $array3[0] ;
1383 $query3 = "INSERT INTO artifact_extra_field_elements (element_id, extra_field_id, element_name, status_id)
1384 VALUES ($efeid, $aefid, ?, 0)" ;
1385 # &debug ($query3) ;
1386 $sth3 =$dbh->prepare ($query3) ;
1387 $sth3->execute ($grpname) ;
1390 $query3 = "INSERT INTO artifact_extra_field_data (artifact_id,field_data,extra_field_id)
1391 SELECT artifact_id,$efeid,$aefid FROM artifact
1392 WHERE artifact_group_id=$grp_id" ;
1393 # &debug ($query3) ;
1394 $sth3 =$dbh->prepare ($query3) ;
1398 $query3 = "UPDATE artifact_history SET old_value=?,field_name='Group'
1399 WHERE old_value='$grp_id' AND field_name='artifact_group_id'" ;
1400 # &debug ($query3) ;
1401 $sth3 =$dbh->prepare ($query3) ;
1402 $sth3->execute ($grpname) ;
1407 # Ajout du champ Resolution (s'il existe, cf. $ur)
1409 $query2 = "SELECT nextval('artifact_extra_field_list_extra_field_id_seq'::text)" ;
1410 # &debug ($query2) ;
1411 $sth2 = $dbh->prepare ($query2) ;
1413 @array2 = $sth2->fetchrow_array ;
1415 $aefid = $array2[0] ;
1417 $query2 = "INSERT INTO artifact_extra_field_list (extra_field_id, group_artifact_id,field_name,field_type)
1418 VALUES ($aefid, $gaid, 'Resolution', 1)" ;
1419 # &debug ($query2) ;
1420 $sth2 =$dbh->prepare ($query2) ;
1423 $query2 = "SELECT id, resolution_name FROM artifact_resolution" ;
1424 # &debug ($query2) ;
1425 $sth2 = $dbh->prepare ($query2) ;
1428 while (@array2 = $sth2->fetchrow_array) {
1429 my $res_id = $array2[0] ;
1430 my $resname = $array2[1] ;
1432 if ($resname eq '') { $resname = '[empty]' ; }
1434 my $query3 = "SELECT nextval('artifact_extra_field_elements_element_id_seq'::text)" ;
1435 # &debug ($query3) ;
1436 my $sth3 = $dbh->prepare ($query3) ;
1438 my @array3 = $sth3->fetchrow_array ;
1440 my $efeid = $array3[0] ;
1442 $query3 = "INSERT INTO artifact_extra_field_elements (element_id, extra_field_id, element_name, status_id)
1443 VALUES ($efeid, $aefid, ?, 0)" ;
1444 # &debug ($query3) ;
1445 $sth3 =$dbh->prepare ($query3) ;
1446 $sth3->execute ($resname) ;
1449 $query3 = "INSERT INTO artifact_extra_field_data (artifact_id,field_data,extra_field_id)
1450 SELECT artifact_id,$efeid,$aefid FROM artifact
1451 WHERE resolution_id=$res_id and group_artifact_id=$gaid" ;
1452 # &debug ($query3) ;
1453 $sth3 =$dbh->prepare ($query3) ;
1457 $query3 = "UPDATE artifact_history SET old_value=?,field_name='Resolution'
1458 WHERE old_value='$res_id' AND field_name='resolution_id'" ;
1459 # &debug ($query3) ;
1460 $sth3 =$dbh->prepare ($query3) ;
1461 $sth3->execute ($resname) ;
1468 &update_db_version ($target) ;
1473 &update_with_sql("20050325-5", "4.1-6") ;
1474 &update_with_sql("20050605", "4.1-7") ;
1476 $version = &get_db_version ;
1478 if (&is_lesser ($version, $target)) {
1479 &debug ("Creating aliases for the extra fields") ;
1481 $query = "ALTER TABLE artifact_extra_field_list ADD COLUMN alias TEXT" ;
1483 $sth = $dbh->prepare ($query) ;
1487 my %reserved_alias = (
1496 $query = "SELECT field_name, alias, group_artifact_id, extra_field_id FROM artifact_extra_field_list" ;
1498 $sth = $dbh->prepare ($query) ;
1500 while (@array = $sth->fetchrow_array) {
1501 my $name = $array[0] ;
1502 my $alias = $array[1] ;
1503 my $gaid = $array[2] ;
1504 my $efid = $array[3] ;
1507 my $newalias = lc $name ;
1508 $newalias =~ s/\s/_/g ;
1509 $newalias =~ s/[^_a-z]//g ;
1511 if ($newalias ne "") {
1512 if ($reserved_alias{$newalias}) {
1513 $newalias = "extra_" . $newalias ;
1520 $candidate = $newalias ;
1521 $candidate .= $count if ($count > 0) ;
1522 my $query2 = "SELECT count(*) FROM artifact_extra_field_list WHERE group_artifact_id=$gaid AND LOWER(alias)='$candidate' AND extra_field_id <> $efid" ;
1523 # &debug ($query2) ;
1524 my $sth2 =$dbh->prepare ($query2) ;
1526 my @array2 = $sth2->fetchrow_array ;
1527 if ($array2[0] == 0) {
1534 } until ($conflict == 0) ;
1536 my $query2 = "UPDATE artifact_extra_field_list SET alias='$candidate' WHERE extra_field_id=$efid" ;
1537 # &debug ($query2) ;
1538 my $sth2 =$dbh->prepare ($query2) ;
1547 &update_db_version ($target) ;
1552 &update_with_sql("20050628", "4.1-9") ;
1553 &update_with_sql("20050711", "4.5-1") ;
1554 &update_with_sql("20050906","4.5-2");
1555 &update_with_sql("20050804-1","4.5-3");
1557 $version = &get_db_version ;
1559 if (&is_lesser ($version, $target)) {
1560 &debug ("Updating document sizes") ;
1562 $query = "SELECT docid, data FROM doc_data" ;
1564 $sth = $dbh->prepare ($query) ;
1566 while (@array = $sth->fetchrow_array) {
1567 my $docid = $array[0] ;
1568 my $b64data = $array[1] ;
1569 my $data = decode_base64 ($b64data) ;
1570 my $size = length ($data) ;
1572 my $query2 = "UPDATE doc_data SET filesize=$size WHERE docid=$docid" ;
1573 # &debug ($query2) ;
1574 my $sth2 =$dbh->prepare ($query2) ;
1580 &update_db_version ($target) ;
1585 $version = &get_db_version ;
1586 $target = "4.5.14-3" ;
1587 if (&is_lesser ($version, $target)) {
1588 &debug ("Setting up time tracking") ;
1590 if (&table_exists ($dbh, "rep_time_category")) {
1591 &debug ("...already set up.") ;
1593 &drop_table_if_exists ($dbh, "rep_time_category") ;
1594 &drop_sequence_if_exists ($dbh, "rep_time_category_time_code_seq") ;
1595 &drop_table_if_exists ($dbh, "rep_time_tracking") ;
1596 &drop_table_if_exists ($dbh, "rep_users_added_daily") ;
1597 &drop_table_if_exists ($dbh, "rep_users_added_weekly") ;
1598 &drop_table_if_exists ($dbh, "rep_users_added_monthly") ;
1599 &drop_table_if_exists ($dbh, "rep_users_cum_daily") ;
1600 &drop_table_if_exists ($dbh, "rep_users_cum_weekly") ;
1601 &drop_table_if_exists ($dbh, "rep_users_cum_monthly") ;
1602 &drop_table_if_exists ($dbh, "rep_groups_added_daily") ;
1603 &drop_table_if_exists ($dbh, "rep_groups_added_weekly") ;
1604 &drop_table_if_exists ($dbh, "rep_groups_added_monthly") ;
1605 &drop_table_if_exists ($dbh, "rep_groups_cum_daily") ;
1606 &drop_table_if_exists ($dbh, "rep_groups_cum_weekly") ;
1607 &drop_table_if_exists ($dbh, "rep_groups_cum_monthly") ;
1608 &drop_view_if_exists ($dbh, "rep_group_act_oa_vw") ;
1609 &drop_view_if_exists ($dbh, "rep_user_act_oa_vw") ;
1610 &drop_view_if_exists ($dbh, "rep_site_act_daily_vw") ;
1611 &drop_view_if_exists ($dbh, "rep_site_act_weekly_vw") ;
1612 &drop_view_if_exists ($dbh, "rep_site_act_monthly_vw") ;
1613 &drop_table_if_exists ($dbh, "rep_user_act_daily") ;
1614 &drop_table_if_exists ($dbh, "rep_user_act_weekly") ;
1615 &drop_table_if_exists ($dbh, "rep_user_act_monthly") ;
1616 &drop_table_if_exists ($dbh, "rep_group_act_daily") ;
1617 &drop_index_if_exists ($dbh, "repgroupactdaily_daily") ;
1618 &drop_table_if_exists ($dbh, "rep_group_act_weekly") ;
1619 &drop_index_if_exists ($dbh, "repgroupactweekly_weekly") ;
1620 &drop_table_if_exists ($dbh, "rep_group_act_monthly") ;
1621 &drop_index_if_exists ($dbh, "repgroupactmonthly_monthly") ;
1623 @reqlist = @{ &parse_sql_file ("$sqldir/timetracking-init.sql") } ;
1624 foreach my $s (@reqlist) {
1627 $sth = $dbh->prepare ($query) ;
1634 &update_db_version ($target) ;
1639 # I had to increase versions from 4.5.14 to 4.5.15
1640 # The activity view is created by 20060216-nocommit
1641 # If the view doesn't exists apply
1642 if (! &view_exists ($dbh, 'activity_vw')) {
1643 &update_with_sql("20050812","4.5.15-10merge");
1644 &update_with_sql("20050822-2","4.5.15-11merge");
1645 &update_with_sql("20050823","4.5.15-12merge");
1646 &update_with_sql("20050824","4.5.15-13merge");
1647 &update_with_sql("20050831","4.5.15-14merge");
1649 &update_with_sql("20060113","4.5.15-15");
1650 &update_with_sql("20060214","4.5.15-16");
1651 &update_with_sql("20060216-2-debian-nocommit","4.5.15-17");
1654 $version = &get_db_version ;
1655 $target = "4.5.15-21" ;
1656 if (&is_lesser ($version, $target)) {
1657 &debug ("Fixing past mistakes in role naming") ;
1659 my $defaultroles_restricted = {
1660 'Admin' => { 'projectadmin'=>'A', 'frs'=>'1', 'scm'=>'1', 'docman'=>'1', 'forumadmin'=>'2', 'trackeradmin'=>'2', 'pmadmin'=>'2' },
1661 'Senior Developer' => { 'projectadmin'=>'0', 'frs'=>'1', 'scm'=>'1', 'docman'=>'1', 'forumadmin'=>'2', 'trackeradmin'=>'2', 'pmadmin'=>'2' },
1662 'Junior Developer' => { 'projectadmin'=>'0', 'frs'=>'0', 'scm'=>'1', 'docman'=>'0', 'forumadmin'=>'0', 'trackeradmin'=>'0', 'pmadmin'=>'0' },
1663 'Doc Writer' => { 'projectadmin'=>'0', 'frs'=>'0', 'scm'=>'0', 'docman'=>'1', 'forumadmin'=>'0', 'trackeradmin'=>'0', 'pmadmin'=>'0' },
1664 'Support Tech' => { 'projectadmin'=>'0', 'frs'=>'0', 'scm'=>'0', 'docman'=>'1', 'forumadmin'=>'0', 'trackeradmin'=>'0', 'pmadmin'=>'0' }
1667 foreach my $drname (keys %{$defaultroles_restricted}) {
1668 $query = "UPDATE role SET role_name='$drname' WHERE role_id IN (SELECT role.role_id" ;
1673 foreach my $setting (keys %{$defaultroles_restricted->{$drname}}) {
1674 $value = $defaultroles_restricted->{$drname}->{$setting} ;
1675 $from .= ", role_setting rs_$setting" ;
1676 $where .= "role.role_id = rs_$setting.role_id AND rs_$setting.section_name='$setting' AND " ;
1677 $where .= "rs_$setting.value = '$value' \nAND " ;
1679 $query .= "\nFROM role$from" ;
1680 $query .= "\nWHERE $where role.role_name='rname')";
1681 push @reqlist, $query;
1684 foreach my $s (@reqlist) {
1687 $sth = $dbh->prepare ($query) ;
1693 &update_db_version ($target) ;
1698 &update_with_sql("20051103_transiciel_motscle_document","4.6-1");
1700 &update_with_sql("20070924-forum-perm","4.6.99-1");
1701 &update_with_sql("20070924-project-perm","4.6.99-2");
1702 &update_with_sql("20070924-artifact-perm","4.6.99-3");
1704 $version = &get_db_version ;
1705 $target = "4.6.99-4" ;
1706 if (&is_lesser ($version, $target)) {
1707 &debug ("Dropping old translations table") ;
1709 &drop_table_if_exists ($dbh, "tmp_lang") ;
1711 &update_db_version ($target) ;
1716 $version = &get_db_version ;
1717 $target = "4.6.99-5" ;
1718 if (&is_lesser ($version, $target)) {
1719 &debug ("Updating available themes") ;
1721 my @obsolete_themes = qw/ classic debian savannah
1722 savannah_codex savannah_forest
1723 savannah_reverse savannah_sad
1724 savannah_savannah savannah_slashd
1726 savannah_transparent savannah_water
1727 savannah_www.gnu.org
1728 savannah_darkslate forged kde
1731 my $otids = join (',', map { "'$_'" } @obsolete_themes) ;
1733 $query = "UPDATE users SET theme_id=1 WHERE theme_id IN
1734 (SELECT theme_id FROM themes WHERE dirname IN ($otids))" ;
1735 push @reqlist, $query;
1737 $query = "DELETE FROM themes WHERE dirname IN ($otids)" ;
1738 push @reqlist, $query;
1741 'gforge-classic' => 'GForge classic',
1742 'gforge-simple-theme' => 'GForge simple',
1743 'lite' => 'GForge lite'
1746 foreach my $dir (sort keys %new_themes) {
1747 $query = "INSERT INTO themes (dirname, fullname) VALUES ('$dir', '$new_themes{$dir}')" ;
1748 push @reqlist, $query;
1751 foreach my $s (@reqlist) {
1754 $sth = $dbh->prepare ($query) ;
1760 &update_db_version ($target) ;
1765 $version = &get_db_version ;
1766 $target = "4.6.99-6" ;
1767 if (&is_lesser ($version, $target)) {
1768 &debug ("DROP UNIQUE INDEX never UNIQUE") ;
1769 &drop_index_if_exists ($dbh, "statsaggsitebygrp_oid") ;
1770 &drop_index_if_exists ($dbh, "statsprojectmetric_oid") ;
1771 &drop_index_if_exists ($dbh, "statsagglogobygrp_oid") ;
1772 &drop_index_if_exists ($dbh, "statsprojectdevelop_oid") ;
1773 &drop_index_if_exists ($dbh, "statssubdpages_oid") ;
1774 &drop_index_if_exists ($dbh, "statscvsgrp_oid") ;
1775 &drop_index_if_exists ($dbh, "statsproject_oid") ;
1776 &drop_index_if_exists ($dbh, "statssite_oid") ;
1777 &drop_index_if_exists ($dbh, "statssitepgsbyday_oid") ;
1778 &update_db_version ($target) ;
1783 &update_with_sql("20090327_create_table_project_tags","4.6.99-7");
1784 &update_with_sql("20090402-add-projecttags-constraints","4.7.99-1");
1785 &update_with_sql("20090402-forum-attachment-types","4.7.99-2");
1787 &update_with_sql("20090507-add_artifact_workflow","4.8.99-1");
1788 &update_with_sql("20090507-add_element_pos","4.8.99-2");
1789 &update_with_sql("20090507-add_project_query","4.8.99-3");
1790 &update_with_sql("20090507-browse_list","4.8.99-4");
1792 $version = &get_db_version ;
1793 $target = "4.8.99-5" ;
1794 if (&is_lesser ($version, $target)) {
1795 &debug ("Initialising tracker workflows") ;
1798 $query = "SELECT group_id, artifact_group_list.group_artifact_id, element_id, artifact_extra_field_elements.extra_field_id
1799 FROM artifact_extra_field_list, artifact_extra_field_elements, artifact_group_list
1800 WHERE artifact_extra_field_list.extra_field_id=artifact_extra_field_elements.extra_field_id
1801 AND artifact_group_list.group_artifact_id = artifact_extra_field_list.group_artifact_id
1804 $sth = $dbh->prepare ($query) ;
1806 while (@array = $sth->fetchrow_array) {
1807 my $gid = $array[0];
1808 my $gaid = $array[1];
1809 my $eid = $array[2];
1811 my $query2 = "SELECT extra_field_id
1812 FROM artifact_extra_field_list
1813 WHERE group_artifact_id=$gaid
1815 ORDER BY field_type ASC" ;
1816 my $sth2 = $dbh->prepare ($query2) ;
1819 if (my @array2 = $sth2->fetchrow_array) {
1820 my $efid = $array2[0];
1823 $query2 = "SELECT element_id,element_name,status_id
1824 FROM artifact_extra_field_elements
1825 WHERE extra_field_id = $efid
1826 ORDER BY element_pos ASC, element_id ASC" ;
1828 $sth2 = $dbh->prepare ($query2) ;
1830 while (@array2 = $sth2->fetchrow_array) {
1831 my $eid2 = $array2[0];
1832 if ($eid2 != $eid) {
1833 my $query3 = "INSERT INTO artifact_workflow_event
1834 (group_artifact_id, field_id, from_value_id, to_value_id)
1835 VALUES ($gaid, $efid, $eid, $eid2)";
1837 my $sth3 = $dbh->prepare ($query3) ;
1840 $query3 = "INSERT INTO artifact_workflow_event
1841 (group_artifact_id, field_id, from_value_id, to_value_id)
1842 VALUES ($gaid, $efid, $eid2, $eid)";
1844 $sth3 = $dbh->prepare ($query3) ;
1850 my $query3 = "INSERT INTO artifact_workflow_event
1851 (group_artifact_id, field_id, from_value_id, to_value_id)
1852 VALUES ($gaid, $efid, 100, $eid)";
1854 my $sth3 = $dbh->prepare ($query3) ;
1862 &update_db_version ($target) ;
1867 &update_with_sql("20100308-forum-attachment-types","4.8.99-6");
1869 $version = &get_db_version ;
1870 $target = "4.8.99-7" ;
1871 if (&is_lesser ($version, $target)) {
1872 &debug ("Granting read access permissions to NSS and MTA") ;
1874 @reqlist = ( "GRANT SELECT ON nss_passwd TO ${sys_dbuser}_nss",
1875 "GRANT SELECT ON nss_groups TO ${sys_dbuser}_nss",
1876 "GRANT SELECT ON nss_usergroups TO ${sys_dbuser}_nss",
1877 "GRANT SELECT ON mta_users TO ${sys_dbuser}_mta",
1878 "GRANT SELECT ON mta_lists TO ${sys_dbuser}_mta",
1880 foreach my $s (@reqlist) {
1883 $sth = $dbh->prepare ($query) ;
1889 &update_db_version ($target) ;
1894 &update_with_sql("20100330-add-system-event","5.0.0-1");
1895 &update_with_sql("20100331-alter-system-event","5.0.0-2");
1896 &update_with_sql("20100505-alter-user-preference","5.0.1-1");
1897 &update_with_sql("20100506-add-widgets","5.0.1-2");
1898 &update_with_sql("20100517-add-project-widgets","5.0.1-3");
1899 &update_with_sql("20100518-pfo-rbac","5.0.1-4");
1900 &update_with_sql("20100524-pfo-rbac","5.0.1-5");
1901 &update_with_sql("20100606-clean-perm-views","5.0.1-6");
1902 &update_with_sql("20100610-pfo-rbac","5.0.1-7");
1903 &update_with_sql("20100730-docman","5.0.1-8");
1904 &update_with_sql("20100924-theme","5.0.1-9");
1905 &update_with_sql("20100926-pfo-rbac","5.0.1-10");
1906 &update_with_sql("20100927-pfo-rbac","5.0.1-11");
1907 &update_with_sql("20101012-docman-webdav","5.0.51-1");
1908 &update_with_sql("20101021-pfo-rbac","5.0.51-2");
1909 &update_with_sql("20101025-ipv6","5.0.51-3");
1911 $version = &get_db_version ;
1912 $target = "5.0.51-4" ;
1913 if (&is_lesser ($version, $target)) {
1914 &debug ("Granting read access permissions to NSS and MTA") ;
1916 @reqlist = ( "GRANT SELECT ON nss_passwd TO ${sys_dbuser}_nss",
1917 "GRANT SELECT ON nss_groups TO ${sys_dbuser}_nss",
1918 "GRANT SELECT ON nss_usergroups TO ${sys_dbuser}_nss",
1919 "GRANT SELECT ON mta_users TO ${sys_dbuser}_mta",
1920 "GRANT SELECT ON mta_lists TO ${sys_dbuser}_mta",
1922 foreach my $s (@reqlist) {
1925 $sth = $dbh->prepare ($query) ;
1931 &update_db_version ($target) ;
1936 &update_with_sql("20101027-docman-lock","5.0.51-5");
1937 &update_with_sql("20101105-pfo-rbac","5.0.51-6");
1938 &update_with_sql("20101029-docman-monitoring","5.0.51-7");
1939 &update_with_sql("20100402_add_query_options","5.0.51-8");
1940 &update_with_sql("20101024-docman-createonline","5.0.51-9");
1941 &update_with_sql("20101213-project-template","5.0.51-10");
1942 &update_with_sql("20110110-pw-size","5.0.51-11");
1943 &update_with_sql("20110405-forum_attachment_fix-bug284","5.0.51-12");
1944 &update_with_sql("20110408-anonymous-read-news","5.0.51-13");
1945 &update_with_sql("20110414-move-news-forums-to-own-project","5.0.51-14");
1946 &update_with_sql("20110701-gforge-5.1","5.1-1");
1947 &update_with_sql("20110728-fix-mta-lists-view","5.1-2");
1948 &update_with_sql("FTI","5.1-3");
1949 &update_with_sql("FTI-20050315","5.1-4");
1950 &update_with_sql("FTI-20050401","5.1-5");
1951 &update_with_sql("FTI-20050530","5.1-6");
1952 &update_with_sql("FTI-20060130","5.1-7");
1953 &update_with_sql("FTI-20061025","5.1-8");
1954 &update_with_sql("20111007-fti-aggregate-functions","5.1-9");
1955 &update_with_sql("20111007-add-fti-for-task-messages","5.1-10");
1956 &update_with_sql("20111009-string-aggregate-function","5.1-11");
1957 &update_with_sql("20120321-add-news-in-activity_vw","5.1-12");
1958 &update_with_sql("20120903-no-unix-account-for-deleted-users", "5.1-13");
1960 ########################### INSERT HERE #################################
1962 # There should be a commit at the end of every block above.
1963 # If there is not, then it might be symptomatic of a problem.
1964 # For safety, we roll back.
1969 warn "Transaction aborted because $@" ;
1970 &debug ("Transaction aborted because $@") ;
1971 &debug ("Last SQL query was:\n$query\n(end of query)") ;
1973 my $version = &get_db_version ;
1975 &debug ("Your database schema is at version $version") ;
1977 &debug ("Couldn't get your database schema version.") ;
1979 &debug ("Please report this bug on the Debian bug-tracking system.") ;
1980 &debug ("Please include the previous messages as well to help debugging.") ;
1981 &debug ("You should not worry too much about this,") ;
1982 &debug ("your DB is still in a consistent state and should be usable.") ;
1989 sub get_pg_version () {
1991 if (-x '/usr/bin/pg_lsclusters' ) {
1992 $command = q(/usr/bin/pg_lsclusters | grep 5432 | grep online | cut -d' ' -f1) ;
1994 $command = q(dpkg -s postgresql | awk '/^Version: / { print $2 }') ;
1996 my $version = qx($command) ;
2001 sub create_metadata_table ( $ ) {
2002 my $v = shift || "2.5-7+just+before+8" ;
2004 my ($query, $sth, @array) ;
2006 # Let's create this table if we have it not
2007 if (! &table_exists ($dbh, 'debian_meta_data')) {
2008 &debug ("Creating debian_meta_data table.") ;
2009 $query = "CREATE TABLE debian_meta_data (key varchar primary key, value text not null)" ;
2011 $sth = $dbh->prepare ($query) ;
2016 $query = "SELECT count(*) FROM debian_meta_data WHERE key = 'db-version'";
2018 $sth = $dbh->prepare ($query) ;
2020 @array = $sth->fetchrow_array () ;
2023 # Empty table? We'll have to fill it up a bit
2025 if ($array [0] == 0) {
2026 &debug ("Inserting first data into debian_meta_data table.") ;
2027 $query = "INSERT INTO debian_meta_data (key, value) VALUES ('db-version', '$v')" ;
2029 $sth = $dbh->prepare ($query) ;
2035 sub update_db_version ( $ ) {
2036 my $v = shift or die "Not enough arguments" ;
2038 $query = "UPDATE debian_meta_data SET value = '$v' WHERE key = 'db-version'" ;
2039 my $sth = $dbh->prepare ($query) ;
2044 sub get_db_version () {
2045 $query = "SELECT value FROM debian_meta_data WHERE key = 'db-version'" ;
2047 my $sth = $dbh->prepare ($query) ;
2049 my @array = $sth->fetchrow_array () ;
2052 my $version = $array [0] ;
2057 sub update_with_sql ( $$ ) {
2058 my $sqlfile = shift or die "Not enough arguments" ;
2059 my $target = shift or die "Not enough arguments" ;
2060 $sqlfile =~ s/\.sql$//;
2061 my $version = &get_db_version ;
2062 if (&is_lesser ($version, $target)) {
2063 &debug ("Upgrading database with $sqlfile.sql") ;
2065 @reqlist = @{ &parse_sql_file ("$sqldir/$sqlfile.sql") } ;
2066 foreach my $s (@reqlist) {
2069 my $sth = $dbh->prepare ($query) ;
2075 &update_db_version ($target) ;