Index: modules/project/release/project_release.install =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/project/release/project_release.install,v retrieving revision 1.1.2.10 diff -u -p -r1.1.2.10 project_release.install --- modules/project/release/project_release.install 12 Nov 2006 13:52:35 -0000 1.1.2.10 +++ modules/project/release/project_release.install 29 Nov 2006 08:45:58 -0000 @@ -7,28 +7,36 @@ function project_release_install() { case 'mysql': case 'mysqli': db_query("CREATE TABLE IF NOT EXISTS {project_release_nodes} ( - nid int unsigned NOT NULL default 0, - pid int unsigned NOT NULL default 0, + nid int unsigned NOT NULL default '0', + pid int unsigned NOT NULL default '0', version varchar(255) NOT NULL default '', tag varchar(255) NOT NULL default '', file_path varchar(255) NOT NULL default '', - file_date int unsigned NOT NULL default 0, + file_date int unsigned NOT NULL default '0', file_hash varchar(32) NOT NULL default '', rebuild tinyint default '0', version_major int default NULL, version_minor int default NULL, version_patch int default NULL, version_extra varchar(255) default NULL, - PRIMARY KEY (`nid`), + PRIMARY KEY (nid), KEY project_releases_pid (pid) ) TYPE=MyISAM /*!40100 DEFAULT CHARACTER SET utf8 */;"); db_query("CREATE TABLE IF NOT EXISTS {project_release_projects} ( - nid int unsigned NOT NULL default 0, + nid int unsigned NOT NULL default '0', releases tinyint NOT NULL default '1', version_format varchar(255) NOT NULL default '', - PRIMARY KEY (`nid`), - KEY project_release_projects_releases (`releases`) + default_version int unsigned NOT NULL default '0', + PRIMARY KEY (nid), + KEY project_release_projects_releases (releases) + ) TYPE=MyISAM + /*!40100 DEFAULT CHARACTER SET utf8 */;"); + db_query("CREATE TABLE IF NOT EXISTS {project_release_default_versions} ( + nid int unsigned NOT NULL default '0', + tid int unsigned NOT NULL default '0', + major int unsigned NOT NULL default '0', + PRIMARY KEY (nid, tid) ) TYPE=MyISAM /*!40100 DEFAULT CHARACTER SET utf8 */;"); break; @@ -57,16 +65,103 @@ function project_release_install() { nid int NOT NULL default '0', releases smallint NOT NULL default '1', version_format varchar(255) NOT NULL default '', + default_version int NOT NULL default '0', PRIMARY KEY (nid), - KEY project_release_projects_releases (releases), + KEY project_release_projects_releases (releases) );"); } + if (!project_release_db_table_exists('project_release_default_versions')) { + db_query("CREATE TABLE {project_release_default_versions} ( + nid int NOT NULL default '0', + tid int NOT NULL default '0', + major int NOT NULL default '0', + PRIMARY KEY (nid, tid) + );"); + } break; } db_query("UPDATE {system} SET weight = 2 WHERE name = 'project_release'"); db_query("DELETE FROM {variable} WHERE name = 'project_browse_releases'"); } +/** + * Adds the {project_release_default_versions} table for branch-aware + * default versions, and populates it via the {project_projects} + * table's "version" field. + */ +function project_release_update_1() { + $ret = array(); + + // We're going to re-create this table and populate with new values + // so that we can store the default version for each project here. + $ret[] = update_sql("ALTER TABLE {project_release_projects} RENAME TO {project_release_projects_old}"); + + switch ($GLOBALS['db_type']) { + case 'mysql': + case 'mysqli': + $ret[] = update_sql( + "CREATE TABLE IF NOT EXISTS {project_release_projects} ( + nid int unsigned NOT NULL default '0', + releases tinyint NOT NULL default '1', + version_format varchar(255) NOT NULL default '', + default_version int unsigned NOT NULL default '0', + PRIMARY KEY (nid), + KEY project_release_projects_releases (releases) + ) TYPE=MyISAM + /*!40100 DEFAULT CHARACTER SET utf8 */;"); + $ret[] = update_sql( + "CREATE TABLE IF NOT EXISTS {project_release_default_versions} ( + nid int unsigned NOT NULL default '0', + tid int unsigned NOT NULL default '0', + major int unsigned NOT NULL default '0', + PRIMARY KEY (nid, tid) + ) TYPE=MyISAM /*!40100 DEFAULT CHARACTER SET utf8 */;"); + break; + case 'pgsql': + if (!project_release_db_table_exists('project_release_projects')) { + $ret[] = update_sql( + "CREATE TABLE {project_release_projects} ( + nid int NOT NULL default '0', + releases smallint NOT NULL default '1', + version_format varchar(255) NOT NULL default '', + default_version int NOT NULL default '0', + PRIMARY KEY (nid), + KEY project_release_projects_releases (releases) + );"); + } + if (!project_release_db_table_exists('project_release_default_versions')) { + $ret[] = update_sql( + "CREATE TABLE {project_release_default_versions} ( + nid int NOT NULL default '0', + tid int NOT NULL default '0', + major int NOT NULL default '0', + PRIMARY KEY (nid, tid) + );"); + } + break; + } + + // Initially populate based on the existing default release, if that + // release is a real release with a valid compatibility taxonomy. + $ret[] = update_sql("INSERT INTO {project_release_default_versions} (nid, tid, major) SELECT pp.nid, tn.tid, prn.version_major FROM {project_projects} pp INNER JOIN {project_release_nodes} prn ON pp.version = prn.nid INNER JOIN {term_node} tn ON tn.nid = prn.nid"); + // Now, add in values for any other distinct branches we know about + // for each project. + // TODO: this doesn't correctly handle projects with more than 1 + // major version for a given compatibility term!!! + $ret[] = update_sql("INSERT INTO {project_release_default_versions} (nid, tid, major) SELECT DISTINCT prn.pid, tn.tid, prn.version_major FROM {project_release_nodes} prn INNER JOIN {term_node} tn ON prn.nid = tn.nid LEFT JOIN {project_release_default_versions} prdv ON prdv.nid = prn.pid AND prdv.tid = tn.tid WHERE prdv.nid IS NULL and tn.tid IN (78, 79, 80)"); + + // Populate the new {project_release_projects} table based on the + // old values. This query gets everything where the default version + // is pointing to a valid release node. + $ret[] = update_sql("INSERT INTO {project_release_projects} (nid, releases, version_format, default_version) SELECT prpo.nid, prpo.releases, prpo.version_format, tn.tid FROM {project_release_projects_old} prpo INNER JOIN {project_projects} pp ON pp.nid = prpo.nid INNER JOIN {project_release_nodes} prn ON prn.nid = pp.version LEFT JOIN {term_node} tn ON tn.nid = pp.version"); + // This query grabs everything else (the ones that weren't pointing + // to a valid release) and sets their default version to 0. + $ret[] = update_sql("INSERT INTO {project_release_projects} (nid, releases, version_format, default_version) SELECT prpo.nid, prpo.releases, prpo.version_format, 0 FROM {project_release_projects_old} prpo LEFT JOIN {project_release_projects} prp ON prpo.nid = prp.nid WHERE prp.nid IS NULL"); + + return $ret; +} + + function project_release_db_table_exists($table) { switch ($GLOBALS['db_type']) { case 'mysql':