From 66238be7bda54ee3a398097484007d24aac94178 Mon Sep 17 00:00:00 2001 From: lo-lan-do <> Date: Thu, 1 Nov 2001 19:19:12 +0000 Subject: [PATCH] Initial revision --- .gitattributes | 26 + gforge/TARBALL | 196 + gforge/common/include/Error.class | 96 + gforge/common/include/Foundry.class | 182 + gforge/common/include/Group.class | 1454 ++++ gforge/common/include/Permission.class | 300 + gforge/common/include/Project.class | 147 + gforge/common/include/User.class | 1119 +++ gforge/common/include/account.php | 203 + gforge/common/include/database.php | 305 + gforge/common/include/jpcache.php | 368 + gforge/common/include/ldap.php | 776 +++ gforge/common/include/session.php | 468 ++ gforge/common/include/timezones.php | 471 ++ gforge/common/include/utils.php | 570 ++ gforge/common/include/vars.php | 64 + gforge/common/pm/pm_data.php | 616 ++ gforge/common/tracker/Artifact.class | 1026 +++ gforge/common/tracker/ArtifactCanned.class | 199 + gforge/common/tracker/ArtifactCategory.class | 195 + gforge/common/tracker/ArtifactFile.class | 279 + gforge/common/tracker/ArtifactGroup.class | 182 + .../common/tracker/ArtifactResolution.class | 115 + gforge/common/tracker/ArtifactType.class | 662 ++ gforge/common/tracker/ArtifactTypes.class | 222 + gforge/common/tracker/Artifacts.class | 111 + gforge/cronjobs/check_stale_tracker_items.php | 40 + gforge/cronjobs/db_foundry_boxes.php | 148 + gforge/cronjobs/db_project_sums.php | 151 + gforge/cronjobs/db_stats_agg.php | 870 +++ gforge/cronjobs/kt_dump.php | 82 + gforge/cronjobs/massmail.php | 280 + .../project_weekly_metric-backfill.php | 233 + gforge/cronjobs/stats_projects-backfill.php | 41 + gforge/cronjobs/stats_projects.inc | 271 + gforge/cronjobs/stats_site.inc | 42 + gforge/db/SQL_migrate-2.5-to-2.6/README | 26 + .../artifact-conversion.sql | 375 + .../artifact-convert-files.php | 29 + .../SQL_migrate-2.5-to-2.6/artifact-fkeys.sql | 66 + .../SQL_migrate-2.5-to-2.6/artifact-man.sql | 271 + .../sqlchanges20001209.sql | 20 + .../sqlchanges20001214.sql | 15 + .../sqlchanges20001220.sql | 2 + .../sqlchanges20010109.sql | 7 + .../sqlchanges20010112.sql | 9 + .../sqlchanges20010126.sql | 51 + .../sqlchanges20010206.sql | 9 + .../sqlchanges20010301.sql | 16 + .../sqlchanges20010304.NOTE | 12 + .../sqlchanges20010305.sql | 69 + .../sqlchanges20010313.sql | 143 + .../sqlchanges20010317.sql | 13 + .../sqlchanges20010409.sql | 227 + .../sqlchanges20010412.sql | 5 + .../sqlchanges20010507.sql | 5 + .../sqlchanges20010509.sql | 61 + .../sqlchanges20010511.sql | 12 + gforge/db/dbusers.sql | 32 + gforge/db/languages.tab | 23 + .../db/oci8port/pssonline/DefaultValues.sql | 195 + gforge/db/oci8port/pssonline/Languages.sql | 42 + gforge/db/oci8port/pssonline/SourceForge.sql | 6141 +++++++++++++++++ .../db/oci8port/pssonline/database-oci8.php | 509 ++ .../db/oci8port/pssonline/trove_defaults.sql | 280 + .../oci8port/shaguo/SourceForge2.5_oci8.sql | 5322 ++++++++++++++ .../SourceForge2.5oci8-Trigger_auto.sql | 1400 ++++ .../shaguo/SourceForge2.5oci8-Trigger_er.sql | 420 ++ gforge/db/oci8port/shaguo/database.php | 506 ++ gforge/db/oci8port/shaguo/pgdb-convert.pl | 223 + gforge/db/replicate.sh | 54 + gforge/db/replication-master.sql | 65 + gforge/db/replication-reset-master.sql | 43 + gforge/db/replication-reset-slave.sql | 58 + gforge/db/replication-slave.sql | 349 + gforge/db/replication.plan | 54 + gforge/db/sfdocs.sql | 89 + gforge/db/trove_cat.tab | 305 + .../docs/architecture/coding_standards.html | 479 ++ gforge/docs/architecture/sf2.sda | Bin 0 -> 89088 bytes .../docs/architecture/stats/stats-process.gif | Bin 0 -> 41497 bytes .../docs/architecture/stats/stats-process.sda | Bin 0 -> 81408 bytes gforge/docs/architecture/templating.php | 170 + gforge/docs/architecture/tour/first0.gif | Bin 0 -> 1240 bytes gforge/docs/architecture/tour/first1.gif | Bin 0 -> 1223 bytes gforge/docs/architecture/tour/img0.htm | 10 + gforge/docs/architecture/tour/img0.jpg | Bin 0 -> 33655 bytes gforge/docs/architecture/tour/img1.htm | 10 + gforge/docs/architecture/tour/img1.jpg | Bin 0 -> 43478 bytes gforge/docs/architecture/tour/img2.htm | 10 + gforge/docs/architecture/tour/img2.jpg | Bin 0 -> 39758 bytes gforge/docs/architecture/tour/index.gif | Bin 0 -> 1223 bytes gforge/docs/architecture/tour/last0.gif | Bin 0 -> 1271 bytes gforge/docs/architecture/tour/last1.gif | Bin 0 -> 1218 bytes gforge/docs/architecture/tour/next0.gif | Bin 0 -> 1196 bytes gforge/docs/architecture/tour/next1.gif | Bin 0 -> 1182 bytes gforge/docs/architecture/tour/prev0.gif | Bin 0 -> 1203 bytes gforge/docs/architecture/tour/prev1.gif | Bin 0 -> 1183 bytes gforge/docs/architecture/tour/standards.htm | 18 + gforge/docs/background/charter.html | 0 gforge/docs/background/org_chart.html | 0 gforge/docs/background/whos_who.html | 0 gforge/docs/doc_utils.php | 117 + gforge/docs/index.php | 255 + .../project_management/change_control.html | 0 gforge/docs/project_management/community.html | 0 .../development_process.html | 0 .../docs/project_management/ps_engineers.html | 0 .../docs/project_management/requirements.html | 0 gforge/docs/project_management/review.html | 0 .../project_management/source_branching.sda | Bin 0 -> 38400 bytes .../project_management/source_control.html | 0 gforge/docs/templates/generic_document.html | 56 + gforge/docs/templates/project_index.html | 181 + gforge/pager.php3 | 17 + gforge/utils/download/README | 10 + gforge/utils/groupCreator | 120 + gforge/utils/ldap-check-replica | 37 + gforge/www/account/unsubscribe.php | 62 + gforge/www/admin/admin_table.php | 276 + gforge/www/admin/database.php | 150 + gforge/www/admin/edit_frs_filetype.php | 21 + gforge/www/admin/edit_frs_processor.php | 21 + gforge/www/admin/edit_supported_languages.php | 21 + gforge/www/admin/intelapprove.php | 99 + gforge/www/admin/massmail-old.php | 87 + gforge/www/admin/resetapc.php | 16 + gforge/www/admin/unsubscribe.php | 134 + gforge/www/admin/vhost.php | 173 + .../export/rss_foundry_featuredprojects.php | 55 + gforge/www/export/rss_foundry_mostactive.php | 48 + .../www/export/rss_foundry_topdownloads.php | 49 + gforge/www/export/rss_osdn_search.php | 85 + gforge/www/export/rss_osdnnews.php | 219 + gforge/www/export/sf_tracker_export.php | 170 + gforge/www/export/sf_tracker_export.xsd | 212 + gforge/www/help/tracker.php | 93 + gforge/www/images/favicon.ico | Bin 0 -> 3262 bytes gforge/www/images/phorum/c.gif | Bin 0 -> 55 bytes gforge/www/images/phorum/i.gif | Bin 0 -> 68 bytes gforge/www/images/phorum/l.gif | Bin 0 -> 67 bytes gforge/www/images/phorum/m.gif | Bin 0 -> 66 bytes gforge/www/images/phorum/n.gif | Bin 0 -> 61 bytes gforge/www/images/phorum/p.gif | Bin 0 -> 67 bytes gforge/www/images/phorum/t.gif | Bin 0 -> 71 bytes gforge/www/images/phorum/trans.gif | Bin 0 -> 42 bytes gforge/www/include/languages/Base.tab | 374 + gforge/www/include/languages/Bulgarian.tab | 84 + gforge/www/include/languages/Catalan.tab | 90 + gforge/www/include/languages/Chinese.tab | 82 + gforge/www/include/languages/Dutch.tab | 83 + gforge/www/include/languages/English.tab | 11 + gforge/www/include/languages/Esperanto.tab | 97 + gforge/www/include/languages/French.tab | 86 + gforge/www/include/languages/German.tab | 84 + gforge/www/include/languages/Greek.tab | 84 + gforge/www/include/languages/Hebrew.tab | 78 + gforge/www/include/languages/Indonesian.tab | 84 + gforge/www/include/languages/Italian.tab | 82 + gforge/www/include/languages/Japanese.tab | 87 + gforge/www/include/languages/Korean.tab | 89 + gforge/www/include/languages/Norwegian.tab | 82 + gforge/www/include/languages/Polish.tab | 87 + gforge/www/include/languages/Portuguese.tab | 90 + .../languages/PortugueseBrazillian.tab | 89 + gforge/www/include/languages/Russian.tab | 90 + .../include/languages/SimplifiedChinese.tab | 95 + gforge/www/include/languages/Spanish.tab | 80 + gforge/www/include/languages/Swedish.tab | 88 + gforge/www/include/languages/Thai.tab | 89 + gforge/www/kernel_traffic.php | 83 + gforge/www/my/intelagreement.php | 197 + gforge/www/news/admin/news_admin_utils.php | 114 + gforge/www/project/admin/database.php | 241 + gforge/www/project/admin/rmuser.php | 87 + gforge/www/project/admin/userpermedit.php | 369 + gforge/www/project/admin/vhost.php | 149 + gforge/www/register/projectinfo.php | 294 + gforge/www/stats/lastlogins.php | 54 + gforge/www/testsecurity.php | 62 + gforge/www/themes/ultralite/Theme.class | 309 + gforge/www/top/topusers.php | 101 + gforge/www/tos/privacy_generic.php | 30 + gforge/www/tos/tos_generic.php | 25 + gforge/www/tracker/add.php | 100 + gforge/www/tracker/admin/index.php | 797 +++ gforge/www/tracker/browse.php | 244 + gforge/www/tracker/detail.php | 143 + gforge/www/tracker/download.php | 65 + .../tracker/include/ArtifactFileHtml.class | 52 + gforge/www/tracker/include/ArtifactHtml.class | 136 + .../tracker/include/ArtifactTypeHtml.class | 219 + gforge/www/tracker/index.php | 345 + gforge/www/tracker/mod.php | 227 + gforge/www/tracker/reporting/index.php | 305 + gforge/www/tracker/tracker-er-diagram.sda | Bin 0 -> 36352 bytes 196 files changed, 40577 insertions(+) create mode 100644 gforge/TARBALL create mode 100644 gforge/common/include/Error.class create mode 100644 gforge/common/include/Foundry.class create mode 100644 gforge/common/include/Group.class create mode 100644 gforge/common/include/Permission.class create mode 100644 gforge/common/include/Project.class create mode 100644 gforge/common/include/User.class create mode 100644 gforge/common/include/account.php create mode 100644 gforge/common/include/database.php create mode 100644 gforge/common/include/jpcache.php create mode 100644 gforge/common/include/ldap.php create mode 100644 gforge/common/include/session.php create mode 100644 gforge/common/include/timezones.php create mode 100644 gforge/common/include/utils.php create mode 100644 gforge/common/include/vars.php create mode 100644 gforge/common/pm/pm_data.php create mode 100644 gforge/common/tracker/Artifact.class create mode 100644 gforge/common/tracker/ArtifactCanned.class create mode 100644 gforge/common/tracker/ArtifactCategory.class create mode 100644 gforge/common/tracker/ArtifactFile.class create mode 100644 gforge/common/tracker/ArtifactGroup.class create mode 100644 gforge/common/tracker/ArtifactResolution.class create mode 100644 gforge/common/tracker/ArtifactType.class create mode 100644 gforge/common/tracker/ArtifactTypes.class create mode 100644 gforge/common/tracker/Artifacts.class create mode 100755 gforge/cronjobs/check_stale_tracker_items.php create mode 100755 gforge/cronjobs/db_foundry_boxes.php create mode 100755 gforge/cronjobs/db_project_sums.php create mode 100755 gforge/cronjobs/db_stats_agg.php create mode 100755 gforge/cronjobs/kt_dump.php create mode 100755 gforge/cronjobs/massmail.php create mode 100755 gforge/cronjobs/project_weekly_metric-backfill.php create mode 100755 gforge/cronjobs/stats_projects-backfill.php create mode 100755 gforge/cronjobs/stats_projects.inc create mode 100644 gforge/cronjobs/stats_site.inc create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/README create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/artifact-conversion.sql create mode 100755 gforge/db/SQL_migrate-2.5-to-2.6/artifact-convert-files.php create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/artifact-fkeys.sql create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/artifact-man.sql create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001209.sql create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001214.sql create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001220.sql create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010109.sql create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010112.sql create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010126.sql create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010206.sql create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010301.sql create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010304.NOTE create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010305.sql create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010313.sql create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010317.sql create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010409.sql create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010412.sql create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010507.sql create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010509.sql create mode 100644 gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010511.sql create mode 100644 gforge/db/dbusers.sql create mode 100644 gforge/db/languages.tab create mode 100644 gforge/db/oci8port/pssonline/DefaultValues.sql create mode 100644 gforge/db/oci8port/pssonline/Languages.sql create mode 100644 gforge/db/oci8port/pssonline/SourceForge.sql create mode 100644 gforge/db/oci8port/pssonline/database-oci8.php create mode 100644 gforge/db/oci8port/pssonline/trove_defaults.sql create mode 100644 gforge/db/oci8port/shaguo/SourceForge2.5_oci8.sql create mode 100644 gforge/db/oci8port/shaguo/SourceForge2.5oci8-Trigger_auto.sql create mode 100644 gforge/db/oci8port/shaguo/SourceForge2.5oci8-Trigger_er.sql create mode 100644 gforge/db/oci8port/shaguo/database.php create mode 100644 gforge/db/oci8port/shaguo/pgdb-convert.pl create mode 100755 gforge/db/replicate.sh create mode 100644 gforge/db/replication-master.sql create mode 100644 gforge/db/replication-reset-master.sql create mode 100644 gforge/db/replication-reset-slave.sql create mode 100644 gforge/db/replication-slave.sql create mode 100644 gforge/db/replication.plan create mode 100644 gforge/db/sfdocs.sql create mode 100644 gforge/db/trove_cat.tab create mode 100644 gforge/docs/architecture/coding_standards.html create mode 100644 gforge/docs/architecture/sf2.sda create mode 100644 gforge/docs/architecture/stats/stats-process.gif create mode 100644 gforge/docs/architecture/stats/stats-process.sda create mode 100644 gforge/docs/architecture/templating.php create mode 100644 gforge/docs/architecture/tour/first0.gif create mode 100644 gforge/docs/architecture/tour/first1.gif create mode 100644 gforge/docs/architecture/tour/img0.htm create mode 100644 gforge/docs/architecture/tour/img0.jpg create mode 100644 gforge/docs/architecture/tour/img1.htm create mode 100644 gforge/docs/architecture/tour/img1.jpg create mode 100644 gforge/docs/architecture/tour/img2.htm create mode 100644 gforge/docs/architecture/tour/img2.jpg create mode 100644 gforge/docs/architecture/tour/index.gif create mode 100644 gforge/docs/architecture/tour/last0.gif create mode 100644 gforge/docs/architecture/tour/last1.gif create mode 100644 gforge/docs/architecture/tour/next0.gif create mode 100644 gforge/docs/architecture/tour/next1.gif create mode 100644 gforge/docs/architecture/tour/prev0.gif create mode 100644 gforge/docs/architecture/tour/prev1.gif create mode 100644 gforge/docs/architecture/tour/standards.htm create mode 100644 gforge/docs/background/charter.html create mode 100644 gforge/docs/background/org_chart.html create mode 100644 gforge/docs/background/whos_who.html create mode 100644 gforge/docs/doc_utils.php create mode 100644 gforge/docs/index.php create mode 100644 gforge/docs/project_management/change_control.html create mode 100644 gforge/docs/project_management/community.html create mode 100644 gforge/docs/project_management/development_process.html create mode 100644 gforge/docs/project_management/ps_engineers.html create mode 100644 gforge/docs/project_management/requirements.html create mode 100644 gforge/docs/project_management/review.html create mode 100644 gforge/docs/project_management/source_branching.sda create mode 100644 gforge/docs/project_management/source_control.html create mode 100644 gforge/docs/templates/generic_document.html create mode 100644 gforge/docs/templates/project_index.html create mode 100644 gforge/pager.php3 create mode 100644 gforge/utils/download/README create mode 100755 gforge/utils/groupCreator create mode 100755 gforge/utils/ldap-check-replica create mode 100644 gforge/www/account/unsubscribe.php create mode 100644 gforge/www/admin/admin_table.php create mode 100644 gforge/www/admin/database.php create mode 100644 gforge/www/admin/edit_frs_filetype.php create mode 100644 gforge/www/admin/edit_frs_processor.php create mode 100644 gforge/www/admin/edit_supported_languages.php create mode 100644 gforge/www/admin/intelapprove.php create mode 100644 gforge/www/admin/massmail-old.php create mode 100644 gforge/www/admin/resetapc.php create mode 100644 gforge/www/admin/unsubscribe.php create mode 100644 gforge/www/admin/vhost.php create mode 100644 gforge/www/export/rss_foundry_featuredprojects.php create mode 100644 gforge/www/export/rss_foundry_mostactive.php create mode 100644 gforge/www/export/rss_foundry_topdownloads.php create mode 100644 gforge/www/export/rss_osdn_search.php create mode 100644 gforge/www/export/rss_osdnnews.php create mode 100644 gforge/www/export/sf_tracker_export.php create mode 100644 gforge/www/export/sf_tracker_export.xsd create mode 100644 gforge/www/help/tracker.php create mode 100644 gforge/www/images/favicon.ico create mode 100644 gforge/www/images/phorum/c.gif create mode 100644 gforge/www/images/phorum/i.gif create mode 100644 gforge/www/images/phorum/l.gif create mode 100644 gforge/www/images/phorum/m.gif create mode 100644 gforge/www/images/phorum/n.gif create mode 100644 gforge/www/images/phorum/p.gif create mode 100644 gforge/www/images/phorum/t.gif create mode 100644 gforge/www/images/phorum/trans.gif create mode 100644 gforge/www/include/languages/Base.tab create mode 100644 gforge/www/include/languages/Bulgarian.tab create mode 100644 gforge/www/include/languages/Catalan.tab create mode 100644 gforge/www/include/languages/Chinese.tab create mode 100644 gforge/www/include/languages/Dutch.tab create mode 100644 gforge/www/include/languages/English.tab create mode 100644 gforge/www/include/languages/Esperanto.tab create mode 100644 gforge/www/include/languages/French.tab create mode 100644 gforge/www/include/languages/German.tab create mode 100644 gforge/www/include/languages/Greek.tab create mode 100644 gforge/www/include/languages/Hebrew.tab create mode 100644 gforge/www/include/languages/Indonesian.tab create mode 100644 gforge/www/include/languages/Italian.tab create mode 100644 gforge/www/include/languages/Japanese.tab create mode 100644 gforge/www/include/languages/Korean.tab create mode 100644 gforge/www/include/languages/Norwegian.tab create mode 100644 gforge/www/include/languages/Polish.tab create mode 100644 gforge/www/include/languages/Portuguese.tab create mode 100644 gforge/www/include/languages/PortugueseBrazillian.tab create mode 100644 gforge/www/include/languages/Russian.tab create mode 100644 gforge/www/include/languages/SimplifiedChinese.tab create mode 100644 gforge/www/include/languages/Spanish.tab create mode 100644 gforge/www/include/languages/Swedish.tab create mode 100644 gforge/www/include/languages/Thai.tab create mode 100644 gforge/www/kernel_traffic.php create mode 100644 gforge/www/my/intelagreement.php create mode 100644 gforge/www/news/admin/news_admin_utils.php create mode 100644 gforge/www/project/admin/database.php create mode 100644 gforge/www/project/admin/rmuser.php create mode 100644 gforge/www/project/admin/userpermedit.php create mode 100644 gforge/www/project/admin/vhost.php create mode 100644 gforge/www/register/projectinfo.php create mode 100644 gforge/www/stats/lastlogins.php create mode 100644 gforge/www/testsecurity.php create mode 100644 gforge/www/themes/ultralite/Theme.class create mode 100644 gforge/www/top/topusers.php create mode 100644 gforge/www/tos/privacy_generic.php create mode 100644 gforge/www/tos/tos_generic.php create mode 100644 gforge/www/tracker/add.php create mode 100644 gforge/www/tracker/admin/index.php create mode 100644 gforge/www/tracker/browse.php create mode 100644 gforge/www/tracker/detail.php create mode 100644 gforge/www/tracker/download.php create mode 100644 gforge/www/tracker/include/ArtifactFileHtml.class create mode 100644 gforge/www/tracker/include/ArtifactHtml.class create mode 100644 gforge/www/tracker/include/ArtifactTypeHtml.class create mode 100644 gforge/www/tracker/index.php create mode 100644 gforge/www/tracker/mod.php create mode 100644 gforge/www/tracker/reporting/index.php create mode 100644 gforge/www/tracker/tracker-er-diagram.sda diff --git a/.gitattributes b/.gitattributes index 154b1b6265..2baee0df5a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,7 +1,23 @@ * text=auto !eol gforge/backend/shell/apache.sh svneol=native#unset +gforge/docs/architecture/sf2.sda svneol=native#unset +gforge/docs/architecture/stats/stats-process.gif svneol=native#unset +gforge/docs/architecture/stats/stats-process.sda svneol=native#unset +gforge/docs/architecture/tour/first0.gif svneol=native#unset +gforge/docs/architecture/tour/first1.gif svneol=native#unset +gforge/docs/architecture/tour/img0.jpg svneol=native#unset +gforge/docs/architecture/tour/img1.jpg svneol=native#unset +gforge/docs/architecture/tour/img2.jpg svneol=native#unset +gforge/docs/architecture/tour/index.gif svneol=native#unset +gforge/docs/architecture/tour/last0.gif svneol=native#unset +gforge/docs/architecture/tour/last1.gif svneol=native#unset +gforge/docs/architecture/tour/next0.gif svneol=native#unset +gforge/docs/architecture/tour/next1.gif svneol=native#unset +gforge/docs/architecture/tour/prev0.gif svneol=native#unset +gforge/docs/architecture/tour/prev1.gif svneol=native#unset gforge/docs/branching.sda svneol=native#unset gforge/docs/images/sflogo2-105a.png -text +gforge/docs/project_management/source_branching.sda svneol=native#unset gforge/docs/sourceforge-architecture.sda svneol=native#unset gforge/www/bugs/bugs-er-diagram.sda svneol=native#unset gforge/www/forum/forum-er-diagram.sda svneol=native#unset @@ -18,6 +34,7 @@ gforge/www/images/bug.png svneol=native#unset gforge/www/images/cfolder.gif svneol=native#unset gforge/www/images/docs/developerperms.png svneol=native#unset gforge/www/images/docs/groupmembers.png svneol=native#unset +gforge/www/images/favicon.ico svneol=native#unset gforge/www/images/foundry/1872admin.png svneol=native#unset gforge/www/images/foundry/1872logo.png svneol=native#unset gforge/www/images/foundry/6770admin.png svneol=native#unset @@ -102,6 +119,14 @@ gforge/www/images/others/dmoz-cool1.gif svneol=native#unset gforge/www/images/others/gnome1.png svneol=native#unset gforge/www/images/others/kde-logotp3.png svneol=native#unset gforge/www/images/others/suse_g_sm.png svneol=native#unset +gforge/www/images/phorum/c.gif svneol=native#unset +gforge/www/images/phorum/i.gif svneol=native#unset +gforge/www/images/phorum/l.gif svneol=native#unset +gforge/www/images/phorum/m.gif svneol=native#unset +gforge/www/images/phorum/n.gif svneol=native#unset +gforge/www/images/phorum/p.gif svneol=native#unset +gforge/www/images/phorum/t.gif svneol=native#unset +gforge/www/images/phorum/trans.gif svneol=native#unset gforge/www/images/rateit.png svneol=native#unset gforge/www/images/ratesubmit.png svneol=native#unset gforge/www/images/sflogo-88-1.png svneol=native#unset @@ -164,3 +189,4 @@ gforge/www/themes/forged/images/tbar1.png svneol=native#unset gforge/www/themes/forged/images/tleft1.png svneol=native#unset gforge/www/themes/forged/images/tright1.png svneol=native#unset gforge/www/themes/forged/images/valogo5.jpg svneol=native#unset +gforge/www/tracker/tracker-er-diagram.sda svneol=native#unset diff --git a/gforge/TARBALL b/gforge/TARBALL new file mode 100644 index 0000000000..6b0dcd3d9f --- /dev/null +++ b/gforge/TARBALL @@ -0,0 +1,196 @@ +#!/usr/bin/perl +# +# SourceForge: Breaking Down the Barriers to Open Source Development +# Copyright 1999-2001 (c) VA Linux Systems +# http://sourceforge.net +# +# $Id: TARBALL,v 1.14 2001/07/09 21:54:14 pfalcon Exp $ +# + +use strict; + +my $CVS_TAG; +tarball_init(); + +# ------------------------------------------------------------------------------ +# 1. TARBALL +# ------------------------------------------------------------------------------ +# +# This document describes and executes the steps to create a SourceForge tarball +# release from CVS. This file should be up to date in CVS for each +# release but should not be included in the actual tarball. +# +# ------------------------------------------------------------------------------ +# 2. RELEASE VERSION +# ------------------------------------------------------------------------------ +# +# +# RELEASE_VERSION=2.6.1pre4 +# +# The above string should be updated with each tarball release to be in +# the form "MAJOR.MINOR.REVISION". +# +# ------------------------------------------------------------------------------ +# 3. PROCESS +# ------------------------------------------------------------------------------ +# +# 0. tag CVS at SF_pre where VERSION is listed above (2. RELEASE +# VERSION) and (with dots replaced with underscores) N is an increasing +# integer starting at 1. + +system('cvs -Q tag SF_' . $CVS_TAG); + +# 1. create a scratch directory + +system("rm -rf /tmp/scratch"); +system('mkdir /tmp/scratch'); +chdir('/tmp/scratch'); + +# 2. check out CVS into this directory + +system('cvs -z9 -Q export -rHEAD alexandria'); + +# 3. process the file removal list (4. REMOVE) + +process_removes(); + +# 4. process the file addition list (5. ADD) + +process_adds(); + +# 5. read and act on any notes (6. NOTES) + +process_notes(); + +# 6. Create tarball in the form "SourceForge-VERSIONpreN.tar.gz" +# and email a URL to the tarball to: +# +# - Engine Team and PS (sf-engine@valinux.com) +# - SF.net Team (staff@sourceforge.net) + +create_tarball(); + +# 7. review should generate changes in CVS to: +# +# - critical bugs +# - files missing copyright statements +# - README, AUTHORS, and other administrative files +# +# 8. Goto 0. Repeat until step 7 generates no comments. Upon approval, +# tag CVS at VERSION and repeat steps 1 through 5. Create tarball in +# the form "SourceForge-VERSION.tar.gz" and release on SourceForge.net. +# +# ------------------------------------------------------------------------------ +# 4. REMOVE +# ------------------------------------------------------------------------------ +# +# Note: this section should be a list of 'rm path/to/file' +# statements, suitable to be pasted into a console. + +sub process_removes { + my @stuff_to_remove = ( + 'rm -rf alexandria/include', + 'rm -rf alexandria/backend/', + 'rm -rf alexandria/monitor/', + 'rm -rf alexandria/docs/', + 'rm -rf alexandria/utils/', + 'rm -f alexandria/TARBALL', + 'rm -f alexandria/pager.php3', + 'rm -f alexandria/www/my/intelagreement.php', + 'rm -f alexandria/www/admin/intelapprove.php', + 'rm -rf alexandria/www/themes/forged/', + 'rm -rf alexandria/www/themes/classic/', + 'rm -f alexandria/cronjobs/kt_dump.php', + 'rm -f alexandria/www/kernel_traffic.php' + ); + + foreach(@stuff_to_remove) { + system $_; + } +} + +# ------------------------------------------------------------------------------ +# 5. ADD +# ------------------------------------------------------------------------------ + +sub process_adds { +} + +# ------------------------------------------------------------------------------ +# 6. NOTES +# ------------------------------------------------------------------------------ + +sub process_notes { + print " +WARNING: PLEASE READ CAREFULLY! + +Automated preparation of SF source code snapshot has been completed. +In particular, removals and additions has been performed. You should +check that the latter were correct, however. + +For your convenience, as the next step, tarball package will be created, +put at the appropriate place, and notice about snapshot availability +will be sent to concerned parties. But you should review resulting tarball +immediately to make sure it is correct, including (but not limited to): +1. Additions made are based on the latest versions of subfacilities. +2. Source code does not contain elements pertinent only to .net + installation (www/index.php is obvious candidate for review). +If in doubt, ask via the staff list or IRC. + +If you will find that changes are required you may make them (among +other means) to snapshot tree residing in /tmp/scratch and +recreate tarball with following command: + +cd /tmp/scratch; tar cfz /usr/local/sourceforge.net/www/SourceForge-$ARGV[0].tar.gz alexandria + +"; +} + +################################################################################ + +sub tarball_init { + # Check that CVS tag is in place + if (!$ARGV[0] || !($ARGV[0] =~ /((\d+)\.(\d+)\.(\d+))(\w*)/)) { + print("Usage: TARBALL \n"); + print("Example: TARBALL 1.2.3pre4\n"); + exit; + } + + # Replace '.' with '_' + $CVS_TAG = $ARGV[0]; + $CVS_TAG =~ s/[\.]/_/g; + + # Update this file with the new release name + open(FH, "+< TARBALL") or die("Opening: $!"); + my $out = ''; + while () { + s/# RELEASE_VERSION=((\d+)\.(\d+)\.(\d+))(\w*)/# RELEASE_VERSION=$ARGV[0]/g; + $out .= $_; + } + + seek(FH, 0, 0) or die("Can't seek to start of file: $!"); + print FH $out or die("Can't print to file: $!"); + truncate(FH, tell(FH)) or die("Can't truncate file: $!"); + close(FH) or die("Can't close file: $!"); +} + +sub create_tarball { + # Create the tarball + system('tar cfz /usr/local/sourceforge.net/www/SourceForge-' . $ARGV[0] . '.tar.gz alexandria'); + + # Send email notices +## open(SENDMAIL, "|/usr/sbin/sendmail -oi -t -odq") or die("Can't fork for sendmail: $!\n"); + open(SENDMAIL, "|/usr/sbin/sendmail -oi -t") or die("Can't fork for sendmail: $!\n"); +## my $body = "From: noreply\@sourceforge.net + my $body = "To: sf-engine\@valinux.com, staff\@sourceforge.net +Subject: New Tarball ($ARGV[0]) Created + +A new SourceForge tarball is available for review at http://webdev.sourceforge.net/SourceForge-$ARGV[0].tar.gz"; + print SENDMAIL $body; + close(SENDMAIL) or warn("sendmail didn't close nicely: $!\n"); + + # Remove the scratch dir + # Don't do this as source tree will likely need manual + # augmentation/cleanup for package release +# system("rm -rf /tmp/scratch"); +} diff --git a/gforge/common/include/Error.class b/gforge/common/include/Error.class new file mode 100644 index 0000000000..cd14cead7c --- /dev/null +++ b/gforge/common/include/Error.class @@ -0,0 +1,96 @@ + + * @date 2000-08-28 + * + */ + +class Error { + /** + * The current error state. + * + * @var bool $error_state + */ + var $error_state; + + /** + * The current error message(s). + * + * @var string $error_message + */ + var $error_message; + + /** + * Error() - Constructor + * Constructor for the Error class. + * Sets the error state to false. + * + */ + function Error() { + //nothing + $this->error_state=false; + } + + /** + * setError() - Sets the error string. + * Set the error string $error_message to the value of $string + # and enable the $error_state flag. + * + * @param string The error string to set. + * + */ + function setError($string) { + $this->error_state=true; + $this->error_message=$string; + } + + /** + * clearError() - Clear the current error. + * Clear the current error string and disable the $error_state flag. + * + */ + function clearError() { + $this->error_state=false; + $this->error_message=''; + } + + /** + * getErrorMessage() - Retrieve the error message string. + * Returns the value of $error_message. + * + * @return $error_message The current error message string. + * + */ + function getErrorMessage() { + if ($this->error_state) { + return $this->error_message; + } else { + return 'No Error'; + } + } + + /** + * isError() - Determines the current error state. + * This function returns the current value of $error_state. + * + * @return $error_state The boolean error status. + * + */ + function isError() { + return $this->error_state; + } + +} + +?> diff --git a/gforge/common/include/Foundry.class b/gforge/common/include/Foundry.class new file mode 100644 index 0000000000..983b3ce96e --- /dev/null +++ b/gforge/common/include/Foundry.class @@ -0,0 +1,182 @@ +getUnixName(); + * + * + * SourceForge: Breaking Down the Barriers to Open Source Development + * Copyright 1999-2001 (c) VA Linux Systems + * http://sourceforge.net + * + * @version $Id: Foundry.class,v 1.4 2001/06/06 21:30:03 dbrogdon Exp $ + * @author Tim Perdue + * @date 2000-08-28 + * + */ + +class Foundry extends Group { + /** + * Foundry preferences, etc - associative array from the database + * + * @var array $foundry_data_array + */ + var $foundry_data_array; + + /** + * Database result set handle for foundry_data + * + * @var int $foundry_db_result + */ + var $foundry_db_result; + + /** + * Foundry() - Constructor + * Constructor for the Error class. + * Basically just call the parent to set up everything + * + * @param int The foundry ID + * @param int Database resource ID + * + */ + function Foundry($id,$res=false) { + $this->Group($id,$res); + + //now set up the foundry data + + $this->foundry_db_result=db_query("SELECT * FROM foundry_data WHERE foundry_id='$id'"); + if (db_numrows($this->foundry_db_result) < 1) { + //function in class we extended + $this->setError('Foundry Data Not Found'); + $this->foundry_data_array=array(); + } else { + //set up an associative array for use by other functions + $this->foundry_data_array=db_fetch_array($this->foundry_db_result); + } + } + + /** + * refreshFoundryData() - Refresh object member values. + * Retreive the latest foundry data and update object members with the new data. + * + */ + function refreshFoundryData() { + $this->refreshGroupData(); + $this->foundry_db_result=db_query("SELECT * FROM foundry_data WHERE foundry_id='". $this->getID() ."'"); + $this->foundry_data_array=db_fetch_array($this->foundry_db_result); + } + + /** + * getFreeformHTML1() - Return value of 'freeform1_html' from the foundry_data table. + * Return value of 'freeform1_html'. + * + * @return $foundry_data_array['freeform1_html'] The value of 'freeform1_html' from the foundry_data table. + * + */ + function getFreeformHTML1() { + return $this->foundry_data_array['freeform1_html']; + } + + /** + * getFreeformHTML2() - Return value of 'freeform2_html' from the foundry_data table. + * Return value of 'freeform2_html'. + * + * @return $foundry_data_array['freeform2_html'] The value of 'freeform2_html' from the foundry_data table. + * + */ + function getFreeformHTML2() { + return $this->foundry_data_array['freeform2_html']; + } + + /** + * getSponsorHTML1() - Return value of 'sponsor1_html' from the foundry_data table. + * Return value of 'sponsor1_html'. + * + * @return $foundry_data_array['sponsor1_html'] The value of 'sponsor1_html' from the foundry_data table. + * + */ + function getSponsorHTML1() { + return $this->foundry_data_array['sponsor1_html']; + } + + /** + * getSponsorHTML2() - Return value of 'sponsor2_html' from the foundry_data table. + * Return value of 'sponsor2_html'. + * + * @return $foundry_data_array['sponsor2_html'] The value of 'sponsor2_html' from the foundry_data table. + * + */ + function getSponsorHTML2() { + return $this->foundry_data_array['sponsor2_html']; + } + + /** + * getGuideImageID() - Return value of 'guide_image_id' from the foundry_data table. + * Returns the ID number that corresponds to the appropriate ID # in + * the db_images table + * + * @return $foundry_data_array['guide_image_id'] The value of 'guide_image_id' from the foundry_data table. + * + */ + function getGuideImageID() { + return $this->foundry_data_array['guide_image_id']; + } + + /** + * getLogoImageID() - Return value of 'logo_image_id' from the foundry_data table. + * Get the ID number that corresponds to the appropriate ID # in the db_images table. + * + * @return $foundry_data_array['logo_image_id'] The value of 'logo_image_id' from the foundry_data table. + * + */ + function getLogoImageID() { + return $this->foundry_data_array['logo_image_id']; + } + + /** + * getTroveCategories() - Get the trove categories. + * Return value of 'trove_categories' from the foundry_data table. + * + * @return $foundry_data_array['trove_categories'] The value of 'trove_categories' from the foundry_data table. + * + */ + function getTroveCategories() { + return $this->foundry_data_array['trove_categories']; + } + + /** + * getProjectCommaSep() - Get comma separated list of projects. + * Returns a comma separated list of member project ids + * + * @see getMemberProjects() + * + */ + function getProjectsCommaSep() { + return implode(',',$this->getMemberProjects()); + } + + /** + * getMemberProjects() - Return an array of member project ID's. + * Returns an array of member project ids + * + * @see utils.php::util_result_column_to_array() + * + */ + function getMemberProjects() { + //return an array of group_id's in this project + $sql="SELECT DISTINCT project_id FROM foundry_projects WHERE foundry_id='". $this->getID() ."' ORDER BY project_id ASC"; + $result=db_query($sql); + return util_result_column_to_array($result); + } +} + +?> diff --git a/gforge/common/include/Group.class b/gforge/common/include/Group.class new file mode 100644 index 0000000000..21730e441b --- /dev/null +++ b/gforge/common/include/Group.class @@ -0,0 +1,1454 @@ + + * @date 2000-08-28 + * + */ + +require_once('common/tracker/ArtifactTypes.class'); +require_once('www/include/frs.class'); + +$GROUP_OBJ=array(); + +/** + * group_get_object() - Get the group object. + * + * group_get_object() is useful so you can pool group objects/save database queries + * You should always use this instead of instantiating the object directly. + * + * You can now optionally pass in a db result handle. If you do, it re-uses that query + * to instantiate the objects. + * + * IMPORTANT! That db result must contain all fields + * from groups table or you will have problems + * + * @param int Required + * @param int Result set handle ("SELECT * FROM groups WHERE group_id=xx") + * @return a group object or false on failure + */ +function &group_get_object($group_id,$res=false) { + //create a common set of group objects + //saves a little wear on the database + + //automatically checks group_type and + //returns appropriate object + + global $GROUP_OBJ; + if (!isset($GROUP_OBJ["_".$group_id."_"])) { + if ($res) { + //the db result handle was passed in + } else { + $res=db_query("SELECT * FROM groups WHERE group_id='$group_id'"); + } + if (!$res || db_numrows($res) < 1) { + $GROUP_OBJ["_".$group_id."_"]=false; + } else { + /* + check group type and set up object + */ + if (db_result($res,0,'type')==1) { + //project + $GROUP_OBJ["_".$group_id."_"]= new Project($group_id,$res); + } else if (db_result($res,0,'type')==2) { + //foundry + $GROUP_OBJ["_".$group_id."_"]= new Foundry($group_id,$res); + } else { + //invalid + $GROUP_OBJ["_".$group_id."_"]=false; + } + } + } + return $GROUP_OBJ["_".$group_id."_"]; +} + +class Group extends Error { + /** + * Associative array of data from db + * + * @var array $data_array + */ + var $data_array; + + /** + * The group ID + * + * @var int $group_id + */ + var $group_id; + + /** + * Database result set handle + * + * @var int $db_result + */ + var $db_result; + + /** + * Permissions data row from db + * + * @var array $perm_data_array + */ + var $perm_data_array; + + /** + * Whether the use is an admin/super user of this project + * + * @var bool $is_admin + */ + var $is_admin; + + /** + * Artifact types result handle + * + * @var int $types_res; + */ + var $types_res; + + /** + * Group() - Group object constructor - use group_get_object() to instantiate + * + * @param int Required - group_id of the group you want to instantiate + * @param int Database result from select query + */ + function Group($id=false, $res=false) { + $this->Error(); + if (!$id) { + //setting up an empty object + //probably going to call create() + return true; + } + $this->group_id=$id; + if (!$res) { + $this->db_result=db_query("SELECT * FROM groups WHERE group_id='$id'"); + } else { + $this->db_result=$res; + } + if (db_numrows($this->db_result) < 1) { + //function in class we extended + $this->setError('Group Not Found'); + $this->data_array=array(); + } else { + //set up an associative array for use by other functions + + db_reset_result($this->db_result); + + $this->data_array=db_fetch_array($this->db_result); + } + } + + + /** + * getData() + * + * Generally should NOT be used - here for supporting deprecated group.php + * @return a database result set handle + * @access private + */ + function getData() { + db_reset_result($this->db_result); + return $this->db_result; + } + + /** + * refreshGroupData() - May need to refresh database fields if an update occurred + */ + function refreshGroupData() { + $this->db_result=db_query("SELECT * FROM groups WHERE group_id='". $this->getID() ."'"); + $this->data_array=db_fetch_array($this->db_result); + } + + + /** + * create() - Create new group + * + * This method should be called on empty Group object + * + * @param object The User object + * @param string The full name of the user + * @param string The Unix name of the user + * @param string The new group description + * @param int The ID of the license to use + * @param string The 'other' license to use if any + * @param string The purpose of the group + */ + function create(&$user, $full_name, $unix_name, $description, + $license, $license_other, $purpose) { + + // $user is ignored - anyone can create pending group + + if ($this->getID()!=0) { + $this->setError("Group::create: Group object already exists"); + return false; + } + + srand((double)microtime()*1000000); + $random_num = rand(0,1000000); + + db_begin(); + + $res = db_query(" + INSERT INTO groups ( + group_name, + is_public, + unix_group_name, + short_description, + http_domain, + homepage, + status, + unix_box, + cvs_box, + license, + register_purpose, + register_time, + license_other, + rand_hash + ) + VALUES ( + '$full_name', + 1, + '$unix_name', + '$description', + '$unix_name.".$GLOBALS['sys_default_domain']."', + '$unix_name.".$GLOBALS['sys_default_domain']."', + 'P', + 'shell1', + 'cvs1', + '$license', + '".htmlspecialchars($purpose)."', + ".time().", + '".htmlspecialchars($license_other)."', + '".md5($random_num)."' + ) + "); + + if (!$res || db_affected_rows($res) < 1) { + $this->setError('ERROR: Could not create group: '.db_error()); + db_rollback(); + return false; + } + + $this->group_id = db_insertid($res, 'groups', 'group_id'); + + // + // Now, make the user an admin + // + $res = db_query(" + INSERT INTO user_group ( + user_id, + group_id, + admin_flags, + cvs_flags, + artifact_flags, + forum_flags + ) + VALUES ( + ".$user->getID().", + ".$this->getID().", + 'A', + 1, + 2, + 2 + ) + "); + + if (!$res || db_affected_rows($res) < 1) { + $this->setError('ERROR: Could not add admin to newly created group: '.db_error()); + db_rollback(); + return false; + } + + db_commit(); + $this->refreshGroupData(); + return true; + } + + + /** + * updateAdmin($user) - Update core properties of group object + * + * This function require site admin privilege + * + * @param object User requesting operation (for access control) + * @param bool Whether group is publicly accessible (0/1) + * @param string Project's license (string ident) + * @param int Group type (1-project, 2-foundry) + * @param string Machine on which group's home directory located + * @param string Domain which serves group's WWW + * @return status + * @access public + */ + function updateAdmin(&$user, $is_public, $license, $type, $unix_box, $http_domain) { + + $perm =& $this->getPermission($user); + + if (!$perm || !is_object($perm)) { + $this->setError('Could not get permission'); + return false; + } + + if (!$perm->isSuperUser()) { + $this->setError('Permission Denied'); + return false; + } + + db_begin(); + + $res = db_query(" + UPDATE groups + SET is_public='$is_public', + license='$license',type='$type', + unix_box='$unix_box',http_domain='$http_domain' + WHERE group_id='".$this->getID()."' + "); + + if (!$res || db_affected_rows($res) < 1) { + $this->setError('ERROR: DB: Could not change group properties: '.db_error()); + db_rollback(); + return false; + } + + /* + If this is a foundry, see if they have a preferences row, if not, create one + */ + if ($type=='2') { + + $res = db_query(" + SELECT * + FROM foundry_data + WHERE foundry_id='".$this->getID()."' + "); + + if (db_numrows($res) < 1) { + $res = db_query(" + INSERT INTO foundry_data (foundry_id) + VALUES ('".$this->getID()."') + "); + + if (!$res || db_affected_rows($res) < 1) { + $this->setError('Could not insert foundry_data row: '.db_error()); + db_rollback(); + return false; + } + } + } + + db_commit(); + + // Log the audit trail + if ($is_public != $this->isPublic()) { + $this->addHistory('is_public', $this->isPublic()); + } + if ($license != $this->data_array['license']) { + $this->addHistory('license', $this->data_array['license']); + } + if ($type != $this->data_array['type']) { + $this->addHistory('type', $this->data_array['type']); + } + if ($unix_box != $this->data_array['unix_box']) { + $this->addHistory('unix_box', $this->data_array['unix_box']); + } + if ($http_domain != $this->data_array['http_domain']) { + $this->addHistory('http_domain', $this->data_array['http_domain']); + } + + $this->refreshGroupData(); + return true; + } + + /** + * update() - Update number of common properties + * + * Unlike updateAdmin(), this function accessible to project + * admin. + * + * @param object User requesting operation (for access control) + * @param bool Whether group is publicly accessible (0/1) + * @param string Project's license (string ident) + * @param int Group type (1-project, 2-foundry) + * @param string Machine on which group's home directory located + * @param string Domain which serves group's WWW + * @return status + * @access public + */ + function update(&$user, $group_name,$homepage,$short_description,$use_mail,$use_survey,$use_forum, + $use_pm,$use_pm_depend_box,$use_cvs,$use_news,$use_docman, + $new_task_address,$send_all_tasks,$logo_image_id) { + + $perm =& $this->getPermission($user); + + if (!$perm || !is_object($perm)) { + $this->setError('Could not get permission'); + return false; + } + + if (!$perm->isAdmin()) { + $this->setError('Permission Denied'); + return false; + } + + // Validate some values + if (!$group_name) { + $this->setError('Invalid Group Name'); + return false; + } + + if ($new_task_address && !validate_email($new_task_address)) { + $this->setError('Task Address Appeared Invalid'); + return false; + } + + // in the database, these all default to '1', + // so we have to explicity set 0 + if (!$use_mail) { + $use_mail=0; + } + if (!$use_survey) { + $use_survey=0; + } + if (!$use_forum) { + $use_forum=0; + } + if (!$use_pm) { + $use_pm=0; + } + if (!$use_pm_depend) { + $use_pm_depend=0; + } + if (!$use_cvs) { + $use_cvs=0; + } + if (!$use_news) { + $use_news=0; + } + if (!$use_docman) { + $use_docman=0; + } + if (!$send_all_tasks) { + $send_all_tasks=0; + } + + if (!$homepage) { + $homepage='http://'.$GLOBALS['sys_default_domain'].'/projects/'.$this->getUnixName().'/'; + } + + $res = db_query(" + UPDATE groups + SET + group_name='$group_name', + homepage='$homepage', + short_description='$short_description', + use_mail='$use_mail', + use_survey='$use_survey', + use_forum='$use_forum', + use_pm='$use_pm', + use_pm_depend_box='$use_pm_depend_box', + use_cvs='$use_cvs', + use_news='$use_news', + use_docman='$use_docman', + new_task_address='$new_task_address', + send_all_tasks='$send_all_tasks'". +// XXX: not active yet +// logo_image_id='$logo_image_id' + " + WHERE group_id='".$this->getID()."' + "); + + if (!$res || db_affected_rows($res) < 1) { + $this->setError('Error updating project information: '.db_error()); + return false; + } + + // Log the audit trail + $this->addHistory('Changed Public Info', ''); + + $this->refreshGroupData(); + return true; + } + + /** + * getID() - Simply return the group_id for this object + * + * @return integer group_id + */ + function getID() { + return $this->group_id; + } + + /** + * getType() - Foundry, project, etc + * + * @return the type flag from the database + */ + function getType() { + return $this->data_array['type']; + } + + + /** + * getStatus() + * + * Statuses include I,H,A,D + */ + function getStatus() { + return $this->data_array['status']; + } + + /** + * setStatus($user, $status) + * + * Statuses include I,H,A,D + * + * @param object User requesting operation (for access control) + * @param string Status value + * + * @access public + */ + function setStatus(&$user, $status) { + + $perm =& $this->getPermission($user); + + if (!$perm || !is_object($perm)) { + $this->setError('Could not get permission'); + return false; + } + + if (!$perm->isSuperUser()) { + $this->setError('Permission Denied'); + return false; + } + + // Projects in 'A' status can only go to 'H' or 'D' + // Projects in 'D' status can only go to 'A' + // Projects in 'P' status can only go to 'A' OR 'D' + // Projects in 'I' status can only go to 'P' + // Projects in 'H' status can only go to 'A' OR 'D' + $allowed_status_changes = array( + 'AH'=>1,'AD'=>1,'DA'=>1,'PA'=>1,'PD'=>1, + 'IP'=>1,'HA'=>1,'HD'=>1 + ); + + // Check that status transition is valid + if ($this->getStatus() != $status + && !$allowed_status_changes[$this->getStatus().$status]) { + $this->setError('Invalid Status Change'); + return false; + } + + db_begin(); + + $res = db_query(" + UPDATE groups + SET status='$status' + WHERE group_id='". $this->getID()."' + "); + + if (!$res || db_affected_rows($res) < 1) { + $this->setError('ERROR: DB: Could not change group status: '.db_error()); + db_rollback(); + return false; + } + + if ($status=='A') { + // Activate LDAP group, if not yet + if (!sf_ldap_check_group($this->getID())) { + + if (!sf_ldap_create_group($this->getID())) { + $this->setError(sf_ldap_get_error_msg()); + db_rollback(); + return false; + } + + if (!$this->activateUsers()) { + db_rollback(); + return false; + } + } + + /* Otherwise, the group is not active, and make sure that + LDAP group is not active either */ + } else if (sf_ldap_check_group($this->getID())) { + + if (!sf_ldap_remove_group($this->getID())) { + $this->setError(sf_ldap_get_error_msg()); + db_rollback(); + return false; + } + + } + + // Make sure that active group have default trackers + if ($status=='A') { + $ats = new ArtifactTypes($this); + if (!$ats || !is_object($ats)) { + $this->setError('Error creating ArtifactTypes object'); + db_rollback(); + return false; + } else if ($ats->isError()) { + $this->setError($ats->getErrorMessage()); + db_rollback(); + return false; + } + if (!$ats->createTrackers()) { + $this->setError($ats->getErrorMessage()); + db_rollback(); + return false; + } + } + + db_commit(); + + // Log the audit trail + if ($status != $this->getStatus()) { + $this->addHistory('status', $this->getStatus()); + } + + $this->data_array['status'] = $status; + return true; + } + + /** + * isFoundry() - Simple boolean test to see if it's a foundry or not + * + * @return true/false + */ + function isFoundry() { + if ($this->getType()==2) { + return true; + } else { + return false; + } + } + + /** + * isProject() - Simple boolean test to see if it's a project or not + * + * @return true/false + */ + function isProject() { + if ($this->getType()==1) { + return true; + } else { + return false; + } + } + + /** + * isPublic() - Simply returns the is_public flag from the database + * + * @return true/false + */ + function isPublic() { + return $this->data_array['is_public']; + } + + /** + * isActive() - Database field status of 'A' returns true + * + * @return true/false + */ + function isActive() { + if ($this->getStatus()=='A') { + return true; + } else { + return false; + } + } + + /** + * getUnixName() + * + * @return text unix_name + */ + function getUnixName() { + return strtolower($this->data_array['unix_group_name']); + } + + /** + * getPublicName() + * + * @return text group_name + */ + function getPublicName() { + return htmlspecialchars($this->data_array['group_name']); + } + + /** + * getDescription() + * + * @return text description + */ + function getDescription() { + return $this->data_array['short_description']; + } + + /** + * getStartDate() + * + * @return integer (unix time) of registration + */ + function getStartDate() { + return $this->data_array['register_time']; + } + + /** + * getLogoImageID() + * + * @return ID of logo image in db_images table (or 100 if none) + */ + function getLogoImageID() { + return $this->data_array['logo_image_id']; + } + + /** + * getUnixBox() + * + * @return name of the unix machine for the group + */ + function getUnixBox() { + return $this->data_array['unix_box']; + } + + /** + * getDomain() + * + * @return name of the group [web] domain + */ + function getDomain() { + return $this->data_array['http_domain']; + } + + /** + * getLicense() + * + * @return string ident of group license + */ + function getLicense() { + return $this->data_array['license']; + } + + /** + * getLicenseOther() + * + * @return text custom license + */ + function getLicenseOther() { + if ($this->getLicense() == 'other') { + return $this->data_array['license_other']; + } else { + return ''; + } + } + + /** + * getRegistrationPurpose() + * + * @return text application for project hosting + */ + function getRegistrationPurpose() { + return $this->data_array['register_purpose']; + } + + + + + + /* + + Common Group preferences for tools + + */ + + /** + * usesCVS() - whether or not this group has opted to use CVS + * + * @return true/false + */ + function usesCVS() { + return $this->data_array['use_cvs']; + } + + /** + * usesMail() - whether or not this group has opted to use mailing lists + * + * @return true/false + */ + function usesMail() { + return $this->data_array['use_mail']; + } + + /** + * usesNews() - whether or not this group has opted to use news + * + * @return true/false + */ + function usesNews() { + return $this->data_array['use_news']; + } + + /** + * usesForum() - whether or not this group has opted to use discussion forums + * + * @return true/false + */ + function usesForum() { + return $this->data_array['use_forum']; + } + + /** + * usesDocman() - whether or not this group has opted to use docman + * + * @return true/false + */ + function usesDocman() { + return $this->data_array['use_docman']; + } + + /** + * usesSurvey() - whether or not this group has opted to use surveys + * + * @return true/false + */ + function usesSurvey() { + return $this->data_array['use_survey']; + } + + /** + * usesPM() - whether or not this group has opted to Project Manager + * + * @return true/false + */ + function usesPM() { + return $this->data_array['use_pm']; + } + + /** + * usesPMDependencies() - whether or not this group has opted to use task dependencies + * + * @return true/false + */ + function usesPMDependencies() { + return $this->data_array['use_pm_depend']; + } + + // Warning: names for 2 functions below were choosen to be + // consistent with trackers code + + /** + * PMEmailAddress() - get email address to send PM notifications to + * + * @return true/false + */ + function PMEmailAddress() { + return $this->data_array['new_task_address']; + } + + /** + * PMEmailAll() - whether or not this group has opted to use task dependencies + * + * @return true/false + */ + function PMEmailAll() { + return $this->data_array['send_all_tasks']; + } + + + /** + * getHomePage() - The URL for this project's home page + * + * @return text homepage URL + */ + function getHomePage() { + return $this->data_array['homepage']; + } + + /** + * getArtifactTypes() - Get all Artifact types for this group + * + * @return result set + */ + function getArtifactTypes() { + if (!isset($this->types_res)) { + $sql="SELECT group_artifact_id,name + FROM artifact_group_list + WHERE group_id='".$this->getID()."' + ORDER BY name"; + $this->types_res=db_query($sql); + } + return $this->types_res; + } + + /** + * getPermission() - Return a Permission for this Group and the specified User + * + * @param object The user you wish to get permission for (usually the logged in user) + * @return permission + */ + function &getPermission(&$_user) { + return permission_get_object(&$this, &$_user); + } + + /* + + + Basic functions to add/remove users to/from a group + and update their permissions + + + */ + + /** + * addUser() - controls adding a user to a group + * + * @param string Unix name of the user to add + * @return true/false + * @access public + */ + function addUser($user_unix_name) { + /* + Admins can add users to groups + */ +?>getPermission( session_get_user() ); + + if (!$perm || !is_object($perm) || !$perm->isAdmin()) { + $this->setError('You Are Not An Admin For This Group'); + return false; + } + + db_begin(); + + /* + get user id for this user's unix_name + */ + $res_newuser = db_query("SELECT * FROM users WHERE user_name='" . strtolower($user_unix_name) . "'"); + + if (db_numrows($res_newuser) > 0) { + // + // make sure user is active + // + if (db_result($res_newuser,0,'status') != 'A') { + $this->setError('User is not active. Only active users can be added.'); + db_rollback(); + return false; + } + + // + // user was found - set new user_id var + // + $form_newuid = db_result($res_newuser,0,'user_id'); + + // + // if not already a member, add them + // + $res_member = db_query("SELECT user_id FROM user_group ". + "WHERE user_id='$form_newuid' AND group_id='". $this->getID() ."'"); + + if (db_numrows($res_member) < 1) { + // + // user was not already a member + // + // if no unix account, give them a unix_uid + // + if ( !db_result($res_newuser,0,'unix_uid') ) { + $user=&user_get_object($form_newuid,$res_newuser); + if (!$user->setUpUnixUID()) { + $this->setError('ERROR: Cannot assign UNIX uid to the user'); + db_rollback(); + return false; + } + if (!sf_ldap_create_user($form_newuid)) { + $this->setError(sf_ldap_get_error_msg()); + db_rollback(); + return false; + } + } else { + // + // User already had unix account + // + if (!sf_ldap_check_create_user($form_newuid)) { + $this->setError(sf_ldap_get_error_msg()); + db_rollback(); + return false; + } + } + // + // Create this user's row in the user_group table + // + $res=db_query("INSERT INTO user_group + (user_id,group_id,admin_flags,forum_flags,project_flags, + doc_flags,cvs_flags,member_role,release_flags,artifact_flags) + VALUES ('$form_newuid','". $this->getID() ."','','0','0','0','1','100','0','0')"); + + //verify the insert worked + if (!$res || db_affected_rows($res) < 1) { + $this->setError('ERROR: Could Not Add User To Group'); + db_rollback(); + return false; + } + // + // set up their ldap info + // + if (!sf_ldap_group_add_user($this->getID(),$form_newuid)) { + $this->setError(sf_ldap_get_error_msg()); + db_rollback(); + return false; + } + + } else { + // + // user was already a member + // make sure they are set up with a unix_uid, + // LDAP entry and membership + // + $user=&user_get_object($form_newuid,$res_newuser); + if (!$user->setUpUnixUID()) { + $this->setError('ERROR: could not set up unix_uid for user: '.$user->getErrorMessage()); + db_rollback(); + return false; + } else { + $user->refreshUserData(); + if (!sf_ldap_check_create_user($form_newuid)) { + $this->setError(sf_ldap_get_error_msg()); + db_rollback(); + return false; + } + if (!sf_ldap_group_add_user($this->getID(),$form_newuid)) { + $this->setError(sf_ldap_get_error_msg()); + db_rollback(); + return false; + } + db_commit(); + return true; + } + } + } else { + // + // user doesn't exist + // + $this->setError('ERROR: User does not exist on SourceForge'); + db_rollback(); + return false; + } + // + // audit trail + // + $this->addHistory('Added User',$user_unix_name); + db_commit(); + return true; + } + + /** + * removeUser() - controls removing a user from a group + * + * Users can remove themselves + * + * @param int The ID of the user to remove + * @return true/false + */ + function removeUser($user_id) { + + if ($user_id==user_getid()) { + //users can remove themselves + //everyone else must be a project admin + } else { +//TODO should not assume logged in user only - $user should be passed in or $perm passed in + $perm =& $this->getPermission( session_get_user() ); + + if (!$perm || !is_object($perm) || !$perm->isAdmin()) { + $this->setError('You Are Not An Admin For This Group'); + return false; + } + } + + $res=db_query("SELECT * FROM user_group ". + "WHERE group_id='".$this->getID()."' AND user_id='$user_id' AND admin_flags = 'A'"); + if (db_numrows($res) > 0) { + $this->setError('Cannot remove admin'); + return false; + } + + db_begin(); + $res=db_query("DELETE FROM user_group ". + "WHERE group_id='".$this->getID()."' AND user_id='$user_id' AND admin_flags <> 'A'"); + if (!$res || db_affected_rows($res) < 1) { + $this->setError('ERROR: DB: User not removed.'); + db_rollback(); + return false; + } else { + // + // remove them from artifact types + // + db_query("DELETE FROM artifact_perm + WHERE group_artifact_id + IN (SELECT group_artifact_id + FROM artifact_group_list + WHERE group_id='".$this->getID()."') + AND user_id='$user_id'"); + + if (!sf_ldap_group_remove_user($this->getID(),$user_id)) { + $this->setError(sf_ldap_get_error_msg()); + db_rollback(); + return false; + } + + //audit trail + $this->addHistory('removed user',$user_id); + } + db_commit(); + return true; + } + + /** + * updateUser() - controls updating a user's perms in this group + * + * NOTE - bug_flags,patch_flags,support flags are deprecated + * + * @param int The ID of the user + * @param string The admin flag for the user + * @param int The bug flag for the user DEPRECATED + * @param int The forum flag for the user + * @param int The project flag for the user + * @param int The patch flag for the user DEPRECATED + * @param int The support flag for the user DEPRECATED + * @param int The doc flag for the user + * @param int The CVS flag for the user + * @param int The release flag for the user + * @param int The member role for the user + * @param int The artifact flags for the user + * @return true/false + */ + function updateUser($user_id,$admin_flags='',$bug_flags=1,$forum_flags=0,$project_flags=1,$patch_flags=1,$support_flags=1,$doc_flags=0,$cvs_flags=1,$release_flags=1,$member_role=100,$artifact_flags=0) { + +//TODO should not assume logged in user only - $user should be passed in or $perm passed in + $perm =& $this->getPermission( session_get_user() ); + + if (!$perm || !is_object($perm) || !$perm->isAdmin()) { + $this->setError('You Are Not An Admin For This Group'); + return false; + } + + if (user_getid() == $user_id) { + $admin_flags='A'; + } + + db_begin(); + $res = db_query("UPDATE user_group SET + admin_flags='$admin_flags', + forum_flags='$forum_flags', + project_flags='$project_flags', + doc_flags='$doc_flags', + cvs_flags='$cvs_flags', + release_flags='$release_flags', + artifact_flags='$artifact_flags', + member_role='$member_role' + WHERE user_id='$user_id' AND group_id='". $this->getID() ."'"); + + if (!$res || db_affected_rows($res) < 1) { + $this->setError('ERROR: Could Not Change Member Permissions: '.db_error()); + db_rollback(); + return false; + } + + // + // If user acquired admin access to CVS, + // one to be given normal shell on CVS machine, + // else - restricted. + // + if ($cvs_flags>1) { + if (!sf_ldap_user_set_attribute($user_id,"x-cvsShell","/bin/bash")) { + $this->setError(sf_ldap_get_error_msg()); + db_rollback(); + return false; + } + } else { + if (!sf_ldap_user_set_attribute($user_id,"x-cvsShell","/bin/cvssh")) { + $this->setError(sf_ldap_get_error_msg()); + db_rollback(); + return false; + } + } + + // + // If user acquired at least commit access to CVS, + // one to be promoted to CVS group, else, demoted. + // + if ($cvs_flags>0) { + if (!sf_ldap_group_add_user($this->getID(),$user_id,1)) { + $this->setError(sf_ldap_get_error_msg()); + db_rollback(); + return false; + } + } else { + if (!sf_ldap_group_remove_user($this->getID(),$user_id,1)) { + $this->setError(sf_ldap_get_error_msg()); + db_rollback(); + return false; + } + } + + + db_commit(); + return true; + } + + /** + * addHistory() - Makes an audit trail entry for this project + * + * @param string The name of the field + * @param string The Old Value for this $field_name + * @return database result handle + * @access public + */ + function addHistory($field_name, $old_value) { + $sql=" + INSERT INTO group_history(group_id,field_name,old_value,mod_by,date) + VALUES ('". $this->getID() ."','$field_name','$old_value','". user_getid() ."','".time()."') + "; + return db_query($sql); + } + + /** + * activateUsers() - Make sure that group members have unix accounts + * + * Setup unix accounts for group members. Can be called even + * if members are already active. + * + * @access private + * + */ + function activateUsers() { + + /* + Activate member(s) of the project + */ + + $member_res = db_query(" + SELECT * + FROM users,user_group + WHERE user_group.group_id='".$this->getID()."' + AND users.user_id=user_group.user_id + "); + + $rows = db_numrows($member_res); + + if ($rows > 0) { + + for ($i=0; $i<$rows; $i++) { + + $member =& user_get_object(db_result($member_res,$i,'user_id')); + + if (!$member || !is_object($member)) { + $this->setError('Error getting member object'); + return false; + } else if ($member->isError()) { + $this->setError('Error getting member object: '.$member->getErrorMessage()); + return false; + } + + if (!$this->addUser($member->getUnixName())) { + return false; + } + } + + } + + return true; + } + + /** + * approve() - Approve pending project + * + * @param object The User object + * @access public + * + */ + function approve(&$user) { + + if ($this->getStatus()=='A') { + $this->setError("Group already active"); + return false; + } + + db_begin(); + + // Step 1: Activate group and create LDAP entries + if (!$this->setStatus($user, 'A')) { + db_rollback(); + return false; + } + + // Step 2: Setup forums for this group + forum_create_forum($this->getID(),'Open Discussion',1,'General Discussion'); + forum_create_forum($this->getID(),'Help',1,'Get Help'); + forum_create_forum($this->getID(),'Developers',0,'Project Developer Discussion'); + + // Step 3: Setup default DocManager doc_group + db_query(" + INSERT INTO doc_groups(groupname,group_id) + VALUES ('Uncategorized Submissions',".$this->getID().") + "); + + // Step 4: Setup default filerelease package + $frs = new FRS($this->getID()); + $frs->frsCreatePackage($this->getUnixName()); + + db_commit(); + + $this->sendApprovalEmail(); + $this->addHistory('approved', 'x'); + + return true; + } + + + + /** + * sendApprovalEmail() - Send new project email + * + * @return completion status + * @access public + * + */ + function sendApprovalEmail() { + + $res_admins = db_query(" + SELECT users.user_name,users.email + FROM users,user_group + WHERE users.user_id=user_group.user_id + AND user_group.group_id='".$this->getID()."' + AND user_group.admin_flags='A' + "); + + if (db_numrows($res_admins) < 1) { + $this->setEror("Group does not have any administrators."); + return false; + } + + // send one email per admin + while ($row_admins = db_fetch_array($res_admins)) { + + $message = +'Your project registration for SourceForge has been approved. + +Project Full Name: '.$this->getPublicName().' +Project Unix Name: '.$this->getUnixName().' +CVS Server: cvs.'.$this->getUnixName().'.'.$GLOBALS['sys_default_domain'].' +Shell/Web Server: '.$this->getUnixName().'.'.$GLOBALS['sys_default_domain'].' + +Your DNS will take up to a day to become active on our site. +While waiting for your DNS to resolve, you may try shelling into +'. $GLOBALS['sys_shell_host']. ' and pointing CVS to '. $GLOBALS['sys_cvs_host'].'. + +If after 6 hours your shell/CVS accounts still do not work, please +open a support ticket so that we may take a look at the problem. +Please note that all shell/CVS accounts are closed to telnet and only +work with SSH1. + +Your web site is accessible through your shell account. Please read +site documentation (see link below) about intended usage, available +services, and directory layout of the account. + +Please take some time to read the site documentation about project +administration (http://'.$GLOBALS['sys_default_domain'].'/docs/site/). If you visit your +own project page in SourceForge while logged in, you will find +additional menu functions to your left labeled \'Project Admin\'. + +We highly suggest that you now visit SourceForge and create a public +description for your project. This can be done by visiting your project +page while logged in, and selecting \'Project Admin\' from the menus +on the left (or by visiting https://'.$GLOBALS['sys_default_domain'].'/project/admin/?group_id='.$this->getID().' +after login). + +Your project will also not appear in the Trove Software Map (primary +list of projects hosted on SourceForge which offers great flexibility in +browsing and search) until you categorize it in the project administration +screens. So that people can find your project, you should do this now. +Visit your project while logged in, and select \'Project Admin\' from the +menus on the left. + +Enjoy the system, and please tell others about SourceForge. Let us know +if there is anything we can do to help you. + + -- the SourceForge crew'; + + mail($row_admins['email'],"SourceForge Project Approved",$message,"From: noreply@$GLOBALS[HTTP_HOST]"); + usleep(250000); // TODO: This is dirty. If sendmail required pause, let send_new... handle it + + } + + return true; + } + + + /* + * sendRejectionEmail() - Send project rejection email + * + * This function sends out a rejection message to a user who + * registered a project. + * + * @param int The id of the response to use + * @param string The rejection message + * @return completion status + * @access public + * + */ + function sendRejectionEmail($response_id, $message="zxcv") { + + // Get the email addr of the user who wants to register the project. + $email = db_result(db_query(" + SELECT u.email AS email + FROM users u, user_group ug + WHERE ug.group_id='".$this->getID()."' + AND u.user_id=ug.user_id; + "), 0, "email"); + + $response = +'Your project registration for SourceForge has been denied. + +Project Full Name: '.$this->getPublicName().' +Project Unix Name: '.$this->getUnixName().' + +Reasons for negative decision: + +'; + + + // Check to see if they want to send a custom rejection response + if ($response_id == 0) { + $response .= $message; + } else { + $response .= db_result(db_query(" + SELECT response_text + FROM canned_responses + WHERE response_id='$response_id' + "), 0, "response_text"); + } + + mail($email, "SourceForge Project Denied", $response, "From: noreply@sourceforge.net"); + + return true; + } + +} + +?> diff --git a/gforge/common/include/Permission.class b/gforge/common/include/Permission.class new file mode 100644 index 0000000000..908c3d4801 --- /dev/null +++ b/gforge/common/include/Permission.class @@ -0,0 +1,300 @@ +getID(); + } else { + $group_id = 0; + } + + if (is_object($_User)) { + $user_id = $_User->getID(); + } else { + //invalid object, probably from user not being logged in + $user_id = 0; + } + + if (!isset($PERMISSION_OBJ["_".$group_id."_".$user_id])) { + $PERMISSION_OBJ["_".$group_id."_".$user_id]= new Permission($_Group, $_User); + } + return $PERMISSION_OBJ["_".$group_id."_".$user_id]; +} + +class Permission extends Error { + /** + * Associative array of data from db + * + * @var array $data_array + */ + var $data_array; + + /** + * The Group object + * + * @var object $Group + */ + var $Group; + + /** + * The User object + * + * @var object $User + */ + var $User; + + /** + * Whether the user is an admin/super user of this project + * + * @var bool $is_admin + */ + var $is_admin=false; + + /** + * Whether the user is an admin/super user of the entire site + * + * @var bool $is_site_admin + */ + var $is_site_admin; + + /** + * Constructor for this object + * + * @param object Group Object required + * @param object User Object required + * + */ + function Permission (&$_Group, &$_User) { + if (!$_Group || !is_object($_Group)) { + $this->setError('No Valid Group Object'); + return false; + } + if ($_Group->isError()) { + $this->setError('Permission: '.$_Group->getErrorMessage()); + return false; + } + $this->Group =& $_Group; + + if (!$_User || !is_object($_User)) { + $this->setError('No Valid User Object'); + return false; + } + if ($_User->isError()) { + $this->setError('Permission: '.$_User->getErrorMessage()); + return false; + } + $this->User =& $_User; + + if (!$this->fetchData()) { + return false; + } else { + return true; + } + } + + /** + * fetchData() - fetch the data for this Permission from the database + * + * @return true/false + * @access private + */ + function fetchData() { + $res=db_query("SELECT * FROM user_group + WHERE user_id='". $this->User->getID() ."' + AND group_id='". $this->Group->getID() ."'"); + if (!$res || db_numrows($res) < 1) { + $this->setError('Permission: User Not Found'); + + if ($this->setUpSuperUser()) { + return true; + } + } else { + $this->data_array =& db_fetch_array($res); + if (trim($this->data_array['admin_flags']) == 'A') { + $this->is_admin=true; + } else { + $this->setUpSuperUser(); + } + db_free_result($res); + return true; + } + } + + /** + * setUpSuperUser() - check to see if this User is a site super-user + * + * @return true/false + * @access private + */ + function setUpSuperUser() { + // + // see if they are a site super-user + // if not a member of this group + // + if ($this->isSuperUser()) { + $this->clearError(); + $this->is_admin = true; + return true; + } + + return false; + } + + /** + * getUser() - get the User object this Permission is associated with + * + * @return the User object + */ + function &getUser() { + return $this->User; + } + + /** + * getGroup() - get the Group object this ArtifactType is associated with + * + * @return the Group object + */ + function &getGroup() { + return $this->Group; + } + + /** + * isSuperUser() - whether the current user has site admin privilege + * + * @return true/false + */ + function isSuperUser() { + if (isset($this->is_site_admin)) { + return $this->is_site_admin; + } + + $res = db_query("SELECT * FROM user_group + WHERE user_id='". $this->User->getID() ."' + AND group_id='1' + AND admin_flags='A'"); + + if (!$res || db_numrows($res) < 1) { + $this->is_site_admin = false; + } else { + $this->is_site_admin = true; + } + + db_free_result($res); + return $this->is_site_admin; + } + + /** + * isForumAdmin() - whether the current user has form admin perms + * + * @return true/false + */ + function isForumAdmin() { + return $this->isMember('forum_flags',2); + } + + /** + * isDocEditor() - whether the current user has form doc editor perms + * + * @return true/false + */ + function isDocEditor() { + return $this->isMember('doc_flags',1); + } + + /** + * isReleaseTechnician() - whether the current user has FRS admin perms + * + * @return true/false + */ + function isReleaseTechnician() { + return $this->isMember('release_flags',1); + } + + /** + * useIsArtifactAdmin() - whether the current user has artifact admin perms + * + * @return true/false + */ + function isArtifactAdmin() { + return $this->isMember('artifact_flags',2); + } + + function isPMAdmin() { + return $this->isMember('project_flags',2); + } + + /** + * isMember() - Simple test to see if the current user is a member of this project + * + * Can optionally pass in vars to test other permissions + * + * @param string The field to check + * @param int The value that $field should have + * @return true/false + */ + function isMember($field='user_id',$value='-1') { + if ($this->isAdmin()) { + //admins are tested first so that super-users can return true + //and admins of a project should always have full privileges + //on their project + return true; + } else { + $arr =& $this->getPermData(); + if ($arr[$field] >= $value) { + return true; + } else { + return false; + } + } + } + + /** + * userIsAdmin() - User is an admin of the project or admin of the entire site + * + * @return true/false + */ + function isAdmin() { + return $this->is_admin; + } + + /** + * getPermData() - returns the assocative array from the db + * + * @return associative array + * @access private + */ + function &getPermData() { + return $this->data_array; + } +} + +?> diff --git a/gforge/common/include/Project.class b/gforge/common/include/Project.class new file mode 100644 index 0000000000..e5c1bb381b --- /dev/null +++ b/gforge/common/include/Project.class @@ -0,0 +1,147 @@ +getUnixName(); + * + * + * SourceForge: Breaking Down the Barriers to Open Source Development + * Copyright 1999-2001 (c) VA Linux Systems + * http://sourceforge.net + * + * @version $Id: Project.class,v 1.5 2001/06/06 21:30:03 dbrogdon Exp $ + * @author Tim Perdue + * @date 2000-08-28 + * + */ + +class Project extends Group { + + /** + * An array containing project data. + * + * @var array $project_data_array + */ + var $project_data_array; + + /** + * Project() - Constructor + * Basically just call the parent to set up everything + * + * @param int The project ID + * @param int An optional database resource ID + * + */ + function Project($id,$res=false) { + //echo "\n\nRows: ".db_numrows($res); + $this->Group($id,$res); + + //for right now, just point our prefs + //array at Group's data array + //this will change later when we split the + //project_data table off from groups table + $this->project_data_array=&$this->data_array; + } + + + /** + * usesCVS() - Returns whether a project uses CVS + * + */ + function usesCVS() { + return $this->project_data_array['use_cvs']; + } + + /** + * usesPM() - Returns whether a project uses Project Manager + * + */ + function usesPM() { + return $this->project_data_array['use_pm']; + } + + /** + * usesPmDependencies() - Returns whether a projected uses PM dependencies + * + */ + function usesPmDependencies() { + return $this->project_data_array['use_pm_depend_box']; + } + + /** + * getNewTaskAddress() - Returns the default address to which new task submissions are sent + * + */ + function getNewTaskAddress() { + return $this->project_data_array['new_task_address']; + } + + /** + * sendAllTaskUpdates() - Returns whether all task updates should be sent to the default address + * + * @see getNewTaskAddress() + * + */ + function sendAllTaskUpdates() { + return $this->project_data_array['send_all_tasks']; + } +} + +/** + * group_getname() - get the group name + * + * @param int The group ID + * @deprecated + * + */ +function group_getname ($group_id = 0) { + $grp = &group_get_object($group_id); + if ($grp) { + return $grp->getPublicName(); + } else { + return 'Invalid'; + } +} + +/** + * group_getunixname() - get the unixname for a group + * + * @param int The group ID + * @deprecated + * + */ +function group_getunixname ($group_id) { + $grp = &group_get_object($group_id); + if ($grp) { + return $grp->getUnixName(); + } else { + return 'Invalid'; + } +} + +/** + * group_get_result() - Get the group object result ID. + * + * @param int The group ID + * @deprecated + * + */ +function &group_get_result($group_id=0) { + $grp = &group_get_object($group_id); + if ($grp) { + return $grp->getData(); + } else { + return 0; + } +} + +?> diff --git a/gforge/common/include/User.class b/gforge/common/include/User.class new file mode 100644 index 0000000000..b95756aee2 --- /dev/null +++ b/gforge/common/include/User.class @@ -0,0 +1,1119 @@ +Error(); + if (!$id) { + //setting up an empty object + //probably going to call create() + return true; + } + $this->user_id=$id; + if (!$res) { + $this->db_result=db_query("SELECT * FROM users WHERE user_id='$id'"); + } else { + $this->db_result=$res; + } + if (db_numrows($this->db_result) < 1) { + //function in class we extended + $this->setError('User Not Found'); + $this->data_array=array(); + return false; + } else { + //set up an associative array for use by other functions + + db_reset_result($this->db_result); + + $this->data_array =& db_fetch_array($this->db_result); + } + $this->user_id=$this->data_array['user_id']; + $this->is_super_user=false; + $this->is_logged_in=false; + return true; + } + + /** + * create() - Create a new user + * + * @param string The unix username + * @param string The real username + * @param string The first password + * @param string The confirmation password + * @param string The users email address + * @param string The users preferred default language + * @param string The users preferred default timezone + * @param string The users preference for receiving site updates by email + * @param string The users preference for receiving community updates by email + * @param int The ID of the language preference + * @param string The users preferred timezone + * @returns The newly created user ID + * + */ + function create($unix_name,$realname,$password1,$password2,$email, + $mail_site,$mail_va,$language_id,$timezone) { + if (!$unix_name) { + $this->setError('You must supply a username'); + return false; + } + if (!$realname) { + $this->setError('You must supply a real name'); + return false; + } + if (!$password1) { + $this->setError('You must supply a password'); + return false; + } + if ($password1 != $password2) { + $this->setError('Passwords do not match'); + return false; + } + if (!account_pwvalid($password1)) { + $this->setError('Password must be at least 6 characters'); + return false; + } + $unix_name=strtolower($unix_name); + if (!account_namevalid($unix_name)) { + $this->setError('Invalid Unix Name. '); + return false; + } + if (!validate_email($email)) { + $this->setError('Invalid Email Address'); + return false; + } + if (db_numrows(db_query("SELECT user_id FROM users WHERE user_name LIKE '$unix_name'")) > 0) { + $this->setError('That username already exists.'); + return false; + } + if ($GLOBALS['sys_require_unique_email']) { + if (db_numrows(db_query("SELECT user_id FROM users WHERE email='$email'")) > 0) { + $this->setError('User with this email already exists - use people search to recover your login.'); + return false; + } + } + // if we got this far, it must be good + $confirm_hash = substr(md5($session_hash . $password1 . time()),0,16); + $result=db_query("INSERT INTO users (user_name,user_pw,unix_pw,realname,email,add_date, + status,confirm_hash,mail_siteupdates,mail_va,language,timezone) + VALUES ('$unix_name', + '". md5($password1) . "', + '". account_genunixpw($password1) . "', + '". "$realname', + '$email', + '" . time() . "', + 'P', + '$confirm_hash', + '". (($mail_site)?"1":"0") . "', + '". (($mail_va)?"1":"0") . "', + '$language_id', + '$timezone')"); + + $this->user_id = db_insertid($result,'users','user_id'); + + if (!$result || !$this->user_id) { + $this->setError('Insert Failed '.db_error()); + return false; + } else { + + // send mail + $this->refreshUserData(); + + $this->sendRegistrationEmail(); + + return $this->user_id; + } + } + + /** + * sendRegistrationEmail() - Send email for registration verification + * + * @return true or false + */ + function sendRegistrationEmail() { + $message = "Thank you for registering on the SourceForge web site. You have\n" + . "account with username '".$this->getUnixName()."' created for you. In order\n" + . "to complete your registration, visit the following url: \n\n" + . "getConfirmHash().">\n\n" + . "(If you don't see any URL above, it is likely due to bug in your mail client.\n" + . "Use one below, but make sure it is entered as the single line.)\n\n" + . "https://". $GLOBALS['sys_default_domain']."/account/verify.php?confirm_hash=_".$this->getConfirmHash()."\n\n" + . "Enjoy the site.\n\n" + . " -- the SourceForge staff\n"; + + mail( + $this->getEmail(), + "SourceForge Account Registration", + $message, + "From: noreply@".$GLOBALS['sys_default_domain'] + ); + } + + /** + * update() - update *common* properties of User object + * + * Use specific setter to change other properties + * + * @param string The users real name + * @param int The ID of the users language preference + * @param string The useres timezone preference + * @param string The users preference for receiving site updates by email + * @param string The users preference for receiving community updates by email + */ + function update($realname,$language_id,$timezone,$mail_site,$mail_va,$use_ratings) { + $mail_site = $mail_site ? 1 : 0; + $mail_va = $mail_va ? 1 : 0; + $block_ratings = !$use_ratings; + + $res = db_query(" + UPDATE users + SET + realname='$realname', + language='$language_id', + timezone='$timezone', + mail_siteupdates=$mail_site, + mail_va=$mail_va, + block_ratings='$block_ratings' + WHERE user_id='".$this->getID()."' + "); + + if (!$res) { + $this->setError('ERROR - Could Not Update User Object: '.db_error()); + return false; + } else { + // If there's a transaction from using to not + // using ratings, remove all rating made by the + // user (ratings by others should not be removed, + // as it opens possibility to abuse rate system) + if (!$use_ratings && $this->usesRatings()) { + vote_remove_all_ratings_by($this->getID()); + } + $this->refreshUserData(); + return true; + } + } + + /** + * getData() - Return database result handle for direct access + * + * Generally should NOT be used - here for supporting deprecated group.php + * @return database result set handle + */ + function getData() { + db_reset_result($this->db_result); + return $this->db_result; + } + + /** + * refreshUserData() - May need to refresh database fields + * + * if an update occurred and you need to access the updated info + */ + function refreshUserData() { + $this->db_result=db_query("SELECT * FROM users WHERE user_id='". $this->getID() ."'"); + $this->data_array=db_fetch_array($this->db_result); + return $this->db_result; + } + + /** + * getID() - Simply return the user_id for this object + * + * @return this user's user_id number + */ + function getID() { + return $this->user_id; + } + + /** + * getStatus() + * + * Statuses include (A)ctive, (P)ending, (S)uspended ,(D)eleted + * + * @return this user's status flag + */ + function getStatus() { + return $this->data_array['status']; + } + + /** + * setStatus() + * + * @param string Status - P, A, S, or D + * @sets user status + */ + function setStatus($status) { + + if ($status != 'P' && $status != 'A' + && $status != 'S' && $status != 'D') { + $this->setError('ERROR: Invalid status value'); + return false; + } + + db_begin(); + $res=db_query(" + UPDATE users + SET status='$status' + WHERE user_id='". $this->getID()."' + "); + + if (!$res) { + $this->setError('ERROR - Could Not Update User Status: '.db_error()); + db_rollback(); + return false; + } else { + $this->data_array['status']=$status; + if ($status == 'D') { + // Remove this user from all groups + $res = db_query(" + DELETE FROM user_group + WHERE user_id='".$this->getID()."' + "); + if (!$res) { + $this->setError('ERROR - Could Not Propogate Deleted Status: '.db_error()); + db_rollback(); + return false; + } + } + db_commit(); + return true; + } + } + + /** + * isActive() + * + * Database field status of 'A' returns true + * @return true or false + */ + function isActive() { + if ($this->getStatus()=='A') { + return true; + } else { + return false; + } + } + + /** + * getUnixStatus() - Status of activation of unix account + * + * @return (N)one, (A)ctive, (S)uspended or (D)eleted + */ + function getUnixStatus() { + return $this->data_array['unix_status']; + } + + /** + * setUnixStatus() - Sets status of activation of unix account + * + * @param string The unix tatus + * @return true/false + */ + function setUnixStatus($status) { + db_begin(); + $res=db_query(" + UPDATE users + SET unix_status='$status' + WHERE user_id='". $this->getID()."' + "); + + if (!$res) { + $this->setError('ERROR - Could Not Update User Unix Status: '.db_error()); + db_rollback(); + return false; + } else { + if ($status == 'A') { + if (!sf_ldap_check_create_user($this->getID())) { + $this->setError(sf_ldap_get_error_msg()); + db_rollback(); + return false; + } + } else { + if (sf_ldap_check_user($this->getID())) { + if (!sf_ldap_remove_user($this->getID())) { + $this->setError(sf_ldap_get_error_msg()); + db_rollback(); + return false; + } + } + } + + $this->data_array['unix_status']=$status; + db_commit(); + return true; + } + } + + /** + * getUnixName() + * + * @return this user's unix/login name + */ + function getUnixName() { + return strtolower($this->data_array['user_name']); + } + + /** + * getUnixPasswd() + * + * @return this user's unix crypted passwd + */ + function getUnixPasswd() { + return $this->data_array['unix_pw']; + } + + /** + * getUnixBox() + * + * @return this user's shell login machine + */ + function getUnixBox() { + return $this->data_array['unix_box']; + } + + /** + * getMD5Passwd() + * + * @return this user's MD5-crypted passwd + */ + function getMD5Passwd() { + return $this->data_array['user_pw']; + } + + /** + * getConfirmHash() + * + * @return this user's confirmation hash + */ + function getConfirmHash() { + return $this->data_array['confirm_hash']; + } + + /** + * getEmail() + * + * @return this user's email address + */ + function getEmail() { + return $this->data_array['email']; + } + + /** + * getNewEmail() + * + * getNewEmail is a private operation for email change + * + * @return this user's new (not yet confirmed) email address + * @private + */ + function getNewEmail() { + return $this->data_array['email_new']; + } + + /** + * setEmail() + * + * @param string The email address + * @sets user's email address + */ + function setEmail($email) { + if (!$email || !validate_email($email)) { + $this->setError('ERROR: Invalid Email'); + return false; + } + $res=db_query(" + UPDATE users + SET email='$email' + WHERE user_id='". $this->getID()."' + "); + + if (!$res) { + $this->setError('ERROR - Could Not Update User Email: '.db_error()); + return false; + } else { + $this->data_array['email'] = $email; + return true; + } + } + + /** + * setNewEmailAndHash() + * + * setNewEmailAndHash is a private operation for email change + * + * @param string The email address + * @param string The emial hash + * @sets record of user's new email address and confirmation hash + */ + function setNewEmailAndHash($email, $hash='') { + + if (!$hash) { + $hash = substr(md5(strval(time()) . strval(mt_rand())), 0, 16); + } + + if (!$email || !validate_email($email)) { + $this->setError('ERROR - Invalid Email'); + return false; + } + + $res=db_query(" + UPDATE users + SET confirm_hash='$hash', + email_new='$email' + WHERE user_id='".$this->getID()."' + "); + + if (!$res) { + $this->setError('ERROR - Could Not Update User Email And Hash: '.db_error()); + return false; + } else { + $this->data_array['email_new'] = $email; + $this->data_array['confirm_hash'] = $hash; + return true; + } + } + + /** + * getRealName() + * + * @return this user's real name + */ + function getRealName() { + return $this->data_array['realname']; + } + + /** + * getAddDate() + * + * @return this user's unix time since account was opened + */ + function getAddDate() { + return $this->data_array['add_date']; + } + + /** + * getTimeZone() + * + * @return this user's timezone setting + */ + function getTimeZone() { + return $this->data_array['timezone']; + } + + /** + * getShell() + * + * @return this user's preferred shell + */ + function getShell() { +?>data_array['shell']; + } + + /** + * setShell() + * + * @param string The users preferred shell + * @sets user's preferred shell + */ + function setShell($shell) { + $shells = file('/etc/shells'); + $out_shells = array(); + foreach ($shells as $s) { + if (substr($s, 0, 1) == '#') { + continue; + } + $out_shells[] = chop($s); + } + if (!in_array($shell, $out_shells)) { + $this->setError('ERROR: Invalid Shell'); + return false; + } + + db_begin(); + $res=db_query(" + UPDATE users + SET shell='$shell' + WHERE user_id='". $this->getID()."' + "); + + if (!$res) { + $this->setError('ERROR - Could Not Update User Unix Shell: '.db_error()); + db_rollback(); + return false; + } else { + // Now change LDAP attribute, but only if corresponding + // entry exists (i.e. if user have shell access) + if (sf_ldap_check_user($this->getID())) + { + if (!sf_ldap_user_set_attribute($this->getID(),"loginShell",$shell)) { + $this->setError(sf_ldap_get_error_msg()); + db_rollback(); + return false; + } + } + $this->data_array['shell']=$shell; + } + db_commit(); + return true; + } + + /** + * getUnixUid() + * + * @return this user's unix_uid + */ + function getUnixUID() { + return $this->data_array['unix_uid']; + } + + /** + * getLanguage() + * + * @return this user's language_id + */ + function getLanguage() { + return $this->data_array['language']; + } + + /** + * getAuthorizedKeys() + * + * @return this user's SSH authorized (public) keys + */ + function getAuthorizedKeys() { + return ereg_replace("###", "\n", $this->data_array['authorized_keys']); + } + + /** + * setAuthorizedKeys() + * + * @param string The users public keys + * @sets this user's SSH authorized (public) keys + */ + function setAuthorizedKeys($keys) { + $keys = trim($keys); + $keys = ereg_replace("(\r\n)|(\n)", "###", $keys); + + $res=db_query(" + UPDATE users + SET authorized_keys='$keys' + WHERE user_id='".$this->getID()."' + "); + + if (!$res) { + $this->setError('ERROR - Could Not Update User SSH Keys: '.db_error()); + return false; + } else { + $this->data_array['authorized_keys']=$keys; + return true; + } + } + + /** + * getAuthorizedKeys() + * + * @return this user's SSH authorized (public) keys + */ + function getAuthorizedKeys() { + return ereg_replace("###", "\n", $this->data_array['authorized_keys']); + } + + /** + * setAuthorizedKeys() + * + * @param string The users public keys + * @sets this user's SSH authorized (public) keys + */ + function setAuthorizedKeys($keys) { + $keys = trim($keys); + $keys = ereg_replace("(\r\n)|(\n)", "###", $keys); + + $res=db_query(" + UPDATE users + SET authorized_keys='$keys' + WHERE user_id='".$this->getID()."' + "); + + if (!$res) { + $this->setError('ERROR - Could Not Update User SSH Keys'); + return false; + } else { + $this->data_array['authorized_keys'] = $keys; + return true; + } + } + + /** + * setLoggedIn($val) - Really only used by session code + * + * @param bool The session value + */ + function setLoggedIn($val=true) { + $this->is_logged_in=$val; + if ($val) { + //if this is the logged in user - + //see if they are a super user + $sql="SELECT * FROM user_group ". + "WHERE user_id='". $this->getID() ."' AND group_id='1' AND admin_flags='A'"; + $result=db_query($sql); + if (!$result || db_numrows($result) < 1) { + $this->is_super_user=false; + } else { + $this->is_super_user=true; + } + } + } + + /** + * isLoggedIn() + * + * @return true or false + */ + function isLoggedIn() { + return $this->is_logged_in; + } + + /** + * setPreference($preference_name,$value) + * + * @param string Tthe unique field name for this preference + * @param string The value you are setting this preference to + * @return true or false on failure + */ + function setPreference($preference_name,$value) { + $preference_name=strtolower(trim($preference_name)); + $result=db_query("UPDATE user_preferences SET preference_value='$value',set_date='". time() ."' ". + "WHERE user_id='". $this->getID() ."' ". + "AND preference_name='$preference_name'"); + if (db_affected_rows($result) < 1) { + //echo db_error(); + $result=db_query("INSERT INTO user_preferences (user_id,preference_name,preference_value,set_date) ". + "VALUES ('". $this->getID() ."','$preference_name','$value','". time() ."')"); + return $result; + } + } + + /** + * getPreference($preference_name) + * + * @param string The unique field name for this preference + * @return the preference or false on failure + */ + function getPreference($preference_name) { + $preference_name=strtolower(trim($preference_name)); + /* + First check to see if we have already fetched the preferences + */ + if ($this->user_pref) { + //echo "\n\nPrefs were fetched already"; + if ($this->user_pref["$preference_name"]) { + //we have fetched prefs - return part of array + return $this->user_pref["$preference_name"]; + } else { + //we have fetched prefs, but this pref hasn't been set + return false; + } + } else { + //we haven't returned prefs - go to the db + $result=db_query("SELECT preference_name,preference_value FROM user_preferences ". + "WHERE user_id='". $this->getID() ."'"); + if (db_numrows($result) < 1) { + //echo "\n\nNo Prefs Found"; + return false; + } else { + $pref=array(); + //iterate and put the results into an array + for ($i=0; $iuser_pref =& $pref; + + if ($this->user_pref["$preference_name"]) { + //we have fetched prefs - return part of array + return $this->user_pref["$preference_name"]; + } else { + //we have fetched prefs, but this pref hasn't been set + return false; + } + } + } + } + + /** + * setUpUnixUID() - Sets up this user's unix_uid for shell access + * + * @return true on success false on failure + */ + function setUpUnixUID() { + global $sys_database_type; + if ($this->getUnixUID() > 1) { + // + // already have unix_uid + // + return true; + } + //get the next unix uid + + /* + hack to simulate sequences in mysql + */ + if ($sys_database_type=='mysql') { + $res=db_query("INSERT INTO unix_uids (id) values ('')"); + $unixid=db_insertid($res,'unix_uids','id'); + db_free_result($res); + } else { + $res=db_query("SELECT nextval('unix_uid_seq')"); + $unixid=db_result($res,0,0); + db_free_result($res); + } + if (!$unixid) { + $this->setError('ERROR - Could Not Get Next Unix UID'); + return false; + } else { + $res=db_query(" + UPDATE users + SET unix_status='A',unix_uid='$unixid' + WHERE user_id='". $this->getID()."' + "); + + if (!$res || db_affected_rows($res) < 1) { + $this->setError('ERROR - Could Not Update User Account Flags: '.db_error()); + return false; + } else { + $this->data_array['unix_uid'] = $unixid; + return true; + } + } + } + + /** + * setPasswd($passwd) - Changes user's password + * + * @param string The plaintext password + * @return true on success false on failure + */ + function setPasswd($passwd) { + if (!account_pwvalid($passwd)) { + $this->setError('Error: '.$GLOBALS['register_error']); + return false; + } + + db_begin(); + $unix_pw = account_genunixpw($passwd); + + $res=db_query(" + UPDATE users + SET user_pw='" . md5($passwd) . "', + unix_pw='$unix_pw' + WHERE user_id='".$this->getID()."' + "); + + if (!$res || db_affected_rows($res) < 1) { + $this->setError('ERROR - Could Not Change User Password: '.db_error()); + db_rollback(); + return false; + } else { + // Now change LDAP password, but only if corresponding + // entry exists (i.e. if user have shell access) + if (sf_ldap_check_user($this->getID())) + { + if (!sf_ldap_user_set_attribute($this->getID(),"userPassword",'{crypt}'.$unix_pw)) { + $this->setError(sf_ldap_get_error_msg()); + db_rollback(); + return false; + } + } + } + db_commit(); + return true; + } + + /** + * usesRatings() - whether user participates in rating system + * + * @return true/false + */ + function usesRatings() { + return !$this->data_array['block_ratings']; + } + + /** + * getMailingsPrefs($mailing_id) - Get activity status for one of the site mailings + * + * @param string The id of mailing ('mail_va' for community mailings, 'mail_siteupdates' for site mailings) + * @return true/false + */ + function getMailingsPrefs($mailing_id) { + if ($mailing_id=='va') { + return $this->data_array['mail_va']; + } else if ($mailing_id=='site') { + return $this->data_array['mail_siteupdates']; + } else { + return 0; + } + } + + /** + * unsubscribeFromMailings($all) - Disable email notifications for user + * + * @param bool If false, disable general site mailings, else - all + * @return true on success false on failure + */ + function unsubscribeFromMailings($all=false) { + $res1 = $res2 = $res3 = true; + $res1 = db_query(" + UPDATE users + SET mail_siteupdates=0, + mail_va=0 + WHERE user_id='".$this->getID()."' + "); + if ($all) { + $res2 = db_query(" + DELETE FROM forum_monitored_forums + WHERE user_id='".$this->getID()."' + "); + $res3 = db_query(" + DELETE FROM filemodule_monitor + WHERE user_id='".$this->getID()."' + "); + } + + return $res1 && $res2 && $res3; + } + +} + +/* + + + + + EVERYTHING BELOW HERE IS DEPRECATED + + + DO NOT USE FOR ANY NEW CODE + + + +*/ + + + +/** + * user_ismember() - DEPRECATED; DO NOT USE! + * + * @param int The Group ID + * @param int The Type + * @deprecated + * + */ +function user_ismember($group_id,$type=0) { + if (!user_isloggedin()) { + return false; + } + + $project =& group_get_object($group_id); + + if (!$project || !is_object($project)) { + return false; + } + + $perm =& $project->getPermission( session_get_user() ); + if (!$perm || !is_object($perm) || !$perm->isMember()) { + return false; + } + + $type=strtoupper($type); + + switch ($type) { + case 'P2' : { + //pm admin + return $perm->isPMAdmin(); + break; + } + case 'F2' : { + //forum admin + return $perm->isForumAdmin(); + break; + } + case '0' : { + //just in this group + return $perm->isMember(); + break; + } + case 'A' : { + //admin for this group + return $perm->isAdmin(); + break; + } + case 'D1' : { + //document editor + return $perm->isDocEditor(); + break; + } + default : { + //fubar request + return false; + } + } + return false; +} + +/** + * user_getname() - DEPRECATED; DO NOT USE! + * + * @param int The User ID + * @deprecated + * + */ +function user_getname($user_id = false) { + // use current user if one is not passed in + if (!$user_id) { + if (user_isloggedin()) { + $user=&user_get_object(user_getid()); + if ($user) { + return $user->getUnixName(); + } else { + return 'Error getting user'; + } + } else { + return 'No User Id'; + } + } else { + $user=&user_get_object($user_id); + if ($user) { + return $user->getUnixName(); + } else { + return 'Invalid User'; + } + } +} + +?> diff --git a/gforge/common/include/account.php b/gforge/common/include/account.php new file mode 100644 index 0000000000..8a09d1ce7b --- /dev/null +++ b/gforge/common/include/account.php @@ -0,0 +1,203 @@ + 0) { + $GLOBALS['register_error'] = "There cannot be any spaces in the login name."; + return 0; + } + + // min and max length + if (strlen($name) < 3) { + $GLOBALS['register_error'] = "Name is too short. It must be at least 3 characters."; + return 0; + } + if (strlen($name) > 15) { + $GLOBALS['register_error'] = "Name is too long. It must be less than 15 characters."; + return 0; + } + + if (!ereg('^[a-z][-a-z0-9_]+$', $name)) { + $GLOBALS['register_error'] = "Illegal character in name."; + return 0; + } + + // illegal names + if (eregi("^((root)|(bin)|(daemon)|(adm)|(lp)|(sync)|(shutdown)|(halt)|(mail)|(news)" + . "|(uucp)|(operator)|(games)|(mysql)|(httpd)|(nobody)|(dummy)" + . "|(www)|(cvs)|(shell)|(ftp)|(irc)|(debian)|(ns)|(download))$",$name)) { + $GLOBALS['register_error'] = "Name is reserved."; + return 0; + } + if (eregi("^(anoncvs_)",$name)) { + $GLOBALS['register_error'] = "Name is reserved for CVS."; + return 0; + } + + return 1; +} + +/** + * account_groupnamevalid() - Validates an account group name + * + * @param string The group name string + * @returns true on success/false on failure + * + */ +function account_groupnamevalid($name) { + if (!account_namevalid($name)) return 0; + + // illegal names + if (eregi("^((www[0-9]?)|(cvs[0-9]?)|(shell[0-9]?)|(ftp[0-9]?)|(irc[0-9]?)|(news[0-9]?)" + . "|(mail[0-9]?)|(ns[0-9]?)|(download[0-9]?)|(pub)|(users)|(compile)|(lists)" + . "|(slayer)|(orbital)|(tokyojoe)|(webdev)|(projects)|(cvs)|(slayer)|(monitor)|(mirrors?))$",$name)) { + $GLOBALS['register_error'] = "Name is reserved for DNS purposes."; + return 0; + } + + if (eregi("_",$name)) { + $GLOBALS['register_error'] = "Group name cannot contain underscore for DNS reasons."; + return 0; + } + + return 1; +} + +/** + * rannum() - Generate a random number + * + * This is a local function used for account_salt() + * + * @return int $num A random number + * + */ +function rannum(){ + mt_srand((double)microtime()*1000000); + $num = mt_rand(46,122); + return $num; +} + +/** + * genchr() - Generate a random character + * + * This is a local function used for account_salt() + * + * @return int $num A random character + * + */ +function genchr(){ + do { + $num = rannum(); + } while ( ( $num > 57 && $num < 65 ) || ( $num > 90 && $num < 97 ) ); + $char = chr($num); + return $char; +} + +/** + * account_gensalt() - A random salt generator + * + * @returns The random salt string + * + */ +function account_gensalt(){ + + $a = genchr(); + $b = genchr(); + $salt = "$1$" . "$a$b"; + return $salt; +} + +/** + * account_genunixpw() - Generate unix password + * + * @param string The plaintext password string + * @return The encrypted password + * + */ +function account_genunixpw($plainpw) { + return crypt($plainpw,account_gensalt()); +} + +/** + * account_shellselects() - Print out shell selects + * + * @param string The current shell + * + */ +function account_shellselects($current) { + $shells = file("/etc/shells"); + + for ($i = 0; $i < count($shells); $i++) { + $this_shell = chop($shells[$i]); + + if ($current == $this_shell) { + echo "\n"; + } else { + echo "\n"; + } + } +} + +/** + * account_user_homedir() - Returns full path of user home directory + * + * @param string The username + * @return home directory path + */ +function account_user_homedir($user) { + return '/home/users/'.substr($user,0,1).'/'.substr($user,0,2).'/'.$user; +} + +/** + * account_group_homedir() - Returns full path of group home directory + * + * @param string The group name + * @return home directory path + */ +function account_group_homedir($group) { + return '/home/groups/'.substr($group,0,1).'/'.substr($group,0,2).'/'.$group; +} + +/** + * account_group_cvsweb_url() - Returns URL for group's CVS interface WWW + * + * @param string The group name + * @return URL to access CVS over HTTP + */ +function account_group_cvsweb_url($group) { + return 'http://'.$GLOBALS['sys_cvs_host'].'/cgi-bin/viewcvs.cgi/'.$group; +} + +?> diff --git a/gforge/common/include/database.php b/gforge/common/include/database.php new file mode 100644 index 0000000000..e2ad2d0010 --- /dev/null +++ b/gforge/common/include/database.php @@ -0,0 +1,305 @@ + 0) { + if (!$offset || $offset < 0) { + $offset=0; + } + $qstring=$qstring." LIMIT $limit OFFSET $offset"; + } + + $GLOBALS['G_DEBUGQUERY'] .= $qstring .' |'.$dbserver.''. "

\n"; + return @pg_exec($dbserver,$qstring); +} + +/* Current transaction level, private variable */ +/* FIXME: Having scalar variable for transaction level is + no longer correct after multiple database (dbservers) support + introduction. However, it is true that in one given PHP + script, at most one db is modified, so this works for now. */ +$_sys_db_transaction_level = 0; + +/** + * db_begin() - Begin a transaction. + * + * @param constant Database server (SYS_DB_PRIMARY, SYS_DB_STATS, SYS_DB_TROVE, SYS_DB_SEARCH) + * @return true. + */ +function db_begin($dbserver=SYS_DB_PRIMARY) { + global $_sys_db_transaction_level; + + // start database transaction only for the top-level + // programmatical transaction + $_sys_db_transaction_level++; + if ($_sys_db_transaction_level == 1) { + return db_query("BEGIN WORK", -1, 0, $dbserver); + } + + return true; +} + +/** + * db_commit() - Commit a transaction. + * + * @param constant Database server (SYS_DB_PRIMARY, SYS_DB_STATS, SYS_DB_TROVE, SYS_DB_SEARCH) + * @return true on success/false on failure. + */ +function db_commit($dbserver=SYS_DB_PRIMARY) { + global $_sys_db_transaction_level; + + // check for transaction stack underflow + if ($_sys_db_transaction_level == 0) { + echo "COMMIT underflow
"; + return false; + } + + // commit database transaction only when top-level + // programmatical transaction ends + $_sys_db_transaction_level--; + if ($_sys_db_transaction_level == 0) { + return db_query("COMMIT", -1, 0, $dbserver); + } + + return true; +} + +/** + * db_rollback() - Rollback a transaction. + * + * @param constant Database server (SYS_DB_PRIMARY, SYS_DB_STATS, SYS_DB_TROVE, SYS_DB_SEARCH) + * @return true on success/false on failure. + */ +function db_rollback($dbserver=SYS_DB_PRIMARY) { + global $_sys_db_transaction_level; + + // check for transaction stack underflow + if ($_sys_db_transaction_level == 0) { + echo "ROLLBACK underflow
"; + return false; + } + + // rollback database transaction only when top-level + // programmatical transaction ends + $_sys_db_transaction_level--; + if ($_sys_db_transaction_level == 0) { + return db_query("ROLLBACK", -1, 0, $dbserver); + } + + return true; +} + +/** + * db_numrows() - Returns the number of rows in this result set. + * + * @param int Query result set handle. + * @return int number of rows. + */ + +function db_numrows($qhandle) { + return @pg_numrows($qhandle); +} + +/** + * db_free_result() - Frees a database result properly. + * + * @param int Query result set handle. + */ +function db_free_result($qhandle) { + return @pg_freeresult($qhandle); +} + +/** + * db_reset_result() - Reset is useful for db_fetch_array + * sometimes you need to start over. + * + * @param int Query result set handle. + * @param integer Row number. + * @return int row. + */ +function db_reset_result($qhandle,$row=0) { + global $sys_db_row_pointer; + return $sys_db_row_pointer[$qhandle]=$row; +} + +/** + * db_result() - Returns a field from a result set. + * + * @param int Query result set handle. + * @param integer Row number. + * @param string Field name. + * @return contents of field from database. + */ +function db_result($qhandle,$row,$field) { + return @pg_result($qhandle,$row,$field); +} + +/** + * db_numfields() - Returns the number of fields in this result set. + * + * @param int Query result set handle. + */ +function db_numfields($lhandle) { + return @pg_numfields($lhandle); +} + +/** + * db_fieldname() - Returns the number of rows changed in the last query. + * + * @param int Query result set handle. + * @param int Column number. + * @return text name of the field. + */ +function db_fieldname($lhandle,$fnumber) { + return @pg_fieldname($lhandle,$fnumber); +} + +/** + * db_affected_rows() - Returns the number of rows changed in the last query. + * + * @param int Query result set handle. + * @return int number of affected rows. + */ +function db_affected_rows($qhandle) { + return @pg_cmdtuples($qhandle); +} + +/** + * db_fetch_array() - Returns an associative array from + * the current row of this database result + * Use db_reset_result to seek a particular row. + * + * @param int Query result set handle. + * @return associative array of fieldname/value key pairs. + */ +function db_fetch_array($qhandle) { + global $sys_db_row_pointer; + $sys_db_row_pointer[$qhandle]++; + return @pg_fetch_array($qhandle,($sys_db_row_pointer[$qhandle]-1)); +} + +/** + * db_insertid() - Returns the last primary key from an insert. + * + * @param int Query result set handle. + * @param string table_name is the name of the table you inserted into. + * @param string pkey_field_name is the field name of the primary key. + * @param string Server to which original query was made + * @return int id of the primary key or 0 on failure. + */ +function db_insertid($qhandle,$table_name,$pkey_field_name,$dbserver=SYS_DB_PRIMARY) { + $oid=@pg_getlastoid($qhandle); + if ($oid) { + $sql="SELECT $pkey_field_name AS id FROM $table_name WHERE oid='$oid'"; + //echo $sql; + $res=db_query($sql, -1, 0, $dbserver); + if (db_numrows($res) >0) { + return db_result($res,0,'id'); + } else { + // echo "No Rows Matched"; + // echo db_error(); + return 0; + } + } else { +// echo "No OID"; +// echo db_error(); + return 0; + } +} + +/** + * db_error() - Returns the last error from the database. + * + * @param constant Database server (SYS_DB_PRIMARY, SYS_DB_STATS, SYS_DB_TROVE, SYS_DB_SEARCH) + * @return text error message. + */ +function db_error($dbserver=SYS_DB_PRIMARY) { + return @pg_errormessage($dbserver); +} + +/** + * system_cleanup() - In the future, we may wish to do a number + * of cleanup functions at script termination. + * + * For now, we just abort any in-process transaction. + */ +function system_cleanup() { + global $_sys_db_transaction_level; + if ($_sys_db_transaction_level > 0) { + echo "Open transaction detected!!!"; + db_query("ROLLBACK"); + } +} + +?> diff --git a/gforge/common/include/jpcache.php b/gforge/common/include/jpcache.php new file mode 100644 index 0000000000..57ade29ebd --- /dev/null +++ b/gforge/common/include/jpcache.php @@ -0,0 +1,368 @@ + + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +/* + Credits: + + Most things taken from + phpCache v1.2 (http://www.0x00.org/phpCache) + gzdoc.php and + jr-cache.php + + Inspired by the following threads: + http://www.aota.net/ubb/Forum15/HTML/000738-1.html + http://www.aota.net/ubb/Forum15/HTML/000746-1.html + http://www.aota.net/ubb/Forum15/HTML/000749-1.html + + Note: + I do not claim anything. + Just a first try to 'release' something under the GPL. + + More info on http://www.weirdpier.com/jpcache/ + + +-- +-- Table for new caching system +-- +CREATE TABLE cache_store ( +name varchar(255), +data text, +indate int not null default 0 +); + +CREATE UNIQUE INDEX cachestore_name ON cache_store(name); + + */ + +/******************************************************************************/ + + $CACHE_TIME=900; // Default: 900 - number seconds to cache + $CACHE_DEBUG=0; // Default: 0 - Turn debugging on/off + $SINGLE_SITE=1; // Default: 1 - No servername in file + $CACHE_POST=0; // Default: 0 - don't cache when HTTP_POST_VARS present + $CACHE_COOKIE=0; // Default: 0 - don't cache when HTTP_COOKIE_VARS present + $CACHE_ON=1; // Default: 1 - Turn caching on/off + $CACHE_USE_GZIP=1; // Default: 0 - Whether or not to use GZIP + + define(CACHE_DIR, "/tmp"); // Default: /tmp - Default cache directory + define(CACHE_GC, .1); // Default: 1 - Probability of garbage collection (i.e: 1%) + +/******************************************************************************/ + + + /* This resets the cache state */ + function cache_reset() + { + global $cache_file, $cache_data; + $cache_file = NULL; + $cache_data = array(); + } + + /* duh ? */ + function cache_debug($s) { + global $CACHE_DEBUG,$cache_debug_comments; + if ($CACHE_DEBUG) { + header("X-Debug: $s"); + } + $cache_debug_comments .= "\n".$s; + } + + /* Returns the default key used by the helper functions */ + function cache_default_key() + { + global $HTTP_POST_VARS, $HTTP_GET_VARS, $HTTP_COOKIE_VARS, $REQUEST_URI; + return md5("POST=" . serialize($HTTP_POST_VARS) . " GET=" . serialize($HTTP_GET_VARS) . " COOKIE=" . serialize($HTTP_COOKIE_VARS) . $REQUEST_URI ); + } + + /* Returns the default object used by the helper functions */ + function cache_default_object() + { + global $SCRIPT_URI, $SERVER_NAME, $SCRIPT_NAME, $SINGLE_SITE; + + if ($SINGLE_SITE) { + $name=$SCRIPT_NAME; + } else { + $name=$SCRIPT_URI; + } + + if ($name=="") { + $name="http://$SERVER_NAME/$SCRIPT_NAME"; + } + return $name; + } + + /* This is the function that writes out the cache */ + function cache_write($file, $data) + { + global $CACHE_TIME,$CACHE_ON; + + if (!$CACHE_ON || $CACHE_TIME < 1) { + cache_debug("Not caching, CACHE_ON is off"); + return 0; + } + + db_begin(); + + // + // Get a lock on this object in the db + // + $res=db_query("SELECT * + FROM cache_store + WHERE + name='$file' + FOR UPDATE"); + + if (!$res || db_numrows($res) < 1) { + $res=db_query("INSERT INTO cache_store (name,data,indate) + VALUES ('$file','". addslashes($data) ."','". time() ."')"); + // + // Assume it worked - it may have been rejected by the UNIQUE INDEX + // but that just means another thread inserted in the meantime + // + db_commit(); + return true; + } else { + // + // See if we still need to update or not... + // + if (db_result($res,0,'indate') > (time()-$CACHE_TIME)) { + // + // Another thread updated the db already.... + // + db_commit(); + return true; + } else { + $res=db_query("UPDATE cache_store + SET + data='". addslashes($data) ."', + indate='". time() ."' + WHERE + name='$file'"); + // + // Assume it worked - it may have been rejected by the UNIQUE INDEX + // but that just means another thread inserted in the meantime + // + db_commit(); + return true; + } + + } + return TRUE; + } + + /* This function reads in the cache, duh */ + function cache_read($file) + { + global $CACHE_TIME; + $res=db_query("SELECT data + FROM cache_store + WHERE + name='$file' + AND indate > '". (time()-$CACHE_TIME) ."'"); + return db_result($res,0,'data'); + } + + /* Cache garbage collection */ + function cache_gc() + { + global $CACHE_TIME; + + if (CACHE_GC>0) { + mt_srand(time(NULL)); + $precision=100000; + $r=(mt_rand()%$precision)/$precision; + if ($r >= (CACHE_GC/100)) { + return false; + } else { + db_query("DELETE FROM cache_store WHERE indate < '". (time()-$CACHE_TIME) ."'"); + } + } + } + + /* + Caches $object based on $key for $cachetime, will return 0 if the + object has expired or the object does not exist. + */ + function check_cache() + { + global $cache_file, $cache_data, $gzcontent, $CACHE_ON; + + if (!$CACHE_ON) { + cache_debug("Not caching, CACHE_ON is off"); + return false; + } + + $cache_file=eregi_replace("[^A-Z,0-9,=]", "_", cache_default_object()); + $key=eregi_replace("[^A-Z,0-9,=]", "_", cache_default_key()); + + cache_debug("Caching based on OBJECT=$cache_file KEY=$key"); + + $cache_file=$cache_file . ":" . $key; + + // Can we access the cache_file ? + if ($buff=cache_read($cache_file)) { + cache_debug("Opened the cache file"); + return $buff; + } else { + // No cache file (yet) or unable to read + cache_debug("No previous cache of $cache_file or unable to read"); + + // If we came here: start caching! + + return false; + } + } + + /* + Sets the handler + */ + function cache_start() + { + global $CACHE_ON,$CACHE_POST,$CACHE_COOKIE,$CACHE_TIME,$cache_debug_comments; + + // + // If you chose not to cache when POST occurs, force cache off + // + if (!$CACHE_POST && (count($HTTP_POST_VARS) > 0)) { + $CACHE_ON = 0; + $CACHE_TIME = -1; + } + + // + // If you chose not to cache when COOKIES present, force cache off + // + if (!$CACHE_COOKIE && (count($HTTP_COOKIE_VARS) > 0)) { + $CACHE_ON = 0; + $CACHE_TIME = -1; + } + + // + // CACHE_TIME of -1 disables caching, just using gzip if possible + // + if ($CACHE_TIME == -1) { + $CACHE_ON=0; + } + + // Reset + cache_reset(); + + // Check cache + if ($et=check_cache()) { + // Cache is valid: flush it! + $size = strlen($et); + $crc32 = crc32($et); + print cache_flush($et, $size, $crc32); +//exec("/bin/echo \"$cache_debug_comments\" >> /tmp/out.txt"); + exit; + } else { + cache_gc(); + + // Start a new cache file + ob_start("cache_end"); + ob_implicit_flush(0); + } +//exec("/bin/echo \"$cache_debug_comments\" >> /tmp/out.txt"); + } + + /* Are we capable of receiving gzipped data ? + * + * Returns the encoding that is accepted. Maybe additional check for Mac ? + */ + function cache_get_encoding() { + global $HTTP_ACCEPT_ENCODING; + if (headers_sent() || connection_aborted()) { + return false; + } + if (strpos($HTTP_ACCEPT_ENCODING,'x-gzip') !== false) { + return "x-gzip"; + } + if (strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false) { + return "gzip"; + } + return false; + } + + /* cache_flush() + * + * Responsible for final flushing everything. + * Sets ETag-headers and returns "Not modified" when possible + * + * When ETag doesn't match (or is invalid), it is tried to send + * the gzipped data. If that is also not possible, we sadly have to + * uncompress... + */ + function cache_flush($contents, $size, $crc32) + { + global $HTTP_SERVER_VARS,$CACHE_USE_GZIP; + + // First check if we can send last-modified + $myETag = "\"jpd-$crc32.$size\""; + header("ETag: $myETag"); + $foundETag = stripslashes($HTTP_SERVER_VARS["HTTP_IF_NONE_MATCH"]); + $ret = NULL; + + if (strstr($foundETag, $myETag)) { + // Not modified! + header("HTTP/1.0 304"); + } else { + if ($CACHE_USE_GZIP) { + $ENCODING = cache_get_encoding(); + if ($ENCODING) { + // compressed output + $contents = gzcompress($contents, 9); + header("Content-Encoding: $ENCODING"); + $ret = "\x1f\x8b\x08\x00\x00\x00\x00\x00"; + $ret .= substr($contents, 0, strlen($contents) - 4); + $ret .= pack('V',$crc32); + $ret .= pack('V',$size); + } else { + // Darn, we need to uncompress :( + $ret = $contents; + } + } else { + $ret=$contents; + } + } + return $ret; + } + + /** + * cache_end() + * + * This one is called by the callback-funtion of the ob_start + */ + function cache_end($contents) + { + cache_debug("Callback happened"); + global $size, $cache_file, $crc32; + + $size = strlen($contents); + $crc32 = crc32($contents); + + // write the cache + cache_write($cache_file,$contents); + + // Return flushed data + return cache_flush($contents, $size, $crc32); + } + + cache_start(); +?> diff --git a/gforge/common/include/ldap.php b/gforge/common/include/ldap.php new file mode 100644 index 0000000000..b7eb34ca1c --- /dev/null +++ b/gforge/common/include/ldap.php @@ -0,0 +1,776 @@ +'); + return false; + } + ldap_bind($ldap_conn,$sys_ldap_bind_dn,$sys_ldap_passwd); + } + return true; +} + +/** + * sf_ldap_add() - Wrapper for ldap_add() + * + * @param string dn + * @param string entry + * + */ +function sf_ldap_add($dn, $entry) { + global $ldap_conn; + return @ldap_add($ldap_conn,$dn,$entry); +} + +/** + * sf_ldap_delete() - Wrapper for ldap_delete() + * + * @param string dn + * + */ +function sf_ldap_delete($dn) { + global $ldap_conn; + return @ldap_delete($ldap_conn,$dn); +} + +/** + * sf_ldap_modify() - Wrapper for ldap_modify() + * + * @param string dn + * @param string entry + * + */ +function sf_ldap_modify($dn,$entry) { + global $ldap_conn; + return @ldap_modify($ldap_conn,$dn,$entry); +} + +/** + * sf_ldap_mod_add() - Wrapper for ldap_mod_add() + * + * @param string dn + * @param string entry + * + */ +function sf_ldap_mod_add($dn,$entry) { + global $ldap_conn; + return @ldap_mod_add($ldap_conn,$dn,$entry); +} + +/** + * sf_ldap_mod_del() - Wrapper for ldap_mod_del() + * + * @param string dn + * @param string entry + * + */ +function sf_ldap_mod_del($dn,$entry) { + global $ldap_conn; + return @ldap_mod_del($ldap_conn,$dn,$entry); +} + +/** + * sf_ldap_read() - Wrapper for ldap_read() + * + * @param string dn + * @param string filter + * @param int attrs + * + */ +function sf_ldap_read($dn,$filter,$attrs=0) { + global $ldap_conn; + return @ldap_read($ldap_conn,$dn,$filter,$attrs); +} + +/** + * sf_ldap_error() - Wrapper for ldap_error() + * + * @see ldap_error() + * + */ +function sf_ldap_error() { + global $ldap_conn; + return ldap_error($ldap_conn); +} + +/** + * sf_ldap_errno() - Wrapper for ldap_errno() + * + * @see ldap_errno() + * + */ +function sf_ldap_errno() { + global $ldap_conn; + return ldap_errno($ldap_conn); +} + +/** + * sf_ldap_already_exists() + */ +function sf_ldap_already_exists() { + global $ldap_conn; + return ldap_errno($ldap_conn)==20; +} + +/** + * sf_ldap_does_not_exist() + */ +function sf_ldap_does_not_exist() { + global $ldap_conn; + return ldap_errno($ldap_conn)==16; +} + +/* + * User management functions + */ + +/** + * sf_ldap_check_user() - Check for the existence of a user + * + * @param int The user ID of the user to check + * @returns true on success/false on error + * + */ +function sf_ldap_check_user($user_id) { + $user =& user_get_object($user_id); + if (!$user) { + return false; + } + return sf_ldap_check_user_by_name($user->getUnixName()); +} + +/** + * sf_ldap_check_user_by_name() - Check for a user by the username + * + * @param string The username + * @returns true on success/false on error + * + */ +function sf_ldap_check_user_by_name($user_name) { + global $ldap_conn; + global $sys_ldap_base_dn; + + global $sys_use_ldap; + if (!$sys_use_ldap) { + return true; + } + + if (!sf_ldap_connect()) { + return false; + } + + $dn = 'uid='.$user_name.',ou=People,'.$sys_ldap_base_dn; + $res = sf_ldap_read($dn,"objectClass=*",array("uid")); + if ($res) { + ldap_free_result($res); + return true; + } + + return false; +} + +/** + * sf_ldap_create_user() - Create a user + * + * @param int The user ID of the user to create + * @returns The return status of sf_ldap_create_user_from_object() + * + */ +function sf_ldap_create_user($user_id) { + $user = &user_get_object($user_id); + return sf_ldap_create_user_from_object($user); +} + +/** + * sf_ldap_check_create_user() - Check that a user has been created + * + * @param int The ID of the user to check + * @returns true on success/false on error + * + */ +function sf_ldap_check_create_user($user_id) { + global $sys_use_ldap; + if (!$sys_use_ldap) { + return true; + } + + if (!sf_ldap_check_user($user_id)){ + $user = &user_get_object($user_id); + return sf_ldap_create_user_from_object($user); + } + return true; +} + +/** + * sf_ldap_create_user_from_object() - Create a user from information contained within an object + * + * @param object The user object + * @returns true on success/false on error + * + */ +function sf_ldap_create_user_from_object(&$user) { + global $sys_ldap_base_dn; + global $UID_ADD; + + global $sys_use_ldap; + if (!$sys_use_ldap) { + return true; + } + +//echo "sf_ldap_create_user_from_object(".$user->getUnixName().")
"; + if (!sf_ldap_connect()) { + return false; + } + $dn = 'uid='.$user->getUnixName().',ou=People,'.$sys_ldap_base_dn; + $entry['objectClass'][0]='top'; + $entry['objectClass'][1]='account'; + $entry['objectClass'][2]='posixAccount'; + $entry['objectClass'][3]='shadowAccount'; + $entry['objectClass'][4]='x-sourceforgeAccount'; + $entry['uid']=$user->getUnixName(); + $entry['cn']=asciize($user->getRealName()); + $entry['gecos']=asciize($user->getRealName()); + $entry['userPassword']='{crypt}'.$user->getUnixPasswd(); + $entry['homeDirectory'] = account_user_homedir($user->getUnixName()); + $entry['loginShell']=$user->getShell(); + $entry['x-cvsShell']="/bin/cvssh"; // unless explicitly set otherwise, developer has write access + $entry['uidNumber']=$user->getUnixUID() + $UID_ADD; + $entry['gidNumber']=100; // users + $entry['shadowLastChange']=1; // We don't have expiration, so any non-0 + $entry['shadowMax']=99999; + $entry['shadowWarning']=7; + + if (!sf_ldap_add($dn,$entry)) { + sf_ldap_set_error_msg("ERROR: cannot add LDAP user entry '". + $user->getUnixName()."': ".sf_ldap_error()."
"); + return false; + } + return true; +} + +/** + * sf_ldap_create_user_from_props() - Creates an LDAP user from + * + * @param string The username + * @param string ???? + * @param string The encrypted password + * @returns true on success/false on error + * + */ +function sf_ldap_create_user_from_props($username, $cn, $crypt_pw, + $shell, $cvsshell, $uid, $gid) { + global $sys_ldap_base_dn; + + global $sys_use_ldap; + if (!$sys_use_ldap) { + return true; + } + + if (!sf_ldap_connect()) { + return false; + } + $dn = 'uid='.$username.',ou=People,'.$sys_ldap_base_dn; + $entry['objectClass'][0]='top'; + $entry['objectClass'][1]='account'; + $entry['objectClass'][2]='posixAccount'; + $entry['objectClass'][3]='shadowAccount'; + $entry['objectClass'][4]='x-sourceforgeAccount'; + $entry['uid']=$username; + $entry['cn']=asciize($cn); + $entry['gecos']=asciize($cn); + $entry['userPassword']='{crypt}'.$crypt_pw; + $entry['homeDirectory'] = account_user_homedir($username); + $entry['loginShell']=$shell; + $entry['x-cvsShell']=$cvsshell; + $entry['uidNumber']=$uid; + $entry['gidNumber']=$gid; + $entry['shadowLastChange']=1; + $entry['shadowMax']=99999; + $entry['shadowWarning']=7; + + if (!sf_ldap_add($dn,$entry)) { + sf_ldap_set_error_msg("ERROR: cannot add LDAP user entry '". + $username."': ".sf_ldap_error()."
"); + return false; + } + return true; +} + +/** + * sf_ldap_remove_user() - Remove an LDAP user + * + * @param int The user ID of the user to remove + * @returns true on success/false on failure + * + */ +function sf_ldap_remove_user($user_id) { + global $sys_ldap_base_dn; + + global $sys_use_ldap; + if (!$sys_use_ldap) { + return true; + } + + $user = &user_get_object($user_id); + if (!sf_ldap_connect()) { + return false; + } + $dn = 'uid='.$user->getUnixName().',ou=People,'.$sys_ldap_base_dn; + + if (!sf_ldap_delete($dn)) { + sf_ldap_set_error_msg("ERROR: cannot delete LDAP user entry '". + $user->getUnixName()."': ".sf_ldap_error()."
"); + return false; + } + return true; +} + +/** + * sf_ldap_user_set_attribute() - Set an attribute for a user + * + * @param int The user ID + * @param string The attribute to set + * @param string The new value of the attribute + * @returns true on success/false on error + * + */ +function sf_ldap_user_set_attribute($user_id,$attr,$value) { + global $sys_ldap_base_dn; + + global $sys_use_ldap; + if (!$sys_use_ldap) { + return true; + } + + $user = &user_get_object($user_id); +//echo "sf_ldap_user_set_attribute(".$user->getUnixName().",".$attr.",".$value.")
"; + if (!sf_ldap_connect()) { + return false; + } + $dn = 'uid='.$user->getUnixName().',ou=People,'.$sys_ldap_base_dn; + $entry[$attr]=$value; + + if (!sf_ldap_modify($dn, $entry)) { + sf_ldap_set_error_msg("ERROR: cannot change LDAP attribute '$attr' for user '". + $user->getUnixName()."': ".sf_ldap_error()."
"); + return false; + } + return true; +} + +/* + * Group management functions + */ + +/** + * sf_ldap_check_group() - Check for the existence of a group + * + * @param int The ID of the group to check + * @returns true on success/false on error + * + */ +function sf_ldap_check_group($group_id) { + global $ldap_conn; + global $sys_ldap_base_dn; + + global $sys_use_ldap; + if (!$sys_use_ldap) { + return true; + } + + $group = &group_get_object($group_id); + if (!$group) { + sf_ldap_set_error_msg("ERROR: Cannot find group [$group_id]
"); + return false; + } + if (!sf_ldap_connect()) { + return false; + } + $dn = 'cn='.$group->getUnixName().',ou=Group,'.$sys_ldap_base_dn; + $res=sf_ldap_read($dn, "objectClass=*", array("cn")); + if ($res) { + ldap_free_result($res); + return true; + } + return false; +} + +/** + * sf_ldap_create_group() - Create a group + * + * @param int The ID of the group to create + * @returns true on success/false on error + * + */ +function sf_ldap_create_group($group_id) { + global $sys_ldap_base_dn; + global $GID_ADD; + global $ANONCVS_UID_ADD; + + global $sys_use_ldap; + if (!$sys_use_ldap) { + return true; + } + + $group = &group_get_object($group_id); + if (!sf_ldap_connect()) { + return false; + } + $dn = 'cn='.$group->getUnixName().',ou=Group,'.$sys_ldap_base_dn; + $entry['objectClass'][0]='top'; + $entry['objectClass'][1]='posixGroup'; + $entry['cn']=$group->getUnixName(); + $entry['userPassword']='{crypt}x'; + $entry['gidNumber']=$group->getID() + $GID_ADD; + + $i=0; $i_cvs=0; + + $ret_val=true; + + if (!sf_ldap_add($dn,$entry)) { + sf_ldap_set_error_msg("ERROR: cannot add LDAP group entry '". + $group->getUnixName()."': ".sf_ldap_error()."
"); + // If there's error, that's bad. But don't stop. + $ret_val=false; + } + + // + // Now create CVS group + // + + // Add virtual anoncvs user to CVS group + $cvs_member_list[$i_cvs++] = 'anoncvs_'.$group->getUnixName(); + + $dn = 'cn='.$group->getUnixName().',ou=cvsGroup,'.$sys_ldap_base_dn; + + if ($cvs_member_list) { + $entry['memberUid']=$cvs_member_list; + } else { + unset($entry['memberUid']); + } + + if (!sf_ldap_add($dn,$entry)) { + sf_ldap_set_error_msg("ERROR: cannot add LDAP CVS group entry '" + .$group->getUnixName()."': ".sf_ldap_error()."
"); + $ret_val=false; + } + + // + // Finally, setup AnonCVS virtual user + // + + if (!sf_ldap_check_user_by_name('anoncvs_'.$group->getUnixName()) + && !sf_ldap_create_user_from_props('anoncvs_'.$group->getUnixName(), + 'anoncvs', 'x', + '/bin/false', '/bin/false', + $group_id+$GID_ADD+$ANONCVS_UID_ADD, + $group_id+$GID_ADD)) { + sf_ldap_set_error_msg("ERROR: cannot add LDAP AnonCVS user entry '" + .$group->getUnixName()."': ".sf_ldap_error()."
"); + $ret_val=false; + } + + return $ret_val; +} + +/** + * sf_ldap_remove_group() - Remove a group + * + * @param int The ID of the group to remove + * @returns true on success/false on error + * + */ +function sf_ldap_remove_group($group_id) { + global $sys_ldap_base_dn; + + global $sys_use_ldap; + if (!$sys_use_ldap) { + return true; + } + + $group = &group_get_object($group_id); + if (!sf_ldap_connect()) { + return false; + } + + // + // Remove shell LDAP group + // + $ret_val=true; + + $dn = 'cn='.$group->getUnixName().',ou=Group,'.$sys_ldap_base_dn; + + if (!sf_ldap_delete($dn)) { + sf_ldap_set_error_msg("ERROR: cannot delete LDAP group entry '". + $group->getUnixName()."': ".sf_ldap_error()."
"); + $ret_val = false; + } + + // + // Remove CVS LDAP group + // + + $dn = 'cn='.$group->getUnixName().',ou=cvsGroup,'.$sys_ldap_base_dn; + + if (!sf_ldap_delete($dn)) { + sf_ldap_set_error_msg("ERROR: cannot delete LDAP CVS group entry '". + $group->getUnixName()."': ".sf_ldap_error()."
"); + $ret_val = false; + } + + // + // Remove AnonCVS virtual user + // + + $dn = 'uid=anoncvs_'.$group->getUnixName().',ou=People,'.$sys_ldap_base_dn; + if (!sf_ldap_delete($dn)) { + sf_ldap_set_error_msg("ERROR: cannot delete LDAP AnonCVS user entry '". + $group->getUnixName()."': ".sf_ldap_error()."
"); + $ret_val = false; + } + + return $ret_val; +} + +/** + * sf_ldap_group_add_user() - Add a user to an LDAP group + * + * @param int The ID of the group two which the user will be added + * @param int The ID of the user to add + * @param bool Only add this user to CVS + * @returns true on success/false on error + * + */ +function sf_ldap_group_add_user($group_id,$user_id,$cvs_only=0) { + global $ldap_conn; + global $sys_ldap_base_dn; + + global $sys_use_ldap; + if (!$sys_use_ldap) { + return true; + } + + $group = &group_get_object($group_id); + $user = &user_get_object($user_id); + if (!sf_ldap_connect()) { + return false; + } + $dn = 'cn='.$group->getUnixName().',ou=Group,'.$sys_ldap_base_dn; + $cvs_dn = 'cn='.$group->getUnixName().',ou=cvsGroup,'.$sys_ldap_base_dn; + $entry['memberUid'] = $user->getUnixName(); + + // + // Check if user already a member of CVS group + // + + $res=sf_ldap_read($cvs_dn,"memberUid=".$user->getUnixName(),array("cn")); + if ($res && ldap_count_entries($ldap_conn,$res)>0) { + //echo "already a member of CVS
"; + } else { + // + // No, add one + // + + if (!sf_ldap_mod_add($cvs_dn,$entry)) { + sf_ldap_set_error_msg("ERROR: cannot add member to LDAP CVS group entry '". + $group->getUnixName()."': ".sf_ldap_error()."
"); + return false; + } + } + + ldap_free_result($res); + + if ($cvs_only) { + return true; + } + + // + // Check if user already a member of shell group + // + $res = sf_ldap_read($dn, "memberUid=".$user->getUnixName(), array("cn")); + + if ($res && ldap_count_entries($ldap_conn,$res)>0) { + //echo "already a member
"; + } else { + // + // No, add one + // + + if (!sf_ldap_mod_add($dn,$entry)) { + sf_ldap_set_error_msg("ERROR: cannot add member to LDAP group entry '". + $group->getUnixName()."': ".sf_ldap_error()."
"); + return false; + } + } + + ldap_free_result($res); + + return true; +} + +/** + * sf_ldap_group_remove_user() - Remove a user from an LDAP group + * + * @param int The ID of the group from which to remove the user + * @param int The ID of the user to remove + * @param bool Only remove user from CVS group + * @returns true on success/false on error + * + */ +function sf_ldap_group_remove_user($group_id,$user_id,$cvs_only=0) { + global $sys_ldap_base_dn; + + global $sys_use_ldap; + if (!$sys_use_ldap) { + return true; + } + + $group = &group_get_object($group_id); + $user = &user_get_object($user_id); + if (!sf_ldap_connect()) { + return false; + } + + $dn = 'cn='.$group->getUnixName().',ou=Group,'.$sys_ldap_base_dn; + $cvs_dn = 'cn='.$group->getUnixName().',ou=cvsGroup,'.$sys_ldap_base_dn; + $entry['memberUid'] = $user->getUnixName(); + + $ret_val=true; + + if (!sf_ldap_mod_del($cvs_dn,$entry) && !sf_ldap_does_not_exist()) { + sf_ldap_set_error_msg("ERROR: cannot remove member from LDAP CVS group entry '". + $group->getUnixName()."': ".sf_ldap_error()."(".sf_ldap_errno().")"."
"); + $ret_val=false; + } + + if ($cvs_only) { + return $ret_val; + } + + if (!sf_ldap_mod_del($dn,$entry) && !sf_ldap_does_not_exist()) { + sf_ldap_set_error_msg("ERROR: cannot remove member from LDAP group entry '". + $group->getUnixName()."': ".sf_ldap_error()."(".sf_ldap_errno().")"."
"); + $ret_val=false; + } + + return $ret_val; +} + +?> diff --git a/gforge/common/include/session.php b/gforge/common/include/session.php new file mode 100644 index 0000000000..fc94205e52 --- /dev/null +++ b/gforge/common/include/session.php @@ -0,0 +1,468 @@ += $GLOBALS['sys_session_expire']) { + return false; + } + + return $user_id; +} + +/** + * session_logout() - Log the user off the system. + * + * This function destroys object associated with the current session, + * making user "logged out". Deletes both user and session cookies. + * + * @return true/false + * + */ +function session_logout() { + + // delete both session and username cookies + // NB: cookies must be deleted with the same scope parameters they were set with + // + session_cookie('session_ser', ''); + session_cookie('username', + '', + $GLOBALS['sys_username_cookie_urlspace'], + 0); + + return true; +} + +/** + * session_login_valid() - Log the user to the system. + * + * High-level function for user login. Check credentials, and if they + * are valid, open new session. + * + * @param string User name + * @param string User password (in clear text) + * @param bool Allow login to non-confirmed user account (only for confirmation of the very account) + * @return true/false, if false reason is in global $feedback + * @access public + * + */ +function session_login_valid($loginname, $passwd, $allowpending=0) { + global $feedback; + + if (!$loginname || !$passwd) { + $feedback = 'Missing Password Or users Name'; + return false; + } + + //get the users from the database using user_id and password + $res = db_query(" + SELECT user_id,status + FROM users + WHERE user_name='$loginname' + AND user_pw='".md5($passwd)."' + "); + if (!$res || db_numrows($res) < 1) { + //invalid password or user_name + $feedback='Invalid Password or User Name'; + return false; + } else { + // check status of this user + $usr = db_fetch_array($res); + + // if allowpending (for verify.php) then allow + if ($allowpending && ($usr['status'] == 'P')) { + //1; + } else { + if ($usr['status'] == 'S') { + //acount suspended + $feedback = 'Account Suspended'; + return false; + } + if ($usr['status'] == 'P') { + //account pending + $feedback = 'Account Pending'; + return false; + } + if ($usr['status'] == 'D') { + //account deleted + $feedback = 'Account Deleted'; + return false; + } + if ($usr['status'] != 'A') { + //unacceptable account flag + $feedback = 'Account Not Active'; + return false; + } + } + //create a new session + session_set_new(db_result($res,0,'user_id')); + + return true; + } +} + +/** + * session_check_ip() - Check 2 IP addresses for match + * + * This function checks that IP addresses match with the + * given fuzz factor (within 255.255.0.0 subnet). + * + * @param string The old IP address + * @param string The new IP address + * @return true/false + * @access private + */ +function session_check_ip($oldip,$newip) { + $eoldip = explode(".",$oldip); + $enewip = explode(".",$newip); + + // ## require same class b subnet + if (($eoldip[0]!=$enewip[0])||($eoldip[1]!=$enewip[1])) { + return 0; + } else { + return 1; + } +} + +/** + * session_issecure() - Check if current session is secure + * + * @return true/false + * @access public + */ +function session_issecure() { + return (getenv('SERVER_PORT') == '443'); +} + +/** + * session_cookie() - Set a session cookie + * + * Set a cookie with default temporal scope of the current browser session + * and URL space of the current webserver + * + * @param string Name of cookie + * @param string Value of cookie + * @param string Domain scope (default '') + * @param string Expiration time in UNIX seconds (default 0) + * @return true/false + */ +function session_cookie($name ,$value, $domain = '', $expiration = 0) { + setcookie($name, $value, $expiration, '/', $domain, 0); +} + +/** + * session_redirect() - Redirect browser within the site + * + * @param string Absolute path within the site + * @return never returns + */ +function session_redirect($loc) { + header('Location: http' . (session_issecure()?'s':'') . '://' . getenv('HTTP_HOST') . $loc); + print("\n\n"); + exit; +} + +/** + * session_require() - Convenience function to easily enforce permissions + * + * Calling page will terminate with error message if current user + * fails checks. + * + * @param array Associative array specifying criteria + * @return does not return if check is failed + * + */ +function session_require($req) { + if (!user_isloggedin()) { + exit_not_logged_in(); + //exit_permission_denied(); + } + + if ($req['group']) { + $group =& group_get_object($req['group']); + exit_assert_object($group,'Group'); + + $perm =& $group->getPermission( session_get_user() ); + exit_assert_object($perm,'Permission'); + + if ($req['admin_flags']) { + //$query .= " AND admin_flags = '$req[admin_flags]'"; + if (!$perm->isAdmin()) { + exit_permission_denied(); + } + } else { + if (!$perm->isMember()) { + exit_permission_denied(); + } + } + } else if ($req['isloggedin']) { + //no need to check as long as the check is present at top of function + } else { + exit_permission_denied(); + } +} + +/** + * session_set_new() - Setup session for the given user + * + * This function sets up SourceForge session for the given user, + * making one be "logged in". + * + * @param int The user ID + * @return none + */ +function session_set_new($user_id) { + global $G_SESSION; + + // set session cookie + // + $cookie = session_build_session_cookie($user_id); + session_cookie("session_ser", $cookie); + + db_query(" + INSERT INTO session (session_hash, ip_addr, time, user_id) + VALUES ( + '".session_get_session_cookie_hash($cookie)."', + '".$GLOBALS['REMOTE_ADDR']."', + '".time()."', + $user_id + ) + "); + + // check uniqueness of the session_hash in the database + // + $res = session_getdata($user_id); + + if (!$res || db_numrows($res) < 1) { + exit_error("ERROR","ERROR - Cannot initialize session: ".db_error()); + } else { + + //set up the new user object + // + $G_SESSION = user_get_object($user_id,$res); + if ($G_SESSION) { + $G_SESSION->setLoggedIn(true); + } + } + + // set username cookie for *.hostname.tld, expiration set in local.inc + // + session_cookie('username', + session_build_username_cookie($G_SESSION->getUnixName()), + $GLOBALS['sys_username_cookie_urlspace'], + time() + $GLOBALS['sys_username_cookie_expiration']); +} + +/** + * Private optimization function for logins - fetches user data, language, and session + * with one query + * + * @param int The user ID + * @access private + */ +function session_getdata($user_id) { + $res=db_query("SELECT + + u.*,sl.language_id, sl.name, sl.filename, sl.classname, sl.language_code + + FROM users u, + supported_languages sl + WHERE u.language=sl.language_id + AND u.user_id='$user_id' + "); + return $res; +} + +/** + * session_set() - Re-initialize session for the logged in user + * + * This function checks that the user is logged in and if so, initialize + * internal session environment. + * + * @return none + */ +function session_set() { + global $G_SESSION; + global $session_ser, $session_key; + + // assume bad session_hash and session. If all checks work, then allow + // otherwise make new session + $id_is_good = false; + + // If user says he's logged in (by presenting cookie), check that + if ($session_ser) { + + $user_id = session_check_session_cookie($session_ser); + + if ($user_id) { + + $result = session_getdata($user_id); + + if (db_numrows($result) > 0) { + $id_is_good = true; + } + } + } // else (hash does not exist) or (session hash is bad) + + if ($id_is_good) { + $G_SESSION = user_get_object($user_id, $result); + if ($G_SESSION) { + $G_SESSION->setLoggedIn(true); + } + } else { + $G_SESSION=false; + + // if there was bad session cookie, kill it and the user cookie + // + if ($session_ser) { + session_logout(); + } + } +} + +/** + * session_get_user() - Wrapper function to return the User object for the logged in user. + * + * @return User + * @access public + */ +function &session_get_user() { + global $G_SESSION; + return $G_SESSION; +} + +/** + * user_getid() + * Get user_id of logged in user + */ + +function user_getid() { + global $G_SESSION; + if ($G_SESSION) { + return $G_SESSION->getID(); + } else { + return false; + } +} + +/** + * user_isloggedin() + * See if user is logged in + */ +function user_isloggedin() { + global $G_SESSION; + + if ($G_SESSION) { + return $G_SESSION->isLoggedIn(); + } else { + return false; + } +} + +?> diff --git a/gforge/common/include/timezones.php b/gforge/common/include/timezones.php new file mode 100644 index 0000000000..a1d5fad9bd --- /dev/null +++ b/gforge/common/include/timezones.php @@ -0,0 +1,471 @@ + diff --git a/gforge/common/include/utils.php b/gforge/common/include/utils.php new file mode 100644 index 0000000000..da9876550c --- /dev/null +++ b/gforge/common/include/utils.php @@ -0,0 +1,570 @@ +& /dev/null &"); +} + +/** + * util_prep_string_for_sendmail() - Prepares a string to be sent by email + * + * @param string The text to be prepared + * @returns The prepared text + * + */ +function util_prep_string_for_sendmail($body) { + //$body=str_replace("\\","\\\\",$body); + $body=str_replace("`","\\`",$body); + $body=str_replace("\"","\\\"",$body); + $body=str_replace("\$","\\\$",$body); + return $body; +} + +/** + * util_unconvert_htmlspecialchars() - Unconverts a string converted with htmlspecialchars() + * This function requires PHP 4.0.3 or greater + * + * @param string The string to unconvert + * @returns The unconverted string + * + */ +function util_unconvert_htmlspecialchars($string) { + if (strlen($string) < 1) { + return ''; + } else { + $trans = get_html_translation_table(HTMLENTITIES, ENT_QUOTES); + $trans = array_flip ($trans); + $str = strtr ($string, $trans); + return $str; + } +} + +/** + * util_result_columns_to_assoc() - Takes a result set and turns the column pair into an associative array + * + * @param string The result set ID + * @param int The column key + * @param int The optional column value + * @returns An associative array + * + */ +function util_result_columns_to_assoc($result, $col_key=0, $col_val=1) { + $rows=db_numrows($result); + + if ($rows > 0) { + $arr=array(); + for ($i=0; $i<$rows; $i++) { + $arr[db_result($result,$i,$col_key)]=db_result($result,$i,$col_val); + } + } else { + $arr=array(); + } + return $arr; +} + +/** + * util_result_column_to_array() - Takes a result set and turns the optional column into an array + * + * @param int The result set ID + * @param int The column + * @resturns An array + * + */ +function util_result_column_to_array($result, $col=0) { + /* + Takes a result set and turns the optional column into + an array + */ + $rows=db_numrows($result); + + if ($rows > 0) { + $arr=array(); + for ($i=0; $i<$rows; $i++) { + $arr[$i]=db_result($result,$i,$col); + } + } else { + $arr=array(); + } + return $arr; +} + +/** + * resutl_column_to_array() - DEPRECATED; DO NOT USE! + * + * @param int The result set ID + * @param int The column + * @see util_result_column_to_array() + * @deprecated + * + */ +function result_column_to_array($result, $col=0) { + /* + backwards compatibility + */ + return util_result_column_to_array($result, $col); +} + +/** + * util_wrap_find_space() - Find the first space in a string + * + * @param string The string in which to find the space + * @param int The number of characters to wrap - Default is 80 + * @returns The position of the first space + * + */ +function util_wrap_find_space($string,$wrap) { + //echo"\n"; + $start=$wrap-5; + $try=1; + $found=false; + + while (!$found) { + //find the first space starting at $start + $pos=@strpos($string,' ',$start); + + //if that space is too far over, go back and start more to the left + if (($pos > ($wrap+5)) || !$pos) { + $try++; + $start=($wrap-($try*5)); + //if we've gotten so far left , just truncate the line + if ($start<=10) { + return $wrap; + } + $found=false; + } else { + $found=true; + } + } + + return $pos; +} + +/** + * util_line_wrap() - Automatically linewrap text + * + * @param string The text to wrap + * @param int The number of characters to wrap - Default is 80 + * @param string The line break to use - Default is '\n' + * @returns The wrapped text + * + */ +function util_line_wrap ($text, $wrap = 80, $break = "\n") { + $paras = explode("\n", $text); + + $result = array(); + $i = 0; + while ($i < count($paras)) { + if (strlen($paras[$i]) <= $wrap) { + $result[] = $paras[$i]; + $i++; + } else { + $pos=util_wrap_find_space($paras[$i],$wrap); + + $result[] = substr($paras[$i], 0, $pos); + + $new = trim(substr($paras[$i], $pos, strlen($paras[$i]) - $pos)); + if ($new != '') { + $paras[$i] = $new; + $pos=util_wrap_find_space($paras[$i],$wrap); + } else { + $i++; + } + } + } + return implode($break, $result); +} + +/** + * util_make_links() - Turn URL's into HREF's. + * + * @param string The URL + * @returns The HREF'ed URL + * + */ +function util_make_links ($data='') { + if(empty($data)) { return $data; } + + $lines = split("\n",$data); + while ( list ($key,$line) = each ($lines)) { + // When we come here, we usually have form input + // encoded in entities. Our aim is to NOT include + // angle brackets in the URL + // (RFC2396; http://www.w3.org/Addressing/URL/5.1_Wrappers.html) + $line = str_replace('>', "\1", $line); + $line = eregi_replace("([ \t]|^)www\."," http://www.",$line); + $text = eregi_replace("([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])", "\\1://\\2\\3", $line); + $text = eregi_replace("(([a-z0-9_]|\\-|\\.)+@([^[:space:]]*)([[:alnum:]-]))", "\\1", $text); + $text = str_replace("\1", '>', $text); + $newText .= $text; + } + return $newText; +} + +/** + * show_priority_colors_key() - Show the priority colors legend + * + */ +function show_priority_colors_key() { + + echo '

Priority Colors:
+ + '; + + for ($i=1; $i<10; $i++) { + echo ' + '; + } + echo '
'.$i.'
'; +} + +/** + * utils_buildcheckboxarray() - Build a checkbox array + * + * @param int Number of options to be in the array + * @param string The name of the checkboxes + * @param array An array of boxes to be pre-checked + * + */ +function utils_buildcheckboxarray($options,$name,$checked_array) { + $option_count=count($options); + $checked_count=count($checked_array); + + for ($i=1; $i<=$option_count; $i++) { + echo ' +
'.$options[$i]; + } +} + +/** + * GraphResult() - Takes a database result set and builds a graph. + * The first column should be the name, and the second column should be the values + * Be sure to include HTL_Graphs.php before using this function + * + * @author Tim Perdue tperdue@valinux.com + * @param int The databse result set ID + * @param string The title of the graph + * + */ +Function GraphResult($result,$title) { + $rows=db_numrows($result); + + if ((!$result) || ($rows < 1)) { + echo 'None Found.'; + } else { + $names=array(); + $values=array(); + + for ($j=0; $jCOLOR_LTBACK1; + } + + $counter=count($value_string); + + /* + Figure the max_value passed in, so scale can be determined + */ + + $max_value=0; + + for ($i = 0; $i < $counter; $i++) { + if ($value_string[$i] > $max_value) { + $max_value=$value_string[$i]; + } + } + + if ($max_value < 1) { + $max_value=1; + } + + /* + I want my graphs all to be 800 pixels wide, so that is my divisor + */ + + $scale=(400/$max_value); + + /* + I create a wrapper table around the graph that holds the title + */ + + $title_arr=array(); + $title_arr[]=$title; + + echo html_build_list_table_top ($title_arr); + echo ''; + /* + Create an associate array to pass in. I leave most of it blank + */ + + $vals = array( + 'vlabel'=>'', + 'hlabel'=>'', + 'type'=>'', + 'cellpadding'=>'', + 'cellspacing'=>'0', + 'border'=>'', + 'width'=>'', + 'background'=>'', + 'vfcolor'=>'', + 'hfcolor'=>'', + 'vbgcolor'=>'', + 'hbgcolor'=>'', + 'vfstyle'=>'', + 'hfstyle'=>'', + 'noshowvals'=>'', + 'scale'=>$scale, + 'namebgcolor'=>'', + 'valuebgcolor'=>'', + 'namefcolor'=>'', + 'valuefcolor'=>'', + 'namefstyle'=>'', + 'valuefstyle'=>'', + 'doublefcolor'=>''); + + /* + This is the actual call to the HTML_Graphs class + */ + + html_graph($name_string,$value_string,$bars,$vals); + + echo ' + + '; +} + +/** + * ShowResultSet() - Show a generic result set + * Very simple, plain way to show a generic result set + * + * @param int The result set ID + * @param string The title of the result set + * @param bool The option to turn URL's into links + * + */ +Function ShowResultSet($result,$title="Untitled",$linkify=false) { + global $group_id,$HTML; + + if ($result) { + $rows = db_numrows($result); + $cols = db_numfields($result); + + echo ' + '; + + /* Create the title */ + + echo ' + + '; + + /* Create the headers */ + echo ' + '; + for ($i=0; $i < $cols; $i++) { + echo ''; + } + echo ''; + + /* Create the rows */ + for ($j = 0; $j < $rows; $j++) { + echo ''; + for ($i = 0; $i < $cols; $i++) { + if ($linkify && $i == 0) { + $link = ''; + } else if($linkify == "bug_group") { + $link .= 'group_id='.$group_id.'&bug_group_mod=y&bug_group_id='.db_result($result, $j, 'bug_group_id').'">'; + } else if($linkify == "patch_cat") { + $link .= 'group_id='.$group_id.'&patch_cat_mod=y&patch_cat_id='.db_result($result, $j, 'patch_category_id').'">'; + } else if($linkify == "support_cat") { + $link .= 'group_id='.$group_id.'&support_cat_mod=y&support_cat_id='.db_result($result, $j, 'support_category_id').'">'; + } else if($linkify == "pm_project") { + $link .= 'group_id='.$group_id.'&project_cat_mod=y&project_cat_id='.db_result($result, $j, 'group_project_id').'">'; + } else { + $link = $linkend = ''; + } + } else { + $link = $linkend = ''; + } + echo ''; + } + echo ''; + } + echo '
'.$title.'
'.db_fieldname($result, $i).'
'.$link . db_result($result, $j, $i) . $linkend.'
'; + } else { + echo db_error(); + } +} + +/** + * validate_email() - Validate an email address + * + * @param string The address string to validate + * @returns true on success/false on error + * + */ +function validate_email ($address) { + return (ereg('^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'. '@'. '[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.' . '[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$', $address)); +} + +/** + * util_is_valid_filename() - Verifies whether a file has a valid filename + * + * @param string The file to verify + * @returns true on success/false on error + * + */ +function util_is_valid_filename ($file) { + if (ereg("[]~`! ~@#\"$%^,&*();=|[{}<>?/]",$file)) { + return false; + } else { + if (strstr($file,'..')) { + return false; + } else { + return true; + } + } +} + +/** + * valid_hostname() - Validates a hostname string to make sure it doesn't contain invalid characters + * + * @param string The optional hostname string + * @returns true on success/false on failur + * + */ +function valid_hostname ($hostname = "xyz") { + + //bad char test + $invalidchars = eregi_replace("[-A-Z0-9\.]","",$hostname); + + if (!empty($invalidchars)) { + return false; + } + + //double dot, starts with a . or - + if (ereg("\.\.",$hostname) || ereg("^\.",$hostname) || ereg("^\-",$hostname)) { + return false; + } + + $multipoint = explode(".",$hostname); + + if (!(is_array($multipoint)) || ((count($multipoint) - 1) < 1)) { + return false; + } + + return true; + +} + +?> diff --git a/gforge/common/include/vars.php b/gforge/common/include/vars.php new file mode 100644 index 0000000000..7be456afe5 --- /dev/null +++ b/gforge/common/include/vars.php @@ -0,0 +1,64 @@ + diff --git a/gforge/common/pm/pm_data.php b/gforge/common/pm/pm_data.php new file mode 100644 index 0000000000..78c41a5433 --- /dev/null +++ b/gforge/common/pm/pm_data.php @@ -0,0 +1,616 @@ + '3' ORDER BY project_task_id DESC"; + $pm_data_tasks["$group_project_id"]=db_query($sql,100); + } + return $pm_data_tasks["$group_project_id"]; +} + +/** + * pm_data_get_subprojects() - Return a result set of subprojects for this group + * + * @param int The ID of the group + * @returns Database result set + * + */ +function pm_data_get_subprojects ($group_id) { + global $pm_data_subprojects; + if (!$pm_data_subprojects["$group_id"]) { + $sql="SELECT group_project_id,project_name ". + "FROM project_group_list WHERE group_id='$group_id'"; + $pm_data_subprojects["$group_id"]=db_query($sql); + } + return $pm_data_subprojects["$group_id"]; +} + +/** + * pm_data_get_other_tasks() - Return a result set of tasks in this subproject that do not equal + * the passed in task_id + * + * @param int The ID of the project group + * @param int The ID of the task + * @returns Database result set + * + */ +function pm_data_get_other_tasks ($group_project_id,$project_task_id) { + $sql="SELECT project_task_id,summary ". + "FROM project_task ". + "WHERE group_project_id='$group_project_id' ". + "AND status_id <> '3' ". + "AND project_task_id <> '$project_task_id' ORDER BY project_task_id DESC"; + return db_query($sql,100); +} + +/** + * pm_data_get_technicians() - Return a result set of pm technicians in this group + * + * @param int The ID of the group + * @returns Datbase result set + * + */ +function pm_data_get_technicians ($group_id) { + global $pm_data_technicians; + if (!$pm_data_technicians["$group_id"]) { + $sql="SELECT users.user_id,users.user_name ". + "FROM users,user_group ". + "WHERE users.user_id=user_group.user_id ". + "AND user_group.group_id='$group_id' ". + "AND user_group.project_flags IN (1,2) ". + "ORDER BY users.user_name"; + $pm_data_technicians["$group_id"]=db_query($sql); + } + return $pm_data_technicians["$group_id"]; +} + +/** + * pm_data_get_dependent_tasks() - Return result set of ids of tasks that are dependent on this task + * + * @param int The project task ID + * @returns Database result set + * + */ +function pm_data_get_dependent_tasks ($project_task_id) { + $sql="SELECT is_dependent_on_task_id ". + "FROM project_dependencies ". + "WHERE project_task_id='$project_task_id'"; + return db_query($sql); +} + +/** + * pm_data_get_assigned_to() - Return result set of user_ids that are assigned this task + * + * @param int The project task ID + * @returns Database result set + * + */ +function pm_data_get_assigned_to ($project_task_id) { + $sql="SELECT assigned_to_id ". + "FROM project_assigned_to ". + "WHERE project_task_id='$project_task_id'"; + return db_query($sql); +} + +/** + * pm_data_get_statuses() - Return result set of statuses + * + * @returns Database result set + * + */ +function pm_data_get_statuses () { + global $pm_data_statuses; + if (!$pm_data_statuses) { + $sql='SELECT * FROM project_status'; + $pm_data_statuses=db_query($sql); + } + return $pm_data_statuses; +} + +/** + * pm_data_get_status_name() - Simply return status_name from bug_status + * + * @param string Status ID + * @returns Databse result set on success/Error string on error + * + */ +function pm_data_get_status_name($string) { + $sql="SELECT * FROM project_status WHERE status_id='$string'"; + $result=db_query($sql); + if ($result && db_numrows($result) > 0) { + return db_result($result,0,'status_name'); + } else { + return 'Error - Not Found'; + } +} + +/** + * pm_data_get_group_name() - Simply return the resolution name for this id + * + * @param int The group project ID + * @returns Database result set on success/Error string one rror + * + */ +function pm_data_get_group_name($group_project_id) { + $sql="SELECT * FROM project_group_list WHERE group_project_id='$group_project_id'"; + $result=db_query($sql); + if ($result && db_numrows($result) > 0) { + return db_result($result,0,'project_name'); + } else { + return 'Error - Not Found'; + } +} + +/** + * pm_data_create_history() - Handle the insertion of history for these parameters + * + * @param string The field name + * @param string The old value + * @param int The project task ID + * @returns true on success/false on error + * + */ +function pm_data_create_history ($field_name,$old_value,$project_task_id) { + global $feedback; + + $sql="insert into project_history(project_task_id,field_name,old_value,mod_by,date) ". + "VALUES ('$project_task_id','$field_name','$old_value','".user_getid()."','".time()."')"; + $result=db_query($sql); + if (!$result) { + $feedback .= ' ERROR IN AUDIT TRAIL - '.db_error(); + return false; + } else { + return true; + } +} + +/** + * pm_data_insert_assigned_to() - Insert the people this task is assigned to + * + * @param array An array of project ID's + * @param int The project task ID + * @returns true on success/false on error + * + */ +function pm_data_insert_assigned_to($array,$project_task_id) { + global $feedback; + + $user_count=count($array); + if ($user_count < 1) { + //if no users selected, insert user "none" + $sql="INSERT INTO project_assigned_to (project_task_id,assigned_to_id) + VALUES ('$project_task_id','100')"; + $result=db_query($sql); + if (!$result) { + return false; + } else { + return true; + } + } else { + for ($i=0; $i<$user_count; $i++) { + if (($user_count > 1) && ($array[$i]==100)) { + //don't insert the row if there's more + //than 1 item selected and this item is the "none user" + } else { + $sql="INSERT INTO project_assigned_to (project_task_id,assigned_to_id) + VALUES ('$project_task_id','$array[$i]')"; + //echo "\n$sql"; + $result=db_query($sql); + if (!$result) { + $feedback .= ' ERROR inserting project_assigned_to '.db_error(); + return false; + } + } + } + return true; + } +} + +/** + * pm_data_update_assigned_to() - Delete then Insert the people this task is assigned to + * + * @param array An array of project ID's + * @param int The project task ID + * @returns Return value of pm_data_insert_assigned_to() + * @see pm_data_insert_assigned_do() + * + */ +function pm_data_update_assigned_to($array,$project_task_id) { + $toss=db_query("DELETE FROM project_assigned_to WHERE project_task_id='$project_task_id'"); + return pm_data_insert_assigned_to($array,$project_task_id); +} + +/** + * pm_data_insert_dependent_tasks() - Insert the list of dependencies + * + * @param array An array of project ID's + * @param int The project task ID + * @returns true on success/false on error + * + */ +function pm_data_insert_dependent_tasks($array,$project_task_id) { + global $feedback; + + $depend_count=count($array); + if ($depend_count < 1) { + //if no tasks selected, insert task "none" + $sql="INSERT INTO project_dependencies (project_task_id,is_dependent_on_task_id) + VALUES ('$project_task_id','100')"; + $result=db_query($sql); + if (!$result) { + return false; + } else { + return true; + } + } else { + for ($i=0; $i<$depend_count; $i++) { + if (($depend_count > 1) && ($array[$i]==100)) { + //don't insert the row if there's more + //than 1 item selected and this item is the "none task" + } else { + $sql="INSERT INTO project_dependencies (project_task_id,is_dependent_on_task_id) + VALUES ('$project_task_id','$array[$i]')"; + //echo "\n$sql"; + $result=db_query($sql); + + if (!$result) { + $feedback .= ' ERROR inserting dependent_tasks '.db_error(); + return false; + } + } + } + return true; + } +} + +/** + * pm_data_update_dependend_tasks() - Delete then Insert the list of dependencies + * + * @param array An array of project ID's + * @param int The project task ID + * @returns true on success/false on error + * + */ +function pm_data_update_dependent_tasks($array,$project_task_id) { + $toss=db_query("DELETE FROM project_dependencies WHERE project_task_id='$project_task_id'"); + return pm_data_insert_dependent_tasks($array,$project_task_id); +} + +/** + * pm_data_create_task() - Creates a new task in the task mgr + * NOTE: Does no handle security!! + * + * @param int The group project ID + * @param int The starting month + * @param int The starting day + * @param int The ending month + * @param int The ending day + * @param int The ending year + * @param string The task summary + * @param string Details of the task + * @param int The completed percentage of the task + * @param int The task priority + * @param int The number of hours exptected to complete this task + * @param int The user ID of the person to which this task is assigned + * @param int on The task ID on which this task depends + * @returns Nnew project_task_id or false and $feedback + * + */ +function pm_data_create_task ($group_project_id,$start_month,$start_day,$start_year,$end_month,$end_day, + $end_year,$summary,$details,$percent_complete,$priority,$hours,$assigned_to,$dependent_on) { + + global $feedback; + if (!$group_project_id || !$start_month || !$start_day || !$start_year || !$end_month || !$end_day || + !$end_year || !$summary || !$details || !$priority) { + $feedback .= ' ERROR - Missing Required Parameters '; + return false; + } + + if (mktime(0,0,0,$start_month,$start_day,$start_year) > mktime(0,0,0,$end_month,$end_day,$end_year)) { + exit_error('Error','End Date Must Be Greater Than Begin Date'); + } + + $sql="INSERT INTO project_task (group_project_id,summary,details,percent_complete,". + "priority,hours,start_date,end_date,". + "created_by,status_id) VALUES ('$group_project_id','".htmlspecialchars($summary)."',". + "'".htmlspecialchars($details)."','$percent_complete','$priority','$hours','". + mktime(0,0,0,$start_month,$start_day,$start_year)."','". + mktime(0,0,0,$end_month,$end_day,$end_year)."','".user_getid()."','1')"; + + db_begin(); + + $result=db_query($sql); + $project_task_id=db_insertid($result,'project_task','project_task_id'); + + if (!$result || !$project_task_id) { + $feedback .= ' ERROR INSERTING ROW '.db_error(); + db_rollback(); + return false; + } else { + $feedback .= ' Successfully added task '; + if (!pm_data_insert_assigned_to($assigned_to,$project_task_id)) { + db_rollback(); + $feedback .= ' ERROR inserting assigned to '; + return false; + } + if (!pm_data_insert_dependent_tasks($dependent_on,$project_task_id)) { + db_rollback(); + $feedback .= ' ERROR inserting assigned to '; + return false; + } + mail_followup($project_task_id,$group_project_id,1); + db_commit(); + return $project_task_id; + } +} + +/** + * pm_data_update_task() - Update a task + * NOTE: Does not handle security at this time! + * This assumes that you have verified this $group_project_id truly belongs to this $group_id + * AND that this user is a project_task_admin + * + * @param int The group project ID + * @param int The starting month + * @param int The starting day + * @param int The ending month + * @param int The ending day + * @param int The ending year + * @param string The task summary + * @param string Details of the task + * @param int The completed percentage of the task + * @param int The task priority + * @param int The number of hours exptected to complete this task + * @param int The user ID of the person to which this task is assigned + * @param int The task ID on which this task depends + * @returns Nnew project_task_id or false and $feedback + * @returns true/false and $feedback string + * + */ +function pm_data_update_task ($group_project_id,$project_task_id,$start_month,$start_day,$start_year, + $end_month,$end_day,$end_year,$summary,$details,$percent_complete,$priority,$hours, + $status_id,$assigned_to,$dependent_on,$new_group_project_id,$group_id) { + + global $feedback; + if (!$group_project_id || !$project_task_id || !$status_id || !$start_month || !$start_day || !$start_year || + !$end_month || !$end_day || !$end_year || !$summary || !$priority || !$new_group_project_id || !$group_id) { + $feedback .= ' ERROR - Missing Parameters '; + return false; + } + $sql="SELECT * FROM project_task WHERE project_task_id='$project_task_id' AND group_project_id='$group_project_id'"; + + $result=db_query($sql); + + if (db_numrows($result) < 1) { + $feedback .= ' ERROR - Task Doesn\'t Exist In This Subproject '; + return false; + } + + /* + Enforce start date > end date + */ + if (mktime(0,0,0,$start_month,$start_day,$start_year) > mktime(0,0,0,$end_month,$end_day,$end_year)) { + $feedback .= ' ERROR - End Date Must Be Greater Than Start Date '; + return false; + } + + db_begin(); + + /* + If changing subproject, verify the new subproject belongs to this project + */ + if ($group_project_id != $new_group_project_id) { + $sql = "SELECT group_id FROM project_group_list WHERE group_project_id='$new_group_project_id'"; + + if (db_result(db_query($sql),0,'group_id') != $group_id) { + $feedback .= ' You can not put this task into the subproject of another group. '; + db_rollback(); + return false; + } else { + pm_data_create_history ('subproject_id',$group_project_id,$project_task_id); + } + } + + /* + See which fields changed during the modification + and create audit trail + */ + + if (db_result($result,0,'status_id') != $status_id) + { pm_data_create_history ('status_id',db_result($result,0,'status_id'),$project_task_id); } + + if (db_result($result,0,'priority') != $priority) + { pm_data_create_history ('priority',db_result($result,0,'priority'),$project_task_id); } + + if (db_result($result,0,'summary') != htmlspecialchars(stripslashes($summary))) + { pm_data_create_history ('summary',addslashes(db_result($result,0,'summary')),$project_task_id); } + + if (db_result($result,0,'percent_complete') != $percent_complete) + { pm_data_create_history ('percent_complete',db_result($result,0,'percent_complete'),$project_task_id); } + + if (db_result($result,0,'hours') != $hours) + { pm_data_create_history ('hours',db_result($result,0,'hours'),$project_task_id); } + + if (db_result($result,0,'start_date') != mktime(0,0,0,$start_month,$start_day,$start_year)) + { pm_data_create_history ('start_date',db_result($result,0,'start_date'),$project_task_id); } + + if (db_result($result,0,'end_date') != mktime(0,0,0,$end_month,$end_day,$end_year)) + { pm_data_create_history ('end_date',db_result($result,0,'end_date'),$project_task_id); } + + /* + Details field is handled a little differently + + Details are comments attached to bugs + They are still stored in the project_history (audit trail) + system, but they are not shown in the regular audit trail + + Someday, these should technically be split into their own table. + */ + if ($details != '') + { pm_data_create_history ('details',htmlspecialchars($details),$project_task_id); } + + if (!pm_data_update_dependent_tasks($dependent_on,$project_task_id)) { + db_rollback(); + $feedback .= ' ERROR updating dependent tasks '; + return false; + } + if (!pm_data_update_assigned_to($assigned_to,$project_task_id)) { + db_rollback(); + $feedback .= ' ERROR updating assigned to '; + return false; + } + + /* + Update the actual db record + */ + $sql="UPDATE project_task SET status_id='$status_id', priority='$priority',". + "summary='".htmlspecialchars($summary)."',start_date='". + mktime(0,0,0,$start_month,$start_day,$start_year)."',end_date='". + mktime(0,0,0,$end_month,$end_day,$end_year)."',hours='$hours',". + "percent_complete='$percent_complete', ". + "group_project_id='$new_group_project_id' ". + "WHERE project_task_id='$project_task_id' AND group_project_id='$group_project_id'"; + + $result=db_query($sql); + if (!$result) { + $feedback .= ' ERROR - Database Update Failed '.db_error(); + db_rollback(); + return false; + } else { + $feedback .= ' Successfully Modified Task '; + mail_followup($project_task_id,$new_group_project_id); + db_commit(); + return true; + } + +} + +/** + * mail_followup() - Send a message to the person who opened this task and the person(s) it is assigned to + * Accepts the unique id of a task, its group project id and optionally a list of additional addresses to send to + * + * @param int The project task ID + * @param int The group project ID + * @param string The additional addresses to send the followup + * @param bool The flag of whether this is a new task or not + * + */ +function mail_followup($project_task_id,$group_project_id,$more_addresses=false,$new_task=0) { + global $sys_datefmt,$feedback; + + $sql="SELECT project_task.*, project_group_list.*, groups.group_name,groups.new_task_address, ". + "groups.send_all_tasks,project_status.status_name,users.email, ". + "users.user_name AS creator_name ". + "FROM project_task,project_group_list,project_status,users,groups ". + "WHERE project_task_id='$project_task_id' ". + "AND project_task.group_project_id='$group_project_id' ". + "AND project_task.status_id=project_status.status_id ". + "AND project_task.group_project_id=project_group_list.group_project_id ". + "AND groups.group_id=project_group_list.group_id ". + "AND project_task.created_by=users.user_id"; + + $result=db_query($sql); + + if ($result && db_numrows($result) > 0) { + + // Send a message to the task creator + $to = db_result($result,0,'email'); + + // Build the list of developers assigned this task + $sql="SELECT users.email AS Email,users.user_name ". + "FROM users,project_assigned_to ". + "WHERE project_assigned_to.project_task_id='$project_task_id' ". + "AND users.user_id=project_assigned_to.assigned_to_id"; + + $result3=db_query($sql); + $rows=db_numrows($result3); + if ($result3 && $rows > 0) { + $to .= ', ' . implode(result_column_to_array($result3),', '); + $assignees = implode(result_column_to_array($result3, 1),', '); + } + + $body = "Task #".db_result($result,0,"project_task_id")." has been updated. ". + "\n\nProject: ".db_result($result,0,'group_name'). + "\nSubproject: ".db_result($result,0,'project_name'). + "\nSummary: ".util_unconvert_htmlspecialchars(db_result($result,0,'summary')). + "\nComplete: ".db_result($result,0,'percent_complete')."%". + "\nStatus: ".db_result($result,0,'status_name'). + "\nAuthority : ".db_result($result,0,'creator_name'). + "\nAssigned to: ".$assignees. + "\n\nDescription: ".db_result($result,0,'details'); + + /* + Now get the followups to this task + */ + $sql="SELECT project_history.field_name,project_history.old_value,project_history.date,users.user_name ". + "FROM project_history,users ". + "WHERE project_history.mod_by=users.user_id AND project_history.field_name = 'details' ". + "AND project_task_id='$project_task_id' ORDER BY project_history.date DESC"; + $result2=db_query($sql); + $rows=db_numrows($result2); + if ($result2 && $rows > 0) { + $body .= "\n\nFollow-Ups:"; + for ($i=0; $i<$rows;$i++) { + $body .= "\n\n-------------------------------------------------------"; + $body .= "\nDate: ".date($sys_datefmt,db_result($result2,$i,'date')); + $body .= "\nBy: ".db_result($result2,$i,'user_name'); + $body .= "\n\nComment:\n".util_unconvert_htmlspecialchars(db_result($result2,$i,'old_value')); + } + } + $body .= "\n\n-------------------------------------------------------". + "\nFor more info, visit:". + "\n\nhttp://$GLOBALS[sys_default_domain]/pm/task.php?func=detailtask&project_task_id=". + db_result($result,0,'project_task_id')."&group_id=". + db_result($result,0,'group_id')."&group_project_id=".db_result($result,0,'group_project_id'); + + $subject="[Task #".db_result($result,0,'project_task_id').'] '. + util_unconvert_htmlspecialchars(db_result($result,0,'summary')); + + + // Append the list of additional receiptients + if ($more_addresses) { + $to .= ', ' . $more_addresses; + } + + // If this is a new task, or if send all tasks == 1, + // append the new_task_address for the group + if (($new_task && db_result($result,0,'new_task_address')) || db_result($result,0,'send_all_tasks')) { + $to .= ', ' . db_result($result,0,'new_task_address'); + } + + $more='From: noreply@'.$GLOBALS['sys_default_domain']; + + mail($to,$subject,$body,$more); + + $feedback .= " Task Update Sent "; + + } else { + + $feedback .= " Could Not Send Task Update "; + echo db_error(); + + } +} + +?> diff --git a/gforge/common/tracker/Artifact.class b/gforge/common/tracker/Artifact.class new file mode 100644 index 0000000000..c7707cdb88 --- /dev/null +++ b/gforge/common/tracker/Artifact.class @@ -0,0 +1,1026 @@ +create() + * @return true/false + */ + function Artifact(&$ArtifactType, $data=false) { + $this->Error(); + + $this->ArtifactType =& $ArtifactType; + + //was ArtifactType legit? + if (!$ArtifactType || !is_object($ArtifactType)) { + $this->setError('Artifact: No Valid ArtifactType'); + return false; + } + //did ArtifactType have an error? + if ($ArtifactType->isError()) { + $this->setError('Artifact: '.$ArtifactType->getErrorMessage()); + return false; + } + + // + // make sure this person has permission to view artifacts + // + if (!$this->ArtifactType->userCanView()) { + $this->setError('Artifact: Only Group Members Can View Private ArtifactTypes'); + return false; + } + + // + // set up data structures + // + if ($data) { + if (is_array($data)) { + $this->data_array =& $data; + return true; + } else { + if (!$this->fetchData($data)) { + return false; + } else { + return true; + } + } + } else { + $this->setError('No ID Present'); + } + } + + + /** + * create() - construct a new Artifact in the database + * + * @param int The category ID + * @param int The artifact group ID + * @param string The artifact summary + * @param string Details of the artifact + * @param int The ID of the user to which this artifact is to be assigned + * @param int The artifacts priority + * @return id on success / false on failure + */ + function create($category_id, $artifact_group_id, $summary, $details, $assigned_to=100, $priority=5, $monitor_email=false) { + + // + // make sure this person has permission to add artifacts + // + if (!$this->ArtifactType->isPublic()) { + // + // Only admins can post/modify private artifacts + // + if (!$this->ArtifactType->userIsAdmin()) { + $this->setError('Artifact: Only Artifact Admins Can Modify Private ArtifactTypes'); + return false; + } + } + + // + // get the user_id + // + if (user_isloggedin()) { + $user=user_getid(); + } else { + if ($this->ArtifactType->allowsAnon()) { + $user=100; + } else { + $this->setError('Artifact: This ArtifactType Does Not Allow Anonymous Submissions. Please Login.'); + return false; + } + } + + // + // data validation + // + if (!$summary) { + $this->setError('Artifact: Message Summary Is Required'); + return false; + } + if (!$details) { + $this->setError('Artifact: Message Body Is Required'); + return false; + } + if (!$assigned_to) { + if ($category_id == 100) { + $assigned_to=100; + } else { + //create an ArtifactCategory to determine who to auto-assign to + $ac=new ArtifactCategory($this->ArtifactType,$category_id); + if (!$ac || !is_object($ac) || $ac->isError()) { + $assigned_to=100; + } else { + $assigned_to=$ac->getAssignee(); + } + } + } + if ($assigned_to==100 && $category_id != 100) { + //create an ArtifactCategory to determine who to auto-assign to + $ac=new ArtifactCategory($this->ArtifactType,$category_id); + if (!$ac || !is_object($ac) || $ac->isError()) { + $assigned_to=100; + } else { + $assigned_to=$ac->getAssignee(); + } + } + if (!$priority) { + $priority=5; + } + if (!$category_id) { + $category_id=100; + } + if (!$artifact_group_id) { + $artifact_group_id=100; + } + if (!$resolution_id) { + $resolution_id=100; + } + + db_begin(); + + // + // Check to see if this idiot user is trying to double-submit + // + $res=db_query("SELECT * FROM artifact + WHERE summary='$summary' + AND submitted_by='$user' + AND open_date > '". (time() - 86400) ."'"); + if ($res && db_numrows($res) > 0) { + $this->setError("You Attempted To Double-submit this item. Please avoid double-clicking."); + db_rollback(); + return false; + } + + $res=db_query("INSERT INTO artifact + (group_artifact_id,status_id,category_id,artifact_group_id,priority, + submitted_by,assigned_to,open_date,summary,details,resolution_id) + VALUES + ('".$this->ArtifactType->getID()."','1','$category_id','$artifact_group_id', + '$priority','$user','$assigned_to','". time() ."','". + htmlspecialchars($summary)."','". htmlspecialchars($details)."','$resolution_id')"); + + $artifact_id=db_insertid($res,'artifact','artifact_id'); + + if (!$res || !$artifact_id) { + $this->setError('Artifact: '.db_error()); + db_rollback(); + return false; + } else { + // + // Now set up our internal data structures + // + if (!$this->fetchData($artifact_id)) { + db_rollback(); + return false; + } + + // + // now send an email if appropriate + // + $this->mailFollowup(1); + db_commit(); + $this->clearError(); + + // + // Set up monitoring for the user if requested + // + if ($monitor_email) { + $this->setMonitor($monitor_email); + } + return $artifact_id; + } + } + + /** + * fetchData() - re-fetch the data for this Artifact from the database + * + * @param int The artifact ID + * @return true/false + */ + function fetchData($artifact_id) { + $res=db_query("SELECT * FROM artifact_vw + WHERE artifact_id='$artifact_id' AND group_artifact_id='".$this->ArtifactType->getID()."'"); + if (!$res || db_numrows($res) < 1) { + $this->setError('Artifact: Invalid ArtifactID'); + return false; + } + $this->data_array =& db_fetch_array($res); + db_free_result($res); + return true; + } + + /** + * getArtifactType() - get the ArtifactType Object this Artifact is associated with + * + * @return ArtifactType + */ + function &getArtifactType() { + return $this->ArtifactType; + } + + /** + * getID() - get this ArtifactID + * + * @return the group_artifact_id # + */ + function getID() { + return $this->data_array['artifact_id']; + } + + /** + * getStatusID() - get open/closed/deleted flag + * + * @return (1) Open, (2) Closed, (3) Deleted + */ + function getStatusID() { + return $this->data_array['status_id']; + } + + /** + * getStatusName() - get open/closed/deleted text + * + * @return text status name + */ + function getStatusName() { + return $this->data_array['status_name']; + } + + /** + * getResolutionID() - get resolution flag + * + * @return int + */ + function getResolutionID() { + return $this->data_array['resolution_id']; + } + + /** + * getResolutionName() - get resolution name + * + * @return text resolution name + */ + function getResolutionName() { + return $this->data_array['resolution_name']; + } + + /** + * getCategoryID() - get category_id flag + * + * @return int category_id + */ + function getCategoryID() { + return $this->data_array['category_id']; + } + + /** + * getCategoryName() - get category text name + * + * @return text category name + */ + function getCategoryName() { + return $this->data_array['category_name']; + } + + /** + * getArtifactGroupID() - get artifact_group_id flag + * + * @return int artifact_group_id + */ + function getArtifactGroupID() { + return $this->data_array['artifact_group_id']; + } + + /** + * getArtifactGroupName() - get artifact_group_name text + * + * @return text artifact_group name + */ + function getArtifactGroupName() { + return $this->data_array['group_name']; + } + + /** + * getPriority() - get priority flag + * + * @return int priority + */ + function getPriority() { + return $this->data_array['priority']; + } + + /** + * getSubmittedBy() - get ID of submitter + * + * @return int user_id of submitter + */ + function getSubmittedBy() { + return $this->data_array['submitted_by']; + } + + /** + * getSubmittedEmail() - get email of submitter + * + * @return text email of submitter + */ + function getSubmittedEmail() { + return $this->data_array['submitted_email']; + } + + /** + * getSubmittedRealName() - get real name of submitter + * + * @return text real name of submitter + */ + function getSubmittedRealName() { + return $this->data_array['submitted_realname']; + } + + /** + * getSubmittedUnixName() - get login name of submitter + * + * @return text unix name of submitter + */ + function getSubmittedUnixName() { + return $this->data_array['submitted_unixname']; + } + + /** + * getAssignedTo() - get ID of assignee + * + * @return int user_id of assignee + */ + function getAssignedTo() { + return $this->data_array['assigned_to']; + } + + /** + * getAssignedEmail() - get email of assignee + * + * @return text email of assignee + */ + function getAssignedEmail() { + return $this->data_array['assigned_email']; + } + + /** + * getAssignedRealName() - get real name of assignee + * + * @return text real name of assignee + */ + function getAssignedRealName() { + return $this->data_array['assigned_realname']; + } + + /** + * getAssignedUnixName() - get login name of assignee + * + * @return text unix name of assignee + */ + function getAssignedUnixName() { + return $this->data_array['assigned_unixname']; + } + + /** + * getOpenDate() - get unix time of creation + * + * @return int unix time + */ + function getOpenDate() { + return $this->data_array['open_date']; + } + + /** + * getCloseDate() - get unix time of closure + * + * @return int unix time + */ + function getCloseDate() { + return $this->data_array['close_date']; + } + + /** + * getSummary() - get text summary of artifact + * + * @return text summary (subject) + */ + function getSummary() { + return $this->data_array['summary']; + } + + /** + * getDetails() - get text body (message) of artifact + * + * @return text body (message) + */ + function getDetails() { + return $this->data_array['details']; + } + + /** + * setMonitor() - user can monitor this artifact + * + * @param string The email address of the user who is monitoring this artifact + * @return false - always false - always use the getErrorMessage() for feedback + */ + function setMonitor($email=false) { + if (user_isloggedin()) { + + $user_id=user_getid(); + $user =& user_get_object(user_getid()); + $email=' '; + + //we don't want to include the "And email=" because + //a logged-in user's email may have changed + $email_sql=''; + + } else { + + if (!$email || !validate_email($email)) { + $this->setError('SetMonitor::Valid Email Address Required'); + return false; + } + $user_id=100; + + $email_sql="AND email='$email'"; + + } + + $email=strtolower($email); + + $res=db_query("SELECT * FROM artifact_monitor + WHERE artifact_id='". $this->getID() ."' + AND user_id='$user_id' $email_sql"); + + if (!$res || db_numrows($res) < 1) { + //not yet monitoring + $res=db_query("INSERT INTO artifact_monitor (artifact_id,user_id,email) + VALUES ('". $this->getID() ."','$user_id','$email')"); + if (!$res) { + $this->setError(db_error()); + return false; + } else { + $this->setError('Now Monitoring'); + return false; + } + } else { + //already monitoring - remove their monitor + db_query("DELETE FROM artifact_monitor + WHERE artifact_id='". $this->getID() ."' + AND user_id='$user_id' $email_sql"); + $this->setError('Monitoring Deactivated'); + return false; + } + } + + /** + * getMonitorEmails() - + * + * @return array of email addresses monitoring this ArtifactType + */ + function &getMonitorEmails() { + $res=db_query("SELECT artifact_monitor.user_id,users.email,artifact_monitor.email as email2 + FROM users,artifact_monitor + WHERE users.user_id=artifact_monitor.user_id + AND artifact_monitor.artifact_id='". $this->getID() ."'"); + + $rows=db_numrows($res); + $email=array(); + + for ($i=0; $i<$rows; $i++) { + // + // for monitoring by non-logged-in users, + // we grab the email they gave us + // + // otherwise we use the confirmed one from the users table + // + $email[]=((db_result($res,$i,'user_id') == 100)?db_result($res,$i,'email2'):db_result($res,$i,'email') ); + } + return $email; + } + + /** + * getHistory() - returns a result set of audit trail for this support request + * + * @return result set + */ + function getHistory() { + $sql="SELECT * ". + "FROM artifact_history_user_vw ". + "WHERE artifact_id='". $this->getID() ."' ". + "ORDER BY entrydate DESC"; + return db_query($sql); + } + + /** + * getMessages() - get the list of messages attached to this artifact + * + * @return database result set + */ + function getMessages() { + $sql="select * ". + "FROM artifact_message_user_vw ". + "WHERE artifact_id='". $this->getID() ."' ORDER BY adddate DESC"; + return db_query($sql); + } + + /** + * getFiles() - get array of ArtifactFile's + * + * @return array of ArtifactFile's + */ + function &getFiles() { + if (!isset($this->files)) { + $sql="select * ". + "FROM artifact_file_user_vw ". + "WHERE artifact_id='". $this->getID() ."'"; + $res=db_query($sql); + $rows=db_numrows($res); + if ($rows > 0) { + for ($i=0; $i < $rows; $i++) { + $this->files[$i]=new ArtifactFile($this,db_fetch_array($res)); + } + } else { + $this->files=array(); + } + } + return $this->files; + } + + /** + * addMessage() - attach a text message to this Artifact + * + * @param string The message being attached + * @param string Email address of message creator + * @param bool Whether to email out a followup + * @access private + * @return true/false + */ + function addMessage($body,$by=false,$send_followup=false) { + if (!$body) { + $this->setError('ERROR - addMessage: Missing Parameters'); + return false; + } + + if (user_isloggedin()) { + $user_id=user_getid(); + $user =& user_get_object($user_id); + if (!$user || !is_object($user)) { + $this->setError('ERROR - Logged In User Bug Could Not Get User Object'); + return false; + } + $body="Logged In: YES \nuser_id=$user_id\n\n".$body; + + // we'll store this email even though it will likely never be used - + // since we have their correct user_id, we can join the USERS table to get email + $by=$user->getEmail(); + } else { + $body="Logged In: NO \n\n".$body; + $user_id=100; + if (!$by) { + $this->setError('ERROR - addMessage: Missing Email Address'); + return false; + } + } + + $sql="insert into artifact_message (artifact_id,submitted_by,from_email,adddate,body) ". + "VALUES ('". $this->getID() ."','$user_id','$by','". time() ."','". htmlspecialchars($body). "')"; + $res = db_query($sql); + if ($send_followup) { + $this->mailFollowup(2,false); + } + return $res; + } + + /** + * addHistory() - add an entry to audit trail + * + * @param string The name of the field in the database being modified + * @param string The former value of this field + * @access private + * @return true/false + */ + function addHistory($field_name,$old_value) { + if (!user_isloggedin()) { + $user=100; + } else { + $user=user_getid(); + } +?>getID() ."','$field_name','$old_value','$user','". time() ."')"; + return db_query($sql); + } + + /** + * update() - update the fields in this artifact + * + * @param int The artifact priority + * @param int The artifact status ID + * @param int The artifact category ID + * @param int The artifact group ID + * @param int The artifact resolution ID + * @param int The person to which this artifact is to be assigned + * @param int The artifact summary + * @param int The canned response + * @param int Attaching another comment + * @param int Allows you to move an artifact to another type + * @return true/false + */ + function update($priority,$status_id,$category_id,$artifact_group_id,$resolution_id, + $assigned_to,$summary,$canned_response,$details,$new_artifact_type_id) { + + if (!$this->getID() + || !$assigned_to + || !$status_id + || !$category_id + || !$artifact_group_id + || !$resolution_id + || !$canned_response + || !$new_artifact_type_id) { + $this->setError('Artifact: Missing required parameters to artifact::update()'); + return false; + } + + // If the current status is Pending then auto-reset it to 'Open' + // Assumes the status ID for 'Pending' is '4' + if ($status_id != '2' && $status_id != '3' && $this->getStatusID() == '4') { + $status_id = '1'; + } + + // original submitter can always modify his/her items now + if (!$this->ArtifactType->userIsAdmin() && ($this->getSubmittedBy() != user_getid())) { + $this->setError('Artifact: Update Permission Denied'); + return false; + } + + // Array to record which properties were changed + $changes = array(); + + db_begin(); + + // + // Get a lock on this row in the database + // + $lock=db_query("SELECT * FROM artifact WHERE artifact_id='".$this->getID()."' FOR UPDATE"); + + $artifact_type_id = $this->ArtifactType->getID(); + + // + // Attempt to move this Artifact to a new ArtifactType + // need to instantiate new ArtifactType obj and test perms + // + if ($new_artifact_type_id != $artifact_type_id) { + $newArtifactType= new ArtifactType($this->ArtifactType->getGroup(), $new_artifact_type_id); + if (!is_object($newArtifactType) || $newArtifactType->isError()) { + $this->setError('Artifact: Could not move to new ArtifactType'.$newArtifactType->getErrorMessage()); + return false; + } + // do they have perms for new ArtifactType? + if (!$newArtifactType->userIsAdmin()) { + $this->setError('Artifact: Could not move to new ArtifactType: Permission Denied'); + db_rollback(); + return false; + } + // + // Now set ArtifactGroup, Category, and Assigned to 100 in the new ArtifactType + // + $status_id=1; + $category_id='100'; + $artifact_group_id='100'; + $assigned_to='100'; + //can't send a canned response when changing ArtifactType + $canned_response=100; + $this->ArtifactType =& $newArtifactType; + $update = true; + } + + $sqlu=''; + + // + // handle audit trail & build SQL statement + // + if ($this->getStatusID() != $status_id) { + $this->addHistory('status_id',$this->getStatusID()); + $sqlu .= " status_id='$status_id', "; + $changes['status'] = 1; + $update = true; + } + if (($this->getResolutionID() != $resolution_id) && ($resolution_id != 100)) { + $this->addHistory('resolution_id',$this->getResolutionID()); + $sqlu .= " resolution_id='$resolution_id', "; + $changes['resolution'] = 1; + $update = true; + } + if ($this->getCategoryID() != $category_id) { + $this->addHistory('category_id',$this->getCategoryID()); + $sqlu .= " category_id='$category_id', "; + $changes['category'] = 1; + $update = true; + } + if ($this->getArtifactGroupID() != $artifact_group_id) { + $this->addHistory('artifact_group_id',$this->getArtifactGroupID()); + $sqlu .= " artifact_group_id='$artifact_group_id', "; + $changes['artifact_group'] = 1; + $update = true; + } + if ($this->getPriority() != $priority) { + $this->addHistory('priority',$this->getPriority()); + $sqlu .= " priority='$priority', "; + $changes['priority'] = 1; + $update = true; + } + + if ($this->getAssignedTo() != $assigned_to) { + $this->addHistory('assigned_to',$this->getAssignedTo()); + $sqlu .= " assigned_to='$assigned_to', "; + $changes['assigned_to'] = 1; + $update = true; + } + if ($summary && (addslashes($this->getSummary()) != htmlspecialchars($summary))) { + $this->addHistory('summary', addslashes($this->getSummary())); + $sqlu .= " summary='". htmlspecialchars($summary) ."', "; + $changes['summary'] = 1; + $update = true; + } + + if ($details) { + $this->addMessage($details); + $changes['details'] = 1; + $send_message=true; + } + + // + // Enter the timestamp if we are changing to closed + // + if ($status_id != 1) { + $now=time(); + $sqlu .= " close_date='$now', "; + $this->addHistory('close_date',$this->getCloseDate()); + $update = true; + } + + /* + Finally, update the artifact itself + */ + if ($update){ + $sql = "UPDATE artifact + SET + $sqlu + group_artifact_id='$new_artifact_type_id' + WHERE + artifact_id='". $this->getID() ."' + AND group_artifact_id='$artifact_type_id'"; + + $result=db_query($sql); + + if (!$result || db_affected_rows($result) < 1) { + $this->setError('Error - update failed!'); + echo db_error(); + db_rollback(); + return false; + } else { + $this->fetchData($this->getID()); +//error check the data fetching?? + } + } + + /* + handle canned responses + + Instantiate ArtifactCanned and get the body of the message + */ + if ($canned_response != 100) { + //don't care if this response is for this group - could be hacked + $acr=new ArtifactCanned($this->ArtifactType,$canned_response); + if (!$acr || !is_object($acr)) { + $this->setError('Artifact: Could Not Create Canned Response Object'); + } elseif ($acr->isError()) { + $this->setError('Artifact: '.$acr->getErrorMessage()); + } else { + $body = addslashes($acr->getBody()); + if ($body) { + if (!$this->addMessage(util_unconvert_htmlspecialchars($body),user_getname().'@'.$GLOBALS['sys_users_host'])) { + db_rollback(); + return false; + } else { + $send_message=true; + } + } else { + $this->setError('Artifact: Unable to Use Canned Response'); + return false; + } + } + } + + if ($update || $send_message){ + /* + now send the email + */ + $this->mailFollowup(2, false, $changes); + db_commit(); + return true; + } else { + //nothing changed, so cancel the transaction + $this->setError('Nothing Changed - Update Cancelled'); + db_rollback(); + return false; + } + } + + // function which returns proper marker for changed properties + function marker($prop_name,$changes) { + if ($changes[$prop_name]) { + return '>'; + } else { + return ''; + } + } + + /** + * mailFollowup() - send out an email update for this artifact + * + * @param int (1) initial/creation (2) update + * @param array Array of additional addresses to mail to + * @param array Array of fields changed in this update + * @access private + * @return true/false + */ + function mailFollowup($type, $more_addresses=false, $changes='') { + global $sys_datefmt; + + if (!$changes) { + $changes=array(); + } + + if ($this->ArtifactType->useResolution()) { + $resolution_text = $this->marker('resolution',$changes). + "Resolution: ". $this->getResolutionName() ."\n"; + } + + $body = $this->ArtifactType->getName() ." item #". $this->getID() .", was opened at ". date( $sys_datefmt, $this->getOpenDate() ). + "\nYou can respond by visiting: ". + "\nhttp://".$GLOBALS['sys_default_domain']."/tracker/?func=detail&atid=". $this->ArtifactType->getID() . + "&aid=". $this->getID() . + "&group_id=". $this->ArtifactType->Group->getID() . + "\n\n". + $this->marker('category',$changes). + "Category: ". $this->getCategoryName() ."\n". + $this->marker('artifact_group',$changes). + "Group: ". $this->getArtifactGroupName() ."\n". + $this->marker('status',$changes). + "Status: ". $this->getStatusName() ."\n". + $resolution_text. + $this->marker('priority',$changes). + "Priority: ". $this->getPriority() ."\n". + "Submitted By: ". $this->getSubmittedRealName() . + " (". $this->getSubmittedUnixName(). ")"."\n". + $this->marker('assigned_to',$changes). + "Assigned to: ". $this->getAssignedRealName() . + " (". $this->getAssignedUnixName(). ")"."\n". + $this->marker('summary',$changes). + "Summary: ". util_unconvert_htmlspecialchars( $this->getSummary() ); + + + $subject='[ '. $this->ArtifactType->Group->getUnixName() . '-' . $this->ArtifactType->getName() . '-' . $this->getID() .' ] '. util_unconvert_htmlspecialchars( $this->getSummary() ); + + if ($type > 1) { + /* + get all the email addresses that are monitoring this request + */ + $emails =& $this->getMonitorEmails(); + } + + if ($more_addresses) { + $emails[] = $more_addresses; + } + //we don't email the current user + if ($this->getAssignedTo() != user_getid()) { + $emails[] = $this->getAssignedEmail(); + } + if ($this->getSubmittedBy() != user_getid()) { + $emails[] = $this->getSubmittedEmail(); + } + //initial submission + if ($type==1) { + //if an email is set for this ArtifactType + //add that address to the BCC: list + if ($this->ArtifactType->getEmailAddress()) { + $emails[] = $this->ArtifactType->getEmailAddress(); + } + } else { + //update + if ($this->ArtifactType->emailAll()) { + $emails[] = $this->ArtifactType->getEmailAddress(); + } + } + + $body .= "\n\nInitial Comment:". + "\n".util_unconvert_htmlspecialchars( $this->getDetails() ) . + "\n\n----------------------------------------------------------------------"; + + if ($type > 1) { + /* + Now include the followups + */ + $result2=$this->getMessages(); + + $rows=db_numrows($result2); + + if ($result2 && $rows > 0) { + for ($i=0; $i<$rows; $i++) { + // + // for messages posted by non-logged-in users, + // we grab the email they gave us + // + // otherwise we use the confirmed one from the users table + // + if (db_result($result2,$i,'user_id') == 100) { + $emails[] = db_result($result2,$i,'from_email'); + } else { + $emails[] = db_result($result2,$i,'email'); + } + + + $body .= "\n\n"; + if ($i == 0) { + $body .= $this->marker('details',$changes); + } + $body .= "Comment By: ". db_result($result2,$i,'realname') . " (".db_result($result2,$i,'user_name').")". + "\nDate: ". date( $sys_datefmt,db_result($result2,$i,'adddate') ). + "\n\nMessage:". + "\n".util_unconvert_htmlspecialchars( db_result($result2,$i,'body') ). + "\n\n----------------------------------------------------------------------"; + } + } + + } + + $body .= "\n\nYou can respond by visiting: ". + "\nhttp://$GLOBALS[sys_default_domain]/tracker/?func=detail&atid=". $this->ArtifactType->getID() . + "&aid=". $this->getID() . + "&group_id=". $this->ArtifactType->Group->getID(); + + //only send if some recipients were found + if (count($emails) < 1) { + return true; + } + + //now remove all duplicates from the email list + $BCC=implode(',',array_unique($emails)); + + /* + Send the email + */ + util_send_mail("noreply@$GLOBALS[sys_default_domain]",$subject,$body,"noreply@$GLOBALS[sys_default_domain]",$BCC); + return true; + } + +} + +?> diff --git a/gforge/common/tracker/ArtifactCanned.class b/gforge/common/tracker/ArtifactCanned.class new file mode 100644 index 0000000000..e80d1c7579 --- /dev/null +++ b/gforge/common/tracker/ArtifactCanned.class @@ -0,0 +1,199 @@ +Error(); + + //was ArtifactType legit? + if (!$ArtifactType || !is_object($ArtifactType)) { + $this->setError('ArtifactCanned: No Valid ArtifactType'); + return false; + } + //did ArtifactType have an error? + if ($ArtifactType->isError()) { + $this->setError('ArtifactCanned: '.$Artifact->getErrorMessage()); + return false; + } + $this->ArtifactType =& $ArtifactType; + + if ($data) { + if (is_array($data)) { + $this->data_array =& $data; + return true; + } else { + if (!$this->fetchData($data)) { + return false; + } else { + return true; + } + } + } else { + $this->setError('No ID Passed'); + } + } + + /** + * create() - create a new item in the database + * + * @param string The item title + * @param string The item body + * @return id on success / false on failure + */ + function create($title, $body) { + // + // data validation + // + if (!$title || !$body) { + $this->setError('ArtifactCanned: name and assignee are Required'); + return false; + } + if (!$this->ArtifactType->userIsAdmin()) { + $this->setError('Permission Denied'); + return false; + } + + $sql="INSERT INTO artifact_canned_responses (group_artifact_id,title,body) + VALUES ('".$this->ArtifactType->getID()."', + '". htmlspecialchars($title) ."','". htmlspecialchars($body) ."')"; + + $result=db_query($sql); + + if ($result && db_affected_rows($result) > 0) { + $this->clearError(); + return true; + } else { + $this->setError(db_error()); + return false; + } + +/* + // + // Now set up our internal data structures + // + if (!$this->fetchData($id)) { + return false; + } +*/ + } + + /** + * fetchData() - re-fetch the data for this ArtifactCanned from the database + * + * @param int Data ID + * @return true/false + */ + function fetchData($id) { + $res=db_query("SELECT * FROM artifact_canned_responses WHERE id='$id'"); + if (!$res || db_numrows($res) < 1) { + $this->setError('ArtifactCanned: Invalid ArtifactCanned ID'); + return false; + } + $this->data_array =& db_fetch_array($res); + db_free_result($res); + return true; + } + + /** + * getArtifactType() - get the ArtifactType Object this ArtifactCanned message is associated with + * + * @return ArtifactType + */ + function &getArtifactType() { + return $this->ArtifactType; + } + + /** + * getID() - get this ArtifactCanned message's ID + * + * @return the id # + */ + function getID() { + return $this->data_array['id']; + } + + /** + * getTitle() - get the title + * + * @return text title + */ + function getTitle() { + return $this->data_array['title']; + } + + /** + * getBody() - get the body of this message + * + * @return text message body + */ + function getBody() { + return $this->data_array['body']; + } + + /** + * update() - update an ArtifactCanned message + * + * @param string Title of the message + * @param string Body of the message + * @return true/false + */ + function update($title,$body) { + if (!$this->ArtifactType->userIsAdmin()) { + $this->setError('Permission Denied'); + return false; + } + if (!$title || !$body) { + $this->setError('Missing Params'); + return false; + } + + $sql="UPDATE artifact_canned_responses + SET title='". htmlspecialchars($title) ."',body='". htmlspecialchars($body) ."' + WHERE group_artifact_id='". $this->ArtifactType->getID() ."' AND id='". $this->getID() ."'"; + + $result=db_query($sql); + + if ($result && db_affected_rows($result) > 0) { + return true; + } else { + $this->setError(db_error()); + return false; + } + } +} + +?> diff --git a/gforge/common/tracker/ArtifactCategory.class b/gforge/common/tracker/ArtifactCategory.class new file mode 100644 index 0000000000..8b17a8e7d2 --- /dev/null +++ b/gforge/common/tracker/ArtifactCategory.class @@ -0,0 +1,195 @@ +Error(); + + //was ArtifactType legit? + if (!$ArtifactType || !is_object($ArtifactType)) { + $this->setError('ArtifactCategory: No Valid ArtifactType'); + return false; + } + //did ArtifactType have an error? + if ($ArtifactType->isError()) { + $this->setError('ArtifactCategory: '.$Artifact->getErrorMessage()); + return false; + } + $this->ArtifactType =& $ArtifactType; + + if ($data) { + if (is_array($data)) { + $this->data_array =& $data; + return true; + } else { + if (!$this->fetchData($data)) { + return false; + } else { + return true; + } + } + } else { + $this->setError('No ID Passed'); + } + } + + /** + * create() - create a new item in the database + * + * @param string Item name + * @param int User_id of assignee + * @return id on success / false on failure + */ + function create($name, $auto_assign_to) { + // + // data validation + // + if (!$name || !$auto_assign_to) { + $this->setError('ArtifactCategory: name and assignee are Required'); + return false; + } + if (!$this->ArtifactType->userIsAdmin()) { + $this->setError('Permission Denied'); + return false; + } + $sql="INSERT INTO artifact_category (group_artifact_id,category_name,auto_assign_to) + VALUES ('".$this->ArtifactType->getID()."','$name','$auto_assign_to')"; + + $result=db_query($sql); + + if ($result && db_affected_rows($result) > 0) { + $this->clearError(); + return true; + } else { + $this->setError(db_error()); + return false; + } + +/* + // + // Now set up our internal data structures + // + if (!$this->fetchData($id)) { + return false; + } +*/ + } + + /** + * fetchData() - re-fetch the data for this ArtifactCategory from the database + * + * @param int ID of the category + * @return true/false + */ + function fetchData($id) { + $res=db_query("SELECT * FROM artifact_category WHERE id='$id'"); + if (!$res || db_numrows($res) < 1) { + $this->setError('ArtifactCategory: Invalid ArtifactCategory ID'); + return false; + } + $this->data_array =& db_fetch_array($res); + db_free_result($res); + return true; + } + + /** + * getArtifactType() - get the ArtifactType Object this ArtifactCategory is associated with + * + * @return ArtifactType + */ + function &getArtifactType() { + return $this->ArtifactType; + } + + /** + * getID() - get this ArtifactCategory's ID + * + * @return the id # + */ + function getID() { + return $this->data_array['id']; + } + + /** + * getName() - get the name + * + * @return text name + */ + function getName() { + return $this->data_array['category_name']; + } + + /** + * getAssignee() - get the user_id of the person to assign this category to + * + * @return int user_id + */ + function getAssignee() { + return $this->data_array['auto_assign_to']; + } + + /** + * update() - update an ArtifactCategory + * + * @param string Name of the category + * @param int user_id of the person this category should auto-assign to + * @return true/false + */ + function update($name,$assign_to) { + if (!$this->ArtifactType->userIsAdmin()) { + $this->setError('Permission Denied'); + return false; + } + if (!$name || !$assign_to) { + $this->setError('Missing Params'); + return false; + } + $sql="UPDATE artifact_category + SET category_name='$name',auto_assign_to='$assign_to' + WHERE id='". $this->getID() ."' + AND group_artifact_id='".$this->ArtifactType->getID()."'"; + $result=db_query($sql); + if ($result && db_affected_rows($result) > 0) { + return true; + } else { + $this->setError(db_error()); + return false; + } + } +} + +?> diff --git a/gforge/common/tracker/ArtifactFile.class b/gforge/common/tracker/ArtifactFile.class new file mode 100644 index 0000000000..da84c94d51 --- /dev/null +++ b/gforge/common/tracker/ArtifactFile.class @@ -0,0 +1,279 @@ +Error(); + + //was Artifact legit? + if (!$Artifact || !is_object($Artifact)) { + $this->setError('ArtifactFile: No Valid Artifact'); + return false; + } + //did ArtifactType have an error? + if ($Artifact->isError()) { + $this->setError('ArtifactFile: '.$Artifact->getErrorMessage()); + return false; + } + $this->Artifact =& $Artifact; + + if ($data) { + if (is_array($data)) { + $this->data_array =& $data; + return true; + } else { + if (!$this->fetchData($data)) { + return false; + } else { + return true; + } + } + } else { + $this->setError('No ID Passed'); + } + } + + /** + * create() - create a new item in the database + * + * @para string Filename of the item + * @param string Item filetype + * @param string Item filesize + * @param binary Binary item data + * @param string Item description + * @return id on success / false on failure + */ + function create($filename, $filetype, $filesize, $bin_data, $description='None') { + + // Some browsers don't supply mime type if they don't know it + if (!$filetype) { + // Let's be on safe side? + $filetype = 'application/octet-stream'; + } + + // + // data validation + // + if (!$filename || !$filetype || !$filesize || !$bin_data) { + //echo '

|'.$filename.'|'.$filetype.'|'.$filesize.'|'.$bin_data.'|'; + $this->setError('ArtifactFile: File name, type, size, and data are Required'); + return false; + } + + if (user_isloggedin()) { + $userid=user_getid(); + } else { + $userid=100; + } + + $res=db_query("INSERT INTO artifact_file + (artifact_id,description,bin_data,filename,filesize,filetype,adddate,submitted_by) + VALUES + ('".$this->Artifact->getID()."','$description','". base64_encode($bin_data) ."','$filename', + '$filesize','$filetype','". time() ."','$userid')"); + + $id=db_insertid($res,'artifact_file','id'); + + if (!$res || !$id) { + $this->setError('ArtifactFile: '.db_error()); + return false; + } else { +/* +// +// skip this unless we need it later - save a db query +// + // + // Now set up our internal data structures + // + if (!$this->fetchData($id)) { + return false; + } +*/ + $this->Artifact->addHistory('File Added',$id.': '.$filename); + $this->clearError(); + return $id; + } + } + + /** + * delete() - delete this artifact file from the db + * + * @return true/false + */ + function delete() { + if (!$this->Artifact->ArtifactType->userIsAdmin()) { + $this->setError('ArtifactFile: Permission Denied'); + return false; + } + $res=db_query("DELETE FROM artifact_file WHERE id='". $this->getID() ."'"); + if (!$res || db_affected_rows($res) < 1) { + $this->setError('ArtifactFile: Unable to Delete'); + return false; + } else { + $this->Artifact->addHistory('File Deleted',$this->getID().': '.$filename); + return true; + } + } + + /** + * fetchData() - re-fetch the data for this ArtifactFile from the database + * + * @param int Data ID + * @return true/false + */ + function fetchData($id) { + $res=db_query("SELECT * FROM artifact_file_user_vw WHERE id='$id'"); + if (!$res || db_numrows($res) < 1) { + $this->setError('ArtifactFile: Invalid ArtifactFile ID'); + return false; + } + $this->data_array =& db_fetch_array($res); + db_free_result($res); + return true; + } + + /** + * getArtifact() - get the Artifact Object this ArtifactFile is associated with + * + * @return Artifact + */ + function &getArtifact() { + return $this->Artifact; + } + + /** + * getID() - get this ArtifactFile's ID + * + * @return the id # + */ + function getID() { + return $this->data_array['id']; + } + + /** + * getName() - get the filename + * + * @return text filename + */ + function getName() { + return $this->data_array['filename']; + } + + /** + * getType() - get the type + * + * @return text type + */ + function getType() { + return $this->data_array['filetype']; + } + + /** + * getData() - get the binary data from the db + * + * @return binary + */ + function &getData() { +// +// sorry - the data conversion for sf.net was incorrect +// we needed to actually unconvert the htmlspecialchars() +// before base64_encode()ing the data +// + if (($GLOBALS['sys_default_domain'] == 'sourceforge.net') && ($this->getID() < 3976)) { + return util_unconvert_htmlspecialchars(base64_decode($this->data_array['bin_data'])); + } else { + return base64_decode($this->data_array['bin_data']); + } + } + + /** + * getSize() - get the size + * + * @return int size + */ + function getSize() { + return $this->data_array['filesize']; + } + + /** + * getDescription() - get the description + * + * @return text description + */ + function getDescription() { + return $this->data_array['description']; + } + + /** + * getDate() - get the date file was added + * + * @return int unix time + */ + function getDate() { + return $this->data_array['adddate']; + } + + /** + * getSubmittedBy() - get the user_id of the submitter + * + * @return int user_id + */ + function getSubmittedBy() { + return $this->data_array['submitted_by']; + } + + /** + * getSubmittedRealName() - get the real name of the submitter + * + * @return text name + */ + function getSubmittedRealName() { + return $this->data_array['realname']; + } + + /** + * getSubmittedUnixName() - get the unix name of the submitter + * + * @return text unixname + */ + function getSubmittedUnixName() { + return $this->data_array['user_name']; + } + +} + +?> diff --git a/gforge/common/tracker/ArtifactGroup.class b/gforge/common/tracker/ArtifactGroup.class new file mode 100644 index 0000000000..f0e317e70f --- /dev/null +++ b/gforge/common/tracker/ArtifactGroup.class @@ -0,0 +1,182 @@ +Error(); + + //was ArtifactType legit? + if (!$ArtifactType || !is_object($ArtifactType)) { + $this->setError('ArtifactGroup: No Valid ArtifactType'); + return false; + } + //did ArtifactType have an error? + if ($ArtifactType->isError()) { + $this->setError('ArtifactGroup: '.$Artifact->getErrorMessage()); + return false; + } + $this->ArtifactType =& $ArtifactType; + + if ($data) { + if (is_array($data)) { + $this->data_array =& $data; + return true; + } else { + if (!$this->fetchData($data)) { + return false; + } else { + return true; + } + } + } + } + + /** + * create() - create a new item in the database + * + * @param string Item name + * @return id on success / false on failure + */ + function create($name) { + // + // data validation + // + if (!$name) { + $this->setError('ArtifactGroup: name is Required'); + return false; + } + if (!$this->ArtifactType->userIsAdmin()) { + $this->setError('Permission Denied'); + return false; + } + $sql="INSERT INTO artifact_group (group_artifact_id,group_name) + VALUES ('".$this->ArtifactType->getID()."','$name')"; + $result=db_query($sql); + + if ($result && db_affected_rows($result) > 0) { + return true; + } else { + $this->setError(db_error()); + return false; + } + +/* + // + // Now set up our internal data structures + // + if (!$this->fetchData($id)) { + return false; + } +*/ + } + + /** + * fetchData() - re-fetch the data for this ArtifactGroup from the database + * + * @param int Data ID + * @return true/false + */ + function fetchData($id) { + $res=db_query("SELECT * FROM artifact_group WHERE id='$id'"); + if (!$res || db_numrows($res) < 1) { + $this->setError('ArtifactGroup: Invalid ArtifactGroup ID'); + return false; + } + $this->data_array =& db_fetch_array($res); + db_free_result($res); + return true; + } + + /** + * getArtifactType() - get the ArtifactType Object this ArtifactGroup is associated with + * + * @return ArtifactType + */ + function &getArtifactType() { + return $this->ArtifactType; + } + + /** + * getID() - get this ArtifactGroup's ID + * + * @return the id # + */ + function getID() { + return $this->data_array['id']; + } + + /** + * getName() - get the name + * + * @return text name + */ + function getName() { + return $this->data_array['group_name']; + } + + /** + * update() - update an ArtifactGroup + * + * @param string Name of the group + * @return true/false + */ + function update($name) { + if (!$this->ArtifactType->userIsAdmin()) { + $this->setError('Permission Denied'); + return false; + } + if (!$name) { + $this->setError('Missing Params'); + return false; + } + $sql="UPDATE artifact_group + SET group_name='$name' + WHERE id='". $this->getID() ."' + AND group_artifact_id='". $this->ArtifactType->getID() ."'"; + + $result=db_query($sql); + + if ($result && db_affected_rows($result) > 0) { + return true; + } else { + $this->setError(db_error()); + return false; + } + } +} + +?> diff --git a/gforge/common/tracker/ArtifactResolution.class b/gforge/common/tracker/ArtifactResolution.class new file mode 100644 index 0000000000..b86b8d8128 --- /dev/null +++ b/gforge/common/tracker/ArtifactResolution.class @@ -0,0 +1,115 @@ +Error(); + + //was ArtifactType legit? + if (!$ArtifactType || !is_object($ArtifactType)) { + $this->setError('ArtifactResolution: No Valid ArtifactType'); + return false; + } + //did ArtifactType have an error? + if ($ArtifactType->isError()) { + $this->setError('ArtifactResolution: '.$Artifact->getErrorMessage()); + return false; + } + $this->ArtifactType =& $ArtifactType; + + if ($data) { + if (is_array($data)) { + $this->data_array =& $data; + return true; + } else { + if (!$this->fetchData($data)) { + return false; + } else { + return true; + } + } + } + } + + /** + * fetchData() - re-fetch the data for this ArtifactResolution from the database + * + * @param int Data ID + * @return true/false + */ + function fetchData($id) { + $res=db_query("SELECT * FROM artifact_resolution WHERE id='$id'"); + if (!$res || db_numrows($res) < 1) { + $this->setError('ArtifactResolution: Invalid ArtifactResolution ID'); + return false; + } + $this->data_array =& db_fetch_array($res); + db_free_result($res); + return true; + } + + /** + * getArtifactType() - get the ArtifactType Object this ArtifactResolution is associated with + * + * @return ArtifactType + */ + function &getArtifactType() { + return $this->ArtifactType; + } + + /** + * getID() - get this ArtifactResolution's ID + * + * @return the id # + */ + function getID() { + return $this->data_array['id']; + } + + /** + * getName() - get the name + * + * @return text name + */ + function getName() { + return $this->data_array['resolution_name']; + } + +} + +?> diff --git a/gforge/common/tracker/ArtifactType.class b/gforge/common/tracker/ArtifactType.class new file mode 100644 index 0000000000..3a0306509e --- /dev/null +++ b/gforge/common/tracker/ArtifactType.class @@ -0,0 +1,662 @@ +Error(); + if (!$Group || !is_object($Group)) { + $this->setError('No Valid Group Object'); + return false; + } + if ($Group->isError()) { + $this->setError('ArtifactType: '.$Group->getErrorMessage()); + return false; + } + $this->Group =& $Group; + if ($artifact_type_id) { + $this->artifact_type_id=$artifact_type_id; + + if (!$this->fetchData($artifact_type_id)) { + return false; + } else { + return true; + } + } else { + $this->setError('No ID Passed'); + } + } + + /** + * create() - use this to create a new ArtifactType in the database + * + * @param string The type name + * @param string The type description + * @param bool (1) true (0) false - viewable by general public + * @param bool (1) true (0) false - whether non-logged-in users can submit + * @param bool (1) true (0) false - whether to email on all updates + * @param string The address to send new entries and updates to + * @param int Days before this item is considered overdue + * @param bool (1) trye (0) false - whether the resolution box should be shown + * @param string Free-form text that project admins can place on the submit page + * @param string Free-form text that project admins can place on the browse page + * @param int (1) bug tracker, (2) Support Tracker, (3) Patch Tracker, (4) features (0) other + * @return id on success, false on failure + */ + function create($name,$description,$is_public,$allow_anon,$email_all,$email_address, + $due_period,$use_resolution,$submit_instructions,$browse_instructions,$datatype=0) { + + $perm =& $this->Group->getPermission( session_get_user() ); + + if (!$perm || !is_object($perm) || !$perm->isArtifactAdmin()) { + $this->setError('ArtifactType: Permission Denied'); + return false; + } + + if (!$name || !$description || !$due_period) { + $this->setError('ArtifactType: Name, Description, and Due Period are required'); + return false; + } + + if ($email_address && !validate_email($email_address)) { + $email_address=''; + } + if ($email_all && !$email_address) { + $email_all=0; + } + + $res=db_query("INSERT INTO + artifact_group_list + (group_id, + name, + description, + is_public, + allow_anon, + email_all_updates, + email_address, + due_period, + status_timeout, + use_resolution, + submit_instructions, + browse_instructions, + datatype) + VALUES + ('". $this->Group->getID() ."', + '". htmlspecialchars($name) ."', + '". htmlspecialchars($description) ."', + '$is_public', + '$allow_anon', + '$email_all', + '$email_address', + '". ($due_period*(60*60*24)) ."', + '1209600', + '$use_resolution', + '$submit_instructions', + '$browse_instructions', + '$datatype')"); + + $this->artifact_type_id = db_insertid($res,'artifact_group_list','group_artifact_id'); + + if (!$res || !$this->artifact_type_id) { + $this->setError('ArtifactType: '.db_error()); + return false; + } else { + if (!$this->fetchData($this->artifact_type_id)) { + return false; + } else { + $this->clearError(); + return $this->artifact_type_id; + } + } + } + + /** + * fetchData() - re-fetch the data for this ArtifactType from the database + * + * @param int The artifact type ID + * @return true/false + */ + function fetchData($artifact_type_id) { + $res=db_query("SELECT * FROM artifact_group_list + WHERE group_artifact_id='$artifact_type_id' + AND group_id='". $this->Group->getID() ."'"); + if (!$res || db_numrows($res) < 1) { + $this->setError('ArtifactType: Invalid ArtifactTypeID'); + return false; + } + $this->data_array =& db_fetch_array($res); + db_free_result($res); + return true; + } + + /** + * getGroup() - get the Group object this ArtifactType is associated with + * + * @return the Group object + */ + function &getGroup() { + return $this->Group; + } + + /** + * getID() - get this ArtifactTypeID + * + * @return the group_artifact_id # + */ + function getID() { + return $this->artifact_type_id; + } + + /** + * allowsAnon() - determine if non-logged-in users can post + * + * @return true/false + */ + function allowsAnon() { + return $this->data_array['allow_anon']; + } + + /** + * getSubmitInstructions() - get the free-form text strings + * + * @return text instructions + */ + function getSubmitInstructions() { + return $this->data_array['submit_instructions']; + } + + /** + * getBrowseInstructions() - get the free-form text strings + * + * @return text instructions + */ + function getBrowseInstructions() { + return $this->data_array['browse_instructions']; + } + + /** + * emailAll() - determine if we're supposed to email on every event + * + * @return true/false + */ + function emailAll() { + return $this->data_array['email_all_updates']; + } + + /** + * emailAddress() - defined email address to send events to + * + * @return text email + */ + function getEmailAddress() { + return $this->data_array['email_address']; + } + + /** + * isPublic() - whether non-group-members can view + * + * @return true/false + */ + function isPublic() { + return $this->data_array['is_public']; + } + + /** + * getName() - the name of this ArtifactType + * + * @return text name + */ + function getName() { + return $this->data_array['name']; + } + + /** + * getDescription() - the description of this ArtifactType + * + * @return text description + */ + function getDescription() { + return $this->data_array['description']; + } + + /** + * getDuePeriod() - how many seconds until it's considered overdue? + * + * @return int seconds + */ + function getDuePeriod() { + return $this->data_array['due_period']; + } + + /** + * getStatusTimeout() - how many seconds until an item is stale? + * + * @return int seconds + */ + function getStatusTimeout() { + return $this->data_array['status_timeout']; + } + + /** + * useResolution() - whether this ArtifactType uses the resolution feature + * + * @return true/false + */ + function useResolution() { + return $this->data_array['use_resolution']; + } + + /** + * getDataType() - flag that is generally unused but can mark the difference between bugs, patches, etc + * + * @return (1) bug (2) support (3) patch (4) feature (0) other + */ + function getDataType() { + return $this->data_array['datatype']; + } + + /** + * getCategories() - List of possible categories set up for this artifact type + * + * @return result set + */ + function getCategories() { + if (!isset($this->categories_res)) { + $sql="select id,category_name + FROM artifact_category + WHERE group_artifact_id='$this->artifact_type_id'"; + $this->categories_res=db_query($sql); + } + return $this->categories_res; + } + + /** + * getGroups() - List of possible groups set up for this artifact type + * + * @return result set + */ + function getGroups() { + if (!isset($this->groups_res)) { + $sql="select id,group_name + FROM artifact_group + WHERE group_artifact_id='$this->artifact_type_id'"; + $this->groups_res=db_query($sql); + } + return $this->groups_res; + } + + /** + * getResolutions() - List of possible resolutions + * + * @return result set + */ + function getResolutions() { + if (!isset($this->resolutions_res)) { + $sql="select id,resolution_name + FROM artifact_resolution"; + $this->resolutions_res=db_query($sql); + } + return $this->resolutions_res; + } + + /** + * getTechnicians() - returns a result set of technicians + * + * @return result set + */ + function getTechnicians() { + if (!isset($this->technicians_res)) { + $sql="SELECT user_id,user_name + FROM artifactperm_user_vw + WHERE group_artifact_id='$this->artifact_type_id' + AND perm_level in (1,2)"; + $this->technicians_res = db_query($sql); + } + return $this->technicians_res; + } + + /** + * getCannedResponses() - returns a result set of canned responses + * + * @return result set + */ + function getCannedResponses() { + if (!isset($this->cannedresponses_res)) { + $sql="SELECT id,title + FROM artifact_canned_responses + WHERE group_artifact_id='$this->artifact_type_id'"; + $this->cannedresponses_res = db_query($sql); + } + return $this->cannedresponses_res; + } + + /** + * getStatuses() - returns a result set of statuses + * + * @return result set + */ + function getStatuses() { + if (!isset($this->status_res)) { + $sql="select * from artifact_status"; + $this->status_res=db_query($sql); + } + return $this->status_res; + } + + /** + * getStatusName() - returns the name of this status + * + * @param int The status ID + * @return name + */ + function getStatusName($id) { + $sql="select * from artifact_status WHERE id='$id'"; + $result=db_query($sql); + if ($result && db_numrows($result) > 0) { + return db_result($result,0,'status_name'); + } else { + return 'Error - Not Found'; + } + } + + /** + * addUser() - add a user to this ArtifactType - depends on UNIQUE INDEX preventing duplicates + * + * @param int user_id of the new user + * @return true/false + */ + function addUser($id) { + if (!$this->userIsAdmin()) { + $this->setError('Permission Denied'); + return false; + } + if (!$id) { + $this->setError('Missing Params'); + return false; + } + $sql="INSERT INTO artifact_perm (group_artifact_id,user_id,perm_level) + VALUES ('".$this->getID()."','$id',0)"; + $result=db_query($sql); + if ($result && db_affected_rows($result) > 0) { + return true; + } else { + $this->setError(db_error()); + return false; + } + } + + /** + * updateUser() - update a user's permissions + * + * @param int user_id of the user to update + * @param int (1) tech only, (2) admin & tech (3) admin only + * @return true/false + */ + function updateUser($id,$perm_level) { + if (!$this->userIsAdmin()) { + $this->setError('Permission Denied'); + return false; + } + if (!$id) { + $this->setError('Missing Params: '.$id.'|'.$perm_level); + return false; + } + $sql="UPDATE artifact_perm SET perm_level='$perm_level' + WHERE user_id='$id' AND group_artifact_id='".$this->getID()."'"; + $result=db_query($sql); + if ($result) { + return true; + } else { + $this->setError(db_error()); + return false; + } + } + + /** + * deleteUser() - delete a user's permissions + * + * @param int user_id of the user who's permissions to delete + * @return true/false + */ + function deleteUser($id) { + if (!$this->userIsAdmin()) { + $this->setError('Permission Denied'); + return false; + } + if (!$id) { + $this->setError('Missing Params'); + return false; + } + $sql="DELETE FROM artifact_perm + WHERE user_id='$id' AND group_artifact_id='".$this->getID()."'"; + $result=db_query($sql); + if ($result) { + return true; + } else { + $this->setError(db_error()); + return false; + } + } + + /* + + USER PERMISSION FUNCTIONS + + */ + + /** + * userCanView() - determine if the user can view this artifact type + * + * @return true/false + */ + function userCanView() { + if ($this->isPublic()) { + return true; + } else { + if (!user_isloggedin()) { + return false; + } else { + // + // For now, we let any member of a project view this ArtifactType + // A future change might be to restrict to only those people with + // a corresponding entry in artifact_perm table + // + $perm =& $this->Group->getPermission( session_get_user() ); + return $perm->isMember(); + } + } + } + + /** + * userIsAdmin() - see if the logged-in user's perms are >= 2 or Group ArtifactAdmin + * + * @return true/false + */ + function userIsAdmin() { + $perm =& $this->Group->getPermission( session_get_user() ); + + if (($this->getCurrentUserPerm() >= 2) || ($perm->isArtifactAdmin())) { + return true; + } else { + return false; + } + } + + /** + * getCurrentUserPerm() - get the logged-in user's perms from artifact_perm + * + * @return int perm level for the logged-in user + */ + function getCurrentUserPerm() { + if (!user_isloggedin()) { + return 0; + } else { + if (!isset($this->current_user_perm)) { + $sql="select perm_level + FROM artifact_perm + WHERE group_artifact_id='$this->artifact_type_id' + AND user_id='".user_getid()."'"; + $this->current_user_perm=db_result(db_query($sql),0,0); + } + return $this->current_user_perm; + } + } + + /** + * update() - use this to update this ArtifactType in the database + * + * @param string The item name + * @param string The item description + * @param bool (1) true (0) false - viewable by general public + * @param bool (1) true (0) false - whether non-logged-in users can submit + * @param bool (1) true (0) false - whether to email on all updates + * @param string The address to send new entries and updates to + * @param int Days before this item is considered overdue + * @param int Days before stale items time out + * @param bool (1) trye (0) false - whether the resolution box should be shown + * @param string Free-form text that project admins can place on the submit page + * @param string Free-form text that project admins can place on the browse page + * @return true on success, false on failure + */ + function update($name,$description,$is_public,$allow_anon,$email_all,$email_address, + $due_period, $status_timeout,$use_resolution,$submit_instructions,$browse_instructions) { + + $perm =& $this->Group->getPermission(session_get_user()); + + if (!$perm || !is_object($perm) || !$perm->isArtifactAdmin()) { + $this->setError('ArtifactType: Permission Denied'); + return false; + } + + if ($this->getDataType()) { + $name=$this->getName(); + $description=$this->getDescription(); + } + + if (!$name || !$description || !$due_period || !$status_timeout) { + $this->setError('ArtifactType: Name, Description, Due Period, and Status Timeout are required'); + return false; + } + + if ($email_address && !validate_email($email_address)) { + $email_address=''; + } + if ($email_all && !$email_address) { + $email_all=0; + } + $sql="UPDATE artifact_group_list SET + name='$name', + description='". htmlspecialchars($description) ."', + is_public='$is_public', + allow_anon='$allow_anon', + email_all_updates='$email_all', + email_address='$email_address', + due_period='". ($due_period * (60*60*24)) ."', + status_timeout='". ($status_timeout * (60*60*24)) . "', + use_resolution='$use_resolution', + submit_instructions='$submit_instructions', + browse_instructions='$browse_instructions' + WHERE + group_artifact_id='". $this->getID() ."' + AND group_id='". $this->Group->getID() ."'"; + + $res=db_query($sql); + if (!$res || db_affected_rows($res) < 1) { + $this->setError('ArtifactType::Update(): '.db_error()); + return false; + } else { + $this->fetchData($this->getID()); + return true; + } + } + +} + +?> diff --git a/gforge/common/tracker/ArtifactTypes.class b/gforge/common/tracker/ArtifactTypes.class new file mode 100644 index 0000000000..091143bacf --- /dev/null +++ b/gforge/common/tracker/ArtifactTypes.class @@ -0,0 +1,222 @@ +Error(); + if (!$Group || !is_object($Group)) { + $this->setError('No Valid Group Object'); + return false; + } + if ($Group->isError()) { + $this->setError('ArtifactType: '.$Group->getErrorMessage()); + return false; + } + $this->Group =& $Group; + return true; + } + + /** + * createTrackers() creates all the standard trackers for a given Group. + * + * @return true/false + */ + function createTrackers() { + + // first, check if trackers already exist + $res=db_query("SELECT * FROM artifact_group_list + WHERE group_id='".$this->Group->getID()."' AND datatype > 0"); + if (db_numrows($res) > 0) { + return true; + } + + db_begin(); + if (!$this->createBugTracker()) { + db_rollback(); + return false; + } elseif (!$this->createSupportTracker()) { + db_rollback(); + return false; + } elseif (!$this->createPatchTracker()) { + db_rollback(); + return false; + } elseif (!$this->createFeatureTracker()) { + db_rollback(); + return false; + } else { + db_commit(); + return true; + } + } + + /** + * createBugTracker() creates bug tracker + * + * @return true/false + * @access private + */ + function createBugTracker() { + $at=new ArtifactType($this->Group); + if (!$at || !is_object($at)) { + $this->setError('Error Creating ArtifactType for Bug Tracker'); + return false; + } else { + if ($at->create('Bugs','Bug Tracking System',1,1,0,'',30,1,'','',1)) { + // + // create a default category + // + $ac=new ArtifactCategory($at); + $ac->create('Interface (example)',100); + + // + // create a default group + // + $ag=new ArtifactGroup($at); + $ag->create('v1.0 (example)'); + return true; + } else { + $this->setError('Failed to create bug tracker: '.$at->getErrorMessage()); + return false; + } + } + } + + /** + * createSupportTracker() creates support tracker + * + * @return true/false + * @access private + */ + function createSupportTracker() { + $at=new ArtifactType($this->Group); + if (!$at || !is_object($at)) { + $this->setError('Error Creating ArtifactType for support Tracker'); + return false; + } else { + if ($at->create('Support Requests','Tech Support Tracking System',1,1,0,'',15,0,'','',2)) { + // + // create a default category + // + $ac=new ArtifactCategory($at); + $ac->create('Install Problem (example)',100); + + // + // create a default group + // + $ag=new ArtifactGroup($at); + $ag->create('v1.0 (example)'); + return true; + } else { + $this->setError('Failed to create support tracker: '.$at->getErrorMessage()); + return false; + } + } + } + + /** + * createPatchTracker() creates patch tracker + * + * @return true/false + * @access private + */ + function createPatchTracker() { + // + // Set up a patch tracker for this group + // + $at=new ArtifactType($this->Group); + if (!$at || !is_object($at)) { + $this->setError('Error Creating ArtifactType for patch Tracker'); + return false; + } else { + if ($at->create('Patches','Patch Tracking System',1,1,0,'',15,1,'','',3)) { + // + // create a default category + // + $ac=new ArtifactCategory($at); + $ac->create('Widget (example)',100); + + // + // create a default group + // + $ag=new ArtifactGroup($at); + $ag->create('Unstable (example)'); + return true; + } else { + $this->setError('Failed to create support tracker: '.$at->getErrorMessage()); + return false; + } + } + } + + /** + * createFeatureTracker() creates feature tracker + * + * @return true/false + * @access private + */ + function createFeatureTracker() { + // + // Set up a feature request tracker for this group + // + $at=new ArtifactType($this->Group); + if (!$at || !is_object($at)) { + $this->setError('Error Creating ArtifactType for feature Tracker'); + return false; + } else { + if ($at->create('Feature Requests','Feature Request Tracking System',1,1,0,'',45,0,'','',4)) { + // + // create a default category + // + $ac=new ArtifactCategory($at); + $ac->create('Interface Improvements (example)',100); + + // + // create a default group + // + $ag=new ArtifactGroup($at); + $ag->create('Next Release (example)'); + return true; + } else { + $this->setError('Failed to create support tracker: '.$at->getErrorMessage()); + return false; + } + } + } + +} + +?> diff --git a/gforge/common/tracker/Artifacts.class b/gforge/common/tracker/Artifacts.class new file mode 100644 index 0000000000..00211bc2f5 --- /dev/null +++ b/gforge/common/tracker/Artifacts.class @@ -0,0 +1,111 @@ +Error(); + + $this->ArtifactType =& $ArtifactType; + + //was ArtifactType legit? + if (!$ArtifactType || !is_object($ArtifactType)) { + $this->setError('Artifact: No Valid ArtifactType'); + return false; + } + //did ArtifactType have an error? + if ($ArtifactType->isError()) { + $this->setError('Artifact: '.$ArtifactType->getErrorMessage()); + return false; + } + + } + + /** + * getArtifacts() - get an array of artifacts + * + * Retrieves an array of artifact objects. + * + * @param bool Database query offset + * @return an array of artifact objects on success / false on failure. + */ + function &getArtifacts($offset=false) { + if (!$offset) { + $offset = 0; + } + + $sql = "SELECT + * + FROM + artifact_vw + WHERE + group_artifact_id='". $this->ArtifactType->getID() ."'"; + + $res = db_query($sql,500,$offset); + + if (!$res) { + $this->setError('Could not get artifacts: ' . db_error()); + return false; + } else { + while ($rows = db_fetch_array($res)) { + $this->artifacts_array[] = new Artifact($this->ArtifactType, $rows); + } + + return $this->artifacts_array; + } + } + + /** + * getArtifactType() - get the artifact type + * + */ + function &getArtifactType() { + return $this->ArtifactType; + } +} + +?> diff --git a/gforge/cronjobs/check_stale_tracker_items.php b/gforge/cronjobs/check_stale_tracker_items.php new file mode 100755 index 0000000000..77daa6735f --- /dev/null +++ b/gforge/cronjobs/check_stale_tracker_items.php @@ -0,0 +1,40 @@ +#!/usr/local/bin/php -q + diff --git a/gforge/cronjobs/db_foundry_boxes.php b/gforge/cronjobs/db_foundry_boxes.php new file mode 100755 index 0000000000..72f42683ae --- /dev/null +++ b/gforge/cronjobs/db_foundry_boxes.php @@ -0,0 +1,148 @@ +#!/usr/local/bin/php -q + diff --git a/gforge/cronjobs/db_project_sums.php b/gforge/cronjobs/db_project_sums.php new file mode 100755 index 0000000000..1430d248e4 --- /dev/null +++ b/gforge/cronjobs/db_project_sums.php @@ -0,0 +1,151 @@ +#!/usr/local/bin/php -q + 3 AND group_artifact_id=agl.group_artifact_id), +(SELECT count(*) FROM artifact WHERE status_id=1 AND group_artifact_id=agl.group_artifact_id) +FROM artifact_group_list agl +LEFT JOIN artifact a USING (group_artifact_id) +GROUP BY agl.group_artifact_id;"); +echo db_error(); + +db_commit(); + +db_query("VACUUM ANALYZE artifact_counts_agg;"); + +/* + + Rebuild the project_sums_agg table, which saves us + from doing really expensive queries + each time the project summary is viewed + +*/ + +db_begin(); +$res=db_query("DELETE FROM project_sums_agg;"); + +/* + Get counts of mailing lists +*/ +$sql="INSERT INTO project_sums_agg + SELECT group_id,'mail'::text AS type,count(*) AS count + FROM mail_group_list + GROUP BY group_id,type;"; + +$res=db_query($sql); +echo db_error(); + + +/* + Get counts of surveys +*/ +$sql="INSERT INTO project_sums_agg + SELECT group_id,'surv'::text AS type,count(*) AS count + FROM surveys + WHERE is_active='1' + GROUP BY group_id,type;"; + +$res=db_query($sql); +echo db_error(); + + +/* + Forum message count +*/ +$sql="INSERT INTO project_sums_agg + SELECT forum_group_list.group_id,'fmsg'::text AS type, count(forum.msg_id) AS count + FROM forum,forum_group_list + WHERE forum.group_forum_id=forum_group_list.group_forum_id + AND forum_group_list.is_public=1 + GROUP BY group_id,type;"; + +$res=db_query($sql); +echo db_error(); + + +/* + Forum count +*/ +$sql="INSERT INTO project_sums_agg + SELECT group_id,'fora'::text AS type, count(*) AS count + FROM forum_group_list + WHERE is_public=1 + GROUP BY group_id,type;"; + +$res=db_query($sql); +echo db_error(); + + +db_commit(); +echo db_error(); + +db_query("VACUUM ANALYZE project_sums_agg;"); + +if (db_error()) { + echo "Error: ".db_error(); +} + +?> diff --git a/gforge/cronjobs/db_stats_agg.php b/gforge/cronjobs/db_stats_agg.php new file mode 100755 index 0000000000..4c004dbc74 --- /dev/null +++ b/gforge/cronjobs/db_stats_agg.php @@ -0,0 +1,870 @@ +#!/usr/local/bin/php -q += 8 ) OR ( month > 200104 ); + +-- +-- Build a table with only the last 30 days of data in it +-- +DROP TABLE stats_project_last_30; +CREATE TABLE stats_project_last_30 AS +SELECT spd.month::int AS month, +spd.day::int AS day, +spd.group_id::int AS group_id, +spd.developers::int AS developers, +spm.ranking::int AS group_ranking, +spm.percentile::float AS group_metric, +salbg.count::int AS logo_showings, +fdga.downloads::int AS downloads, +sasbg.count::int AS site_views, +ssp.pages::int AS subdomain_views, +(coalesce(sasbg.count,0) + coalesce(ssp.pages,0))::int AS page_views, +sp.file_releases::int AS filereleases, +sp.msg_posted::int AS msg_posted, +sp.msg_uniq_auth::int AS msg_uniq_auth, +sp.bugs_opened::int AS bugs_opened, +sp.bugs_closed::int AS bugs_closed, +sp.support_opened::int AS support_opened, +sp.support_closed::int AS support_closed, +sp.patches_opened::int AS patches_opened, +sp.patches_closed::int AS patches_closed, +sp.artifacts_opened::int AS artifacts_opened, +sp.artifacts_closed::int AS artifacts_closed, +sp.tasks_opened::int AS tasks_opened, +sp.tasks_closed::int AS tasks_closed, +sp.help_requests::int AS help_requests, +scg.checkouts::int AS cvs_checkouts, +scg.commits::int AS cvs_commits, +scg.adds::int AS cvs_adds + +FROM stats_project_developers_last30 spd + +LEFT JOIN frs_dlstats_group_agg fdga USING (month,day,group_id) +LEFT JOIN stats_project sp USING (month,day,group_id) +LEFT JOIN stats_agg_logo_by_group salbg USING (month,day,group_id) +LEFT JOIN stats_project_metric spm USING (month,day,group_id) +LEFT JOIN stats_cvs_group scg USING (month,day,group_id) +LEFT JOIN stats_agg_site_by_group sasbg USING (month,day,group_id) +LEFT JOIN stats_subd_pages ssp USING (month,day,group_id) +; + +CREATE INDEX statsproject30_groupid on stats_project_last_30(group_id); + +-- +-- create a table containing main site page views grouped by month +-- +DROP TABLE stats_site_pages_by_month; +CREATE TABLE stats_site_pages_by_month AS +select month,sum(site_page_views)::int as site_page_views + from stats_site_pages_by_day group by month; + +-- +-- Create a table joining stats_site and stats_project +-- with the last 30 days of data only +-- +-- NOTE: Builds on results of stats_project_last_30 +-- +DROP TABLE stats_site_last_30; +CREATE TABLE stats_site_last_30 AS +SELECT p.month::int AS month, + p.day::int AS day, + sspbd.site_page_views::int AS site_page_views, + SUM(p.downloads)::int AS downloads, + SUM(p.subdomain_views)::int AS subdomain_views, + SUM(p.msg_posted)::int AS msg_posted, + SUM(p.bugs_opened)::int AS bugs_opened, + SUM(p.bugs_closed)::int AS bugs_closed, + SUM(p.support_opened)::int AS support_opened, + SUM(p.support_closed)::int AS support_closed, + SUM(p.patches_opened)::int AS patches_opened, + SUM(p.patches_closed)::int AS patches_closed, + SUM(p.artifacts_opened)::int AS artifacts_opened, + SUM(p.artifacts_closed)::int AS artifacts_closed, + SUM(p.tasks_opened)::int AS tasks_opened, + SUM(p.tasks_closed)::int AS tasks_closed, + SUM(p.help_requests)::int AS help_requests, + SUM(p.cvs_checkouts)::int AS cvs_checkouts, + SUM(p.cvs_commits)::int AS cvs_commits, + SUM(p.cvs_adds)::int AS cvs_adds + FROM stats_project_last_30 p, stats_site_pages_by_day sspbd + WHERE p.month=sspbd.month AND p.day=sspbd.day + GROUP BY p.month, p.day, sspbd.site_page_views; + +CREATE INDEX statssitelast30_month_day on stats_site_last_30 (month,day); + +-- +-- Create a table joining stats_site and stats_project +-- grouped by month +-- +-- NOTICE - this builds on the results of stats_project_months +-- +DROP TABLE stats_site_months; +CREATE TABLE stats_site_months AS +SELECT spm.month::int AS month, + sspbm.site_page_views::int AS site_page_views, + SUM(spm.downloads)::int AS downloads, + SUM(spm.subdomain_views)::int AS subdomain_views, + SUM(spm.msg_posted)::int AS msg_posted, + SUM(spm.bugs_opened)::int AS bugs_opened, + SUM(spm.bugs_closed)::int AS bugs_closed, + SUM(spm.support_opened)::int AS support_opened, + SUM(spm.support_closed)::int AS support_closed, + SUM(spm.patches_opened)::int AS patches_opened, + SUM(spm.patches_closed)::int AS patches_closed, + SUM(spm.artifacts_opened)::int AS artifacts_opened, + SUM(spm.artifacts_closed)::int AS artifacts_closed, + SUM(spm.tasks_opened)::int AS tasks_opened, + SUM(spm.tasks_closed)::int AS tasks_closed, + SUM(spm.help_requests)::int AS help_requests, + SUM(spm.cvs_checkouts)::int AS cvs_checkouts, + SUM(spm.cvs_commits)::int AS cvs_commits, + SUM(spm.cvs_adds)::int AS cvs_adds + FROM stats_project_months spm, stats_site_pages_by_month sspbm + WHERE spm.month=sspbm.month + GROUP BY spm.month,sspbm.site_page_views + ORDER BY spm.month ASC; + +CREATE INDEX statssitemonths_month on stats_site_months(month); + +-- +-- Create a table joining stats_site and stats_project +-- grouped by all to get total +-- +-- NOTICE - this builds on the results of stats_site_months +-- +DROP TABLE stats_site_all; +CREATE TABLE stats_site_all AS +SELECT + SUM(site_page_views)::int AS site_page_views, + SUM(downloads)::int AS downloads, + SUM(subdomain_views)::int AS subdomain_views, + SUM(msg_posted)::int AS msg_posted, + SUM(bugs_opened)::int AS bugs_opened, + SUM(bugs_closed)::int AS bugs_closed, + SUM(support_opened)::int AS support_opened, + SUM(support_closed)::int AS support_closed, + SUM(patches_opened)::int AS patches_opened, + SUM(patches_closed)::int AS patches_closed, + SUM(artifacts_opened)::int AS artifacts_opened, + SUM(artifacts_closed)::int AS artifacts_closed, + SUM(tasks_opened)::int AS tasks_opened, + SUM(tasks_closed)::int AS tasks_closed, + SUM(help_requests)::int AS help_requests, + SUM(cvs_checkouts)::int AS cvs_checkouts, + SUM(cvs_commits)::int AS cvs_commits, + SUM(cvs_adds)::int AS cvs_adds + FROM stats_site_months; + +*/ + + + +// +// total file downloads by file +// +db_begin(SYS_DB_STATS); + +echo "\n\nBeginning frs_dlstats_filetotal_agg: ".date('Y-m-d H:i:s',time()); + +$rel = db_query("DELETE FROM frs_dlstats_filetotal_agg;", -1, 0, SYS_DB_STATS); +echo db_error(SYS_DB_STATS); + +$rel=db_query("INSERT INTO frs_dlstats_filetotal_agg +SELECT file_id,sum(downloads) AS downloads +FROM frs_dlstats_file_agg +GROUP BY file_id +;", -1, 0, SYS_DB_STATS); + +if (!$rel) { + echo "ERROR IN frs_dlstats_filetotal_agg"; +} + +echo db_error(SYS_DB_STATS); + +db_commit(SYS_DB_STATS); + +db_query("VACUUM ANALYZE frs_dlstats_filetotal_agg;", -1, 0, SYS_DB_STATS); + + + +// +// total downloads by group +// +db_begin(SYS_DB_STATS); + +echo "\n\nBeginning frs_dlstats_grouptotal_agg: ".date('Y-m-d H:i:s',time()); + +$rel = db_query("DELETE FROM frs_dlstats_grouptotal_agg;", -1, 0, SYS_DB_STATS); +echo db_error(SYS_DB_STATS); + +$rel=db_query("INSERT INTO frs_dlstats_grouptotal_agg +SELECT frs_package.group_id, sum(frs_dlstats_filetotal_agg.downloads) AS downloads +FROM frs_package,frs_release,frs_file,frs_dlstats_filetotal_agg +WHERE frs_package.package_id=frs_release.package_id +AND frs_release.release_id=frs_file.release_id +AND frs_file.file_id=frs_dlstats_filetotal_agg.file_id +GROUP BY frs_package.group_id +;", -1, 0, SYS_DB_STATS); + +if (!$rel) { + echo "ERROR IN frs_dlstats_grouptotal_agg"; +} + +echo db_error(SYS_DB_STATS); + +db_commit(SYS_DB_STATS); + +db_query("VACUUM ANALYZE frs_dlstats_grouptotal_agg;", -1, 0, SYS_DB_STATS); + + + +// +// total downloads by group +// +db_begin(SYS_DB_STATS); + +echo "\n\nBeginning frs_dlstats_group_agg: ".date('Y-m-d H:i:s',time()); + +$rel = db_query("DELETE FROM frs_dlstats_group_agg;", -1, 0, SYS_DB_STATS); +echo db_error(SYS_DB_STATS); + +$rel=db_query("INSERT INTO frs_dlstats_group_agg +SELECT frs_package.group_id, fdfa.month, fdfa.day, sum(fdfa.downloads) AS downloads +FROM frs_package,frs_release,frs_file,frs_dlstats_file_agg fdfa +WHERE frs_package.package_id=frs_release.package_id +AND frs_release.release_id=frs_file.release_id +AND frs_file.file_id=fdfa.file_id +GROUP BY frs_package.group_id,fdfa.month, fdfa.day +;", -1, 0, SYS_DB_STATS); + +if (!$rel) { + echo "ERROR IN frs_dlstats_group_agg"; +} + +echo db_error(SYS_DB_STATS); + +db_commit(SYS_DB_STATS); + +db_query("VACUUM ANALYZE frs_dlstats_group_agg;", -1, 0, SYS_DB_STATS); + +?>= '$beg_day' ) OR ( month > '$beg_year$beg_month' ); +", -1, 0, SYS_DB_STATS); +echo db_error(SYS_DB_STATS); + +db_commit(SYS_DB_STATS); + +db_query("VACUUM ANALYZE stats_project_developers_last30;", -1, 0, SYS_DB_STATS); + +?> diff --git a/gforge/cronjobs/kt_dump.php b/gforge/cronjobs/kt_dump.php new file mode 100755 index 0000000000..099d32ea79 --- /dev/null +++ b/gforge/cronjobs/kt_dump.php @@ -0,0 +1,82 @@ +#!/usr/local/bin/php -q + + * + */ + +require ('squal_pre.php'); +set_time_limit(60); + +$url = 'http://kt.zork.net/kernel-traffic/latest.html'; + +// Retrieve the file and store the contents in an array. +$data =@ file($url); +if (!sizeof($data)){ + $errors = 'Could not open link: \'' . $url . "'\n"; +} + +$capt_flag = false; +// Walk through the array looking for elements that indicate the start +// of the page body. +foreach ($data as $key => $fileline) { + // If this element is the start of the page body then + // Start saving data + if( ereg("Kernel Traffic \#", $fileline) ) { + $capt_flag = true; + } + + if( eregi('

  • Printer-Friendly Format',$fileline) ) { + $data[$key] = '
  • Printer-Friendly Format'; + } + + if( eregi('
  • Mailing List Stats For This Week',$fileline) ) { + $data[$key] = '
  • Mailing List Stats For This Week'; + } + + // Stop saving data + if( eregi(' diff --git a/gforge/cronjobs/massmail.php b/gforge/cronjobs/massmail.php new file mode 100755 index 0000000000..cc466dc002 --- /dev/null +++ b/gforge/cronjobs/massmail.php @@ -0,0 +1,280 @@ +#!/usr/local/bin/php -q + "users", + 'SITE' => "users", + 'COMMNTY' => "users", + 'DVLPR' => "users,user_group", + 'ADMIN' => "users,user_group", + 'SFDVLPR' => "users,user_group", +); + +// This tables maps mailing types to WHERE subclauses which select +// appropriate users +$cond_mapping = array( + 'ALL' => "", + 'SITE' => "AND mail_siteupdates=1", + 'COMMNTY' => "AND mail_va=1", + 'DVLPR' => "AND users.user_id=user_group.user_id", + 'ADMIN' => "AND users.user_id=user_group.user_id AND user_group.admin_flags='A'", + 'SFDVLPR' => "AND users.user_id=user_group.user_id AND user_group.group_id=1" +); + +/*if (!strstr($REMOTE_ADDR,$sys_internal_network)) { + exit_permission_denied(); +}*/ + +$mail_res = db_query(" + SELECT * + FROM massmail_queue + WHERE finished_date=0 + ORDER BY queued_date +", 1); + +/* If there was error, notify admins, but don't be pesky */ +if (!$mail_res) { + print "cannot execute quesry to select pending mailings\n"; + $hrs = time()/(60*60); + // Send reminder every second day at 11am + if (($hrs%24)==11 && (($hrs/24)%2)==1) { + global $sys_default_domain; + mail( + "admin@$sys_default_domain", + "ATT: Problems with massmail cron script", + "This is automatically generated message from\n" + ."the mass mailing cron script of SourceForge\n" + ."installation. There was error querying massmail_queue\n" + ."database table. Please take appropriate actions.\n", + "From: noreply@$sys_default_domain" + ); + } + + exit(1); +} + +// print "Got ".db_numrows($mail_res)." rows\n"; + +if (db_numrows($mail_res)<1) { + // Nothing to send + exit(); +} + +$type = db_result($mail_res, 0, 'type'); +if (!$table_mapping[$type]) { + print "Unknown mailing type\n"; + exit(1); +} + +$subj = db_result($mail_res, 0, 'subject'); +$mail_id = db_result($mail_res, 0, 'id'); + +//print "Got mail to send: ".$subj."\n"; + +$sql = " + SELECT users.user_id,user_name,realname,email,confirm_hash + FROM ".$table_mapping[$type]." + WHERE users.user_id>".db_result($mail_res, 0, 'last_userid')." + AND status='A' + ".$cond_mapping[$type]." + ORDER BY users.user_id +"; + +//echo $sql; + +// Get next chunk of users to mail +$users_res = db_query($sql, $CHUNK); + +print "Mailing ".db_numrows($users_res)." users.\n"; + +// If no more users left, we've finished with this mailing +if ($users_res && db_numrows($users_res)==0) { + db_query(" + UPDATE massmail_queue + SET failed_date=0,finished_date='".time()."' + WHERE id=$mail_id + "); + exit(); +} + +$batch_no = 0; +$count = 0; +$last_userid = 0; + +// These mailing types should include unsubscription info +if ($type=='SITE' || $type=='COMMNTY') { + $tail = "\r\n==================================================================\r\n" + ."You receive this message because you subscribed to SourceForge\r\n" + ."site mailing(s). You may opt out from some of them selectively\r\n" + ."by logging in to SourceForge and visiting your Account Maintenance\r\n" + ."page (http://$sys_default_domain/account/), or disable them altogether\r\n" + ."by visiting following link:\r\n" + ."\r\n"; +} +$body = db_result($mail_res, 0, 'message'); +//$lines = explode("\n", $body); +//$crlf_body = implode("\r\n", $lines); + +// Get SMTP response +function get_resp() { + global $out; + global $response; + + $response = fgets($out, 500); +// print ">$response"; + return substr($response, 0, 3); +} + +// Expect given response, fail with $diag otherwise +function expect($diag, $resp) { + global $PIPELINE; + global $response; + + if (!$PIPELINE) { + if (get_resp()!=$resp) { + print "Error: $diag: $response"; + exit(1); + } + } +} + +// Start new batch +function start_batch() { + global $out; + global $batch_no; + global $sys_default_domain; + global $MAILSERVER; + global $TEST; + + if ($TEST) { + $out = fopen("!batch.$batch_no","wb"); + } else { + $out = fsockopen($MAILSERVER, 25, $errno, $errstr); + } + + if (!$out) { + print "Error connecting to SMTP: $errstr\n"; + exit(1); + } + if (!$TEST) { + $resp = fgets($out,200); + if (substr($resp,0,3)!="220") { + print "Server is not ready to receive messages\n"; + exit(1); + } + } + fputs($out,"HELO $sys_default_domain\r\n"); + expect("HELO", "250"); +} + +// Finish new batch +function flush_batch() { + global $out; + global $count; + global $last_userid; + global $mail_id; + global $TEST; + + if ($count) { + fputs($out,"QUIT\r\n"); + if (!$TEST) { +// fpassthru($out); + while (!feof($out)) fgets($out, 200); + fclose($out); + } else { + fclose($out); + } + $count = 0; + + $sql=" + UPDATE massmail_queue + SET failed_date=0, + last_userid=$last_userid + WHERE id=$mail_id + "; +// print $sql; + db_query($sql); + + sleep($SLEEP); + } +} + + +// Actual mailing loop +while ($row = db_fetch_array($users_res)) { + + if (!$count) { + $batch_no++; + start_batch(); + } + +// print "Sending for: ".$row['user_id']."\n"; + +// $row['email'] = 'test@email'; + + fputs($out,"MAIL FROM: noreply@$sys_default_domain\r\n"); + expect("MAIL", "250"); + fputs($out,"RCPT TO: ".$row['email']."\r\n"); + expect("RCPT", "250"); + fputs($out,"DATA\r\n"); + expect("DATA", "354"); + fputs( + $out, + "From: Mailer \r\n" + ."To: \"".strtr($row['realname'],'"',"'")."\" <".$row['email'].">\r\n" + ."Subject: ".$subj."\r\n" + ."\r\n" + .$body + ."\r\n" + .sprintf($tail,$row['confirm_hash'] ) + ."\r\n.\r\n" + ); + expect("DATA end", "250"); + + $last_userid = $row['user_id']; + + if (++$count == $BATCH) { + flush_batch(); + } +} + +flush_batch(); + +// print "end\n"; + +?> diff --git a/gforge/cronjobs/project_weekly_metric-backfill.php b/gforge/cronjobs/project_weekly_metric-backfill.php new file mode 100755 index 0000000000..b2542f2676 --- /dev/null +++ b/gforge/cronjobs/project_weekly_metric-backfill.php @@ -0,0 +1,233 @@ +#!/usr/local/bin/php -q +$sql

    ".db_error(); + echo db_error(); +} + + + +#forum messages +$sql="INSERT INTO project_counts_weekly_tmp +SELECT forum_group_list.group_id,'forum',log(3 * count(forum.msg_id)::float) AS count +FROM forum,forum_group_list +WHERE forum.group_forum_id=forum_group_list.group_forum_id +AND date > '$last_week' +AND date < '$this_week' +GROUP BY group_id"; +$rel = db_query($sql); +if (!$rel) { + echo "

    $sql

    ".db_error(); + echo db_error(); +} + + +#project manager tasks +$sql="INSERT INTO project_counts_weekly_tmp +SELECT project_group_list.group_id,'tasks',log(4 * count(project_task.project_task_id)::float) AS count +FROM project_task,project_group_list +WHERE project_task.group_project_id=project_group_list.group_project_id +AND end_date > '$last_week' +AND end_date < '$this_week' +GROUP BY group_id"; + +#print "\n\n".$sql; + +$rel = db_query($sql); +if (!$rel) { + echo "

    $sql

    ".db_error(); + echo db_error(); +} + +#bugs +$sql="INSERT INTO project_counts_weekly_tmp +SELECT agl.group_id,'bugs',log(3 * count(*)::float) AS count +FROM artifact_group_list agl,artifact a +WHERE a.open_date > '$last_week' +AND a.open_date < '$this_week' +AND a.group_artifact_id=agl.group_artifact_id +AND agl.datatype='1' +GROUP BY agl.group_id"; + +#print "\n\n".$sql; + +$rel = db_query($sql); +if (!$rel) { + echo "

    $sql

    ".db_error(); + echo db_error(); +} + + +#patches +$sql="INSERT INTO project_counts_weekly_tmp +SELECT agl.group_id,'patches',log(10 * count(*)::float) AS count +FROM artifact_group_list agl,artifact a +WHERE a.open_date > '$last_week' +AND a.open_date < '$this_week' +AND a.group_artifact_id=agl.group_artifact_id +AND agl.datatype='3' +GROUP BY agl.group_id"; + +#print "\n\n".$sql; + +$rel = db_query($sql); +if (!$rel) { + echo "

    $sql

    ".db_error(); + echo db_error(); +} + + +#support +$sql="INSERT INTO project_counts_weekly_tmp +SELECT agl.group_id,'support',log(5 * count(*)::float) AS count +FROM artifact_group_list agl,artifact a +WHERE a.open_date > '$last_week' +AND a.open_date < '$this_week' +AND a.group_artifact_id=agl.group_artifact_id +AND agl.datatype='2' +GROUP BY agl.group_id"; + +#print "\n\n".$sql; + +$rel = db_query($sql); +if (!$rel) { + echo "

    $sql

    ".db_error(); + echo db_error(); +} + + +#file releases +$sql="INSERT INTO project_counts_weekly_tmp +select frs_package.group_id,'filereleases',log(5 * count(*)::float) +FROM frs_release,frs_package +WHERE + frs_package.package_id = frs_release.package_id + AND frs_release.release_date > '$last_week' + AND frs_release.release_date < '$this_week' +GROUP BY frs_package.group_id"; +$rel = db_query($sql); +if (!$rel) { + echo "

    $sql

    ".db_error(); + echo db_error(); +} + + +#create a new table to insert the final records into +$sql="CREATE TABLE project_metric_weekly_tmp1 ( +ranking serial primary key, +group_id int not null, +value float (10))"; +$rel = db_query($sql); +if (!$rel) { + echo "

    $sql

    ".db_error(); + echo db_error(); +} + + + +#insert the rows into the table in order, adding a sequential rank # +$sql="INSERT INTO project_metric_weekly_tmp1 (group_id,value) +SELECT project_counts_weekly_tmp.group_id,sum(project_counts_weekly_tmp.count) AS value +FROM project_counts_weekly_tmp +WHERE +project_counts_weekly_tmp.count > 0 +GROUP BY group_id ORDER BY value DESC"; +$rel = db_query($sql); +if (!$rel) { + echo "

    $sql

    ".db_error(); + echo db_error(); +} + +#numrows in the set +$sql="SELECT count(*) FROM project_metric_weekly_tmp1"; +$rel = db_query($sql); +if (!$rel) { + echo "

    $sql

    ".db_error(); + echo db_error(); +} + + +$counts = db_result($rel,0,0); +print "\n\nCounts: ".$counts; + +db_begin(); + +#drop the old metrics table +$sql="DELETE FROM project_weekly_metric"; +$rel = db_query($sql); +if (!$rel) { + echo "

    $sql

    ".db_error(); + echo db_error(); +} + + +$sql="INSERT INTO project_weekly_metric (ranking,percentile,group_id) +SELECT ranking,to_char((100-(100*((ranking::float-1)/$counts))), '999D9999'),group_id +FROM project_metric_weekly_tmp1 +ORDER BY ranking ASC"; +$rel = db_query($sql); +if (!$rel) { + echo "

    $sql

    ".db_error(); + echo db_error(); +} + +// +// Now archive the metric +// +db_query("DELETE FROM stats_project_metric WHERE month='$this_year$this_month' AND day='$this_day'"); + +$sql="INSERT INTO stats_project_metric (month,day,group_id,ranking,percentile) +SELECT '$this_year$this_month'::int, '$this_day'::int,group_id,ranking,percentile +FROM project_weekly_metric"; +$rel = db_query($sql); +if (!$rel) { + echo "

    $sql

    ".db_error(); + echo db_error(); +} + +db_commit(); +echo db_error(); + + +$rel=db_query("DROP TABLE project_counts_weekly_tmp;"); +$rel=db_query("DROP TABLE project_metric_weekly_tmp1;"); +$rel=db_query("DROP SEQUENCE project_metric_week_ranking_seq;"); + +} + +?> diff --git a/gforge/cronjobs/stats_projects-backfill.php b/gforge/cronjobs/stats_projects-backfill.php new file mode 100755 index 0000000000..2530a20fb5 --- /dev/null +++ b/gforge/cronjobs/stats_projects-backfill.php @@ -0,0 +1,41 @@ +#!/usr/local/bin/php + diff --git a/gforge/cronjobs/stats_projects.inc b/gforge/cronjobs/stats_projects.inc new file mode 100755 index 0000000000..32e6189d7e --- /dev/null +++ b/gforge/cronjobs/stats_projects.inc @@ -0,0 +1,271 @@ + $i\n"; + + db_query("DELETE FROM stats_project WHERE month='$year$month' AND day='$day'"); + +$sql="INSERT INTO stats_project + +SELECT +'$year$month'::int AS month, +'$day'::int AS day, +* FROM ( + +SELECT + groups.group_id, + r.count AS release_count, + fmcount.count AS msg_posted, + fucount.count AS msg_uniq_auth, + obug.count AS bugs_opened, + cbug.count AS bugs_closed, + osupport.count AS support_opened, + csupport.count AS support_closed, + opatches.count AS patches_opened, + cpatches.count AS patches_closed, + oartifact.count AS artifacts_opened, + cartifact.count AS artifacts_closed, + otask.count AS tasks_opened, + ctask.count AS tasks_closed, + helpr.count AS help_requests + +FROM groups + +-- +-- Create tmp table of groups that made any releases +-- +LEFT JOIN ( + SELECT group_id,COUNT(release_id) AS count + FROM frs_release,frs_package + WHERE + frs_release.release_date > '$day_begin' + AND frs_release.release_date < '$day_end' + AND frs_release.package_id = frs_package.package_id + GROUP BY group_id + ) r USING (group_id) + +-- +-- Create tmp table of groups that had any forum posts +-- +LEFT JOIN ( + SELECT forum_group_list.group_id,COUNT(forum.msg_id) AS count + FROM forum_group_list, forum + WHERE + forum_group_list.group_forum_id = forum.group_forum_id + AND forum.date > '$day_begin' + AND forum.date < '$day_end' + GROUP BY forum_group_list.group_id + ) fmcount USING (group_id) + +-- +-- Create tmp table of groups and unique posters to forums +-- +LEFT JOIN ( + SELECT forum_group_list.group_id,COUNT( DISTINCT(forum.posted_by) ) AS count + FROM forum_group_list, forum + WHERE + forum_group_list.group_forum_id = forum.group_forum_id + AND forum.date > '$day_begin' + AND forum.date < '$day_end' + GROUP BY group_id + ) fucount USING (group_id) + +-- +-- Create tmp table of groups and opened bugs +-- +LEFT JOIN ( + SELECT agl.group_id,count(*) AS count + FROM artifact_group_list agl,artifact a + WHERE + a.open_date > '$day_begin' + AND a.open_date < '$day_end' + AND a.group_artifact_id=agl.group_artifact_id + AND agl.datatype='1' + GROUP BY agl.group_id + ) obug USING (group_id) + +-- +-- Create tmp table of groups and closed bugs +-- +LEFT JOIN ( + SELECT agl.group_id,count(*) AS count + FROM artifact_group_list agl,artifact a + WHERE + a.close_date > '$day_begin' + AND a.close_date < '$day_end' + AND a.group_artifact_id=agl.group_artifact_id + AND agl.datatype='1' + GROUP BY agl.group_id + ) cbug USING (group_id) + +-- +-- Create tmp table of groups and opened support +-- +LEFT JOIN ( + SELECT agl.group_id,count(*) AS count + FROM artifact_group_list agl,artifact a + WHERE + a.open_date > '$day_begin' + AND a.open_date < '$day_end' + AND a.group_artifact_id=agl.group_artifact_id + AND agl.datatype='2' + GROUP BY agl.group_id + ) osupport USING (group_id) + +-- +-- Create tmp table of groups and closed support +-- +LEFT JOIN ( + SELECT agl.group_id,count(*) AS count + FROM artifact_group_list agl,artifact a + WHERE + a.close_date > '$day_begin' + AND a.close_date < '$day_end' + AND a.group_artifact_id=agl.group_artifact_id + AND agl.datatype='2' + GROUP BY agl.group_id + ) csupport USING (group_id) + +-- +-- Create tmp table of groups and opened patches +-- +LEFT JOIN ( + SELECT agl.group_id,count(*) AS count + FROM artifact_group_list agl,artifact a + WHERE + a.open_date > '$day_begin' + AND a.open_date < '$day_end' + AND a.group_artifact_id=agl.group_artifact_id + AND agl.datatype='3' + GROUP BY agl.group_id + ) opatches USING (group_id) + +-- +-- Create tmp table of groups and closed patches +-- +LEFT JOIN ( + SELECT agl.group_id,count(*) AS count + FROM artifact_group_list agl,artifact a + WHERE + a.close_date > '$day_begin' + AND a.close_date < '$day_end' + AND a.group_artifact_id=agl.group_artifact_id + AND agl.datatype='3' + GROUP BY agl.group_id + ) cpatches USING (group_id) + +-- +-- Create tmp table of groups and opened total artifacts +-- +LEFT JOIN ( + SELECT agl.group_id,count(*) AS count + FROM artifact_group_list agl,artifact a + WHERE + a.open_date > '$day_begin' + AND a.open_date < '$day_end' + AND a.group_artifact_id=agl.group_artifact_id + GROUP BY agl.group_id + ) oartifact USING (group_id) + +-- +-- Create tmp table of groups and closed total artifacts +-- +LEFT JOIN ( + SELECT agl.group_id,count(*) AS count + FROM artifact_group_list agl,artifact a + WHERE + a.close_date > '$day_begin' + AND a.close_date < '$day_end' + AND a.group_artifact_id=agl.group_artifact_id + GROUP BY agl.group_id + ) cartifact USING (group_id) + +-- +-- Create tmp table of groups that opened tasks +-- +LEFT JOIN ( + SELECT pgl.group_id,count(pt.project_task_id) AS count + FROM project_group_list pgl, project_task pt + WHERE + pgl.group_project_id=pt.group_project_id + AND pt.start_date > '$day_begin' + AND pt.start_date < '$day_end' + GROUP BY pgl.group_id + ) otask USING (group_id) + +-- +-- Create tmp table of groups that closed tasks +-- +LEFT JOIN ( + SELECT pgl.group_id,count(pt.project_task_id) AS count + FROM project_group_list pgl, project_task pt + WHERE + pgl.group_project_id=pt.group_project_id + AND pt.end_date > '$day_begin' + AND pt.end_date < '$day_end' + GROUP BY pgl.group_id + ) ctask USING (group_id) + +-- +-- Create tmp table of groups that closed tasks +-- +LEFT JOIN ( + SELECT group_id,COUNT(job_id) AS count + FROM people_job + WHERE + date > '$day_begin' + AND date < '$day_end' + GROUP BY group_id + ) helpr USING (group_id) + +) mess + +-- +-- We really only want the rows that have any content +-- +WHERE +release_count > 0 +OR msg_posted > 0 +OR msg_uniq_auth > 0 +OR bugs_opened > 0 +OR bugs_closed > 0 +OR support_opened > 0 +OR support_closed > 0 +OR patches_opened > 0 +OR patches_closed > 0 +OR artifacts_opened > 0 +OR artifacts_closed > 0 +OR tasks_opened > 0 +OR tasks_closed > 0 +OR help_requests > 0;"; + + db_query($sql); + //echo $sql; + echo db_error(); + + db_commit(); + +} + +?> diff --git a/gforge/cronjobs/stats_site.inc b/gforge/cronjobs/stats_site.inc new file mode 100644 index 0000000000..f90961cf70 --- /dev/null +++ b/gforge/cronjobs/stats_site.inc @@ -0,0 +1,42 @@ + $i\n"; + + // + // build row for stats_site + // + $rel=db_query("DELETE FROM stats_site WHERE month='$year$month' AND day='$day'"); + + $sql="INSERT INTO stats_site (month,day,uniq_users,sessions,total_users,new_users,new_projects) + VALUES ('$year$month', + '$day', + (SELECT COUNT(DISTINCT(user_id)) FROM session WHERE (time < '$day_end' AND time > '$day_begin')), + (SELECT COUNT(session_hash) FROM session WHERE (time < '$day_end' AND time > $day_begin)), + (SELECT COUNT(user_id) FROM users WHERE ( add_date < '$day_end' AND status='A' )), + (SELECT COUNT(user_id) FROM users WHERE ( add_date < '$day_end' AND add_date > '$day_begin' )), + (SELECT COUNT(group_id) FROM groups WHERE ( register_time < '$day_end' AND register_time > '$day_begin' )))"; + + $rel=db_query($sql); + echo db_error(); + + db_commit(); + +} + +?> diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/README b/gforge/db/SQL_migrate-2.5-to-2.6/README new file mode 100644 index 0000000000..3767189ae2 --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/README @@ -0,0 +1,26 @@ + +Apologies in advance for the difficulty in converting from 2.5 to 2.6. + +As always, SourceForge is undergoing radical changes, rewrites, feature +and scalability enhancements. This means a large number of SQL and +database changes need to occur in sequence over time. + +The 2.5 codebase was a radical change because it moved from MySQL to PostgreSQL. +2.6 is radical because it takes full advantage of Postgres' advanced features +and MySQL is no longer usable as it was for 2.5 + +The process of upgrading from 2.5 to 2.6 involves running these clearly dated +sql diff files IN ORDER. + +If you encounter difficulties, please report them in the SF Offsite Discussion board: +https://sourceforge.net/forum/forum.php?forum_id=21304 + +Please do not submit bugs to SourceForge.net. + +************************************************************************************ + +IMPORTANT!!! Read and understand EACH AND EVERY sql command before running it. +These commands were issued on SourceForge.net and may cause problems on your system. + +************************************************************************************ + diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/artifact-conversion.sql b/gforge/db/SQL_migrate-2.5-to-2.6/artifact-conversion.sql new file mode 100644 index 0000000000..8d201e7bb7 --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/artifact-conversion.sql @@ -0,0 +1,375 @@ +-- +-- +-- database conversion +-- +-- The general idea is to move data from the 2 +-- + +-- +-- +-- Bug TRACKER +-- +-- +BEGIN; + +-- +-- set up bug ArtifactTypes for each group +-- + +UPDATE groups SET bug_due_period='2592000' WHERE bug_due_period is null; +INSERT INTO artifact_group_list +(group_artifact_id,group_id,name,description,is_public, +allow_anon,email_all_updates,email_address,due_period,use_resolution,datatype) +SELECT group_id+100000,group_id,'Bugs','Bug Tracking System',use_bugs, +1,send_all_bugs,new_bug_address,bug_due_period,1,1 +FROM groups +WHERE status != 'I' AND status != 'P' +ORDER BY group_id ASC; + +-- +-- permissions +-- +INSERT INTO artifact_perm +(group_artifact_id,user_id,perm_level) +SELECT group_id+100000,user_id,bug_flags +FROM user_group; + +-- +-- bug groups conversion +-- +INSERT INTO artifact_group (id,group_artifact_id,group_name) +SELECT bug_group_id+100000,group_id+100000,group_name FROM bug_group; + +-- +-- bug category conversion +-- +INSERT INTO artifact_category (id,group_artifact_id,category_name,auto_assign_to) +SELECT bug_category_id+100000,group_id+100000,category_name,100 FROM bug_category; + +-- +-- bug +-- +-- bug tracker had status_id of 100 (None) and status_id=3 (closed) +-- +UPDATE bug SET status_id=1 WHERE status_id=100; +INSERT INTO bug_status (status_id,status_name) VALUES (2,'Open'); +UPDATE bug SET status_id=2 WHERE status_id=3; +DELETE FROM bug_status WHERE status_id=3; + +UPDATE bug SET close_date=0 WHERE close_date is NULL; + +INSERT INTO artifact +(artifact_id,group_artifact_id,status_id,category_id,artifact_group_id,priority, +submitted_by,assigned_to,open_date,close_date,summary,details,resolution_id) +SELECT +bug_id+100000,group_id+100000,status_id,category_id+100000,bug_group_id+100000,priority, +submitted_by,assigned_to,date,close_date,summary,details,resolution_id +FROM bug +ORDER BY group_id ASC; + +-- +-- bug_history +-- +--UPDATE bug_history SET old_value=1 WHERE old_value='100' AND field_name='status_id'; +UPDATE bug_history SET old_value=2 WHERE old_value='3' AND field_name='status_id'; + +--BEGIN; +--SELECT * from bug_history +--WHERE NOT EXISTS (select bug_id FROM bug +--where bug.bug_id=bug_history.bug_id); +--COMMIT; + +--DELETE FROM bug_history WHERE bug_id=0; + +--DELETE FROM bug_history +--WHERE bug_id+100000 NOT IN (SELECT artifact_id FROM artifact); + +INSERT INTO artifact_history +(artifact_id,field_name,old_value,mod_by,entrydate) +SELECT +bug_id+100000,field_name,old_value,mod_by,date +FROM bug_history +WHERE field_name IN ('summary','resolution_id','priority','group_id','close_date','assigned_to','status_id'); + +INSERT INTO artifact_history +(artifact_id,field_name,old_value,mod_by,entrydate) +SELECT +bug_id+100000,'artifact_group_id',(old_value::int)+100000,mod_by,date +FROM bug_history +WHERE field_name='bug_group_id'; + +INSERT INTO artifact_history +(artifact_id,field_name,old_value,mod_by,entrydate) +SELECT +bug_id+100000,field_name,(old_value::int)+100000,mod_by,date +FROM bug_history +WHERE field_name='category_id'; + +-- +-- bug messages +-- +INSERT INTO artifact_message +(artifact_id,submitted_by,from_email,adddate,body) +SELECT +bh.bug_id+100000,bh.mod_by,users.email,bh.date,bh.old_value +FROM bug_history bh, users +WHERE bh.mod_by=users.user_id +AND bh.field_name='details'; + +-- +-- bug canned responses +-- +delete from bug_canned_responses where title is null; + +INSERT INTO artifact_canned_responses +(group_artifact_id,title,body) +SELECT +group_id+100000,title,body +FROM bug_canned_responses +WHERE group_id > 0; + +COMMIT; + +-- +-- +-- SUPPORT +-- +-- + +-- +-- set up support ArtifactTypes for each group +-- +BEGIN; + +UPDATE groups SET support_due_period='2592000' WHERE support_due_period is null; + +INSERT INTO artifact_group_list +(group_artifact_id,group_id,name,description,is_public, +allow_anon,email_all_updates,email_address,due_period,use_resolution,datatype) +SELECT group_id+200000,group_id,'Support Requests','Tech Support Tracking System',use_support, +1,send_all_support,new_support_address,support_due_period,0,2 +FROM groups +WHERE status != 'I' AND status != 'P' +ORDER BY group_id ASC; + +-- +-- permissions +-- +INSERT INTO artifact_perm +(group_artifact_id,user_id,perm_level) +SELECT group_id+200000,user_id,support_flags +FROM user_group; + +-- +-- support category conversion +-- +INSERT INTO artifact_category (id,group_artifact_id,category_name,auto_assign_to) +SELECT support_category_id+200000,group_id+200000,category_name,100 FROM support_category; + +-- +-- support +-- +DELETE FROM support WHERE NOT EXISTS +(SELECT group_id FROM groups WHERE support.group_id=groups.group_id); + +INSERT INTO artifact +(artifact_id,group_artifact_id,status_id,category_id,artifact_group_id,priority, +submitted_by,assigned_to,open_date,close_date,summary,details,resolution_id) +SELECT +support_id+200000,group_id+200000,support_status_id,support_category_id+200000,100,priority, +submitted_by,assigned_to,open_date,close_date,summary,'',100 +FROM support +ORDER BY group_id ASC; + +-- +-- support_history +-- +DELETE FROM support_history WHERE support_id=0; + +INSERT INTO artifact_history +(artifact_id,field_name,old_value,mod_by,entrydate) +SELECT +support_id+200000,field_name,old_value,mod_by,date +FROM support_history +WHERE +field_name IN ('summary','priority','close_date','assigned_to'); + +INSERT INTO artifact_history +(artifact_id,field_name,old_value,mod_by,entrydate) +SELECT +support_id+200000,'category_id',(old_value::int)+200000,mod_by,date +FROM support_history +WHERE +field_name='support_category_id'; + +INSERT INTO artifact_history +(artifact_id,field_name,old_value,mod_by,entrydate) +SELECT +support_id+200000,'status_id',old_value,mod_by,date +FROM support_history +WHERE +field_name='support_status_id'; + +-- +-- messages +-- +DELETE FROM support_messages WHERE NOT EXISTS +(SELECT support_id FROM support WHERE support.support_id=support_messages.support_id); + +INSERT INTO artifact_message +(artifact_id,submitted_by,from_email,adddate,body) +SELECT +support_id+200000,100,from_email,date,body +FROM support_messages; + +-- +-- canned messages +-- +INSERT INTO artifact_canned_responses +(group_artifact_id,title,body) +SELECT +group_id+200000,title,body +FROM support_canned_responses +WHERE group_id > 0; + +COMMIT; + + +-- +-- +-- Patch Manager +-- +-- +--BEGIN; + +-- +-- set up patch ArtifactTypes for each group +-- +UPDATE groups SET patch_due_period='2592000' WHERE patch_due_period is null; + +INSERT INTO artifact_group_list +(group_artifact_id,group_id,name,description,is_public, +allow_anon,email_all_updates,email_address,due_period,use_resolution,datatype) +SELECT group_id+300000,group_id,'Patches','Patch Tracking System',use_patch, +1,send_all_patches,new_patch_address,patch_due_period,1,3 +FROM groups +WHERE status != 'I' AND status != 'P' +ORDER BY group_id ASC; + +-- +-- permissions +-- +INSERT INTO artifact_perm +(group_artifact_id,user_id,perm_level) +SELECT group_id+300000,user_id,patch_flags +FROM user_group; + +-- +-- patch category conversion +-- +INSERT INTO artifact_category (id,group_artifact_id,category_name,auto_assign_to) +SELECT patch_category_id+300000,group_id+300000,category_name,100 FROM patch_category; + +-- +-- patch table +-- +-- moving the odd patch statuses to resolutions +-- +ALTER TABLE patch ADD COLUMN resolution_id INT NOT NULL DEFAULT 100; +UPDATE patch SET resolution_id=patch_status_id; +vacuum analyze patch; +update patch set patch_status_id=2 where patch_status_id > 3; +update patch set resolution_id=100 WHERE resolution_id < 4; +INSERT INTO artifact_resolution VALUES (102,'Accepted'); +INSERT INTO artifact_resolution VALUES (103,'Out of Date'); +INSERT INTO artifact_resolution VALUES (104,'Postponed'); +INSERT INTO artifact_resolution VALUES (105,'Rejected'); +update patch set resolution_id=104 WHERE resolution_id=4; +update patch set resolution_id=105 WHERE resolution_id=101; + +delete from patch where patch_id=100000; +UPDATE patch SET details=' ' WHERE details is null; + +INSERT INTO artifact +(artifact_id,group_artifact_id,status_id,category_id,artifact_group_id,priority, +submitted_by,assigned_to,open_date,close_date,summary,details,resolution_id) +SELECT +patch_id+300000,group_id+300000,patch_status_id,patch_category_id+300000,100,5, +submitted_by,assigned_to,open_date,close_date,summary,details,resolution_id +FROM patch +ORDER BY group_id ASC; + +-- +-- patch history +-- +INSERT INTO artifact_history +(artifact_id,field_name,old_value,mod_by,entrydate) +SELECT +patch_id+300000,field_name,old_value,mod_by,date +FROM patch_history +WHERE field_name IN ('summary','close_date','assigned_to','Patch Code'); + +INSERT INTO artifact_history +(artifact_id,field_name,old_value,mod_by,entrydate) +SELECT +patch_id+300000,'status_id',old_value,mod_by,date +FROM patch_history +WHERE field_name='patch_status_id'; + +INSERT INTO artifact_history +(artifact_id,field_name,old_value,mod_by,entrydate) +SELECT +patch_id+300000,'category_id',(old_value::int)+300000,mod_by,date +FROM patch_history +WHERE field_name='patch_category_id'; + +-- +-- patch messages +-- +INSERT INTO artifact_message +(artifact_id,submitted_by,from_email,adddate,body) +SELECT +ph.patch_id+300000,ph.mod_by,users.email,ph.date,ph.old_value +FROM patch_history ph, users +WHERE ph.mod_by=users.user_id +AND ph.field_name='details'; + +-- +-- patch code +-- +INSERT INTO artifact_file +(artifact_id,description,bin_data,filename,filesize,filetype,adddate,submitted_by) +SELECT patch_id+300000,'None',code,'None',length(code),'text/plain',open_date,submitted_by +FROM patch +WHERE code IS NOT NULL; + +--COMMIT; + +INSERT INTO artifact_counts_agg +SELECT group_artifact_id,count(*) +FROM artifact +WHERE status_id <> 3 +GROUP BY group_artifact_id; + +-- +-- +-- Feature Requests +-- +-- +INSERT INTO artifact_group_list +(group_artifact_id,group_id,name,description,is_public, +allow_anon,email_all_updates,email_address,due_period,use_resolution,datatype) +SELECT group_id+350000,group_id,'Feature Requests','Feature Request Tracking System',1, +1,0,'',45*24*60*60,0,4 +FROM groups +WHERE status != 'I' AND status != 'P' +ORDER BY group_id ASC; + +vacuum analyze artifact_perm; +vacuum analyze artifact_group_list; +vacuum analyze artifact; +vacuum analyze artifact_history; +vacuum analyze artifact_category; +vacuum analyze artifact_group; +vacuum analyze artifact_file; +vacuum analyze artifact_message; diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/artifact-convert-files.php b/gforge/db/SQL_migrate-2.5-to-2.6/artifact-convert-files.php new file mode 100755 index 0000000000..95cdc9de54 --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/artifact-convert-files.php @@ -0,0 +1,29 @@ +#!/usr/local/bin/php +Num: $i | id: ".db_result($rel,$i,'id'); + +} + +db_commit(); +echo "Done: ".db_error(); + +db_query("vacuum analyze;"); + +?> diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/artifact-fkeys.sql b/gforge/db/SQL_migrate-2.5-to-2.6/artifact-fkeys.sql new file mode 100644 index 0000000000..0da1e15d88 --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/artifact-fkeys.sql @@ -0,0 +1,66 @@ +ALTER TABLE artifact_group_list ADD CONSTRAINT artifactgroup_groupid_fk + FOREIGN KEY (group_id) REFERENCES groups(group_id) MATCH FULL; + +ALTER TABLE artifact_perm ADD CONSTRAINT artifactperm_userid_fk + FOREIGN KEY (user_id) REFERENCES users(user_id) MATCH FULL; +DELETE from artifact_perm + where not exists (select group_artifact_id + from artifact_group_list + where artifact_perm.group_artifact_id=artifact_group_list.group_artifact_id); +ALTER TABLE artifact_perm ADD CONSTRAINT artifactperm_groupartifactid_fk + FOREIGN KEY (group_artifact_id) REFERENCES artifact_group_list(group_artifact_id) MATCH FULL; + +ALTER TABLE artifact_category ADD CONSTRAINT artifactcategory_groupartifactid_fk + FOREIGN KEY (group_artifact_id) REFERENCES artifact_group_list(group_artifact_id) MATCH FULL; +ALTER TABLE artifact_category ADD CONSTRAINT artifactcategory_autoassignto_fk + FOREIGN KEY (auto_assign_to) REFERENCES users(user_id) MATCH FULL; + +ALTER TABLE artifact_group ADD CONSTRAINT artifactgroup_groupartifactid_fk + FOREIGN KEY (group_artifact_id) REFERENCES artifact_group_list(group_artifact_id) MATCH FULL; + +ALTER TABLE artifact ADD CONSTRAINT artifact_groupartifactid_fk + FOREIGN KEY (group_artifact_id) REFERENCES artifact_group_list(group_artifact_id) MATCH FULL; +ALTER TABLE artifact ADD CONSTRAINT artifact_statusid_fk + FOREIGN KEY (status_id) REFERENCES artifact_status(id) MATCH FULL; +ALTER TABLE artifact ADD CONSTRAINT artifact_categoryid_fk + FOREIGN KEY (category_id) REFERENCES artifact_category(id) MATCH FULL; +ALTER TABLE artifact ADD CONSTRAINT artifact_artifactgroupid_fk + FOREIGN KEY (artifact_group_id) REFERENCES artifact_group(id) MATCH FULL; +ALTER TABLE artifact ADD CONSTRAINT artifact_submittedby_fk + FOREIGN KEY (submitted_by) REFERENCES users(user_id) MATCH FULL; +ALTER TABLE artifact ADD CONSTRAINT artifact_assignedto_fk + FOREIGN KEY (assigned_to) REFERENCES users(user_id) MATCH FULL; +ALTER TABLE artifact ADD CONSTRAINT artifact_resolutionid_fk + FOREIGN KEY (resolution_id) REFERENCES artifact_resolution(id) MATCH FULL; + +DELETE FROM artifact_history WHERE NOT EXISTS + (SELECT artifact_id FROM artifact WHERE artifact.artifact_id=artifact_history.artifact_id); +ALTER TABLE artifact_history ADD CONSTRAINT artifacthistory_artifactid_fk + FOREIGN KEY (artifact_id) REFERENCES artifact(artifact_id) MATCH FULL; +ALTER TABLE artifact_history ADD CONSTRAINT artifacthistory_modby_fk + FOREIGN KEY (mod_by) REFERENCES users(user_id) MATCH FULL; + +ALTER TABLE artifact_file ADD CONSTRAINT artifactfile_artifactid_fk + FOREIGN KEY (artifact_id) REFERENCES artifact(artifact_id) MATCH FULL; +ALTER TABLE artifact_file ADD CONSTRAINT artifactfile_submittedby_fk + FOREIGN KEY (submitted_by) REFERENCES users(user_id) MATCH FULL; + +ALTER TABLE artifact_message ADD CONSTRAINT artifactmessage_artifactid_fk + FOREIGN KEY (artifact_id) REFERENCES artifact(artifact_id) MATCH FULL; +ALTER TABLE artifact_message ADD CONSTRAINT artifactmessage_submittedby_fk + FOREIGN KEY (submitted_by) REFERENCES users(user_id) MATCH FULL; + +ALTER TABLE artifact_monitor ADD CONSTRAINT artifactmonitor_artifactid_fk + FOREIGN KEY (artifact_id) REFERENCES artifact(artifact_id) MATCH FULL; + +SELECT setval('artifact_grou_group_artifac_seq',(SELECT max(group_artifact_id) FROM artifact_group_list)); +--SELECT setval('artifact_perm_id_seq',(SELECT max(id) FROM artifact_perm)); +SELECT setval('artifact_category_id_seq',(SELECT max(id) FROM artifact_category)); +SELECT setval('artifact_group_id_seq',(SELECT max(id) FROM artifact_group)); +--SELECT setval('artifact_status_id_seq',(SELECT max(id) FROM artifact_status)); +SELECT setval('artifact_artifact_id_seq',(SELECT max(artifact_id) FROM artifact)); +--SELECT setval('artifact_history_id_seq',(SELECT max(id) FROM artifact_history)); +--SELECT setval('artifact_file_id_seq',(SELECT max(id) FROM artifact_file)); +--SELECT setval('artifact_message_id_seq',(SELECT max(id) FROM artifact_message)); +--SELECT setval('artifact_monitor_id_seq',(SELECT max(id) FROM artifact_monitor)); + diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/artifact-man.sql b/gforge/db/SQL_migrate-2.5-to-2.6/artifact-man.sql new file mode 100644 index 0000000000..7fd3d84621 --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/artifact-man.sql @@ -0,0 +1,271 @@ +-- +-- need to widen the preference column in user_preferences +-- postgres isn't as slick as MySQL in this respect +-- +BEGIN; +ALTER TABLE user_preferences RENAME COLUMN preference_value TO dead1; +ALTER TABLE user_preferences ADD COLUMN preference_value TEXT; +UPDATE user_preferences SET preference_value=dead1; +UPDATE user_preferences SET dead1=''; +COMMIT; +-- +-- user_group permissions flag +-- +ALTER TABLE user_group ADD COLUMN artifact_flags INT NOT NULL DEFAULT 0; +UPDATE user_group SET artifact_flags=0; + +-- +-- each group can have multiple artifact types +-- +create table artifact_group_list ( +group_artifact_id serial primary key, +group_id int not null, +name text, +description text, +is_public int not null default 0, +allow_anon int not null default 0, +email_all_updates int not null default 0, +email_address text not null, +due_period int not null default 2592000, +use_resolution int not null default 0, +submit_instructions text, +browse_instructions text, +datatype int not null default 0 +); + +CREATE INDEX artgrouplist_groupid on artifact_group_list (group_id); +CREATE INDEX artgrouplist_groupid_public on artifact_group_list (group_id,is_public); + +create table artifact_resolution ( +id serial primary key, +resolution_name text +); + +INSERT INTO artifact_resolution SELECT * FROM bug_resolution; + +-- +-- new permissions model required +-- +create table artifact_perm ( +id serial primary key, +group_artifact_id int not null, +user_id int not null, +perm_level int not null DEFAULT 0 +); + +CREATE INDEX artperm_groupartifactid on artifact_perm (group_artifact_id); +CREATE UNIQUE INDEX artperm_groupartifactid_userid on artifact_perm (group_artifact_id,user_id); + +-- +-- create a view to make selecting all perms for a user_id/group_id easier +-- + +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; + +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; + +-- +-- similar to bug_category +-- +CREATE TABLE artifact_category ( + id serial primary key, + group_artifact_id int NOT NULL, + category_name text NOT NULL, + auto_assign_to int not null DEFAULT 100 +); + +CREATE INDEX artcategory_groupartifactid on artifact_category (group_artifact_id); + +-- +-- similar to bug_group +-- +CREATE TABLE artifact_group ( + id serial primary key, + group_artifact_id int NOT NULL, + group_name text NOT NULL +); + +CREATE INDEX artgroup_groupartifactid on artifact_group (group_artifact_id); + +-- +-- similar to bug_status +-- +CREATE TABLE artifact_status ( + id serial primary key, + status_name text NOT NULL +); + +-- +-- similar to bug table +-- +CREATE TABLE artifact ( + artifact_id serial primary key, + group_artifact_id int NOT NULL, + status_id int DEFAULT '1' NOT NULL, + category_id int DEFAULT '100' NOT NULL, + artifact_group_id int DEFAULT '0' NOT NULL, + resolution_id int not null default '100', + priority int DEFAULT '5' NOT NULL, + submitted_by int DEFAULT '100' NOT NULL, + assigned_to int DEFAULT '100' NOT NULL, + open_date int DEFAULT '0' NOT NULL, + close_date int DEFAULT '0' NOT NULL, + summary text NOT NULL, + details text NOT NULL +); + +CREATE INDEX art_groupartid ON artifact (group_artifact_id); +CREATE INDEX art_groupartid_statusid ON artifact (group_artifact_id,status_id); +CREATE INDEX art_groupartid_assign ON artifact (group_artifact_id,assigned_to); +CREATE INDEX art_groupartid_submit ON artifact (group_artifact_id,submitted_by); +create index art_submit_status ON artifact(submitted_by,status_id); +create index art_assign_status ON artifact(assigned_to,status_id); +create index art_groupartid_artifactid on artifact (group_artifact_id,artifact_id); + + + +CREATE VIEW artifact_vw AS +SELECT +artifact.*, +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; + + +-- +-- audit trail table +-- +CREATE TABLE artifact_history ( + id serial primary key, + artifact_id int DEFAULT '0' NOT NULL, + field_name text DEFAULT '' NOT NULL, + old_value text DEFAULT '' NOT NULL, + mod_by int DEFAULT '0' NOT NULL, + entrydate int DEFAULT '0' NOT NULL +); + +CREATE INDEX arthistory_artid on artifact_history(artifact_id); +CREATE INDEX arthistory_artid_entrydate on artifact_history(artifact_id,entrydate); + +-- +-- create a view from the audit trail which joins the user table and history table +-- +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; + +-- +-- files attached to a given artifact +-- +CREATE TABLE artifact_file ( + id serial primary key, + artifact_id int NOT NULL, + description text NOT NULL, + bin_data text NOT NULL, + filename text NOT NULL, + filesize int NOT NULL, + filetype text NOT NULL, + adddate int not null DEFAULT '0', + submitted_by int not null +); + +CREATE INDEX artfile_artid on artifact_file(artifact_id); +CREATE INDEX artfile_artid_adddate on artifact_file(artifact_id,adddate); + +-- +-- create a view from the files which joins the user table and files table +-- +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; + +-- +-- messages and comments attached to an artifact +-- +CREATE TABLE artifact_message ( + id serial primary key, + artifact_id int NOT NULL, + submitted_by int not null, + from_email text NOT NULL, + adddate int DEFAULT '0' NOT NULL, + body text NOT NULL +); + +CREATE INDEX artmessage_artid on artifact_message(artifact_id); +CREATE INDEX artmessage_artid_adddate on artifact_message(artifact_id,adddate); + +-- +-- create a view from the messages which joins the user table and messages table +-- +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; + +-- +-- table containing list of people monitoring each artifact +-- +CREATE TABLE artifact_monitor ( +id serial primary key, +artifact_id int NOT NULL, +user_id int not null, +email text +); + +CREATE INDEX artmonitor_artifactid on artifact_monitor(artifact_id); + +ALTER TABLE artifact_monitor ADD CONSTRAINT artifactmonitor_artifactid_fk + FOREIGN KEY (artifact_id) REFERENCES artifact(artifact_id) MATCH FULL; + +INSERT INTO artifact_group_list VALUES (100,1,'Default','Default Data - Dont Edit',3,0,0,'0',0); +INSERT INTO artifact_category VALUES (100,100,'None',100); +INSERT INTO artifact_group VALUES (100,100,'None'); +INSERT INTO artifact_status VALUES (1,'Open'); +INSERT INTO artifact_status VALUES (2,'Closed'); +INSERT INTO artifact_status VALUES (3,'Deleted'); + +CREATE TABLE artifact_canned_responses ( + id serial primary key, + group_artifact_id int NOT NULL, + title text NOT NULL, + body text NOT NULL +); + +CREATE INDEX artifactcannedresponses_groupid ON artifact_canned_responses (group_artifact_id); + +CREATE TABLE artifact_counts_agg ( +group_artifact_id int not null, +count int not null +); +CREATE INDEX artifactcountsagg_groupartid ON artifact_counts_agg(group_artifact_id); + +GRANT SELECT ON +artifact, +artifact_group_list +TO stats; diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001209.sql b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001209.sql new file mode 100644 index 0000000000..14cea74eb2 --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001209.sql @@ -0,0 +1,20 @@ +drop index downloads_idx; +create index frsdlstatsgroupagg_day_dls on frs_dlstats_group_agg (day,downloads); +create index projectweeklymetric_ranking on project_weekly_metric(ranking); +create index users_status on users(status); +drop index news_date; +create index support_groupid_assignedto_status on support(group_id,assigned_to,support_status_id); +create index support_groupid_assignedto on support(group_id,assigned_to); +create index support_groupid_status on support(group_id,support_status_id); + +create index patch_groupid_assignedto_status on patch(group_id,assigned_to,patch_status_id); +create index patch_groupid_assignedto on patch(group_id,assigned_to); +create index patch_groupid_status on patch(group_id,patch_status_id); + +create index projecttask_projid_status on project_task(group_project_id,status_id); + +create index forummonitoredforums_user on forum_monitored_forums(user_id); + +create index filemodulemonitor_userid on filemodule_monitor(user_id); +create index support_status_assignedto on support(support_status_id,assigned_to); +create index bug_status_assignedto on bug(status_id,assigned_to); diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001214.sql b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001214.sql new file mode 100644 index 0000000000..678b427c5e --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001214.sql @@ -0,0 +1,15 @@ +alter table filemodule_monitor add column id int not null default 0 primary key auto_increment first; +alter table frs_dlstats_filetotal_agg change column file_id file_id int not null default 0 primary key; +alter table group_cvs_history add column id int not null default 0 primary key auto_increment first; + +DROP TABLE system_news; +DROP TABLE system_history; +DROP TABLE system_status; +DROP TABLE system_services; +DROP TABLE system_machines; + + +create index foundrynews_foundry_date_approved on foundry_news(foundry_id,approve_date,is_approved); +create index news_group_date on news_bytes(group_id,date); +create index news_date on news_bytes(date); +create index news_approved_date on news_bytes(is_approved,date); diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001220.sql b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001220.sql new file mode 100644 index 0000000000..f5557b6e60 --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001220.sql @@ -0,0 +1,2 @@ +ALTER TABLE patch ADD COLUMN details text; +INSERT INTO themes VALUES (3,'ultralite','Ultra Lite'); diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010109.sql b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010109.sql new file mode 100644 index 0000000000..8ac7059c7f --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010109.sql @@ -0,0 +1,7 @@ +create table project_sums_agg ( +group_id int not null default 0, +type char(4), +count int not null default 0 +); + +CREATE INDEX projectsumsagg_groupid ON project_sums_agg (group_id); diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010112.sql b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010112.sql new file mode 100644 index 0000000000..0ee144640e --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010112.sql @@ -0,0 +1,9 @@ +-- by: pfalcon +-- purpose: add default due periods (in sec) for tools +--30*24*60*60, +--0*24*60*60, +--15*24*60*60 + +ALTER TABLE groups ADD COLUMN bug_due_period int NOT NULL DEFAULT 2592000; +ALTER TABLE groups ADD COLUMN patch_due_period int NOT NULL DEFAULT 5184000; +ALTER TABLE groups ADD COLUMN support_due_period int NOT NULL DEFAULT 1296000; diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010126.sql b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010126.sql new file mode 100644 index 0000000000..e09f33b1f0 --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010126.sql @@ -0,0 +1,51 @@ +-- by: apzen +-- purpose: stuff for project database and vhost maintanance + + CREATE TABLE prdb_dbs ( + dbid SERIAL PRIMARY KEY, + group_id INT NOT NULL, + dbname TEXT NOT NULL, + dbusername TEXT NOT NULL, + dbuserpass TEXT NOT NULL, + requestdate INT NOT NULL, + dbtype INT NOT NULL, + created_by INT NOT NULL, + state INT NOT NULL + ); + + CREATE TABLE prdb_states ( + + stateid INT NOT NULL, + statename TEXT + ); + + CREATE UNIQUE INDEX idx_prdb_dbname ON prdb_dbs (dbname); + + INSERT INTO prdb_states VALUES ('1', 'Active'); + INSERT INTO prdb_states VALUES ('2', 'Pending Create'); + INSERT INTO prdb_states VALUES ('3', 'Pending Delete'); + INSERT INTO prdb_states VALUES ('4', 'Pending Update'); + INSERT INTO prdb_states VALUES ('5', 'Failed Create'); + INSERT INTO prdb_states VALUES ('6', 'Failed Delete'); + INSERT INTO prdb_states VALUES ('7', 'Failed Update'); + + CREATE TABLE prdb_types ( + dbtypeid INT PRIMARY KEY, + dbservername TEXT NOT NULL, + dbsoftware TEXT NOT NULL + ); + + INSERT INTO prdb_types VALUES ('1','pr-db1','mysql'); + + CREATE TABLE prweb_vhost ( + vhostid SERIAL PRIMARY KEY, + vhost_name TEXT, + docdir TEXT, + cgidir TEXT, + group_id INT NOT NULL + ); + + CREATE INDEX idx_vhost_groups ON prweb_vhost (group_id); + + CREATE UNIQUE INDEX idx_vhost_hostnames ON prweb_vhost(vhost_name); + diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010206.sql b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010206.sql new file mode 100644 index 0000000000..6523d916b1 --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010206.sql @@ -0,0 +1,9 @@ +-- by: pfalcon +-- purpose: add timestamp/version for stored multimedia files + +ALTER TABLE db_images ADD COLUMN upload_date int NOT NULL; +ALTER TABLE db_images ADD COLUMN version int NOT NULL; + +CREATE UNIQUE INDEX usergroup_uniq_groupid_userid ON +user_group(group_id,user_id); + diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010301.sql b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010301.sql new file mode 100644 index 0000000000..3e8529a462 --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010301.sql @@ -0,0 +1,16 @@ +-- +-- Selected TOC Entries: +-- +\connect - www +-- +-- TOC Entry ID 2 (OID 29407739) +-- +-- Name: kernel_traffic Type: TABLE Owner: www +-- + +CREATE TABLE "kernel_traffic" ( + "kt_id" serial primary key, + "kt_data" text, + CONSTRAINT "kernel_traffic_pkey" PRIMARY KEY ("kt_id") +); + diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010304.NOTE b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010304.NOTE new file mode 100644 index 0000000000..0c617e34c6 --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010304.NOTE @@ -0,0 +1,12 @@ +IMPORTANT NOTE! +------------------- + +At this point, the artifact manager was rolled live to production. + +This involved stopping the website, then applying several scripts to the database in order: + +artifact-man.sql -- Create the new tracker tables in production +artifact-conversion.sql -- Convert data from the old structures (bug, patch, support) +artifact-fkeys.sql -- Apply foreign key constraints to new tables + +artifact-convert-files.php -- PHP command line script that reformats old patches diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010305.sql b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010305.sql new file mode 100644 index 0000000000..505a63e60f --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010305.sql @@ -0,0 +1,69 @@ +-- r/w of prdb_dbs || r/o prweb_vhost + +-- +-- All these changes were applied 3/8/2001 +-- + +CREATE USER backend WITH PASSWORD 'xxxxx' NOCREATEDB NOCREATEUSER; + +GRANT SELECT ON prweb_vhost TO backend; +GRANT SELECT,UPDATE ON prdb_dbs TO backend; + +DROP SEQUENCE bug_bug_dependencies_pk_seq;-- +DROP SEQUENCE bug_canned_responses_pk_seq;-- | sequence | tperdue +DROP SEQUENCE bug_category_pk_seq ;-- | sequence | tperdue +DROP SEQUENCE bug_filter_pk_seq ;-- | sequence | tperdue +DROP SEQUENCE bug_group_pk_seq ;-- | sequence | tperdue +DROP SEQUENCE bug_history_pk_seq ;-- | sequence | tperdue +DROP SEQUENCE bug_pk_seq ;-- | sequence | tperdue +DROP SEQUENCE bug_resolution_pk_seq ;-- | sequence | tperdue +DROP SEQUENCE bug_status_pk_seq ;-- | sequence | tperdue +DROP SEQUENCE bug_task_dependencies_pk_seq ;-- | sequence | tperdue +DROP SEQUENCE patch_category_pk_seq ;-- | sequence | tperdue +DROP SEQUENCE patch_history_pk_seq ;-- | sequence | tperdue +DROP SEQUENCE patch_pk_seq ;-- | sequence | tperdue +DROP SEQUENCE patch_status_pk_seq ;-- | sequence | tperdue +DROP SEQUENCE support_canned_responses_pk_seq;-- | sequence | tperdue +DROP SEQUENCE support_category_pk_seq ;-- | sequence | tperdue +DROP SEQUENCE support_history_pk_seq ;-- | sequence | tperdue +DROP SEQUENCE support_messages_pk_seq ;-- | sequence | tperdue +DROP SEQUENCE support_pk_seq ;-- | sequence | tperdue +DROP SEQUENCE support_status_pk_seq ;-- | sequence | tperdue + +DROP TABLE bug ;-- | table | tperdue +DROP TABLE bug_bug_dependencies ;-- | table | tperdue +DROP TABLE bug_canned_responses ;-- | table | tperdue +DROP TABLE bug_category ;-- | table | tperdue +DROP TABLE bug_filter ;-- | table | tperdue +DROP TABLE bug_group ;-- | table | tperdue +DROP TABLE bug_history ;-- | table | tperdue +DROP TABLE bug_resolution ;-- | table | tperdue +DROP TABLE bug_status ;-- | table | tperdue +DROP TABLE bug_task_dependencies ;-- | table | tperdue +DROP TABLE patch ;-- | table | tperdue +DROP TABLE patch_category ;-- | table | tperdue +DROP TABLE patch_history ;-- | table | tperdue +DROP TABLE patch_status ;-- | table | tperdue +DROP TABLE support ;-- | table | tperdue +DROP TABLE support_canned_responses ;-- | table | tperdue +DROP TABLE support_category ;-- | table | tperdue +DROP TABLE support_history ;-- | table | tperdue +DROP TABLE support_messages ;-- | table | tperdue +DROP TABLE support_status ;-- | table | tperdue + +alter table groups rename column use_bugs to dead1; +alter table groups rename column use_patch to dead2; +alter table groups rename column use_support to dead3; +alter table groups rename column new_bug_address to dead4; +alter table groups rename column new_patch_address to dead5; +alter table groups rename column new_support_address to dead6; +alter table groups rename column send_all_bugs to dead7; +alter table groups rename column send_all_patches to dead8; +alter table groups rename column send_all_support to dead9; +alter table groups rename column use_bug_depend_box to dead10; +alter table groups rename column bug_due_period to dead11; +alter table groups rename column patch_due_period to dead12; +alter table groups rename column support_due_period to dead13; + +drop index groups_unix; +create unique index group_unix_uniq on groups (unix_group_name); diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010313.sql b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010313.sql new file mode 100644 index 0000000000..4bb5d04cb6 --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010313.sql @@ -0,0 +1,143 @@ +-- +-- Enforce unique user names +-- + +create unique index users_namename_uniq on users(user_name); +DROP INDEX user_user; +DROP INDEX idx_users_username; + +-- +-- INSTALL PL/pgSQL +-- +CREATE FUNCTION plpgsql_call_handler () RETURNS OPAQUE AS + '/usr/local/pgsql/lib/plpgsql.so' LANGUAGE 'C'; + +CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql' + HANDLER plpgsql_call_handler + LANCOMPILER 'PL/pgSQL'; + +-- +-- Define a trigger so when you create a new ArtifactType +-- You automatically create a related row over in the counters table +-- +CREATE FUNCTION forumgrouplist_insert_agg () RETURNS OPAQUE AS ' +BEGIN + INSERT INTO forum_agg_msg_count (group_forum_id,count) \ + VALUES (NEW.group_forum_id,0); + RETURN NEW; +END; +' LANGUAGE 'plpgsql'; + +CREATE TRIGGER forumgrouplist_insert_trig AFTER INSERT ON forum_group_list + FOR EACH ROW EXECUTE PROCEDURE forumgrouplist_insert_agg(); + +-- +-- Define a rule so that when new forum messages are submitted, +-- the counters increment +-- +CREATE RULE forum_insert_agg AS + ON INSERT TO forum + DO UPDATE forum_agg_msg_count SET count=count+1 + WHERE group_forum_id=new.group_forum_id; + +CREATE RULE forum_delete_agg AS + ON DELETE TO forum + DO UPDATE forum_agg_msg_count SET count=count-1 + WHERE group_forum_id=old.group_forum_id; + + +-- +-- People want the open counts added to the artifact counts +-- +ALTER TABLE artifact_counts_agg ADD COLUMN open_count int; + +-- +-- Define a trigger so when you create a new ArtifactType +-- You automatically create a related row over in the counters table +-- +CREATE FUNCTION artifactgrouplist_insert_agg () RETURNS OPAQUE AS ' +BEGIN + INSERT INTO artifact_counts_agg (group_artifact_id,count,open_count) \ + VALUES (NEW.group_artifact_id,0,0); + RETURN NEW; +END; +' LANGUAGE 'plpgsql'; + +CREATE TRIGGER artifactgrouplist_insert_trig AFTER INSERT ON artifact_group_list + FOR EACH ROW EXECUTE PROCEDURE artifactgrouplist_insert_agg(); + +-- +-- Define a rule so that when new artifacts are submitted, +-- the counters increment +-- +CREATE RULE artifact_insert_agg AS + ON INSERT TO artifact + DO UPDATE artifact_counts_agg SET count=count+1,open_count=open_count+1 + WHERE group_artifact_id=new.group_artifact_id; + +-- +-- +-- +drop TRIGGER artifactgroup_update_trig ON artifact; +drop function artifactgroup_update_agg(); + +CREATE FUNCTION artifactgroup_update_agg () RETURNS OPAQUE AS ' +BEGIN + -- + -- see if they are moving to a new artifacttype + -- if so, its a more complex operation + -- + IF NEW.group_artifact_id <> OLD.group_artifact_id THEN + -- + -- transferred artifacts always have a status of 1 + -- so we will increment the new artifacttypes sums + -- + UPDATE artifact_counts_agg SET count=count+1, open_count=open_count+1 \ + WHERE group_artifact_id=NEW.group_artifact_id; + + -- + -- now see how to increment/decrement the old types sums + -- + IF NEW.status_id <> OLD.status_id THEN + IF OLD.status_id = 2 THEN + UPDATE artifact_counts_agg SET count=count-1 \ + WHERE group_artifact_id=OLD.group_artifact_id; + -- + -- no need to do anything if it was in deleted status + -- + END IF; + ELSE + -- + -- Was already in open status before + -- + UPDATE artifact_counts_agg SET count=count-1, open_count=open_count-1 \ + WHERE group_artifact_id=OLD.group_artifact_id; + END IF; + ELSE + -- + -- just need to evaluate the status flag and + -- increment/decrement the counter as necessary + -- + IF NEW.status_id <> OLD.status_id THEN + IF new.status_id = 1 THEN + UPDATE artifact_counts_agg SET open_count=open_count+1 \ + WHERE group_artifact_id=new.group_artifact_id; + ELSE + IF new.status_id = 2 THEN + UPDATE artifact_counts_agg SET open_count=open_count-1 \ + WHERE group_artifact_id=new.group_artifact_id; + ELSE + IF new.status_id = 3 THEN + UPDATE artifact_counts_agg SET open_count=open_count-1,count=count-1 \ + WHERE group_artifact_id=new.group_artifact_id; + END IF; + END IF; + END IF; + END IF; + END IF; + RETURN NEW; +END; +' LANGUAGE 'plpgsql'; + +CREATE TRIGGER artifactgroup_update_trig AFTER UPDATE ON artifact + FOR EACH ROW EXECUTE PROCEDURE artifactgroup_update_agg(); diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010317.sql b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010317.sql new file mode 100644 index 0000000000..966176d533 --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010317.sql @@ -0,0 +1,13 @@ +-- by: pfalcon +-- purpose: table to store pending mass mailings + +CREATE TABLE massmail_queue ( +id serial primary key, +type varchar(8) not null, +subject text not null, +message text not null, +queued_date int not null, +last_userid int not null default 0, +failed_date int not null default 0, +finished_date int not null default 0 +); diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010409.sql b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010409.sql new file mode 100644 index 0000000000..cb73cf41cf --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010409.sql @@ -0,0 +1,227 @@ +-- +-- Stats structure and process changes +-- + +drop table stats_project_build_tmp; +drop table tmp_projs_releases_tmp; +begin; delete from stats_project where day is null or week is null; commit; +drop table stats_project_tmp; +drop table topproj_admins; +DROP TABLE frs_dlstats_agg; +DROP TABLE frs_dlstats_filetotal_agg_old; +DROP TABLE stats_agg_pages_by_browser; +DROP TABLE stats_agg_pages_by_day_old; +DROP TABLE stats_agr_filerelease; +DROP TABLE stats_agr_project; +drop table group_cvs_history; +drop table project_counts_tmp; + + +-- +-- Change the date format of stats_agg_site_by_group +-- +-- Populated daily by site_stats.php +-- +CREATE TABLE frs_dlstats_file_agg_tmp AS +SELECT + substring(day::text from 1 for 6)::int AS month, + substring(day::text from 7 for 2)::int AS day, + file_id, + downloads + from frs_dlstats_file_agg; + +DROP TABLE frs_dlstats_file_agg; +ALTER TABLE frs_dlstats_file_agg_tmp RENAME TO frs_dlstats_file_agg; + +CREATE UNIQUE INDEX frsdlfileagg_month_day_file ON frs_dlstats_file_agg(month,day,file_id); + + +drop index httpdl_fid; +drop index httpdl_group_id; +create index statshttpdl_day_fileid ON stats_http_downloads(day,filerelease_id); +drop index ftpdl_fid; +drop index ftpdl_group_id; +create index statsftpdl_day_fileid ON stats_ftp_downloads(day,filerelease_id); + +-- +-- Create an archive table of project_weekly_metric +-- +-- Populated by project_weekly_metric.php +-- +CREATE TABLE stats_project_metric ( +month int not null default 0, +day int not null default 0, +ranking int not null default 0, +precentile float not null default 0, +group_id int not null default 0 +); + +copy stats_project_metric from '/tmp/stats_project_metric.dump'; + +CREATE UNIQUE INDEX statsprojectmetric_month_day_group ON stats_project_metric(month,day,group_id); + + +-- +-- Change the date format of stats_agg_site_by_group +-- +-- Populated daily by site_stats.php +-- +CREATE TABLE stats_agg_site_by_group_tmp AS +SELECT + substring(day::text from 1 for 6)::int AS month, + substring(day::text from 7 for 2)::int AS day, + group_id, + count + from stats_agg_site_by_group ; + +DROP TABLE stats_agg_site_by_group; +ALTER TABLE stats_agg_site_by_group_tmp RENAME TO stats_agg_site_by_group; + +DROP TABLE stats_agg_site_by_day; + +CREATE UNIQUE INDEX statssitebygroup_month_day_group ON stats_agg_site_by_group(month,day,group_id); + + +-- +-- Change the date format of stats_agg_logo_by_group +-- +-- Populated daily by site_stats.php +-- +CREATE TABLE stats_agg_logo_by_group_tmp AS +SELECT + substring(day::text from 1 for 6)::int AS month, + substring(day::text from 7 for 2)::int AS day, + group_id, + count + from stats_agg_logo_by_group ; + +DROP TABLE stats_agg_logo_by_group; +ALTER TABLE stats_agg_logo_by_group_tmp RENAME TO stats_agg_logo_by_group; + +CREATE UNIQUE INDEX statslogobygroup_month_day_group ON stats_agg_logo_by_group(month,day,group_id); + + +-- +-- Subdomain pages +-- +create table stats_subd_pages ( +month INT NOT NULL DEFAULT 0, +day INT NOT NULL DEFAULT 0, +group_id INT NOT NULL DEFAULT 0, +pages INT NOT NULL DEFAULT 0 +); + +-- +-- Migrate data from old stats_project table +-- +INSERT INTO stats_subd_pages +SELECT month,day,group_id,subdomain_views +FROM stats_project WHERE subdomain_views > 0; + +CREATE UNIQUE INDEX statssubdpages_month_day_group ON stats_subd_pages(month,day,group_id); + + +create table stats_cvs_user ( +month INT NOT NULL DEFAULT 0, +day INT NOT NULL DEFAULT 0, +group_id INT NOT NULL DEFAULT 0, +user_id INT NOT NULL DEFAULT 0, +checkouts INT NOT NULL DEFAULT 0, +commits INT NOT NULL DEFAULT 0, +adds INT NOT NULL DEFAULT 0 +); + +create table stats_cvs_group ( +month INT NOT NULL DEFAULT 0, +day INT NOT NULL DEFAULT 0, +group_id INT NOT NULL DEFAULT 0, +checkouts INT NOT NULL DEFAULT 0, +commits INT NOT NULL DEFAULT 0, +adds INT NOT NULL DEFAULT 0 +); + +-- +-- Migrate data from old stats_project table +-- +INSERT INTO stats_cvs_group +SELECT month,day,group_id,cvs_checkouts,cvs_commits,cvs_adds +FROM stats_project +WHERE cvs_checkouts > 0 +OR cvs_commits > 0 +OR cvs_adds > 0; + +CREATE UNIQUE INDEX statscvsgroup_month_day_group ON stats_cvs_group(month,day,group_id); + + +DROP INDEX archive_project_day; +DROP INDEX archive_project_month; +DROP INDEX archive_project_monthday; +DROP INDEX archive_project_week; +DROP INDEX project_log_group; + +-- +-- Populated daily by site_stats.php +-- +create table stats_project_developers ( +month INT NOT NULL DEFAULT 0, +day INT NOT NULL DEFAULT 0, +group_id INT NOT NULL DEFAULT 0, +developers INT NOT NULL DEFAULT 0 +); + +-- +-- Migrate data from old stats_project table +-- +COPY stats_project_developers from '/tmp/stats_project_developers'; +CREATE UNIQUE INDEX statsprojectdev_month_day_group ON stats_project_developers(month,day,group_id); + + +-- +-- Reorg and normalize stats_project as much as feasible +-- +-- Populated daily by site_stats.php +-- +DROP TABLE stats_project; + +create table stats_project ( +month INT NOT NULL DEFAULT 0, +day INT NOT NULL DEFAULT 0, +group_id INT NOT NULL DEFAULT 0, +file_releases INT DEFAULT 0, +msg_posted INT DEFAULT 0, +msg_uniq_auth INT DEFAULT 0, +bugs_opened INT DEFAULT 0, +bugs_closed INT DEFAULT 0, +support_opened INT DEFAULT 0, +support_closed INT DEFAULT 0, +patches_opened INT DEFAULT 0, +patches_closed INT DEFAULT 0, +artifacts_opened INT DEFAULT 0, +artifacts_closed INT DEFAULT 0, +tasks_opened INT DEFAULT 0, +tasks_closed INT DEFAULT 0, +help_requests INT DEFAULT 0 +); + +copy stats_project from '/tmp/stats_project.dump'; + +CREATE UNIQUE INDEX statsproject_month_day_group ON stats_project(month,day,group_id); + + +-- +-- Reorg and normalize the stats_site table +-- +-- Populated daily by site_stats.php +-- +create table stats_site_tmp AS +select month,day,uniq_users,sessions,total_users,new_users,new_projects +from stats_site; + +DROP TABLE stats_site; +ALTER TABLE stats_site_tmp RENAME TO stats_site; + +CREATE UNIQUE INDEX statssite_month_day on stats_site(month,day); + +grant all on stats_cvs_group to stats; +grant all on stats_project to stats; +grant all on stats_subd_pages to stats; diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010412.sql b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010412.sql new file mode 100644 index 0000000000..b4c38e2697 --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010412.sql @@ -0,0 +1,5 @@ +-- by: pfalcon +-- purpose: add logo image support for any group + +ALTER TABLE groups ADD COLUMN logo_image_id int NOT NULL DEFAULT 100; + diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010507.sql b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010507.sql new file mode 100644 index 0000000000..90776d7974 --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010507.sql @@ -0,0 +1,5 @@ +-- by: pfalcon +-- purpose: add field to allow ratings opt-out + +ALTER TABLE users ADD COLUMN block_ratings int NOT NULL DEFAULT 0; + diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010509.sql b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010509.sql new file mode 100644 index 0000000000..4db7eac71b --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010509.sql @@ -0,0 +1,61 @@ +-- by: pfalcon +-- purpose: Referential integrity constraints for FRS schema + +BEGIN; + +INSERT INTO frs_filetype VALUES (100,'None'); +INSERT INTO frs_processor VALUES (100,'None'); + +-- if file is not attched to a release, it can't be seen anyway +DELETE FROM frs_file +WHERE NOT EXISTS( + SELECT release_id + FROM frs_release + WHERE frs_file.release_id=frs_release.release_id +) +; + +UPDATE frs_file +SET type_id=100 +WHERE NOT EXISTS( + SELECT type_id + FROM frs_filetype + WHERE frs_file.type_id=frs_filetype.type_id +) +; + +UPDATE frs_file +SET processor_id=100 +WHERE NOT EXISTS( + SELECT processor_id + FROM frs_processor + WHERE frs_file.processor_id=frs_processor.processor_id +) +; + +COMMIT; + +ALTER TABLE frs_file ADD CONSTRAINT frsfile_releaseid_fk + FOREIGN KEY (release_id) REFERENCES frs_release(release_id) MATCH FULL; +ALTER TABLE frs_file ADD CONSTRAINT frsfile_typeid_fk + FOREIGN KEY (type_id) REFERENCES frs_filetype(type_id) MATCH FULL; +ALTER TABLE frs_file ADD CONSTRAINT frsfile_processorid_fk + FOREIGN KEY (processor_id) REFERENCES frs_processor(processor_id) MATCH FULL; + +ALTER TABLE frs_package ADD CONSTRAINT frspackage_groupid_fk + FOREIGN KEY (group_id) REFERENCES groups(group_id) MATCH FULL; +ALTER TABLE frs_package ADD CONSTRAINT frspackage_statusid_fk + FOREIGN KEY (status_id) REFERENCES frs_status(status_id) MATCH FULL; + +ALTER TABLE frs_release ADD CONSTRAINT frsrelease_packageid_fk + FOREIGN KEY (package_id) REFERENCES frs_package(package_id) MATCH FULL; +ALTER TABLE frs_release ADD CONSTRAINT frsrelease_statusid_fk + FOREIGN KEY (status_id) REFERENCES frs_status(status_id) MATCH FULL; +ALTER TABLE frs_release ADD CONSTRAINT frsrelease_releasedby_fk + FOREIGN KEY (released_by) REFERENCES users(user_id) MATCH FULL; + +-- Tracker 'Pending' patch sql changes +-- by: zelphyr +ALTER TABLE artifact_group_list ADD COLUMN status_timeout integer; +UPDATE artifact_group_list SET status_timeout='1209600' WHERE status_timeout=NULL; +INSERT INTO artifact_status VALUES('4','Pending'); diff --git a/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010511.sql b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010511.sql new file mode 100644 index 0000000000..b1a4193394 --- /dev/null +++ b/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010511.sql @@ -0,0 +1,12 @@ +-- by: pfalcon +-- purpose: table with history of users' rating, for tracking changes/graphing + +CREATE TABLE user_metric_history( +month int not null, +day int not null, +user_id int not null, +ranking int not null, +metric float not null); + +CREATE UNIQUE INDEX user_metric_history_date_userid +ON user_metric_history(month,day,user_id); diff --git a/gforge/db/dbusers.sql b/gforge/db/dbusers.sql new file mode 100644 index 0000000000..4728e83ff8 --- /dev/null +++ b/gforge/db/dbusers.sql @@ -0,0 +1,32 @@ +-- +-- SourceForge: Breaking Down the Barriers to Open Source Development +-- Copyright 1999-2001 (c) VA Linux Systems +-- http://sourceforge.net +-- +-- $Id: dbusers.sql,v 1.3 2001/06/19 16:50:06 jbyers Exp $ +-- + +CREATE USER backend WITH PASSWORD 'xxxxx' NOCREATEDB NOCREATEUSER; + +GRANT SELECT ON prweb_vhost,users,mail_group_list TO backend; +GRANT SELECT,UPDATE ON prdb_dbs TO backend; + + +CREATE USER stats WITH PASSWORD 'xxxxx' NOCREATEDB NOCREATEUSER; + +GRANT SELECT ON +groups, +frs_file, +frs_package, +frs_release +TO stats; + +GRANT ALL ON +frs_dlstats_file_agg, +stats_ftp_downloads, +stats_http_downloads, +stats_cvs_group, +stats_subd_pages +TO stats; + +grant all on _rserv_log_ to stats; diff --git a/gforge/db/languages.tab b/gforge/db/languages.tab new file mode 100644 index 0000000000..53a4ea0a83 --- /dev/null +++ b/gforge/db/languages.tab @@ -0,0 +1,23 @@ +1 English English.class English en +2 Japanese Japanese.class Japanese ja +3 Hebrew Hebrew.class Hebrew iw +4 Spanish Spanish.class Spanish es +5 Thai Thai.class Thai th +6 German German.class German de +7 French French.class French fr +8 Italian Italian.class Italian it +9 Norwegian Norwegian.class Norwegian no +10 Swedish Swedish.class Swedish sv +12 Dutch Dutch.class Dutch nl +13 Esperanto Esperanto.class Esperanto eo +14 Catalan Catalan.class Catalan ca +15 Polish Polish.class Polish pl +11 Trad.Chinese Chinese.class Chinese zh +17 Russian Russian.class Russian ru +18 Portuguese Portuguese.class Portuguese pt +19 Greek Greek.class Greek el +20 Bulgarian Bulgarian.class Bulgarian bg +21 Indonesian Indonesian.class Indonesian id +16 Pt. Brazillian PortugueseBrazillian.class PortugueseBrazillian pt +22 Korean Korean.class Korean ko +23 Smpl.Chinese SimplifiedChinese.class SimplifiedChinese zn diff --git a/gforge/db/oci8port/pssonline/DefaultValues.sql b/gforge/db/oci8port/pssonline/DefaultValues.sql new file mode 100644 index 0000000000..d771b787cd --- /dev/null +++ b/gforge/db/oci8port/pssonline/DefaultValues.sql @@ -0,0 +1,195 @@ +-- +-- SourceForge: Breaking Down the Barriers to Open Source Development +-- Copyright 1999-2000 (c) The SourceForge Crew +-- http://sourceforge.net +-- +-- The values in this file must be inserted in order +-- and must be complete or you will have referential integrity problems +-- + +-- +-- Default Data for 'groups' +-- +INSERT INTO groups (group_id) VALUES (1); + +-- +-- Default Data for 'users' +-- +INSERT INTO users (user_id, user_name, email, user_pw) +VALUES (100,'None','noreply','*********34343'); + +-- +-- Default data for table 'bug_resolution' +-- +INSERT INTO bug_resolution (resolution_id, resolution_name) VALUES (1,'Fixed'); +INSERT INTO bug_resolution (resolution_id, resolution_name) VALUES (2,'Invalid'); +INSERT INTO bug_resolution (resolution_id, resolution_name) VALUES (3,'Wont Fix'); +INSERT INTO bug_resolution (resolution_id, resolution_name) VALUES (4,'Later'); +INSERT INTO bug_resolution (resolution_id, resolution_name) VALUES (5,'Remind'); +INSERT INTO bug_resolution (resolution_id, resolution_name) VALUES (6,'Works For Me'); +INSERT INTO bug_resolution (resolution_id, resolution_name) VALUES (100,'None'); +INSERT INTO bug_resolution (resolution_id, resolution_name) VALUES (101,'Duplicate'); + +-- +-- Default data for table 'bug_status' +-- +INSERT INTO bug_status (status_id, status_name) VALUES (1,'Open'); +INSERT INTO bug_status (status_id, status_name) VALUES (3,'Closed'); +INSERT INTO bug_status (status_id, status_name) VALUES (100,'None'); + +-- +-- Default data for bug_category +-- +INSERT INTO bug_category (bug_category_id, group_id, category_name) VALUES (100,1,'None'); + +-- +-- Default data for bug_group +-- +INSERT INTO bug_group (bug_group_id, group_id, group_name) VALUES (100,1,'None'); + +-- +-- Default data for bug - required for dependent tasks/bugs +-- +INSERT INTO bug (bug_id,group_id,status_id,category_id,bug_group_id,submitted_by,assigned_to,resolution_id) + VALUES (100,1,100,100,100,100,100,100); +--NOTE - if using sequences, you may have to update the bug_id sequence here + +-- +-- Default data for table 'patch_category' +-- +INSERT INTO patch_category (patch_category_id, group_id, category_name) VALUES (100,1,'None'); + +-- +-- Default data for table 'patch_status' +-- +INSERT INTO patch_status (patch_status_id, status_name) VALUES (1,'Open'); +INSERT INTO patch_status (patch_status_id, status_name) VALUES (2,'Closed'); +INSERT INTO patch_status (patch_status_id, status_name) VALUES (3,'Deleted'); +INSERT INTO patch_status (patch_status_id, status_name) VALUES (4,'Postponed'); +INSERT INTO patch_status (patch_status_id, status_name) VALUES (100,'None'); + +-- +-- Default values for patch +-- +INSERT INTO patch (group_id,patch_status_id,patch_category_id,submitted_by,assigned_to) + VALUES (1,100,100,100,100); + +-- +-- Default data for table 'project_status' +-- +INSERT INTO project_status (status_id, status_name) VALUES (1,'Open'); +INSERT INTO project_status (status_id, status_name) VALUES (2,'Closed'); +INSERT INTO project_status (status_id, status_name) VALUES (100,'None'); +INSERT INTO project_status (status_id, status_name) VALUES (3,'Deleted'); + +-- +-- Default data for project_group_list +-- +INSERT INTO project_group_list (group_project_id,group_id) VALUES (1,1); +--NOTE - if using sequences, you may have to update the group_project_id sequence here + +-- +-- Default data for project_task +-- +INSERT INTO project_task (group_project_id,created_by,status_id) + VALUES (1,100,100); + +-- +-- Default Data for 'survey_question_types' +-- +INSERT INTO survey_question_types (id, type) VALUES (1,'Radio Buttons 1-5'); +INSERT INTO survey_question_types (id, type) VALUES (2,'Text Area'); +INSERT INTO survey_question_types (id, type) VALUES (3,'Radio Buttons Yes/No'); +INSERT INTO survey_question_types (id, type) VALUES (4,'Comment Only'); +INSERT INTO survey_question_types (id, type) VALUES (5,'Text Field'); +INSERT INTO survey_question_types (id, type) VALUES (100,'None'); + +-- +-- Default data for Support System +-- +insert into support_status values('1','Open'); +insert into support_status values('2','Closed'); +insert into support_status values('3','Deleted'); + +-- +-- Default data for 'support_category' +-- +insert into support_category VALUES ('100','1','None'); + +-- +-- Default data for Help Wanted System +-- +INSERT INTO people_skill_year VALUES ('','< 6 Months'); +INSERT INTO people_skill_year VALUES ('','6 Mo - 2 yr'); +INSERT INTO people_skill_year VALUES ('','2 yr - 5 yr'); +INSERT INTO people_skill_year VALUES ('','5 yr - 10 yr'); +INSERT INTO people_skill_year VALUES ('','> 10 years'); + +INSERT INTO people_skill_level VALUES ('','Want to Learn'); +INSERT INTO people_skill_level VALUES ('','Competent'); +INSERT INTO people_skill_level VALUES ('','Wizard'); +INSERT INTO people_skill_level VALUES ('','Wrote The Book'); +INSERT INTO people_skill_level VALUES ('','Wrote It'); + +INSERT INTO people_job_category (category_id,name) VALUES ('','Developer'); +INSERT INTO people_job_category (category_id,name) VALUES ('','Project Manager'); +INSERT INTO people_job_category (category_id,name) VALUES ('','Unix Admin'); +INSERT INTO people_job_category (category_id,name) VALUES ('','Doc Writer'); +INSERT INTO people_job_category (category_id,name) VALUES ('','Tester'); +INSERT INTO people_job_category (category_id,name) VALUES ('','Support Manager'); +INSERT INTO people_job_category (category_id,name) VALUES ('','Graphic/Other Designer'); + +INSERT INTO people_job_status VALUES ('1','Open'); +INSERT INTO people_job_status VALUES ('2','Filled'); +INSERT INTO people_job_status VALUES ('3','Deleted'); + +-- +-- Default data for group_type +-- +INSERT INTO group_type VALUES ('1','Project'); +INSERT INTO group_type VALUES ('2','Foundry'); + +-- +-- Default data for new filerelease system +-- +INSERT INTO frs_filetype VALUES ('1000','.deb'); +INSERT INTO frs_filetype VALUES ('2000','.rpm'); +INSERT INTO frs_filetype VALUES ('3000','.zip'); +INSERT INTO frs_filetype VALUES ('','.bz2'); +INSERT INTO frs_filetype VALUES ('','.gz'); +INSERT INTO frs_filetype VALUES ('5000','Source .zip'); +INSERT INTO frs_filetype VALUES ('','Source .bz2'); +INSERT INTO frs_filetype VALUES ('','Source .gz'); +INSERT INTO frs_filetype VALUES ('5100','Source .rpm'); +INSERT INTO frs_filetype VALUES ('5900','Other Source File'); +INSERT INTO frs_filetype VALUES ('8000','.jpg'); +INSERT INTO frs_filetype VALUES ('','text'); +INSERT INTO frs_filetype VALUES ('','html'); +INSERT INTO frs_filetype VALUES ('','pdf'); +INSERT INTO frs_filetype VALUES ('9999','Other'); + +INSERT INTO frs_status VALUES ('1','Active'); +INSERT INTO frs_status VALUES ('3','Hidden'); + +INSERT INTO frs_processor VALUES ('1000','i386'); +INSERT INTO frs_processor VALUES ('6000','IA64'); +INSERT INTO frs_processor VALUES ('7000','Alpha'); +INSERT INTO frs_processor VALUES ('8000','Any'); +INSERT INTO frs_processor VALUES ('2000','PPC'); +INSERT INTO frs_processor VALUES ('3000','MIPS'); +INSERT INTO frs_processor VALUES ('4000','Sparc'); +INSERT INTO frs_processor VALUES ('5000','UltraSparc'); +INSERT INTO frs_processor VALUES ('9999','Other'); + +-- +-- Default data for themes +-- +INSERT INTO themes VALUES (1,'forged','Forged Metal'); +INSERT INTO themes VALUES (2,'classic','Classic SourceForge'); + +-- +-- Default data for user_group +-- +INSERT INTO user_group (user_id, group_id, admin_flags) VALUES (101,1,'A'); + + diff --git a/gforge/db/oci8port/pssonline/Languages.sql b/gforge/db/oci8port/pssonline/Languages.sql new file mode 100644 index 0000000000..3652992198 --- /dev/null +++ b/gforge/db/oci8port/pssonline/Languages.sql @@ -0,0 +1,42 @@ +INSERT INTO supported_languages +VALUES (1,'English','English.class','English','en'); +INSERT INTO supported_languages +VALUES (2,'Japanese','Japanese.class','Japanese','ja'); +INSERT INTO supported_languages +VALUES (3,'Hebrew','Hebrew.class','Hebrew','iw'); +INSERT INTO supported_languages +VALUES (4,'Spanish','Spanish.class','Spanish','es'); +INSERT INTO supported_languages +VALUES (5,'Thai','Thai.class','Thai','th'); +INSERT INTO supported_languages +VALUES (6,'German','German.class','German','de'); +INSERT INTO supported_languages +VALUES (7,'French','French.class','French','fr'); +INSERT INTO supported_languages +VALUES (8,'Italian','Italian.class','Italian','it'); +INSERT INTO supported_languages +VALUES (9,'Norwegian','Norwegian.class','Norwegian','no'); +INSERT INTO supported_languages +VALUES (10,'Swedish','Swedish.class','Swedish','sv'); +INSERT INTO supported_languages +VALUES (11,'Chinese','Chinese.class','Chinese','zh'); +INSERT INTO supported_languages +VALUES (12,'Dutch','Dutch.class','Dutch','nl'); +INSERT INTO supported_languages +VALUES (13,'Esperanto','Esperanto.class','Esperanto','eo'); +INSERT INTO supported_languages +VALUES (14,'Catalan','Catalan.class','Catalan','ca'); +INSERT INTO supported_languages +VALUES (15,'Polish','Polish.class','Polish','pl'); +INSERT INTO supported_languages +VALUES (16,'Portuguese (Brazillian)','PortugueseBrazillian.class','PortugueseBrazillian','pt'); +INSERT INTO supported_languages +VALUES (17,'Russian','Russian.class','Russian','ru'); +INSERT INTO supported_languages +VALUES (18,'Portuguese','Portuguese.class','Portuguese','pt'); +INSERT INTO supported_languages +VALUES (19,'Greek','Greek.class','Greek','el'); +INSERT INTO supported_languages +VALUES (20,'Bulgarian','Bulgarian.class','Bulgarian','bg'); +INSERT INTO supported_languages +VALUES (21,'Indonesian','Indonesian.class','Indonesian','id'); diff --git a/gforge/db/oci8port/pssonline/SourceForge.sql b/gforge/db/oci8port/pssonline/SourceForge.sql new file mode 100644 index 0000000000..c6ba3af435 --- /dev/null +++ b/gforge/db/oci8port/pssonline/SourceForge.sql @@ -0,0 +1,6141 @@ +-- ORACLE SCRIPT +-- Changes were renaming the "session" table to sf_session +-- renaming "date" columns to sf_date +-- commenting out the create trigger constraints +-- commenting out the select setval statements + +-- +-- Selected TOC Entries: +-- +--\connect - tperdue +-- +-- TOC Entry ID 2 (OID 18138427) +-- +-- Name: bug_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE bug_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 182 (OID 18138445) +-- +-- Name: bug Type: TABLE +-- + +CREATE TABLE bug ( + bug_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + status_id integer DEFAULT '0' NOT NULL, + priority integer DEFAULT '0' NOT NULL, + category_id integer DEFAULT '0' NOT NULL, + submitted_by integer DEFAULT '0' NOT NULL, + assigned_to integer DEFAULT '0' NOT NULL, + sf_date integer DEFAULT '0' NOT NULL, + summary varchar2(255), + details varchar2(255), + close_date integer, + bug_group_id integer DEFAULT '0' NOT NULL, + resolution_id integer DEFAULT '0' NOT NULL, + PRIMARY KEY (bug_id) +); + +CREATE TRIGGER DEFAULT_BUG_ID BEFORE + INSERT + ON bug REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select bug_pk_seq.nextval into :new.bug_id from dual; +END; +/ + +-- +-- TOC Entry ID 4 (OID 18138495) +-- +-- Name: bug_bug_dependencies_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE bug_bug_dependencies_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 183 (OID 18138513) +-- +-- Name: bug_bug_dependencies Type: TABLE +-- + +CREATE TABLE bug_bug_dependencies ( + bug_depend_id integer DEFAULT '0' NOT NULL, + bug_id integer DEFAULT '0' NOT NULL, + is_dependent_on_bug_id integer DEFAULT '0' NOT NULL, + PRIMARY KEY (bug_depend_id) +); + +CREATE TRIGGER DEFAULT_BUG_DEPEND_ID BEFORE + INSERT + ON bug_bug_dependencies REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select bug_bug_dependencies_pk_seq.nextval into :new.bug_depend_id from dual; +END; +/ + +-- +-- TOC Entry ID 6 (OID 18138531) +-- +-- Name: bug_canned_responses_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE bug_canned_responses_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 184 (OID 18138549) +-- +-- Name: bug_canned_responses Type: TABLE +-- + +CREATE TABLE bug_canned_responses ( + bug_canned_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + title varchar2(255), + body varchar2(255), + PRIMARY KEY (bug_canned_id) +); + +CREATE TRIGGER DEFAULT_BUG_CANNED_ID BEFORE + INSERT + ON bug_canned_responses REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select bug_canned_responses_pk_seq.nextval into :new.bug_canned_id from dual; +END; +/ + +-- +-- TOC Entry ID 8 (OID 18138582) +-- +-- Name: bug_category_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE bug_category_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 185 (OID 18138600) +-- +-- Name: bug_category Type: TABLE +-- + +CREATE TABLE bug_category ( + bug_category_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + category_name varchar2(255), + PRIMARY KEY (bug_category_id) +); + +CREATE TRIGGER DEFAULT_BUG_CATEGORY_ID BEFORE + INSERT + ON bug_category REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select bug_category_pk_seq.nextval into :new.bug_category_id from dual; +END; +/ + +-- +-- TOC Entry ID 10 (OID 18138632) +-- +-- Name: bug_filter_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE bug_filter_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 186 (OID 18138650) +-- +-- Name: bug_filter Type: TABLE +-- + +CREATE TABLE bug_filter ( + filter_id integer DEFAULT '0' NOT NULL, + user_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + sql_clause varchar2(255) DEFAULT '', + is_active integer DEFAULT '0' NOT NULL, + PRIMARY KEY (filter_id) +); + +CREATE TRIGGER DEFAULT_BUG_FILTER_ID BEFORE + INSERT + ON bug_filter REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select bug_filter_pk_seq.nextval into :new.filter_id from dual; +END; +/ + +-- +-- TOC Entry ID 12 (OID 18138687) +-- +-- Name: bug_group_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE bug_group_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 187 (OID 18138705) +-- +-- Name: bug_group Type: TABLE +-- + +CREATE TABLE bug_group ( + bug_group_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + group_name varchar2(255) DEFAULT '', + PRIMARY KEY (bug_group_id) +); + +CREATE TRIGGER DEFAULT_BUG_GROUP_ID BEFORE + INSERT + ON bug_group REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select bug_group_pk_seq.nextval into :new.bug_group_id from dual; +END; +/ + +-- +-- TOC Entry ID 14 (OID 18138738) +-- +-- Name: bug_history_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE bug_history_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 188 (OID 18138756) +-- +-- Name: bug_history Type: TABLE +-- + +CREATE TABLE bug_history ( + bug_history_id integer DEFAULT '0' NOT NULL, + bug_id integer DEFAULT '0' NOT NULL, + field_name varchar2(255) DEFAULT '', + old_value varchar2(255) DEFAULT '', + mod_by integer DEFAULT '0' NOT NULL, + sf_date integer, + PRIMARY KEY (bug_history_id) +); + +--nextval('bug_history_pk_seq'::text) +CREATE TRIGGER DEFAULT_BUG_HISTORY_ID BEFORE + INSERT + ON bug_history REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select bug_history_pk_seq.nextval into :new.bug_history_id from dual; +END; +/ + +-- +-- TOC Entry ID 16 (OID 18138794) +-- +-- Name: bug_resolution_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE bug_resolution_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 189 (OID 18138812) +-- +-- Name: bug_resolution Type: TABLE +-- + +CREATE TABLE bug_resolution ( + resolution_id integer DEFAULT '0' NOT NULL, + resolution_name varchar2(255) DEFAULT '', + PRIMARY KEY (resolution_id) +); + +--nextval('bug_resolution_pk_seq'::text) +CREATE TRIGGER DEFAULT_BUG_RESOLUTION_ID BEFORE + INSERT + ON bug_resolution REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select bug_resolution_pk_seq.nextval into :new.resolution_id from dual; +END; +/ + +-- +-- TOC Entry ID 18 (OID 18138843) +-- +-- Name: bug_status_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE bug_status_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 190 (OID 18138861) +-- +-- Name: bug_status Type: TABLE +-- + +CREATE TABLE bug_status ( + status_id integer DEFAULT '0' NOT NULL, + status_name varchar2(255), + PRIMARY KEY (status_id) +); + +--nextval('bug_status_pk_seq'::text) +CREATE TRIGGER DEFAULT_BUG_STATUS_ID BEFORE + INSERT + ON bug_status REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select bug_status_pk_seq.nextval into :new.status_id from dual; +END; +/ + +-- +-- TOC Entry ID 20 (OID 18138891) +-- +-- Name: bug_task_dependencies_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE bug_task_dependencies_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 191 (OID 18138909) +-- +-- Name: bug_task_dependencies Type: TABLE +-- + +CREATE TABLE bug_task_dependencies ( + bug_depend_id integer DEFAULT '0' NOT NULL, + bug_id integer DEFAULT '0' NOT NULL, + is_dependent_on_task_id integer DEFAULT '0' NOT NULL, + PRIMARY KEY (bug_depend_id) +); + +--nextval('bug_task_dependencies_pk_seq'::text) +CREATE TRIGGER DEFAULT_BUG_TASK_ID BEFORE + INSERT + ON bug_task_dependencies REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select bug_task_dependencies_pk_seq.nextval into :new.bug_depend_id from dual; +END; +/ + +-- +-- TOC Entry ID 22 (OID 18138927) +-- +-- Name: canned_responses_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE canned_responses_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 192 (OID 18138946) +-- +-- Name: canned_responses Type: TABLE +-- + +CREATE TABLE canned_responses ( + response_id integer DEFAULT '0' NOT NULL, + response_title character varying(25), + response_text varchar2(255), + PRIMARY KEY (response_id) +); + +--nextval('canned_responses_pk_seq'::text) +CREATE TRIGGER DEFAULT_CANNED_RESPONSE_ID BEFORE + INSERT + ON canned_responses REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select canned_responses_pk_seq.nextval into :new.response_id from dual; +END; +/ + +-- +-- TOC Entry ID 24 (OID 18138977) +-- +-- Name: db_images_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE db_images_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 193 (OID 18138995) +-- +-- Name: db_images Type: TABLE +-- + +CREATE TABLE db_images ( + id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + description varchar2(255) DEFAULT '', + bin_data varchar2(255) DEFAULT '', + filename varchar2(255) DEFAULT '', + filesize integer DEFAULT '0' NOT NULL, + filetype varchar2(255) DEFAULT '', + width integer DEFAULT '0' NOT NULL, + height integer DEFAULT '0' NOT NULL, + PRIMARY KEY (id) +); + +--nextval('db_images_pk_seq'::text) +CREATE TRIGGER DEFAULT_DB_IMAGES_ID BEFORE + INSERT + ON db_images REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select db_images_pk_seq.nextval into :new.id from dual; +END; +/ + +-- +-- TOC Entry ID 26 (OID 18139040) +-- +-- Name: doc_data_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE doc_data_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 194 (OID 18139058) +-- +-- Name: doc_data Type: TABLE +-- + +CREATE TABLE doc_data ( + docid integer DEFAULT '0' NOT NULL, + stateid integer DEFAULT '0' NOT NULL, + title character varying(255) DEFAULT '', + data varchar2(255) DEFAULT '', + updatedate integer DEFAULT '0' NOT NULL, + createdate integer DEFAULT '0' NOT NULL, + created_by integer DEFAULT '0' NOT NULL, + doc_group integer DEFAULT '0' NOT NULL, + description varchar2(255), + language_id integer DEFAULT '1' NOT NULL, + PRIMARY KEY (docid) +); + +--nextval('doc_data_pk_seq'::text) +CREATE TRIGGER DEFAULT_DOC_DATA_ID BEFORE + INSERT + ON doc_data REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select doc_data_pk_seq.nextval into :new.docid from dual; +END; +/ + +-- +-- TOC Entry ID 28 (OID 18139104) +-- +-- Name: doc_groups_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE doc_groups_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 195 (OID 18139122) +-- +-- Name: doc_groups Type: TABLE +-- + +CREATE TABLE doc_groups ( + doc_group integer DEFAULT '0' NOT NULL, + groupname character varying(255) DEFAULT '', + group_id integer DEFAULT '0' NOT NULL, + PRIMARY KEY (doc_group) +); + +--nextval('doc_groups_pk_seq'::text) +CREATE TRIGGER DEFAULT_DOC_GROUP BEFORE + INSERT + ON doc_groups REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select doc_groups_pk_seq.nextval into :new.doc_group from dual; +END; +/ + +-- +-- TOC Entry ID 30 (OID 18139140) +-- +-- Name: doc_states_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE doc_states_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 196 (OID 18139158) +-- +-- Name: doc_states Type: TABLE +-- + +CREATE TABLE doc_states ( + stateid integer DEFAULT '0' NOT NULL, + name character varying(255) DEFAULT '', + PRIMARY KEY (stateid) +); + +--nextval('doc_states_pk_seq'::text) +CREATE TRIGGER DEFAULT_DOC_STATES_ID BEFORE + INSERT + ON doc_states REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select doc_states_pk_seq.nextval into :new.stateid from dual; +END; +/ + +-- +-- TOC Entry ID 32 (OID 18139174) +-- +-- Name: filemodule_monitor_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE filemodule_monitor_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 197 (OID 18139192) +-- +-- Name: filemodule_monitor Type: TABLE +-- + +CREATE TABLE filemodule_monitor ( + id integer DEFAULT '0' NOT NULL, + filemodule_id integer DEFAULT '0' NOT NULL, + user_id integer DEFAULT '0' NOT NULL, + PRIMARY KEY (id) +); + +--nextval('filemodule_monitor_pk_seq'::text) +CREATE TRIGGER DEFAULT_FILEMODULE_MONITOR_ID BEFORE + INSERT + ON filemodule_monitor REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select filemodule_monitor_pk_seq.nextval into :new.id from dual; +END; +/ + +-- +-- TOC Entry ID 34 (OID 18139210) +-- +-- Name: forum_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE forum_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 198 (OID 18139228) +-- +-- Name: forum Type: TABLE +-- + +CREATE TABLE forum ( + msg_id integer DEFAULT '0' NOT NULL, + group_forum_id integer DEFAULT '0' NOT NULL, + posted_by integer DEFAULT '0' NOT NULL, + subject varchar2(255) DEFAULT '', + body varchar2(255) DEFAULT '', + sf_date integer DEFAULT '0' NOT NULL, + is_followup_to integer DEFAULT '0' NOT NULL, + thread_id integer DEFAULT '0' NOT NULL, + has_followups integer DEFAULT '0', + most_recent_date integer DEFAULT '0' NOT NULL, + PRIMARY KEY (msg_id) +); + +--nextval('forum_pk_seq'::text) +CREATE TRIGGER DEFAULT_FORUM_MSG_ID BEFORE + INSERT + ON forum REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select forum_pk_seq.nextval into :new.msg_id from dual; +END; +/ + + +-- +-- TOC Entry ID 199 (OID 18139275) +-- +-- Name: forum_agg_msg_count Type: TABLE +-- + +CREATE TABLE forum_agg_msg_count ( + group_forum_id integer DEFAULT '0' NOT NULL, + count integer DEFAULT '0' NOT NULL, + PRIMARY KEY (group_forum_id) +); + +-- +-- TOC Entry ID 36 (OID 18139291) +-- +-- Name: forum_group_list_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE forum_group_list_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 200 (OID 18139309) +-- +-- Name: forum_group_list Type: TABLE +-- + +CREATE TABLE forum_group_list ( + group_forum_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + forum_name varchar2(255) DEFAULT '', + is_public integer DEFAULT '0' NOT NULL, + description varchar2(255), + allow_anonymous integer DEFAULT '0' NOT NULL, + send_all_posts_to varchar2(255), + PRIMARY KEY (group_forum_id) +); + +--nextval('forum_group_list_pk_seq'::text) +CREATE TRIGGER DEFAULT_FORUM_GROUP_ID BEFORE + INSERT + ON forum_group_list REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select forum_group_list_pk_seq.nextval into :new.group_forum_id from dual; +END; +/ + +-- +-- TOC Entry ID 38 (OID 18139348) +-- +-- Name: forum_monitored_forums_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE forum_monitored_forums_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 201 (OID 18139366) +-- +-- Name: forum_monitored_forums Type: TABLE +-- + +CREATE TABLE forum_monitored_forums ( + monitor_id integer DEFAULT '0' NOT NULL, + forum_id integer DEFAULT '0' NOT NULL, + user_id integer DEFAULT '0' NOT NULL, + PRIMARY KEY (monitor_id) +); + +--nextval('forum_monitored_forums_pk_seq'::text) +CREATE TRIGGER DEFAULT_FORUM_MON_FORUMS_ID BEFORE + INSERT + ON forum_monitored_forums REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select forum_monitored_forums_pk_seq.nextval into :new.monitor_id from dual; +END; +/ + +-- +-- TOC Entry ID 40 (OID 18139384) +-- +-- Name: forum_saved_place_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE forum_saved_place_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 202 (OID 18139402) +-- +-- Name: forum_saved_place Type: TABLE +-- + +CREATE TABLE forum_saved_place ( + saved_place_id integer DEFAULT '0' NOT NULL, + user_id integer DEFAULT '0' NOT NULL, + forum_id integer DEFAULT '0' NOT NULL, + save_date integer DEFAULT '0' NOT NULL, + PRIMARY KEY (saved_place_id) +); + +--nextval('forum_saved_place_pk_seq'::text) +CREATE TRIGGER DEFAULT_FORUM_SAVED_PLACES_ID BEFORE + INSERT + ON forum_saved_place REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select forum_saved_place_pk_seq.nextval into :new.saved_place_id from dual; +END; +/ + +-- +-- TOC Entry ID 203 (OID 18139454) +-- +-- Name: foundry_data Type: TABLE +-- + +CREATE TABLE foundry_data ( + foundry_id integer DEFAULT '0' NOT NULL, + freeform1_html varchar2(255), + freeform2_html varchar2(255), + sponsor1_html varchar2(255), + sponsor2_html varchar2(255), + guide_image_id integer DEFAULT '0' NOT NULL, + logo_image_id integer DEFAULT '0' NOT NULL, + trove_categories varchar2(255), + PRIMARY KEY (foundry_id) +); + +-- +-- TOC Entry ID 42 (OID 18139492) +-- +-- Name: foundry_news_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE foundry_news_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 204 (OID 18139510) +-- +-- Name: foundry_news Type: TABLE +-- + +CREATE TABLE foundry_news ( + foundry_news_id integer DEFAULT '0' NOT NULL, + foundry_id integer DEFAULT '0' NOT NULL, + news_id integer DEFAULT '0' NOT NULL, + approve_date integer DEFAULT '0' NOT NULL, + is_approved integer DEFAULT '0' NOT NULL, + PRIMARY KEY (foundry_news_id) +); + +--nextval('foundry_news_pk_seq'::text) +CREATE TRIGGER DEFAULT_FOUNDRY_NEWS_ID BEFORE + INSERT + ON foundry_news REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select foundry_news_pk_seq.nextval into :new.foundry_news_id from dual; +END; +/ + +-- +-- TOC Entry ID 44 (OID 18139532) +-- +-- Name: foundry_preferred_projec_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE foundry_preferred_proj_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 205 (OID 18139550) +-- +-- Name: foundry_preferred_projects Type: TABLE +-- + +CREATE TABLE foundry_preferred_projects ( + foundry_project_id integer DEFAULT '0' NOT NULL, + foundry_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + rank integer DEFAULT '0' NOT NULL, + PRIMARY KEY (foundry_project_id) +); + +--nextval('foundry_preferred_projec_pk_seq'::text) +CREATE TRIGGER DEFAULT_FOUNDRY_PREF_PROJS_ID BEFORE + INSERT + ON foundry_preferred_projects REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select foundry_preferred_proj_pk_seq.nextval into :new.foundry_project_id from dual; +END; +/ + +-- +-- TOC Entry ID 46 (OID 18139570) +-- +-- Name: foundry_projects_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE foundry_projects_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 206 (OID 18139588) +-- +-- Name: foundry_projects Type: TABLE +-- + +CREATE TABLE foundry_projects ( + id integer DEFAULT '0' NOT NULL, + foundry_id integer DEFAULT '0' NOT NULL, + project_id integer DEFAULT '0' NOT NULL, + PRIMARY KEY (id) +); + +--nextval('foundry_projects_pk_seq'::text) +CREATE TRIGGER DEFAULT_FOUNDRY_PROJS_ID BEFORE + INSERT + ON foundry_projects REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select foundry_projects_pk_seq.nextval into :new.id from dual; +END; +/ + +-- +-- TOC Entry ID 207 (OID 18139606) +-- +-- Name: frs_dlstats_agg Type: TABLE +-- + +CREATE TABLE frs_dlstats_agg ( + file_id integer DEFAULT '0' NOT NULL, + day integer DEFAULT '0' NOT NULL, + downloads_http integer DEFAULT '0' NOT NULL, + downloads_ftp integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 208 (OID 18139623) +-- +-- Name: frs_dlstats_file_agg Type: TABLE +-- + +CREATE TABLE frs_dlstats_file_agg ( + file_id integer DEFAULT '0' NOT NULL, + day integer DEFAULT '0' NOT NULL, + downloads integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 209 (OID 18139638) +-- +-- Name: frs_dlstats_filetotal_agg Type: TABLE +-- + +CREATE TABLE frs_dlstats_filetotal_agg ( + file_id integer DEFAULT '0' NOT NULL, + downloads integer DEFAULT '0' NOT NULL, + PRIMARY KEY (file_id) +); + +-- +-- TOC Entry ID 210 (OID 18139654) +-- +-- Name: frs_dlstats_filetotal_agg_old Type: TABLE +-- + +CREATE TABLE frs_dlstats_filetotal_agg_old ( + file_id integer DEFAULT '0' NOT NULL, + downloads integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 211 (OID 18139667) +-- +-- Name: frs_dlstats_group_agg Type: TABLE +-- + +CREATE TABLE frs_dlstats_group_agg ( + group_id integer DEFAULT '0' NOT NULL, + day integer DEFAULT '0' NOT NULL, + downloads integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 212 (OID 18139682) +-- +-- Name: frs_dlstats_grouptotal_agg Type: TABLE +-- + +CREATE TABLE frs_dlstats_grouptotal_agg ( + group_id integer DEFAULT '0' NOT NULL, + downloads integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 48 (OID 18139695) +-- +-- Name: frs_file_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE frs_file_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 213 (OID 18139714) +-- +-- Name: frs_file Type: TABLE +-- + +CREATE TABLE frs_file ( + file_id integer DEFAULT '0' NOT NULL, + filename varchar2(255), + release_id integer DEFAULT '0' NOT NULL, + type_id integer DEFAULT '0' NOT NULL, + processor_id integer DEFAULT '0' NOT NULL, + release_time integer DEFAULT '0' NOT NULL, + file_size integer DEFAULT '0' NOT NULL, + post_date integer DEFAULT '0' NOT NULL, + PRIMARY KEY (file_id) +); + +--nextval('frs_file_pk_seq'::text) +CREATE TRIGGER DEFAULT_FRS_FILE_ID BEFORE + INSERT + ON frs_file REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select frs_file_pk_seq.nextval into :new.file_id from dual; +END; +/ + +-- +-- TOC Entry ID 50 (OID 18139756) +-- +-- Name: frs_filetype_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE frs_filetype_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 214 (OID 18139774) +-- +-- Name: frs_filetype Type: TABLE +-- + +CREATE TABLE frs_filetype ( + type_id integer DEFAULT '0' NOT NULL, + name varchar2(255), + PRIMARY KEY (type_id) +); + +--nextval('frs_filetype_pk_seq'::text) +CREATE TRIGGER DEFAULT_FRS_FILETYPE_ID BEFORE + INSERT + ON frs_filetype REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select frs_filetype_pk_seq.nextval into :new.type_id from dual; +END; +/ + +-- +-- TOC Entry ID 52 (OID 18139804) +-- +-- Name: frs_package_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE frs_package_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 215 (OID 18139822) +-- +-- Name: frs_package Type: TABLE +-- + +CREATE TABLE frs_package ( + package_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + name varchar2(255), + status_id integer DEFAULT '0' NOT NULL, + PRIMARY KEY (package_id) +); + +--nextval('frs_package_pk_seq'::text) +CREATE TRIGGER DEFAULT_FRS_PACKAGE_ID BEFORE + INSERT + ON frs_package REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select frs_package_pk_seq.nextval into :new.package_id from dual; +END; +/ + +-- +-- TOC Entry ID 54 (OID 18139856) +-- +-- Name: frs_processor_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE frs_processor_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 216 (OID 18139874) +-- +-- Name: frs_processor Type: TABLE +-- + +CREATE TABLE frs_processor ( + processor_id integer DEFAULT '0' NOT NULL, + name varchar2(255), + PRIMARY KEY (processor_id) +); + +--nextval('frs_processor_pk_seq'::text) +CREATE TRIGGER DEFAULT_FRS_PROCESSOR_ID BEFORE + INSERT + ON frs_processor REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select frs_processor_pk_seq.nextval into :new.processor_id from dual; +END; +/ + +-- +-- TOC Entry ID 56 (OID 18139904) +-- +-- Name: frs_release_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE frs_release_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 217 (OID 18139922) +-- +-- Name: frs_release Type: TABLE +-- + +CREATE TABLE frs_release ( + release_id integer DEFAULT '0' NOT NULL, + package_id integer DEFAULT '0' NOT NULL, + name varchar2(255), + notes varchar2(255), + changes varchar2(255), + status_id integer DEFAULT '0' NOT NULL, + preformatted integer DEFAULT '0' NOT NULL, + release_date integer DEFAULT '0' NOT NULL, + released_by integer DEFAULT '0' NOT NULL, + PRIMARY KEY (release_id) +); + +--nextval('frs_release_pk_seq'::text) +CREATE TRIGGER DEFAULT_FRS_RELEASE_ID BEFORE + INSERT + ON frs_release REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select frs_release_pk_seq.nextval into :new.release_id from dual; +END; +/ + +-- +-- TOC Entry ID 58 (OID 18139964) +-- +-- Name: frs_status_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE frs_status_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 218 (OID 18139982) +-- +-- Name: frs_status Type: TABLE +-- + +CREATE TABLE frs_status ( + status_id integer DEFAULT '0' NULL, + name varchar2(255), + PRIMARY KEY (status_id) +); + +--nextval('frs_status_pk_seq'::text) +CREATE TRIGGER DEFAULT_FRS_STATUS_ID BEFORE + INSERT + ON frs_status REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select frs_status_pk_seq.nextval into :new.status_id from dual; +END; +/ + +-- +-- TOC Entry ID 60 (OID 18140012) +-- +-- Name: group_cvs_history_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE group_cvs_history_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 219 (OID 18140030) +-- +-- Name: group_cvs_history Type: TABLE +-- + +CREATE TABLE group_cvs_history ( + id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + user_name character varying(80) DEFAULT '', + cvs_commits integer DEFAULT '0' NOT NULL, + cvs_commits_wk integer DEFAULT '0' NOT NULL, + cvs_adds integer DEFAULT '0' NOT NULL, + cvs_adds_wk integer DEFAULT '0' NOT NULL, + PRIMARY KEY (id) +); + +--nextval('group_cvs_history_pk_seq'::text) +CREATE TRIGGER DEFAULT_GROUP_CVS_HISTORY_ID BEFORE + INSERT + ON group_cvs_history REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select group_cvs_history_pk_seq.nextval into :new.id from dual; +END; +/ + +-- +-- TOC Entry ID 62 (OID 18140056) +-- +-- Name: group_history_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE group_history_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 220 (OID 18140074) +-- +-- Name: group_history Type: TABLE +-- + +CREATE TABLE group_history ( + group_history_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + field_name varchar2(255) DEFAULT '', + old_value varchar2(255) DEFAULT '', + mod_by integer DEFAULT '0' NOT NULL, + sf_date integer, + PRIMARY KEY (group_history_id) +); + +--nextval('group_history_pk_seq'::text) +CREATE TRIGGER DEFAULT_GROUP_HISTORY_ID BEFORE + INSERT + ON group_history REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select group_history_pk_seq.nextval into :new.group_history_id from dual; +END; +/ + +-- +-- TOC Entry ID 64 (OID 18140112) +-- +-- Name: group_type_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE group_type_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 221 (OID 18140130) +-- +-- Name: group_type Type: TABLE +-- + +CREATE TABLE group_type ( + type_id integer DEFAULT '0' NOT NULL, + name varchar2(255), + PRIMARY KEY (type_id) +); + +--nextval('group_type_pk_seq'::text) +CREATE TRIGGER DEFAULT_GROUP_TYPE_ID BEFORE + INSERT + ON group_type REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select group_type_pk_seq.nextval into :new.type_id from dual; +END; +/ + +-- +-- TOC Entry ID 66 (OID 18140160) +-- +-- Name: groups_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE groups_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 222 (OID 18140178) +-- +-- Name: groups Type: TABLE +-- + +CREATE TABLE groups ( + group_id integer DEFAULT '0' NOT NULL, + group_name character varying(40), + homepage character varying(128), + is_public integer DEFAULT '0' NOT NULL, + status character(1) DEFAULT 'A' NOT NULL, + unix_group_name character varying(30) DEFAULT '', + unix_box character varying(20) DEFAULT 'shell1' NOT NULL, + http_domain character varying(80), + short_description character varying(255), + cvs_box character varying(20) DEFAULT 'cvs1' NOT NULL, + license character varying(16), + register_purpose varchar2(2000), + license_other varchar2(255), + register_time integer DEFAULT '0' NOT NULL, + use_bugs integer DEFAULT '1' NOT NULL, + rand_hash varchar2(255), + use_mail integer DEFAULT '1' NOT NULL, + use_survey integer DEFAULT '1' NOT NULL, + use_patch integer DEFAULT '1' NOT NULL, + use_forum integer DEFAULT '1' NOT NULL, + use_pm integer DEFAULT '1' NOT NULL, + use_cvs integer DEFAULT '1' NOT NULL, + use_news integer DEFAULT '1' NOT NULL, + use_support integer DEFAULT '1' NOT NULL, + new_bug_address varchar2(255) DEFAULT '', + new_patch_address varchar2(255) DEFAULT '', + new_support_address varchar2(255) DEFAULT '', + type integer DEFAULT '1' NOT NULL, + use_docman integer DEFAULT '1' NOT NULL, + send_all_bugs integer DEFAULT '0' NOT NULL, + send_all_patches integer DEFAULT '0' NOT NULL, + send_all_support integer DEFAULT '0' NOT NULL, + new_task_address varchar2(255) DEFAULT '', + send_all_tasks integer DEFAULT '0' NOT NULL, + use_bug_depend_box integer DEFAULT '1' NOT NULL, + use_pm_depend_box integer DEFAULT '1' NOT NULL, + PRIMARY KEY (group_id) +); + +--nextval('groups_pk_seq'::text) +CREATE TRIGGER DEFAULT_GROUP_ID BEFORE + INSERT + ON groups REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select groups_pk_seq.nextval into :new.group_id from dual; +END; +/ + +-- +-- TOC Entry ID 223 (OID 18140269) +-- +-- Name: intel_agreement Type: TABLE +-- + +CREATE TABLE intel_agreement ( + user_id integer DEFAULT '0' NOT NULL, + message varchar2(255), + is_approved integer DEFAULT '0' NOT NULL, + PRIMARY KEY (user_id) +); + +-- +-- TOC Entry ID 68 (OID 18140301) +-- +-- Name: mail_group_list_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE mail_group_list_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 224 (OID 18140319) +-- +-- Name: mail_group_list Type: TABLE +-- + +CREATE TABLE mail_group_list ( + group_list_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + list_name varchar2(255), + is_public integer DEFAULT '0' NOT NULL, + password character varying(16), + list_admin integer DEFAULT '0' NOT NULL, + status integer DEFAULT '0' NOT NULL, + description varchar2(255), + PRIMARY KEY (group_list_id) +); + +--nextval('mail_group_list_pk_seq'::text) +CREATE TRIGGER DEFAULT_MAIL_GROUP_LIST_ID BEFORE + INSERT + ON mail_group_list REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select mail_group_list_pk_seq.nextval into :new.group_list_id from dual; +END; +/ + +-- +-- TOC Entry ID 70 (OID 18140359) +-- +-- Name: news_bytes_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE news_bytes_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 225 (OID 18140377) +-- +-- Name: news_bytes Type: TABLE +-- + +CREATE TABLE news_bytes ( + id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + submitted_by integer DEFAULT '0' NOT NULL, + is_approved integer DEFAULT '0' NOT NULL, + sf_date integer DEFAULT '0' NOT NULL, + forum_id integer DEFAULT '0' NOT NULL, + summary varchar2(255), + details varchar2(255), + PRIMARY KEY (id) +); + +--nextval('news_bytes_pk_seq'::text) +CREATE TRIGGER DEFAULT_NEWS_BYTES_ID BEFORE + INSERT + ON news_bytes REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select news_bytes_pk_seq.nextval into :new.id from dual; +END; +/ + +-- +-- TOC Entry ID 72 (OID 18140419) +-- +-- Name: patch_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE patch_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 226 (OID 18140437) +-- +-- Name: patch Type: TABLE +-- + +CREATE TABLE patch ( + patch_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + patch_status_id integer DEFAULT '0' NOT NULL, + patch_category_id integer DEFAULT '0' NOT NULL, + submitted_by integer DEFAULT '0' NOT NULL, + assigned_to integer DEFAULT '0' NOT NULL, + open_date integer DEFAULT '0' NOT NULL, + summary varchar2(255), + code varchar2(255), + close_date integer DEFAULT '0' NOT NULL, + PRIMARY KEY (patch_id) +); + +--nextval('patch_pk_seq'::text) +CREATE TRIGGER DEFAULT_PATCH_ID BEFORE + INSERT + ON patch REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select patch_pk_seq.nextval into :new.patch_id from dual; +END; +/ + +-- +-- TOC Entry ID 74 (OID 18140483) +-- +-- Name: patch_category_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE patch_category_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 227 (OID 18140501) +-- +-- Name: patch_category Type: TABLE +-- + +CREATE TABLE patch_category ( + patch_category_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + category_name varchar2(255) DEFAULT '', + PRIMARY KEY (patch_category_id) +); + +--nextval('patch_category_pk_seq'::text) +CREATE TRIGGER DEFAULT_PATCH_CATEGORY_ID BEFORE + INSERT + ON patch_category REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select patch_category_pk_seq.nextval into :new.patch_category_id from dual; +END; +/ + +-- +-- TOC Entry ID 76 (OID 18140534) +-- +-- Name: patch_history_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE patch_history_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 228 (OID 18140552) +-- +-- Name: patch_history Type: TABLE +-- + +CREATE TABLE patch_history ( + patch_history_id integer DEFAULT '0' NOT NULL, + patch_id integer DEFAULT '0' NOT NULL, + field_name varchar2(255) DEFAULT '', + old_value varchar2(255) DEFAULT '', + mod_by integer DEFAULT '0' NOT NULL, + sf_date integer, + PRIMARY KEY (patch_history_id) +); + +--nextval('patch_history_pk_seq'::text) +CREATE TRIGGER DEFAULT_PATCH_HISTORY BEFORE + INSERT + ON patch_history REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select patch_history_pk_seq.nextval into :new.patch_history_id from dual; +END; +/ + +-- +-- TOC Entry ID 78 (OID 18140590) +-- +-- Name: patch_status_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE patch_status_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 229 (OID 18140608) +-- +-- Name: patch_status Type: TABLE +-- + +CREATE TABLE patch_status ( + patch_status_id integer DEFAULT '0' NOT NULL, + status_name varchar2(255), + PRIMARY KEY (patch_status_id) +); + +--nextval('patch_status_pk_seq'::text) +CREATE TRIGGER DEFAULT_PATCH_STATUS BEFORE + INSERT + ON patch_status REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select patch_status_pk_seq.nextval into :new.patch_status_id from dual; +END; +/ + +-- +-- TOC Entry ID 80 (OID 18140638) +-- +-- Name: people_job_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE people_job_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 230 (OID 18140656) +-- +-- Name: people_job Type: TABLE +-- + +CREATE TABLE people_job ( + job_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + created_by integer DEFAULT '0' NOT NULL, + title varchar2(255), + description varchar2(255), + sf_date integer DEFAULT '0' NOT NULL, + status_id integer DEFAULT '0' NOT NULL, + category_id integer DEFAULT '0' NOT NULL, + PRIMARY KEY (job_id) +); + +--nextval('people_job_pk_seq'::text) +CREATE TRIGGER DEFAULT_people_job BEFORE + INSERT + ON people_job REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select people_job_pk_seq.nextval into :new.job_id from dual; +END; +/ + + +-- +-- TOC Entry ID 82 (OID 18140697) +-- +-- Name: people_job_category_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE people_job_category_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 231 (OID 18140715) +-- +-- Name: people_job_category Type: TABLE +-- + +CREATE TABLE people_job_category ( + category_id integer DEFAULT '0' NOT NULL, + name varchar2(255), + private_flag integer DEFAULT '0' NOT NULL, + PRIMARY KEY (category_id) +); + +--nextval('people_job_category_pk_seq'::text) +CREATE TRIGGER DEFAULT_people_job_category BEFORE + INSERT + ON people_job_category REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select people_job_category_pk_seq.nextval into :new.category_id from dual; +END; +/ + +-- +-- TOC Entry ID 84 (OID 18140747) +-- +-- Name: people_job_inventory_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE people_job_inventory_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 232 (OID 18140765) +-- +-- Name: people_job_inventory Type: TABLE +-- + +CREATE TABLE people_job_inventory ( + job_inventory_id integer DEFAULT '0' NOT NULL, + job_id integer DEFAULT '0' NOT NULL, + skill_id integer DEFAULT '0' NOT NULL, + skill_level_id integer DEFAULT '0' NOT NULL, + skill_year_id integer DEFAULT '0' NOT NULL, + PRIMARY KEY (job_inventory_id) +); + +--nextval('people_job_inventory_pk_seq'::text) +CREATE TRIGGER DEFAULT_people_job_inventory BEFORE + INSERT + ON people_job_inventory REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select people_job_inventory_pk_seq.nextval into :new.job_inventory_id from dual; +END; +/ + +-- +-- TOC Entry ID 86 (OID 18140787) +-- +-- Name: people_job_status_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE people_job_status_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 233 (OID 18140805) +-- +-- Name: people_job_status Type: TABLE +-- + +CREATE TABLE people_job_status ( + status_id integer DEFAULT '0' NOT NULL, + name varchar2(255), + PRIMARY KEY (status_id) +); + +--nextval('people_job_status_pk_seq'::text) +CREATE TRIGGER DEFAULT_people_job_status BEFORE + INSERT + ON people_job_status REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select people_job_status_pk_seq.nextval into :new.status_id from dual; +END; +/ + +-- +-- TOC Entry ID 88 (OID 18140835) +-- +-- Name: people_skill_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE people_skill_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 234 (OID 18140853) +-- +-- Name: people_skill Type: TABLE +-- + +CREATE TABLE people_skill ( + skill_id integer DEFAULT '0' NOT NULL, + name varchar2(255), + PRIMARY KEY (skill_id) +); + +--nextval('people_skill_pk_seq'::text) +CREATE TRIGGER DEFAULT_people_skill BEFORE + INSERT + ON people_skill REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select people_skill_pk_seq.nextval into :new.skill_id from dual; +END; +/ + +-- +-- TOC Entry ID 90 (OID 18140884) +-- +-- Name: people_skill_inventory_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE people_skill_inventory_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 235 (OID 18140902) +-- +-- Name: people_skill_inventory Type: TABLE +-- + +CREATE TABLE people_skill_inventory ( + skill_inventory_id integer DEFAULT '0' NOT NULL, + user_id integer DEFAULT '0' NOT NULL, + skill_id integer DEFAULT '0' NOT NULL, + skill_level_id integer DEFAULT '0' NOT NULL, + skill_year_id integer DEFAULT '0' NOT NULL, + PRIMARY KEY (skill_inventory_id) +); + +--nextval('people_skill_inventory_pk_seq'::text) +CREATE TRIGGER DEFAULT_people_inventory BEFORE + INSERT + ON people_skill_inventory REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select people_skill_inventory_pk_seq.nextval into :new.skill_inventory_id from dual; +END; +/ + +-- +-- TOC Entry ID 92 (OID 18140924) +-- +-- Name: people_skill_level_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE people_skill_level_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 236 (OID 18140942) +-- +-- Name: people_skill_level Type: TABLE +-- + +CREATE TABLE people_skill_level ( + skill_level_id integer DEFAULT '0' NOT NULL, + name varchar2(255), + PRIMARY KEY (skill_level_id) +); + +--nextval('people_skill_level_pk_seq'::text) +CREATE TRIGGER DEFAULT_people_skill_level BEFORE + INSERT + ON people_skill_level REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select people_skill_level_pk_seq.nextval into :new.skill_level_id from dual; +END; +/ + +-- +-- TOC Entry ID 94 (OID 18140972) +-- +-- Name: people_skill_year_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE people_skill_year_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 237 (OID 18140990) +-- +-- Name: people_skill_year Type: TABLE +-- + +CREATE TABLE people_skill_year ( + skill_year_id integer DEFAULT '0' NOT NULL, + name varchar2(255), + PRIMARY KEY (skill_year_id) +); + +--nextval('people_skill_year_pk_seq'::text) +CREATE TRIGGER DEFAULT_people_skill_year BEFORE + INSERT + ON people_skill_year REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select people_skill_year_pk_seq.nextval into :new.skill_year_id from dual; +END; +/ + + +-- +-- TOC Entry ID 96 (OID 18141020) +-- +-- Name: project_assigned_to_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE project_assigned_to_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 238 (OID 18141038) +-- +-- Name: project_assigned_to Type: TABLE +-- + +CREATE TABLE project_assigned_to ( + project_assigned_id integer DEFAULT '0' NOT NULL, + project_task_id integer DEFAULT '0' NOT NULL, + assigned_to_id integer DEFAULT '0' NOT NULL, + PRIMARY KEY (project_assigned_id) +); + +--nextval('project_assigned_to_pk_seq'::text) +CREATE TRIGGER DEFAULT_project_assigned_to BEFORE + INSERT + ON project_assigned_to REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select project_assigned_to_pk_seq.nextval into :new.project_assigned_id from dual; +END; +/ + +-- +-- TOC Entry ID 239 (OID 18141056) +-- +-- Name: project_counts_tmp Type: TABLE +-- + +CREATE TABLE project_counts_tmp ( + group_id integer, + type varchar2(255), + count double precision +); + +-- +-- TOC Entry ID 240 (OID 18141083) +-- +-- Name: project_counts_weekly_tmp Type: TABLE +-- + +CREATE TABLE project_counts_weekly_tmp ( + group_id integer, + type varchar2(255), + count double precision +); + +-- +-- TOC Entry ID 98 (OID 18141110) +-- +-- Name: project_dependencies_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE project_dependencies_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 241 (OID 18141128) +-- +-- Name: project_dependencies Type: TABLE +-- + +CREATE TABLE project_dependencies ( + project_depend_id integer DEFAULT '0' NOT NULL, + project_task_id integer DEFAULT '0' NOT NULL, + is_dependent_on_task_id integer DEFAULT '0' NOT NULL, + PRIMARY KEY (project_depend_id) +); + +--nextval('project_dependencies_pk_seq'::text) +CREATE TRIGGER DEFAULT_project_dependencies BEFORE + INSERT + ON project_dependencies REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select project_dependencies_pk_seq.nextval into :new.project_depend_id from dual; +END; +/ + +-- +-- TOC Entry ID 100 (OID 18141146) +-- +-- Name: project_group_list_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE project_group_list_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 242 (OID 18141164) +-- +-- Name: project_group_list Type: TABLE +-- + +CREATE TABLE project_group_list ( + group_project_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + project_name varchar2(255) DEFAULT '', + is_public integer DEFAULT '0' NOT NULL, + description varchar2(255), + PRIMARY KEY (group_project_id) +); + +--nextval('project_group_list_pk_seq'::text) +CREATE TRIGGER DEFAULT_project_group_list BEFORE + INSERT + ON project_group_list REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select project_group_list_pk_seq.nextval into :new.group_project_id from dual; +END; +/ + +-- +-- TOC Entry ID 102 (OID 18141200) +-- +-- Name: project_history_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE project_history_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 243 (OID 18141218) +-- +-- Name: project_history Type: TABLE +-- + +CREATE TABLE project_history ( + project_history_id integer DEFAULT '0' NOT NULL, + project_task_id integer DEFAULT '0' NOT NULL, + field_name varchar2(255) DEFAULT '', + old_value varchar2(255) DEFAULT '', + mod_by integer DEFAULT '0' NOT NULL, + sf_date integer DEFAULT '0' NOT NULL, + PRIMARY KEY (project_history_id) +); + +--nextval('project_history_pk_seq'::text) +CREATE TRIGGER DEFAULT_project_history BEFORE + INSERT + ON project_history REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select project_history_pk_seq.nextval into :new.project_history_id from dual; +END; +/ + +-- +-- TOC Entry ID 104 (OID 18141257) +-- +-- Name: project_metric_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE project_metric_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 244 (OID 18141275) +-- +-- Name: project_metric Type: TABLE +-- + +CREATE TABLE project_metric ( + ranking integer DEFAULT '0' NOT NULL, + percentile double precision, + group_id integer DEFAULT '0' NOT NULL, + PRIMARY KEY (ranking) +); + +--nextval('project_metric_pk_seq'::text) +CREATE TRIGGER DEFAULT_project_metric BEFORE + INSERT + ON project_metric REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select project_metric_pk_seq.nextval into :new.ranking from dual; +END; +/ + +-- +-- TOC Entry ID 106 (OID 18141292) +-- +-- Name: project_metric_tmp1_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE project_metric_tmp1_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 245 (OID 18141310) +-- +-- Name: project_metric_tmp1 Type: TABLE +-- + +CREATE TABLE project_metric_tmp1 ( + ranking integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + value double precision, + PRIMARY KEY (ranking) +); + +--nextval('project_metric_tmp1_pk_seq'::text) +CREATE TRIGGER DEFAULT_project_metric_tmp1 BEFORE + INSERT + ON project_metric_tmp1 REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select project_metric_tmp1_pk_seq.nextval into :new.ranking from dual; +END; +/ + +-- +-- TOC Entry ID 108 (OID 18141327) +-- +-- Name: project_metric_weekly_tm_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE project_metric_week_tm_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 246 (OID 18141346) +-- +-- Name: project_metric_weekly_tmp1 Type: TABLE +-- + +CREATE TABLE project_metric_weekly_tmp1 ( + ranking integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + value double precision, + PRIMARY KEY (ranking) +); + +--nextval('project_metric_week_tm_pk_seq'::text) +CREATE TRIGGER DEFAULT_proj_metric_week_tmp1 BEFORE + INSERT + ON project_metric_weekly_tmp1 REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select project_metric_week_tm_pk_seq.nextval into :new.ranking from dual; +END; +/ + +-- +-- TOC Entry ID 110 (OID 18141363) +-- +-- Name: project_status_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE project_status_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 247 (OID 18141381) +-- +-- Name: project_status Type: TABLE +-- + +CREATE TABLE project_status ( + status_id integer DEFAULT '0' NOT NULL, + status_name varchar2(255) DEFAULT '', + PRIMARY KEY (status_id) +); + +--nextval('project_status_pk_seq'::text) +CREATE TRIGGER DEFAULT_project_status BEFORE + INSERT + ON project_status REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select project_status_pk_seq.nextval into :new.status_id from dual; +END; +/ + +-- +-- TOC Entry ID 112 (OID 18141412) +-- +-- Name: project_task_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE project_task_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 248 (OID 18141430) +-- +-- Name: project_task Type: TABLE +-- + +CREATE TABLE project_task ( + project_task_id integer DEFAULT '0' NOT NULL, + group_project_id integer DEFAULT '0' NOT NULL, + summary varchar2(255) DEFAULT '', + details varchar2(255) DEFAULT '', + percent_complete integer DEFAULT '0' NOT NULL, + priority integer DEFAULT '0' NOT NULL, + hours double precision DEFAULT '0.00' NOT NULL, + start_date integer DEFAULT '0' NOT NULL, + end_date integer DEFAULT '0' NOT NULL, + created_by integer DEFAULT '0' NOT NULL, + status_id integer DEFAULT '0' NOT NULL, + PRIMARY KEY (project_task_id) +); + +--nextval('project_task_pk_seq'::text) +CREATE TRIGGER DEFAULT_project_task BEFORE + INSERT + ON project_task REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select project_task_pk_seq.nextval into :new.project_task_id from dual; +END; +/ + +-- +-- TOC Entry ID 114 (OID 18141479) +-- +-- Name: project_weekly_metric_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE project_weekly_metric_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 249 (OID 18141497) +-- +-- Name: project_weekly_metric Type: TABLE +-- + +CREATE TABLE project_weekly_metric ( + ranking integer DEFAULT '0' NOT NULL, + percentile double precision, + group_id integer DEFAULT '0' NOT NULL, + PRIMARY KEY (ranking) +); + +--nextval('project_weekly_metric_pk_seq'::text) +CREATE TRIGGER DEFAULT_project_weekly_metric BEFORE + INSERT + ON project_weekly_metric REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select project_weekly_metric_pk_seq.nextval into :new.ranking from dual; +END; +/ + +-- +-- TOC Entry ID 250 (OID 18141514) +-- +-- Name: sf_session Type: TABLE +-- + +CREATE TABLE sf_session ( + user_id integer DEFAULT '0' NOT NULL, + session_hash character(32) DEFAULT '', + ip_addr character(15) DEFAULT '', + time integer DEFAULT '0' NOT NULL, + PRIMARY KEY (session_hash) +); + +-- +-- TOC Entry ID 116 (OID 18141534) +-- +-- Name: snippet_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE snippet_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 251 (OID 18141552) +-- +-- Name: snippet Type: TABLE +-- + +CREATE TABLE snippet ( + snippet_id integer DEFAULT '0' NOT NULL, + created_by integer DEFAULT '0' NOT NULL, + name varchar2(255), + description varchar2(255), + type integer DEFAULT '0' NOT NULL, + language integer DEFAULT '0' NOT NULL, + license varchar2(255) DEFAULT '', + category integer DEFAULT '0' NOT NULL, + PRIMARY KEY (snippet_id) +); + +--nextval('snippet_pk_seq'::text) +CREATE TRIGGER DEFAULT_snippet BEFORE + INSERT + ON snippet REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select snippet_pk_seq.nextval into :new.snippet_id from dual; +END; +/ + +-- +-- TOC Entry ID 118 (OID 18141593) +-- +-- Name: snippet_package_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE snippet_package_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 252 (OID 18141611) +-- +-- Name: snippet_package Type: TABLE +-- + +CREATE TABLE snippet_package ( + snippet_package_id integer DEFAULT '0' NOT NULL, + created_by integer DEFAULT '0' NOT NULL, + name varchar2(255), + description varchar2(255), + category integer DEFAULT '0' NOT NULL, + language integer DEFAULT '0' NOT NULL, + PRIMARY KEY (snippet_package_id) +); + +--nextval('snippet_package_pk_seq'::text) +CREATE TRIGGER DEFAULT_snippet_package BEFORE + INSERT + ON snippet_package REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select snippet_package_pk_seq.nextval into :new.snippet_package_id from dual; +END; +/ + +-- +-- TOC Entry ID 120 (OID 18141648) +-- +-- Name: snippet_package_item_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE snippet_package_item_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 253 (OID 18141666) +-- +-- Name: snippet_package_item Type: TABLE +-- + +CREATE TABLE snippet_package_item ( + snippet_package_item_id integer DEFAULT '0' NOT NULL, + snippet_package_version_id integer DEFAULT '0' NOT NULL, + snippet_version_id integer DEFAULT '0' NOT NULL, + PRIMARY KEY (snippet_package_item_id) +); + +--nextval('snippet_package_item_pk_seq'::text) +CREATE TRIGGER DEFAULT_snippet_package_item BEFORE + INSERT + ON snippet_package_item REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select snippet_package_item_pk_seq.nextval into :new.snippet_package_item_id from dual; +END; +/ + + +-- +-- TOC Entry ID 122 (OID 18141684) +-- +-- Name: snippet_package_version_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE snippet_package_version_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 254 (OID 18141702) +-- +-- Name: snippet_package_version Type: TABLE +-- + +CREATE TABLE snippet_package_version ( + snippet_package_version_id integer DEFAULT '0' NOT NULL, + snippet_package_id integer DEFAULT '0' NOT NULL, + changes varchar2(255), + version varchar2(255), + submitted_by integer DEFAULT '0' NOT NULL, + sf_date integer DEFAULT '0' NOT NULL, + PRIMARY KEY (snippet_package_version_id) +); + +--nextval('snippet_package_version_pk_seq'::text) +CREATE TRIGGER DEFAULT_snippet_package_ver BEFORE + INSERT + ON snippet_package_version REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select snippet_package_version_pk_seq.nextval into :new.snippet_package_version_id from dual; +END; +/ + + +-- +-- TOC Entry ID 124 (OID 18141739) +-- +-- Name: snippet_version_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE snippet_version_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 255 (OID 18141757) +-- +-- Name: snippet_version Type: TABLE +-- + +CREATE TABLE snippet_version ( + snippet_version_id integer DEFAULT '0' NOT NULL, + snippet_id integer DEFAULT '0' NOT NULL, + changes varchar2(255), + version varchar2(255), + submitted_by integer DEFAULT '0' NOT NULL, + sf_date integer DEFAULT '0' NOT NULL, + code varchar2(255), + PRIMARY KEY (snippet_version_id) +); + +--nextval('snippet_version_pk_seq'::text) +CREATE TRIGGER DEFAULT_snippet_version BEFORE + INSERT + ON snippet_version REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select snippet_version_pk_seq.nextval into :new.snippet_version_id from dual; +END; +/ + +-- +-- TOC Entry ID 256 (OID 18141795) +-- +-- Name: stats_agg_logo_by_day Type: TABLE +-- + +CREATE TABLE stats_agg_logo_by_day ( + day integer, + count integer +); + +-- +-- TOC Entry ID 257 (OID 18141806) +-- +-- Name: stats_agg_logo_by_group Type: TABLE +-- + +CREATE TABLE stats_agg_logo_by_group ( + day integer, + group_id integer, + count integer +); + +-- +-- TOC Entry ID 258 (OID 18141818) +-- +-- Name: stats_agg_pages_by_browser Type: TABLE +-- + +CREATE TABLE stats_agg_pages_by_browser ( + browser character varying(8), + count integer +); + +-- +-- TOC Entry ID 259 (OID 18141829) +-- +-- Name: stats_agg_pages_by_day Type: TABLE +-- + +CREATE TABLE stats_agg_pages_by_day ( + day integer DEFAULT '0' NOT NULL, + count integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 260 (OID 18141842) +-- +-- Name: stats_agg_pages_by_day_old Type: TABLE +-- + +CREATE TABLE stats_agg_pages_by_day_old ( + day integer, + count integer +); + +-- +-- TOC Entry ID 261 (OID 18141853) +-- +-- Name: stats_agg_site_by_day Type: TABLE +-- + +CREATE TABLE stats_agg_site_by_day ( + day integer DEFAULT '0' NOT NULL, + count integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 262 (OID 18141866) +-- +-- Name: stats_agg_site_by_group Type: TABLE +-- + +CREATE TABLE stats_agg_site_by_group ( + day integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + count integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 263 (OID 18141881) +-- +-- Name: stats_agr_filerelease Type: TABLE +-- + +CREATE TABLE stats_agr_filerelease ( + filerelease_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + downloads integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 264 (OID 18141896) +-- +-- Name: stats_agr_project Type: TABLE +-- + +CREATE TABLE stats_agr_project ( + group_id integer DEFAULT '0' NOT NULL, + group_ranking integer DEFAULT '0' NOT NULL, + group_metric double precision DEFAULT '0.00000' NOT NULL, + developers integer DEFAULT '0' NOT NULL, + file_releases integer DEFAULT '0' NOT NULL, + downloads integer DEFAULT '0' NOT NULL, + site_views integer DEFAULT '0' NOT NULL, + logo_views integer DEFAULT '0' NOT NULL, + msg_posted integer DEFAULT '0' NOT NULL, + msg_uniq_auth integer DEFAULT '0' NOT NULL, + bugs_opened integer DEFAULT '0' NOT NULL, + bugs_closed integer DEFAULT '0' NOT NULL, + support_opened integer DEFAULT '0' NOT NULL, + support_closed integer DEFAULT '0' NOT NULL, + patches_opened integer DEFAULT '0' NOT NULL, + patches_closed integer DEFAULT '0' NOT NULL, + tasks_opened integer DEFAULT '0' NOT NULL, + tasks_closed integer DEFAULT '0' NOT NULL, + help_requests integer DEFAULT '0' NOT NULL, + cvs_checkouts integer DEFAULT '0' NOT NULL, + cvs_commits integer DEFAULT '0' NOT NULL, + cvs_adds integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 265 (OID 18141949) +-- +-- Name: stats_ftp_downloads Type: TABLE +-- + +CREATE TABLE stats_ftp_downloads ( + day integer DEFAULT '0' NOT NULL, + filerelease_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + downloads integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 266 (OID 18141966) +-- +-- Name: stats_http_downloads Type: TABLE +-- + +CREATE TABLE stats_http_downloads ( + day integer DEFAULT '0' NOT NULL, + filerelease_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + downloads integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 267 (OID 18141983) +-- +-- Name: stats_project Type: TABLE +-- + +CREATE TABLE stats_project ( + month integer DEFAULT '0' NOT NULL, + week integer DEFAULT '0' NOT NULL, + day integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + group_ranking integer DEFAULT '0' NOT NULL, + group_metric double precision DEFAULT '0.00000' NOT NULL, + developers integer DEFAULT '0' NOT NULL, + file_releases integer DEFAULT '0' NOT NULL, + downloads integer DEFAULT '0' NOT NULL, + site_views integer DEFAULT '0' NOT NULL, + subdomain_views integer DEFAULT '0' NOT NULL, + msg_posted integer DEFAULT '0' NOT NULL, + msg_uniq_auth integer DEFAULT '0' NOT NULL, + bugs_opened integer DEFAULT '0' NOT NULL, + bugs_closed integer DEFAULT '0' NOT NULL, + support_opened integer DEFAULT '0' NOT NULL, + support_closed integer DEFAULT '0' NOT NULL, + patches_opened integer DEFAULT '0' NOT NULL, + patches_closed integer DEFAULT '0' NOT NULL, + tasks_opened integer DEFAULT '0' NOT NULL, + tasks_closed integer DEFAULT '0' NOT NULL, + help_requests integer DEFAULT '0' NOT NULL, + cvs_checkouts integer DEFAULT '0' NOT NULL, + cvs_commits integer DEFAULT '0' NOT NULL, + cvs_adds integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 268 (OID 18142042) +-- +-- Name: stats_project_tmp Type: TABLE +-- + +CREATE TABLE stats_project_tmp ( + month integer DEFAULT '0' NOT NULL, + week integer DEFAULT '0' NOT NULL, + day integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + group_ranking integer DEFAULT '0' NOT NULL, + group_metric double precision DEFAULT '0.00000' NOT NULL, + developers integer DEFAULT '0' NOT NULL, + file_releases integer DEFAULT '0' NOT NULL, + downloads integer DEFAULT '0' NOT NULL, + site_views integer DEFAULT '0' NOT NULL, + subdomain_views integer DEFAULT '0' NOT NULL, + msg_posted integer DEFAULT '0' NOT NULL, + msg_uniq_auth integer DEFAULT '0' NOT NULL, + bugs_opened integer DEFAULT '0' NOT NULL, + bugs_closed integer DEFAULT '0' NOT NULL, + support_opened integer DEFAULT '0' NOT NULL, + support_closed integer DEFAULT '0' NOT NULL, + patches_opened integer DEFAULT '0' NOT NULL, + patches_closed integer DEFAULT '0' NOT NULL, + tasks_opened integer DEFAULT '0' NOT NULL, + tasks_closed integer DEFAULT '0' NOT NULL, + help_requests integer DEFAULT '0' NOT NULL, + cvs_checkouts integer DEFAULT '0' NOT NULL, + cvs_commits integer DEFAULT '0' NOT NULL, + cvs_adds integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 269 (OID 18142101) +-- +-- Name: stats_site Type: TABLE +-- + +CREATE TABLE stats_site ( + month integer DEFAULT '0' NOT NULL, + week integer DEFAULT '0' NOT NULL, + day integer DEFAULT '0' NOT NULL, + site_views integer DEFAULT '0' NOT NULL, + subdomain_views integer DEFAULT '0' NOT NULL, + downloads integer DEFAULT '0' NOT NULL, + uniq_users integer DEFAULT '0' NOT NULL, + sessions integer DEFAULT '0' NOT NULL, + total_users integer DEFAULT '0' NOT NULL, + new_users integer DEFAULT '0' NOT NULL, + new_projects integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 126 (OID 18142132) +-- +-- Name: support_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE support_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 270 (OID 18142150) +-- +-- Name: support Type: TABLE +-- + +CREATE TABLE support ( + support_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + support_status_id integer DEFAULT '0' NOT NULL, + support_category_id integer DEFAULT '0' NOT NULL, + priority integer DEFAULT '0' NOT NULL, + submitted_by integer DEFAULT '0' NOT NULL, + assigned_to integer DEFAULT '0' NOT NULL, + open_date integer DEFAULT '0' NOT NULL, + summary varchar2(255), + close_date integer DEFAULT '0' NOT NULL, + PRIMARY KEY (support_id) +); + +--nextval('support_pk_seq'::text) +CREATE TRIGGER DEFAULT_support BEFORE + INSERT + ON support REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select support_pk_seq.nextval into :new.support_id from dual; +END; +/ + +-- +-- TOC Entry ID 128 (OID 18142196) +-- +-- Name: support_canned_responses_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE support_canned_resp_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 271 (OID 18142214) +-- +-- Name: support_canned_responses Type: TABLE +-- + +CREATE TABLE support_canned_responses ( + support_canned_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + title varchar2(255), + body varchar2(255), + PRIMARY KEY (support_canned_id) +); + +CREATE TRIGGER DEFAULT_support_canned_resp BEFORE + INSERT + ON support_canned_responses REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select support_canned_resp_pk_seq.nextval into :new.support_canned_id from dual; +END; +/ + +-- +-- TOC Entry ID 130 (OID 18142247) +-- +-- Name: support_category_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE support_category_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 272 (OID 18142265) +-- +-- Name: support_category Type: TABLE +-- + +CREATE TABLE support_category ( + support_category_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + category_name varchar2(255) DEFAULT '', + PRIMARY KEY (support_category_id) +); + +CREATE TRIGGER DEFAULT_support_category BEFORE + INSERT + ON support_category REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select support_category_pk_seq.nextval into :new.support_category_id from dual; +END; +/ + +-- +-- TOC Entry ID 132 (OID 18142298) +-- +-- Name: support_history_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE support_history_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 273 (OID 18142316) +-- +-- Name: support_history Type: TABLE +-- + +CREATE TABLE support_history ( + support_history_id integer DEFAULT '0' NOT NULL, + support_id integer DEFAULT '0' NOT NULL, + field_name varchar2(255) DEFAULT '', + old_value varchar2(255) DEFAULT '', + mod_by integer DEFAULT '0' NOT NULL, + sf_date integer, + PRIMARY KEY (support_history_id) +); + +CREATE TRIGGER DEFAULT_support_history BEFORE + INSERT + ON support_history REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select support_history_pk_seq.nextval into :new.support_history_id from dual; +END; +/ + +-- +-- TOC Entry ID 134 (OID 18142354) +-- +-- Name: support_messages_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE support_messages_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 274 (OID 18142372) +-- +-- Name: support_messages Type: TABLE +-- + +CREATE TABLE support_messages ( + support_message_id integer DEFAULT '0' NOT NULL, + support_id integer DEFAULT '0' NOT NULL, + from_email varchar2(255), + sf_date integer DEFAULT '0' NOT NULL, + body varchar2(255), + PRIMARY KEY (support_message_id) +); + +CREATE TRIGGER DEFAULT_support_messages BEFORE + INSERT + ON support_messages REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select support_messages_pk_seq.nextval into :new.support_message_id from dual; +END; +/ + +-- +-- TOC Entry ID 136 (OID 18142407) +-- +-- Name: support_status_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE support_status_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 275 (OID 18142425) +-- +-- Name: support_status Type: TABLE +-- + +CREATE TABLE support_status ( + support_status_id integer DEFAULT '0' NOT NULL, + status_name varchar2(255), + PRIMARY KEY (support_status_id) +); + +CREATE TRIGGER DEFAULT_support_status BEFORE + INSERT + ON support_status REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select support_status_pk_seq.nextval into :new.support_status_id from dual; +END; +/ + +-- +-- TOC Entry ID 138 (OID 18142455) +-- +-- Name: supported_languages_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE supported_languages_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 276 (OID 18142473) +-- +-- Name: supported_languages Type: TABLE +-- + +CREATE TABLE supported_languages ( + language_id integer DEFAULT '0' NOT NULL, + name varchar2(255), + filename varchar2(255), + classname varchar2(255), + language_code character(2), + PRIMARY KEY (language_id) +); + +CREATE TRIGGER DEFAULT_supported_languages BEFORE + INSERT + ON supported_languages REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select supported_languages_pk_seq.nextval into :new.language_id from dual; +END; +/ + +-- +-- TOC Entry ID 140 (OID 18142506) +-- +-- Name: survey_question_types_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE survey_question_types_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 277 (OID 18142524) +-- +-- Name: survey_question_types Type: TABLE +-- + +CREATE TABLE survey_question_types ( + id integer DEFAULT '0' NOT NULL, + type varchar2(255) DEFAULT '', + PRIMARY KEY (id) +); + +CREATE TRIGGER DEFAULT_survey_question_types BEFORE + INSERT + ON survey_question_types REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select survey_question_types_pk_seq.nextval into :new.id from dual; +END; +/ + +-- +-- TOC Entry ID 142 (OID 18142555) +-- +-- Name: survey_questions_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE survey_questions_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 278 (OID 18142573) +-- +-- Name: survey_questions Type: TABLE +-- + +CREATE TABLE survey_questions ( + question_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + question varchar2(255) DEFAULT '', + question_type integer DEFAULT '0' NOT NULL, + PRIMARY KEY (question_id) +); + +CREATE TRIGGER DEFAULT_survey_question BEFORE + INSERT + ON survey_questions REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select survey_questions_pk_seq.nextval into :new.question_id from dual; +END; +/ + +-- +-- TOC Entry ID 279 (OID 18142608) +-- +-- Name: survey_rating_aggregate Type: TABLE +-- + +CREATE TABLE survey_rating_aggregate ( + type integer DEFAULT '0' NOT NULL, + id integer DEFAULT '0' NOT NULL, + response double precision DEFAULT '0' NOT NULL, + count integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 280 (OID 18142625) +-- +-- Name: survey_rating_response Type: TABLE +-- + +CREATE TABLE survey_rating_response ( + user_id integer DEFAULT '0' NOT NULL, + type integer DEFAULT '0' NOT NULL, + id integer DEFAULT '0' NOT NULL, + response integer DEFAULT '0' NOT NULL, + sf_date integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 281 (OID 18142644) +-- +-- Name: survey_responses Type: TABLE +-- + +CREATE TABLE survey_responses ( + user_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + survey_id integer DEFAULT '0' NOT NULL, + question_id integer DEFAULT '0' NOT NULL, + response varchar2(255) DEFAULT '', + sf_date integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 144 (OID 18142680) +-- +-- Name: surveys_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE surveys_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 282 (OID 18142698) +-- +-- Name: surveys Type: TABLE +-- + +CREATE TABLE surveys ( + survey_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + survey_title varchar2(255) DEFAULT '', + survey_questions varchar2(255) DEFAULT '', + is_active integer DEFAULT '1' NOT NULL, + PRIMARY KEY (survey_id) +); + + +CREATE TRIGGER DEFAULT_surveys BEFORE + INSERT + ON surveys REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select surveys_pk_seq.nextval into :new.survey_id from dual; +END; +/ + +-- +-- TOC Entry ID 146 (OID 18142735) +-- +-- Name: system_history_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE system_history_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 148 (OID 18142787) +-- +-- Name: system_machines_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE system_machines_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 150 (OID 18142836) +-- +-- Name: system_news_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE system_news_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 152 (OID 18142895) +-- +-- Name: system_services_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE system_services_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 154 (OID 18142944) +-- +-- Name: system_status_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE system_status_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 283 (OID 18142992) +-- +-- Name: theme_prefs Type: TABLE +-- + +CREATE TABLE theme_prefs ( + user_id integer DEFAULT '0' NOT NULL, + user_theme integer DEFAULT '0' NOT NULL, + body_font character(80) DEFAULT '', + body_size character(5) DEFAULT '', + titlebar_font character(80) DEFAULT '', + titlebar_size character(5) DEFAULT '', + color_titlebar_back character(7) DEFAULT '', + color_ltback1 character(7) DEFAULT '', + PRIMARY KEY (user_id) +); + +-- +-- TOC Entry ID 156 (OID 18143020) +-- +-- Name: themes_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE themes_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 284 (OID 18143038) +-- +-- Name: themes Type: TABLE +-- + +CREATE TABLE themes ( + theme_id integer DEFAULT '0' NOT NULL, + dirname character varying(80), + fullname character varying(80), + PRIMARY KEY (theme_id) +); + +CREATE TRIGGER DEFAULT_themes BEFORE + INSERT + ON themes REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select themes_pk_seq.nextval into :new.theme_id from dual; +END; +/ + +-- +-- TOC Entry ID 285 (OID 18143054) +-- +-- Name: tmp_projs_releases_tmp Type: TABLE +-- + +CREATE TABLE tmp_projs_releases_tmp ( + year integer DEFAULT '0' NOT NULL, + month integer DEFAULT '0' NOT NULL, + total_proj integer DEFAULT '0' NOT NULL, + total_releases integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 286 (OID 18143071) +-- +-- Name: top_group Type: TABLE +-- + +CREATE TABLE top_group ( + group_id integer DEFAULT '0' NOT NULL, + group_name character varying(40), + downloads_all integer DEFAULT '0' NOT NULL, + rank_downloads_all integer DEFAULT '0' NOT NULL, + rank_downloads_all_old integer DEFAULT '0' NOT NULL, + downloads_week integer DEFAULT '0' NOT NULL, + rank_downloads_week integer DEFAULT '0' NOT NULL, + rank_downloads_week_old integer DEFAULT '0' NOT NULL, + userrank integer DEFAULT '0' NOT NULL, + rank_userrank integer DEFAULT '0' NOT NULL, + rank_userrank_old integer DEFAULT '0' NOT NULL, + forumposts_week integer DEFAULT '0' NOT NULL, + rank_forumposts_week integer DEFAULT '0' NOT NULL, + rank_forumposts_week_old integer DEFAULT '0' NOT NULL, + pageviews_proj integer DEFAULT '0' NOT NULL, + rank_pageviews_proj integer DEFAULT '0' NOT NULL, + rank_pageviews_proj_old integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 158 (OID 18143113) +-- +-- Name: trove_cat_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE trove_cat_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 287 (OID 18143131) +-- +-- Name: trove_cat Type: TABLE +-- + +CREATE TABLE trove_cat ( + trove_cat_id integer DEFAULT '0' NOT NULL, + version integer DEFAULT '0' NOT NULL, + parent integer DEFAULT '0' NOT NULL, + root_parent integer DEFAULT '0' NOT NULL, + shortname character varying(80), + fullname character varying(80), + description character varying(255), + count_subcat integer DEFAULT '0' NOT NULL, + count_subproj integer DEFAULT '0' NOT NULL, + fullpath varchar2(255) DEFAULT '', + fullpath_ids varchar2(255), + PRIMARY KEY (trove_cat_id) +); + +CREATE TRIGGER DEFAULT_trove_cat BEFORE + INSERT + ON trove_cat REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select trove_cat_pk_seq.nextval into :new.trove_cat_id from dual; +END; +/ + +-- +-- TOC Entry ID 160 (OID 18143176) +-- +-- Name: trove_group_link_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE trove_group_link_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 288 (OID 18143194) +-- +-- Name: trove_group_link Type: TABLE +-- + +CREATE TABLE trove_group_link ( + trove_group_id integer DEFAULT '0' NOT NULL, + trove_cat_id integer DEFAULT '0' NOT NULL, + trove_cat_version integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + trove_cat_root integer DEFAULT '0' NOT NULL, + PRIMARY KEY (trove_group_id) +); + +CREATE TRIGGER DEFAULT_trove_group_link BEFORE + INSERT + ON trove_group_link REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select trove_group_link_pk_seq.nextval into :new.trove_group_id from dual; +END; +/ + +-- +-- TOC Entry ID 162 (OID 18143216) +-- +-- Name: trove_treesums_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE trove_treesums_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 289 (OID 18143234) +-- +-- Name: trove_treesums Type: TABLE +-- + +CREATE TABLE trove_treesums ( + trove_treesums_id integer DEFAULT '0' NOT NULL, + trove_cat_id integer DEFAULT '0' NOT NULL, + limit_1 integer DEFAULT '0' NOT NULL, + subprojects integer DEFAULT '0' NOT NULL, + PRIMARY KEY (trove_treesums_id) +); + +CREATE TRIGGER DEFAULT_trove_treesums BEFORE + INSERT + ON trove_treesums REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select trove_treesums_pk_seq.nextval into :new.trove_treesums_id from dual; +END; +/ + +-- +-- TOC Entry ID 164 (OID 18143286) +-- +-- Name: user_bookmarks_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE user_bookmarks_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 290 (OID 18143304) +-- +-- Name: user_bookmarks Type: TABLE +-- + +CREATE TABLE user_bookmarks ( + bookmark_id integer DEFAULT '0' NOT NULL, + user_id integer DEFAULT '0' NOT NULL, + bookmark_url varchar2(255), + bookmark_title varchar2(255), + PRIMARY KEY (bookmark_id) +); + +CREATE TRIGGER DEFAULT_user_bookmarks BEFORE + INSERT + ON user_bookmarks REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select user_bookmarks_pk_seq.nextval into :new.bookmark_id from dual; +END; +/ + +-- +-- TOC Entry ID 166 (OID 18143337) +-- +-- Name: user_diary_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE user_diary_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 291 (OID 18143355) +-- +-- Name: user_diary Type: TABLE +-- + +CREATE TABLE user_diary ( + id integer DEFAULT '0' NOT NULL, + user_id integer DEFAULT '0' NOT NULL, + date_posted integer DEFAULT '0' NOT NULL, + summary varchar2(255), + details varchar2(255), + is_public integer DEFAULT '0' NOT NULL, + PRIMARY KEY (id) +); + +CREATE TRIGGER DEFAULT_user_diary BEFORE + INSERT + ON user_diary REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select user_diary_pk_seq.nextval into :new.id from dual; +END; +/ + +-- +-- TOC Entry ID 168 (OID 18143392) +-- +-- Name: user_diary_monitor_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE user_diary_monitor_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 292 (OID 18143410) +-- +-- Name: user_diary_monitor Type: TABLE +-- + +CREATE TABLE user_diary_monitor ( + monitor_id integer DEFAULT '0' NOT NULL, + monitored_user integer DEFAULT '0' NOT NULL, + user_id integer DEFAULT '0' NOT NULL, + PRIMARY KEY (monitor_id) +); + +CREATE TRIGGER DEFAULT_user_diary_monitor BEFORE + INSERT + ON user_diary_monitor REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select user_diary_monitor_pk_seq.nextval into :new.monitor_id from dual; +END; +/ + +-- +-- TOC Entry ID 170 (OID 18143428) +-- +-- Name: user_group_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE user_group_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 293 (OID 18143446) +-- +-- Name: user_group Type: TABLE +-- + +CREATE TABLE user_group ( + user_group_id integer DEFAULT '0' NOT NULL, + user_id integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + admin_flags character(16) DEFAULT '', + bug_flags integer DEFAULT '0' NOT NULL, + forum_flags integer DEFAULT '0' NOT NULL, + project_flags integer DEFAULT '2' NOT NULL, + patch_flags integer DEFAULT '1' NOT NULL, + support_flags integer DEFAULT '1' NOT NULL, + doc_flags integer DEFAULT '0' NOT NULL, + cvs_flags integer DEFAULT '1' NOT NULL, + member_role integer DEFAULT '100' NOT NULL, + release_flags integer DEFAULT '0' NOT NULL, + PRIMARY KEY (user_group_id) +); + +CREATE TRIGGER DEFAULT_user_group BEFORE + INSERT + ON user_group REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select user_group_pk_seq.nextval into :new.user_group_id from dual; +END; +/ + +-- +-- TOC Entry ID 172 (OID 18143484) +-- +-- Name: user_metric_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE user_metric_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 294 (OID 18143502) +-- +-- Name: user_metric Type: TABLE +-- + +CREATE TABLE user_metric ( + ranking integer DEFAULT '0' NOT NULL, + user_id integer DEFAULT '0' NOT NULL, + times_ranked integer DEFAULT '0' NOT NULL, + avg_raters_importance double precision DEFAULT '0.00000000' NOT NULL, + avg_rating double precision DEFAULT '0.00000000' NOT NULL, + metric double precision DEFAULT '0.00000000' NOT NULL, + percentile double precision DEFAULT '0.00000000' NOT NULL, + importance_factor double precision DEFAULT '0.00000000' NOT NULL, + PRIMARY KEY (ranking) +); + +CREATE TRIGGER DEFAULT_user_metric BEFORE + INSERT + ON user_metric REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select user_metric_pk_seq.nextval into :new.ranking from dual; +END; +/ + +-- +-- TOC Entry ID 174 (OID 18143530) +-- +-- Name: user_metric0_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE user_metric0_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 295 (OID 18143548) +-- +-- Name: user_metric0 Type: TABLE +-- + +CREATE TABLE user_metric0 ( + ranking integer DEFAULT '0' NOT NULL, + user_id integer DEFAULT '0' NOT NULL, + times_ranked integer DEFAULT '0' NOT NULL, + avg_raters_importance double precision DEFAULT '0.00000000' NOT NULL, + avg_rating double precision DEFAULT '0.00000000' NOT NULL, + metric double precision DEFAULT '0.00000000' NOT NULL, + percentile double precision DEFAULT '0.00000000' NOT NULL, + importance_factor double precision DEFAULT '0.00000000' NOT NULL, + PRIMARY KEY (ranking) +); + +CREATE TRIGGER DEFAULT_user_metric0 BEFORE + INSERT + ON user_metric0 REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select user_metric0_pk_seq.nextval into :new.ranking from dual; +END; +/ + +-- +-- TOC Entry ID 296 (OID 18143576) +-- +-- Name: user_preferences Type: TABLE +-- + +CREATE TABLE user_preferences ( + user_id integer DEFAULT '0' NOT NULL, + preference_name character varying(20), + preference_value character varying(20), + set_date integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 297 (OID 18143591) +-- +-- Name: user_ratings Type: TABLE +-- + +CREATE TABLE user_ratings ( + rated_by integer DEFAULT '0' NOT NULL, + user_id integer DEFAULT '0' NOT NULL, + rate_field integer DEFAULT '0' NOT NULL, + rating integer DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 176 (OID 18143608) +-- +-- Name: users_pk_seq Type: SEQUENCE +-- + +CREATE SEQUENCE users_pk_seq start with 100 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 298 (OID 18143626) +-- +-- Name: users Type: TABLE +-- + +CREATE TABLE users ( + user_id integer DEFAULT '0' NOT NULL, + user_name varchar2(255) DEFAULT '', + email varchar2(255) DEFAULT '', + user_pw character varying(32) DEFAULT '', + realname character varying(32) DEFAULT '', + status character(1) DEFAULT 'A' NOT NULL, + shell character varying(20) DEFAULT '/bin/bash' NOT NULL, + unix_pw character varying(40) DEFAULT '', + unix_status character(1) DEFAULT 'N' NOT NULL, + unix_uid integer DEFAULT '0' NOT NULL, + unix_box character varying(10) DEFAULT 'shell1' NOT NULL, + add_date integer DEFAULT '0' NOT NULL, + confirm_hash character varying(32), + mail_siteupdates integer DEFAULT '0' NOT NULL, + mail_va integer DEFAULT '0' NOT NULL, + authorized_keys varchar2(255), + email_new varchar2(255), + people_view_skills integer DEFAULT '0' NOT NULL, + people_resume varchar2(255) DEFAULT '', + timezone character varying(64) DEFAULT 'GMT', + language integer DEFAULT '1' NOT NULL, + PRIMARY KEY (user_id) +); + +CREATE TRIGGER DEFAULT_users BEFORE + INSERT + ON users REFERENCING OLD AS old NEW AS new + FOR EACH ROW +BEGIN + select users_pk_seq.nextval into :new.user_id from dual; +END; +/ + +-- +-- TOC Entry ID 178 (OID 27311232) +-- +-- Name: unix_uid_seq Type: SEQUENCE +-- + +CREATE SEQUENCE unix_uid_seq start with 600 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 180 (OID 27311250) +-- +-- Name: forum_thread_seq Type: SEQUENCE +-- + +CREATE SEQUENCE forum_thread_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ; + +-- +-- TOC Entry ID 299 (OID 27311451) +-- +-- Name: trove_agg Type: TABLE +-- + +CREATE TABLE trove_agg ( + trove_cat_id integer, + group_id integer, + group_name character varying(40), + unix_group_name character varying(30), + status character(1), + register_time integer, + short_description character varying(255), + percentile double precision, + ranking integer +); + +-- +-- TOC Entry ID 302 (OID 30136736) +-- +-- Name: activity_log Type: TABLE Owner: www +-- + +CREATE TABLE activity_log ( + day integer DEFAULT '0' NOT NULL, + hour integer DEFAULT '0' NOT NULL, + group_id integer DEFAULT '0' NOT NULL, + browser character varying(8) DEFAULT 'OTHER' NOT NULL, + ver double precision DEFAULT '0.00' NOT NULL, + platform character varying(8) DEFAULT 'OTHER' NOT NULL, + time integer DEFAULT '0' NOT NULL, + page varchar2(255), + type integer DEFAULT '0' NOT NULL +); + +--\connect - tperdue +-- +-- TOC Entry ID 316 (OID 18138445) +-- +-- Name: bug_group_id Type: INDEX +-- + +CREATE INDEX bug_group_id on bug ( group_id ); + +-- +-- TOC Entry ID 466 (OID 18138445) +-- +-- Name: bug_groupid_statusid Type: INDEX +-- + +CREATE INDEX bug_groupid_statusid on bug ( group_id , status_id ); + +-- +-- TOC Entry ID 467 (OID 18138445) +-- +-- Name: bug_groupid_assignedto_statusid Type: INDEX +-- + +CREATE INDEX bug_groupid_assngto_stsid on bug ( group_id , assigned_to , status_id ); + +-- +-- TOC Entry ID 317 (OID 18138513) +-- +-- Name: bug_bug_dependencies_bug_id Type: INDEX +-- + +CREATE INDEX bug_bug_dependencies_bug_id on bug_bug_dependencies ( bug_id ); + +-- +-- TOC Entry ID 318 (OID 18138513) +-- +-- Name: bug_bug_is_dependent_on_task_id Type: INDEX +-- + +CREATE INDEX bug_bug_is_dpnd_on_tsk_id on bug_bug_dependencies ( is_dependent_on_bug_id ); + +-- +-- TOC Entry ID 319 (OID 18138549) +-- +-- Name: bug_canned_response_group_id Type: INDEX +-- + +CREATE INDEX bug_canned_response_group_id on bug_canned_responses ( group_id ); + +-- +-- TOC Entry ID 320 (OID 18138600) +-- +-- Name: bug_category_group_id Type: INDEX +-- + +CREATE INDEX bug_category_group_id on bug_category ( group_id ); + +-- +-- TOC Entry ID 321 (OID 18138705) +-- +-- Name: bug_group_group_id Type: INDEX +-- + +CREATE INDEX bug_group_group_id on bug_group ( group_id ); + +-- +-- TOC Entry ID 322 (OID 18138756) +-- +-- Name: bug_history_bug_id Type: INDEX +-- + +CREATE INDEX bug_history_bug_id on bug_history ( bug_id ); + +-- +-- TOC Entry ID 323 (OID 18138909) +-- +-- Name: bug_task_dependencies_bug_id Type: INDEX +-- + +CREATE INDEX bug_task_dependencies_bug_id on bug_task_dependencies ( bug_id ); + +-- +-- TOC Entry ID 324 (OID 18138909) +-- +-- Name: bug_task_is_dpndnt_on_tsk_i Type: INDEX +-- + +CREATE INDEX bug_task_is_dpndnt_on_tsk_i on bug_task_dependencies ( is_dependent_on_task_id ); + +-- +-- TOC Entry ID 325 (OID 18138995) +-- +-- Name: db_images_group Type: INDEX +-- + +CREATE INDEX db_images_group on db_images ( group_id ); + +-- +-- TOC Entry ID 326 (OID 18139058) +-- +-- Name: doc_group_doc_group Type: INDEX +-- + +CREATE INDEX doc_group_doc_group on doc_data ( doc_group ); + +-- +-- TOC Entry ID 327 (OID 18139122) +-- +-- Name: doc_groups_group Type: INDEX +-- + +CREATE INDEX doc_groups_group on doc_groups ( group_id ); + +-- +-- TOC Entry ID 328 (OID 18139192) +-- +-- Name: filemodule_monitor_id Type: INDEX +-- + +CREATE INDEX filemodule_monitor_id on filemodule_monitor ( filemodule_id ); + +-- +-- TOC Entry ID 329 (OID 18139228) +-- +-- Name: forum_forumid_msgid Type: INDEX +-- + +CREATE INDEX forum_forumid_msgid on forum ( group_forum_id , msg_id ); + +-- +-- TOC Entry ID 330 (OID 18139228) +-- +-- Name: forum_group_forum_id Type: INDEX +-- + +CREATE INDEX forum_group_forum_id on forum ( group_forum_id ); + +-- +-- TOC Entry ID 331 (OID 18139228) +-- +-- Name: forum_forumid_isfollowupto Type: INDEX +-- + +CREATE INDEX forum_forumid_isfollowupto on forum ( group_forum_id , is_followup_to ); + +-- +-- TOC Entry ID 332 (OID 18139228) +-- +-- Name: forum_forumid_threadid_mostrece Type: INDEX +-- + +CREATE INDEX forum_formid_thrdid_mstrc on forum ( group_forum_id , thread_id , most_recent_date ); + +-- +-- TOC Entry ID 333 (OID 18139228) +-- +-- Name: forum_threadid_isfollowupto Type: INDEX +-- + +CREATE INDEX forum_threadid_isfollowupto on forum ( thread_id , is_followup_to ); + +-- +-- TOC Entry ID 334 (OID 18139228) +-- +-- Name: forum_forumid_isfollto_mostrece Type: INDEX +-- + +CREATE INDEX forum_forumid_isfollto_mstrc on forum ( group_forum_id , is_followup_to , most_recent_date ); + +-- +-- TOC Entry ID 335 (OID 18139309) +-- +-- Name: forum_group_list_group_id Type: INDEX +-- + +CREATE INDEX forum_group_list_group_id on forum_group_list ( group_id ); + +-- +-- TOC Entry ID 336 (OID 18139366) +-- +-- Name: forum_monitor_combo_id Type: INDEX +-- + +CREATE INDEX forum_monitor_combo_id on forum_monitored_forums ( forum_id , user_id ); + +-- +-- TOC Entry ID 337 (OID 18139366) +-- +-- Name: forum_monitor_thread_id Type: INDEX +-- + +CREATE INDEX forum_monitor_thread_id on forum_monitored_forums ( forum_id ); + +-- +-- TOC Entry ID 338 (OID 18139510) +-- +-- Name: foundry_news_foundry_approved_d Type: INDEX +-- + +CREATE INDEX foundry_news_fndry_apprvd_d on foundry_news ( foundry_id , is_approved , approve_date ); + +-- +-- TOC Entry ID 339 (OID 18139510) +-- +-- Name: foundry_news_foundry_approved Type: INDEX +-- + +CREATE INDEX foundry_news_foundry_approved on foundry_news ( foundry_id , is_approved ); + +-- +-- TOC Entry ID 340 (OID 18139510) +-- +-- Name: foundry_news_foundry Type: INDEX +-- + +CREATE INDEX foundry_news_foundry on foundry_news ( foundry_id ); + +-- +-- TOC Entry ID 463 (OID 18139510) +-- +-- Name: foundrynews_foundry_dt_apprv Type: INDEX +-- + +CREATE INDEX foundrynews_foundry_dt_apprv on foundry_news ( foundry_id , approve_date , is_approved ); + +-- +-- TOC Entry ID 341 (OID 18139550) +-- +-- Name: foundry_project_group_rank Type: INDEX +-- + +CREATE INDEX foundry_project_group_rank on foundry_preferred_projects ( group_id , rank ); + +-- +-- TOC Entry ID 342 (OID 18139550) +-- +-- Name: foundry_project_group Type: INDEX +-- + +CREATE INDEX foundry_project_group on foundry_preferred_projects ( group_id ); + +-- +-- TOC Entry ID 343 (OID 18139588) +-- +-- Name: foundry_projects_foundry Type: INDEX +-- + +CREATE INDEX foundry_projects_foundry on foundry_projects ( foundry_id ); + +-- +-- TOC Entry ID 344 (OID 18139606) +-- +-- Name: downloads_http_idx Type: INDEX +-- + +CREATE INDEX downloads_http_idx on frs_dlstats_agg ( downloads_http ); + +-- +-- TOC Entry ID 345 (OID 18139606) +-- +-- Name: downloads_ftp_idx Type: INDEX +-- + +CREATE INDEX downloads_ftp_idx on frs_dlstats_agg ( downloads_ftp ); + +-- +-- TOC Entry ID 346 (OID 18139606) +-- +-- Name: file_id_idx Type: INDEX +-- + +CREATE INDEX file_id_idx on frs_dlstats_agg ( file_id ); + +-- +-- TOC Entry ID 347 (OID 18139606) +-- +-- Name: day_idx Type: INDEX +-- + +CREATE INDEX day_idx on frs_dlstats_agg ( day ); + +-- +-- TOC Entry ID 348 (OID 18139623) +-- +-- Name: dlstats_file_down Type: INDEX +-- + +CREATE INDEX dlstats_file_down on frs_dlstats_file_agg ( downloads ); + +-- +-- TOC Entry ID 349 (OID 18139623) +-- +-- Name: dlstats_file_file_id Type: INDEX +-- + +CREATE INDEX dlstats_file_file_id on frs_dlstats_file_agg ( file_id ); + +-- +-- TOC Entry ID 350 (OID 18139623) +-- +-- Name: dlstats_file_day Type: INDEX +-- + +CREATE INDEX dlstats_file_day on frs_dlstats_file_agg ( day ); + +-- +-- TOC Entry ID 351 (OID 18139638) +-- +-- Name: stats_agr_tmp_fid Type: INDEX +-- + +-- Removed because is not needed because is created in table definition +-- CREATE INDEX stats_agr_tmp_fid on frs_dlstats_filetotal_agg ( file_id ); + +-- +-- TOC Entry ID 352 (OID 18139654) +-- +-- Name: frs_dlstats_filetotal_agg_old_f Type: INDEX +-- + +CREATE INDEX frs_dlstats_filettl_agg_old_f on frs_dlstats_filetotal_agg_old ( file_id ); + +-- +-- TOC Entry ID 303 (OID 18139667) +-- +-- Name: frsdlstatsgroupagg_day_dls Type: INDEX +-- + +CREATE INDEX frsdlstatsgroupagg_day_dls on frs_dlstats_group_agg ( day , downloads ); + +-- +-- TOC Entry ID 353 (OID 18139667) +-- +-- Name: group_id_idx Type: INDEX +-- + +CREATE INDEX group_id_idx on frs_dlstats_group_agg ( group_id ); + +-- +-- TOC Entry ID 355 (OID 18139667) +-- +-- Name: frs_dlstats_group_agg_day Type: INDEX +-- + +CREATE INDEX frs_dlstats_group_agg_day on frs_dlstats_group_agg ( day ); + +-- +-- TOC Entry ID 356 (OID 18139682) +-- +-- Name: stats_agr_tmp_gid Type: INDEX +-- + +CREATE INDEX stats_agr_tmp_gid on frs_dlstats_grouptotal_agg ( group_id ); + +-- +-- TOC Entry ID 357 (OID 18139714) +-- +-- Name: frs_file_name Type: INDEX +-- + +CREATE INDEX frs_file_name on frs_file ( filename ); + +-- +-- TOC Entry ID 358 (OID 18139714) +-- +-- Name: frs_file_date Type: INDEX +-- + +CREATE INDEX frs_file_date on frs_file ( post_date ); + +-- +-- TOC Entry ID 359 (OID 18139714) +-- +-- Name: frs_file_processor Type: INDEX +-- + +CREATE INDEX frs_file_processor on frs_file ( processor_id ); + +-- +-- TOC Entry ID 360 (OID 18139714) +-- +-- Name: frs_file_release_id Type: INDEX +-- + +CREATE INDEX frs_file_release_id on frs_file ( release_id ); + +-- +-- TOC Entry ID 361 (OID 18139714) +-- +-- Name: frs_file_type Type: INDEX +-- + +CREATE INDEX frs_file_type on frs_file ( type_id ); + +-- +-- TOC Entry ID 362 (OID 18139822) +-- +-- Name: package_group_id Type: INDEX +-- + +CREATE INDEX package_group_id on frs_package ( group_id ); + +-- +-- TOC Entry ID 363 (OID 18139922) +-- +-- Name: frs_release_package Type: INDEX +-- + +CREATE INDEX frs_release_package on frs_release ( package_id ); + +-- +-- TOC Entry ID 364 (OID 18139922) +-- +-- Name: frs_release_date Type: INDEX +-- + +CREATE INDEX frs_release_date on frs_release ( release_date ); + +-- +-- TOC Entry ID 365 (OID 18139922) +-- +-- Name: frs_release_by Type: INDEX +-- + +CREATE INDEX frs_release_by on frs_release ( released_by ); + +-- +-- TOC Entry ID 366 (OID 18140030) +-- +-- Name: group_cvs_history_group_id Type: INDEX +-- + +CREATE INDEX group_cvs_history_group_id on group_cvs_history ( group_id ); + +-- +-- TOC Entry ID 367 (OID 18140030) +-- +-- Name: user_name_idx Type: INDEX +-- + +CREATE INDEX user_name_idx on group_cvs_history ( user_name ); + +-- +-- TOC Entry ID 368 (OID 18140074) +-- +-- Name: group_history_group_id Type: INDEX +-- + +CREATE INDEX group_history_group_id on group_history ( group_id ); + +-- +-- TOC Entry ID 369 (OID 18140178) +-- +-- Name: groups_unix Type: INDEX +-- + +CREATE INDEX groups_unix on groups ( unix_group_name ); + +-- +-- TOC Entry ID 370 (OID 18140178) +-- +-- Name: groups_type Type: INDEX +-- + +CREATE INDEX groups_type on groups ( type ); + +-- +-- TOC Entry ID 371 (OID 18140178) +-- +-- Name: groups_public Type: INDEX +-- + +CREATE INDEX groups_public on groups ( is_public ); + +-- +-- TOC Entry ID 372 (OID 18140178) +-- +-- Name: groups_status Type: INDEX +-- + +CREATE INDEX groups_status on groups ( status ); + +-- +-- TOC Entry ID 373 (OID 18140319) +-- +-- Name: mail_group_list_group Type: INDEX +-- + +CREATE INDEX mail_group_list_group on mail_group_list ( group_id ); + +-- +-- TOC Entry ID 374 (OID 18140377) +-- +-- Name: news_bytes_group Type: INDEX +-- + +CREATE INDEX news_bytes_group on news_bytes ( group_id ); + +-- +-- TOC Entry ID 375 (OID 18140377) +-- +-- Name: news_bytes_approved Type: INDEX +-- + +CREATE INDEX news_bytes_approved on news_bytes ( is_approved ); + +-- +-- TOC Entry ID 376 (OID 18140377) +-- +-- Name: news_bytes_forum Type: INDEX +-- + +CREATE INDEX news_bytes_forum on news_bytes ( forum_id ); + +-- +-- TOC Entry ID 464 (OID 18140377) +-- +-- Name: news_group_date Type: INDEX +-- + +CREATE INDEX news_group_date on news_bytes ( group_id , sf_date ); + +-- +-- TOC Entry ID 465 (OID 18140377) +-- +-- Name: news_approved_date Type: INDEX +-- + +CREATE INDEX news_approved_date on news_bytes ( is_approved , sf_date ); + +-- +-- TOC Entry ID 377 (OID 18140437) +-- +-- Name: patch_group_id Type: INDEX +-- + +CREATE INDEX patch_group_id on patch ( group_id ); + +-- +-- TOC Entry ID 451 (OID 18140437) +-- +-- Name: patch_groupid_assignedto_status Type: INDEX +-- + +CREATE INDEX patch_groupid_assgndto_sts on patch ( group_id , assigned_to , patch_status_id ); + +-- +-- TOC Entry ID 452 (OID 18140437) +-- +-- Name: patch_groupid_assignedto Type: INDEX +-- + +CREATE INDEX patch_groupid_assignedto on patch ( group_id , assigned_to ); + +-- +-- TOC Entry ID 453 (OID 18140437) +-- +-- Name: patch_groupid_status Type: INDEX +-- + +CREATE INDEX patch_groupid_status on patch ( group_id , patch_status_id ); + +-- +-- TOC Entry ID 378 (OID 18140501) +-- +-- Name: patch_group_group_id Type: INDEX +-- + +CREATE INDEX patch_group_group_id on patch_category ( group_id ); + +-- +-- TOC Entry ID 379 (OID 18140552) +-- +-- Name: patch_history_patch_id Type: INDEX +-- + +CREATE INDEX patch_history_patch_id on patch_history ( patch_id ); + +-- +-- TOC Entry ID 461 (OID 18140656) +-- +-- Name: people_job_group_id Type: INDEX +-- + +CREATE INDEX people_job_group_id on people_job ( group_id ); + +-- +-- TOC Entry ID 380 (OID 18141038) +-- +-- Name: project_assgnd_to_assgnd_to Type: INDEX +-- + +CREATE INDEX project_assgnd_to_assgnd_to on project_assigned_to ( assigned_to_id ); + +-- +-- TOC Entry ID 381 (OID 18141038) +-- +-- Name: project_assigned_to_task_id Type: INDEX +-- + +CREATE INDEX project_assigned_to_task_id on project_assigned_to ( project_task_id ); + +-- +-- TOC Entry ID 382 (OID 18141128) +-- +-- Name: project_is_depndnt_on_tsk_id Type: INDEX +-- + +CREATE INDEX project_is_depndnt_on_tsk_id on project_dependencies ( is_dependent_on_task_id ); + +-- +-- TOC Entry ID 383 (OID 18141128) +-- +-- Name: project_dependencies_task_id Type: INDEX +-- + +CREATE INDEX project_dependencies_task_id on project_dependencies ( project_task_id ); + +-- +-- TOC Entry ID 384 (OID 18141164) +-- +-- Name: project_group_list_group_id Type: INDEX +-- + +CREATE INDEX project_group_list_group_id on project_group_list ( group_id ); + +-- +-- TOC Entry ID 385 (OID 18141218) +-- +-- Name: project_history_task_id Type: INDEX +-- + +CREATE INDEX project_history_task_id on project_history ( project_task_id ); + +-- +-- TOC Entry ID 386 (OID 18141275) +-- +-- Name: project_metric_group Type: INDEX +-- + +CREATE INDEX project_metric_group on project_metric ( group_id ); + +-- +-- TOC Entry ID 387 (OID 18141430) +-- +-- Name: project_task_group_project_id Type: INDEX +-- + +CREATE INDEX project_task_group_project_id on project_task ( group_project_id ); + +-- +-- TOC Entry ID 454 (OID 18141430) +-- +-- Name: projecttask_projid_status Type: INDEX +-- + +CREATE INDEX projecttask_projid_status on project_task ( group_project_id , status_id ); + +-- +-- TOC Entry ID 354 (OID 18141497) +-- +-- Name: projectweeklymetric_ranking Type: INDEX +-- + +-- Removed because is not needed because is created in table definition +-- CREATE INDEX projectweeklymetric_ranking on project_weekly_metric ( ranking ); + +-- +-- TOC Entry ID 388 (OID 18141497) +-- +-- Name: project_metric_weekly_group Type: INDEX +-- + +CREATE INDEX project_metric_weekly_group on project_weekly_metric ( group_id ); + +-- +-- TOC Entry ID 389 (OID 18141514) +-- +-- Name: sf_session_user_id Type: INDEX +-- + +CREATE INDEX sf_session_user_id on sf_session ( user_id ); + +-- +-- TOC Entry ID 390 (OID 18141514) +-- +-- Name: sf_session_time Type: INDEX +-- + +CREATE INDEX sf_session_time on sf_session ( time ); + +-- +-- TOC Entry ID 391 (OID 18141552) +-- +-- Name: snippet_language Type: INDEX +-- + +CREATE INDEX snippet_language on snippet ( language ); + +-- +-- TOC Entry ID 392 (OID 18141552) +-- +-- Name: snippet_category Type: INDEX +-- + +CREATE INDEX snippet_category on snippet ( category ); + +-- +-- TOC Entry ID 393 (OID 18141611) +-- +-- Name: snippet_package_language Type: INDEX +-- + +CREATE INDEX snippet_package_language on snippet_package ( language ); + +-- +-- TOC Entry ID 394 (OID 18141611) +-- +-- Name: snippet_package_category Type: INDEX +-- + +CREATE INDEX snippet_package_category on snippet_package ( category ); + +-- +-- TOC Entry ID 395 (OID 18141666) +-- +-- Name: snippet_package_item_pkg_ver Type: INDEX +-- + +CREATE INDEX snippet_package_item_pkg_ver on snippet_package_item ( snippet_package_version_id ); + +-- +-- TOC Entry ID 396 (OID 18141702) +-- +-- Name: snippet_package_version_pkg_id Type: INDEX +-- + +CREATE INDEX snippet_package_version_pkg_id on snippet_package_version ( snippet_package_id ); + +-- +-- TOC Entry ID 397 (OID 18141757) +-- +-- Name: snippet_version_snippet_id Type: INDEX +-- + +CREATE INDEX snippet_version_snippet_id on snippet_version ( snippet_id ); + +-- +-- TOC Entry ID 398 (OID 18141829) +-- +-- Name: pages_by_day_day Type: INDEX +-- + +CREATE INDEX pages_by_day_day on stats_agg_pages_by_day ( day ); + +-- +-- TOC Entry ID 399 (OID 18141881) +-- +-- Name: stats_agr_filerelease_group_id Type: INDEX +-- + +CREATE INDEX stats_agr_filerelease_group_id on stats_agr_filerelease ( group_id ); + +-- +-- TOC Entry ID 400 (OID 18141881) +-- +-- Name: stats_agr_filerelease_filerelea Type: INDEX +-- + +CREATE INDEX stats_agr_filerelease_flrl on stats_agr_filerelease ( filerelease_id ); + +-- +-- TOC Entry ID 401 (OID 18141896) +-- +-- Name: project_agr_log_group Type: INDEX +-- + +CREATE INDEX project_agr_log_group on stats_agr_project ( group_id ); + +-- +-- TOC Entry ID 402 (OID 18141949) +-- +-- Name: ftpdl_group_id Type: INDEX +-- + +CREATE INDEX ftpdl_group_id on stats_ftp_downloads ( group_id ); + +-- +-- TOC Entry ID 403 (OID 18141949) +-- +-- Name: ftpdl_fid Type: INDEX +-- + +CREATE INDEX ftpdl_fid on stats_ftp_downloads ( filerelease_id ); + +-- +-- TOC Entry ID 404 (OID 18141949) +-- +-- Name: ftpdl_day Type: INDEX +-- + +CREATE INDEX ftpdl_day on stats_ftp_downloads ( day ); + +-- +-- TOC Entry ID 405 (OID 18141966) +-- +-- Name: httpdl_group_id Type: INDEX +-- + +CREATE INDEX httpdl_group_id on stats_http_downloads ( group_id ); + +-- +-- TOC Entry ID 406 (OID 18141966) +-- +-- Name: httpdl_fid Type: INDEX +-- + +CREATE INDEX httpdl_fid on stats_http_downloads ( filerelease_id ); + +-- +-- TOC Entry ID 407 (OID 18141966) +-- +-- Name: httpdl_day Type: INDEX +-- + +CREATE INDEX httpdl_day on stats_http_downloads ( day ); + +-- +-- TOC Entry ID 408 (OID 18141983) +-- +-- Name: archive_project_monthday Type: INDEX +-- + +CREATE INDEX archive_project_monthday on stats_project ( month , day ); + +-- +-- TOC Entry ID 409 (OID 18141983) +-- +-- Name: project_log_group Type: INDEX +-- + +CREATE INDEX project_log_group on stats_project ( group_id ); + +-- +-- TOC Entry ID 410 (OID 18141983) +-- +-- Name: archive_project_week Type: INDEX +-- + +CREATE INDEX archive_project_week on stats_project ( week ); + +-- +-- TOC Entry ID 411 (OID 18141983) +-- +-- Name: archive_project_day Type: INDEX +-- + +CREATE INDEX archive_project_day on stats_project ( day ); + +-- +-- TOC Entry ID 412 (OID 18141983) +-- +-- Name: archive_project_month Type: INDEX +-- + +CREATE INDEX archive_project_month on stats_project ( month ); + +-- +-- TOC Entry ID 413 (OID 18142042) +-- +-- Name: stats_project_tmp_group_id Type: INDEX +-- + +CREATE INDEX stats_project_tmp_group_id on stats_project_tmp ( group_id ); + +-- +-- TOC Entry ID 414 (OID 18142042) +-- +-- Name: project_stats_week Type: INDEX +-- + +CREATE INDEX project_stats_week on stats_project_tmp ( week ); + +-- +-- TOC Entry ID 415 (OID 18142042) +-- +-- Name: project_stats_month Type: INDEX +-- + +CREATE INDEX project_stats_month on stats_project_tmp ( month ); + +-- +-- TOC Entry ID 416 (OID 18142042) +-- +-- Name: project_stats_day Type: INDEX +-- + +CREATE INDEX project_stats_day on stats_project_tmp ( day ); + +-- +-- TOC Entry ID 417 (OID 18142101) +-- +-- Name: stats_site_monthday Type: INDEX +-- + +CREATE INDEX stats_site_monthday on stats_site ( month , day ); + +-- +-- TOC Entry ID 418 (OID 18142101) +-- +-- Name: stats_site_week Type: INDEX +-- + +CREATE INDEX stats_site_week on stats_site ( week ); + +-- +-- TOC Entry ID 419 (OID 18142101) +-- +-- Name: stats_site_day Type: INDEX +-- + +CREATE INDEX stats_site_day on stats_site ( day ); + +-- +-- TOC Entry ID 420 (OID 18142101) +-- +-- Name: stats_site_month Type: INDEX +-- + +CREATE INDEX stats_site_month on stats_site ( month ); + +-- +-- TOC Entry ID 421 (OID 18142150) +-- +-- Name: support_group_id Type: INDEX +-- + +CREATE INDEX support_group_id on support ( group_id ); + +-- +-- TOC Entry ID 448 (OID 18142150) +-- +-- Name: support_groupid_assignedto Type: INDEX +-- + +CREATE INDEX support_groupid_assignedto on support ( group_id , assigned_to ); + +-- +-- TOC Entry ID 449 (OID 18142150) +-- +-- Name: support_groupid_assignedto_stat Type: INDEX +-- + +CREATE INDEX support_groupid_assgndto_stt on support ( group_id , assigned_to , support_status_id ); + +-- +-- TOC Entry ID 450 (OID 18142150) +-- +-- Name: support_groupid_status Type: INDEX +-- + +CREATE INDEX support_groupid_status on support ( group_id , support_status_id ); + +-- +-- TOC Entry ID 422 (OID 18142214) +-- +-- Name: support_canned_response_group_i Type: INDEX +-- + +CREATE INDEX support_canned_rspns_grp_i on support_canned_responses ( group_id ); + +-- +-- TOC Entry ID 423 (OID 18142265) +-- +-- Name: support_group_group_id Type: INDEX +-- + +CREATE INDEX support_group_group_id on support_category ( group_id ); + +-- +-- TOC Entry ID 424 (OID 18142316) +-- +-- Name: support_history_support_id Type: INDEX +-- + +CREATE INDEX support_history_support_id on support_history ( support_id ); + +-- +-- TOC Entry ID 425 (OID 18142372) +-- +-- Name: support_messages_support_id Type: INDEX +-- + +CREATE INDEX support_messages_support_id on support_messages ( support_id ); + +-- +-- TOC Entry ID 426 (OID 18142473) +-- +-- Name: supported_languages_code Type: INDEX +-- + +CREATE INDEX supported_languages_code on supported_languages ( language_code ); + +-- +-- TOC Entry ID 427 (OID 18142573) +-- +-- Name: survey_questions_group Type: INDEX +-- + +CREATE INDEX survey_questions_group on survey_questions ( group_id ); + +-- +-- TOC Entry ID 428 (OID 18142608) +-- +-- Name: survey_rating_aggregate_type_id Type: INDEX +-- + +CREATE INDEX survey_rating_aggrgt_typ_id on survey_rating_aggregate ( type , id ); + +-- +-- TOC Entry ID 429 (OID 18142625) +-- +-- Name: survey_rating_responses_user_ty Type: INDEX +-- + +CREATE INDEX survey_rating_rspns_usr_ty on survey_rating_response ( user_id , type , id ); + +-- +-- TOC Entry ID 430 (OID 18142625) +-- +-- Name: survey_rating_responses_type_id Type: INDEX +-- + +CREATE INDEX survey_rating_rspns_typ_id on survey_rating_response ( type , id ); + +-- +-- TOC Entry ID 431 (OID 18142644) +-- +-- Name: survey_responses_group_id Type: INDEX +-- + +CREATE INDEX survey_responses_group_id on survey_responses ( group_id ); + +-- +-- TOC Entry ID 432 (OID 18142644) +-- +-- Name: survey_responses_user_survey_qu Type: INDEX +-- + +CREATE INDEX survey_rspns_usr_srvy_qu on survey_responses ( user_id , survey_id , question_id ); + +-- +-- TOC Entry ID 433 (OID 18142644) +-- +-- Name: survey_responses_user_survey Type: INDEX +-- + +CREATE INDEX survey_responses_user_survey on survey_responses ( user_id , survey_id ); + +-- +-- TOC Entry ID 434 (OID 18142644) +-- +-- Name: survey_responses_survey_questio Type: INDEX +-- + +CREATE INDEX survey_rspns_srvy_quest on survey_responses ( survey_id , question_id ); + +-- +-- TOC Entry ID 435 (OID 18142698) +-- +-- Name: surveys_group Type: INDEX +-- + +CREATE INDEX surveys_group on surveys ( group_id ); + +-- +-- TOC Entry ID 436 (OID 18143071) +-- +-- Name: rank_forumposts_week_idx Type: INDEX +-- + +CREATE INDEX rank_forumposts_week_idx on top_group ( rank_forumposts_week ); + +-- +-- TOC Entry ID 437 (OID 18143071) +-- +-- Name: rank_downloads_week_idx Type: INDEX +-- + +CREATE INDEX rank_downloads_week_idx on top_group ( rank_downloads_week ); + +-- +-- TOC Entry ID 438 (OID 18143071) +-- +-- Name: pageviews_proj_idx Type: INDEX +-- + +CREATE INDEX pageviews_proj_idx on top_group ( pageviews_proj ); + +-- +-- TOC Entry ID 439 (OID 18143071) +-- +-- Name: rank_userrank_idx Type: INDEX +-- + +CREATE INDEX rank_userrank_idx on top_group ( rank_userrank ); + +-- +-- TOC Entry ID 440 (OID 18143071) +-- +-- Name: rank_downloads_all_idx Type: INDEX +-- + +CREATE INDEX rank_downloads_all_idx on top_group ( rank_downloads_all ); + +-- +-- TOC Entry ID 441 (OID 18143131) +-- +-- Name: parent_idx Type: INDEX +-- + +CREATE INDEX parent_idx on trove_cat ( parent ); + +-- +-- TOC Entry ID 442 (OID 18143131) +-- +-- Name: root_parent_idx Type: INDEX +-- + +CREATE INDEX root_parent_idx on trove_cat ( root_parent ); + +-- +-- TOC Entry ID 443 (OID 18143131) +-- +-- Name: version_idx Type: INDEX +-- + +CREATE INDEX version_idx on trove_cat ( version ); + +-- +-- TOC Entry ID 444 (OID 18143194) +-- +-- Name: trove_group_link_group_id Type: INDEX +-- + +CREATE INDEX trove_group_link_group_id on trove_group_link ( group_id ); + +-- +-- TOC Entry ID 445 (OID 18143194) +-- +-- Name: trove_group_link_cat_id Type: INDEX +-- + +CREATE INDEX trove_group_link_cat_id on trove_group_link ( trove_cat_id ); + +-- +-- TOC Entry ID 446 (OID 18143304) +-- +-- Name: user_bookmark_user_id Type: INDEX +-- + +CREATE INDEX user_bookmark_user_id on user_bookmarks ( user_id ); + +-- +-- TOC Entry ID 304 (OID 18143355) +-- +-- Name: user_diary_user Type: INDEX +-- + +CREATE INDEX user_diary_user on user_diary ( user_id ); + +-- +-- TOC Entry ID 305 (OID 18143355) +-- +-- Name: user_diary_user_date Type: INDEX +-- + +CREATE INDEX user_diary_user_date on user_diary ( user_id , date_posted ); + +-- +-- TOC Entry ID 306 (OID 18143355) +-- +-- Name: user_diary_date Type: INDEX +-- + +CREATE INDEX user_diary_date on user_diary ( date_posted ); + +-- +-- TOC Entry ID 307 (OID 18143410) +-- +-- Name: user_diary_monitor_user Type: INDEX +-- + +CREATE INDEX user_diary_monitor_user on user_diary_monitor ( user_id ); + +-- +-- TOC Entry ID 308 (OID 18143410) +-- +-- Name: user_diary_monitor_monitored_us Type: INDEX +-- + +CREATE INDEX user_diary_monitor_mntrd_us on user_diary_monitor ( monitored_user ); + +-- +-- TOC Entry ID 309 (OID 18143446) +-- +-- Name: user_group_group_id Type: INDEX +-- + +CREATE INDEX user_group_group_id on user_group ( group_id ); + +-- +-- TOC Entry ID 310 (OID 18143446) +-- +-- Name: bug_flags_idx Type: INDEX +-- + +CREATE INDEX bug_flags_idx on user_group ( bug_flags ); + +-- +-- TOC Entry ID 311 (OID 18143446) +-- +-- Name: project_flags_idx Type: INDEX +-- + +CREATE INDEX project_flags_idx on user_group ( project_flags ); + +-- +-- TOC Entry ID 312 (OID 18143446) +-- +-- Name: user_group_user_id Type: INDEX +-- + +CREATE INDEX user_group_user_id on user_group ( user_id ); + +-- +-- TOC Entry ID 313 (OID 18143446) +-- +-- Name: admin_flags_idx Type: INDEX +-- + +CREATE INDEX admin_flags_idx on user_group ( admin_flags ); + +-- +-- TOC Entry ID 314 (OID 18143446) +-- +-- Name: forum_flags_idx Type: INDEX +-- + +CREATE INDEX forum_flags_idx on user_group ( forum_flags ); + +-- +-- TOC Entry ID 315 (OID 18143548) +-- +-- Name: user_metric0_user_id Type: INDEX +-- + +CREATE INDEX user_metric0_user_id on user_metric0 ( user_id ); + +-- +-- TOC Entry ID 455 (OID 18143576) +-- +-- Name: user_pref_user_id Type: INDEX +-- + +CREATE INDEX user_pref_user_id on user_preferences ( user_id ); + +-- +-- TOC Entry ID 456 (OID 18143591) +-- +-- Name: user_ratings_rated_by Type: INDEX +-- + +CREATE INDEX user_ratings_rated_by on user_ratings ( rated_by ); + +-- +-- TOC Entry ID 457 (OID 18143591) +-- +-- Name: user_ratings_user_id Type: INDEX +-- + +CREATE INDEX user_ratings_user_id on user_ratings ( user_id ); + +-- +-- TOC Entry ID 447 (OID 18143626) +-- +-- Name: users_status Type: INDEX +-- + +CREATE INDEX users_status on users ( status ); + +-- +-- TOC Entry ID 458 (OID 18143626) +-- +-- Name: user_user Type: INDEX +-- + +-- Removed because is not needed because is created in table definition +-- CREATE INDEX user_user on users ( status ); + +-- +-- TOC Entry ID 459 (OID 18143626) +-- +-- Name: idx_users_username Type: INDEX +-- + +CREATE INDEX idx_users_username on users ( user_name ); + +-- +-- TOC Entry ID 462 (OID 18143626) +-- +-- Name: users_user_pw Type: INDEX +-- + +CREATE INDEX users_user_pw on users ( user_pw ); + +-- +-- TOC Entry ID 460 (OID 27311451) +-- +-- Name: troveagg_trovecatid Type: INDEX +-- + +CREATE INDEX troveagg_trovecatid on trove_agg ( trove_cat_id ); + +-- +-- TOC Entry ID 536 (OID 27311269) +-- +-- Name: RI_ConstraintTrigger_27311268 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER user_group_user_id_fk AFTER INSERT OR UPdate ON user_group NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('user_group_user_id_fk', 'user_group', 'users', 'FULL', 'user_id', 'user_id'); + +-- +-- TOC Entry ID 537 (OID 27311271) +-- +-- Name: RI_ConstraintTrigger_27311270 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER user_group_user_id_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('user_group_user_id_fk', 'user_group', 'users', 'FULL', 'user_id', 'user_id'); + +-- +-- TOC Entry ID 538 (OID 27311273) +-- +-- Name: RI_ConstraintTrigger_27311272 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER user_group_user_id_fk AFTER UPdate ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('user_group_user_id_fk', 'user_group', 'users', 'FULL', 'user_id', 'user_id'); + +-- +-- TOC Entry ID 535 (OID 27311275) +-- +-- Name: RI_ConstraintTrigger_27311274 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER user_group_group_id_fk AFTER INSERT OR UPDATE ON user_group NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('user_group_group_id_fk', 'user_group', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 506 (OID 27311277) +-- +-- Name: RI_ConstraintTrigger_27311276 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER user_group_group_id_fk AFTER DELETE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('user_group_group_id_fk', 'user_group', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 505 (OID 27311279) +-- +-- Name: RI_ConstraintTrigger_27311278 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER user_group_group_id_fk AFTER UPDATE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('user_group_group_id_fk', 'user_group', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 487 (OID 27311281) +-- +-- Name: RI_ConstraintTrigger_27311280 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER forum_posted_by_fk AFTER INSERT OR UPDATE ON forum NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('forum_posted_by_fk', 'forum', 'users', 'FULL', 'posted_by', 'user_id'); + +-- +-- TOC Entry ID 539 (OID 27311283) +-- +-- Name: RI_ConstraintTrigger_27311282 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER forum_posted_by_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('forum_posted_by_fk', 'forum', 'users', 'FULL', 'posted_by', 'user_id'); + +-- +-- TOC Entry ID 540 (OID 27311285) +-- +-- Name: RI_ConstraintTrigger_27311284 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER forum_posted_by_fk AFTER UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('forum_posted_by_fk', 'forum', 'users', 'FULL', 'posted_by', 'user_id'); + +-- +-- TOC Entry ID 486 (OID 27311287) +-- +-- Name: RI_ConstraintTrigger_27311286 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER forum_group_forum_id_fk AFTER INSERT OR UPDATE ON forum NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('forum_group_forum_id_fk', 'forum', 'forum_group_list', 'FULL', 'group_forum_id', 'group_forum_id'); + +-- +-- TOC Entry ID 492 (OID 27311289) +-- +-- Name: RI_ConstraintTrigger_27311288 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER forum_group_forum_id_fk AFTER DELETE ON forum_group_list NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('forum_group_forum_id_fk', 'forum', 'forum_group_list', 'FULL', 'group_forum_id', 'group_forum_id'); + +-- +-- TOC Entry ID 491 (OID 27311291) +-- +-- Name: RI_ConstraintTrigger_27311290 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER forum_group_forum_id_fk AFTER UPDATE ON forum_group_list NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('forum_group_forum_id_fk', 'forum', 'forum_group_list', 'FULL', 'group_forum_id', 'group_forum_id'); + +-- +-- TOC Entry ID 490 (OID 27311293) +-- +-- Name: RI_ConstraintTrigger_27311292 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER forum_group_list_group_id_fk AFTER INSERT OR UPDATE ON forum_group_list NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('forum_group_list_group_id_fk', 'forum_group_list', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 504 (OID 27311295) +-- +-- Name: RI_ConstraintTrigger_27311294 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER forum_group_list_group_id_fk AFTER DELETE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('forum_group_list_group_id_fk', 'forum_group_list', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 503 (OID 27311297) +-- +-- Name: RI_ConstraintTrigger_27311296 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER forum_group_list_group_id_fk AFTER UPDATE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('forum_group_list_group_id_fk', 'forum_group_list', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 479 (OID 27311299) +-- +-- Name: RI_ConstraintTrigger_27311298 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_group_group_fk AFTER INSERT OR UPDATE ON bug_group NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('bug_group_group_fk', 'bug_group', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 502 (OID 27311301) +-- +-- Name: RI_ConstraintTrigger_27311300 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_group_group_fk AFTER DELETE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('bug_group_group_fk', 'bug_group', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 501 (OID 27311303) +-- +-- Name: RI_ConstraintTrigger_27311302 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_group_group_fk AFTER UPDATE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('bug_group_group_fk', 'bug_group', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 476 (OID 27311305) +-- +-- Name: RI_ConstraintTrigger_27311304 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_category_group_fk AFTER INSERT OR UPDATE ON bug_category NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('bug_category_group_fk', 'bug_category', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 500 (OID 27311307) +-- +-- Name: RI_ConstraintTrigger_27311306 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_category_group_fk AFTER DELETE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('bug_category_group_fk', 'bug_category', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 499 (OID 27311309) +-- +-- Name: RI_ConstraintTrigger_27311308 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_category_group_fk AFTER UPDATE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('bug_category_group_fk', 'bug_category', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 473 (OID 27311311) +-- +-- Name: RI_ConstraintTrigger_27311310 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_submitted_by_fk AFTER INSERT OR UPDATE ON bug NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('bug_submitted_by_fk', 'bug', 'users', 'FULL', 'submitted_by', 'user_id'); + +-- +-- TOC Entry ID 541 (OID 27311313) +-- +-- Name: RI_ConstraintTrigger_27311312 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_submitted_by_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('bug_submitted_by_fk', 'bug', 'users', 'FULL', 'submitted_by', 'user_id'); + +-- +-- TOC Entry ID 542 (OID 27311315) +-- +-- Name: RI_ConstraintTrigger_27311314 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_submitted_by_fk AFTER UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('bug_submitted_by_fk', 'bug', 'users', 'FULL', 'submitted_by', 'user_id'); + +-- +-- TOC Entry ID 472 (OID 27311317) +-- +-- Name: RI_ConstraintTrigger_27311316 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_assigned_to_fk AFTER INSERT OR UPDATE ON bug NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('bug_assigned_to_fk', 'bug', 'users', 'FULL', 'assigned_to', 'user_id'); + +-- +-- TOC Entry ID 543 (OID 27311319) +-- +-- Name: RI_ConstraintTrigger_27311318 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_assigned_to_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('bug_assigned_to_fk', 'bug', 'users', 'FULL', 'assigned_to', 'user_id'); + +-- +-- TOC Entry ID 544 (OID 27311321) +-- +-- Name: RI_ConstraintTrigger_27311320 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_assigned_to_fk AFTER UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('bug_assigned_to_fk', 'bug', 'users', 'FULL', 'assigned_to', 'user_id'); + +-- +-- TOC Entry ID 471 (OID 27311323) +-- +-- Name: RI_ConstraintTrigger_27311322 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_status_fk AFTER INSERT OR UPDATE ON bug NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('bug_status_fk', 'bug', 'bug_status', 'FULL', 'status_id', 'status_id'); + +-- +-- TOC Entry ID 483 (OID 27311325) +-- +-- Name: RI_ConstraintTrigger_27311324 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_status_fk AFTER DELETE ON bug_status NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('bug_status_fk', 'bug', 'bug_status', 'FULL', 'status_id', 'status_id'); + +-- +-- TOC Entry ID 482 (OID 27311327) +-- +-- Name: RI_ConstraintTrigger_27311326 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_status_fk AFTER UPDATE ON bug_status NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('bug_status_fk', 'bug', 'bug_status', 'FULL', 'status_id', 'status_id'); + +-- +-- TOC Entry ID 470 (OID 27311329) +-- +-- Name: RI_ConstraintTrigger_27311328 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_category_fk AFTER INSERT OR UPDATE ON bug NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('bug_category_fk', 'bug', 'bug_category', 'FULL', 'category_id', 'bug_category_id'); + +-- +-- TOC Entry ID 475 (OID 27311331) +-- +-- Name: RI_ConstraintTrigger_27311330 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_category_fk AFTER DELETE ON bug_category NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('bug_category_fk', 'bug', 'bug_category', 'FULL', 'category_id', 'bug_category_id'); + +-- +-- TOC Entry ID 474 (OID 27311333) +-- +-- Name: RI_ConstraintTrigger_27311332 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_category_fk AFTER UPDATE ON bug_category NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('bug_category_fk', 'bug', 'bug_category', 'FULL', 'category_id', 'bug_category_id'); + +-- +-- TOC Entry ID 469 (OID 27311335) +-- +-- Name: RI_ConstraintTrigger_27311334 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_resolution_fk AFTER INSERT OR UPDATE ON bug NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('bug_resolution_fk', 'bug', 'bug_resolution', 'FULL', 'resolution_id', 'resolution_id'); + +-- +-- TOC Entry ID 481 (OID 27311337) +-- +-- Name: RI_ConstraintTrigger_27311336 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_resolution_fk AFTER DELETE ON bug_resolution NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('bug_resolution_fk', 'bug', 'bug_resolution', 'FULL', 'resolution_id', 'resolution_id'); + +-- +-- TOC Entry ID 480 (OID 27311339) +-- +-- Name: RI_ConstraintTrigger_27311338 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_resolution_fk AFTER UPDATE ON bug_resolution NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('bug_resolution_fk', 'bug', 'bug_resolution', 'FULL', 'resolution_id', 'resolution_id'); + +-- +-- TOC Entry ID 468 (OID 27311341) +-- +-- Name: RI_ConstraintTrigger_27311340 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_group_fk AFTER INSERT OR UPDATE ON bug NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('bug_group_fk', 'bug', 'bug_group', 'FULL', 'bug_group_id', 'bug_group_id'); + +-- +-- TOC Entry ID 478 (OID 27311343) +-- +-- Name: RI_ConstraintTrigger_27311342 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_group_fk AFTER DELETE ON bug_group NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('bug_group_fk', 'bug', 'bug_group', 'FULL', 'bug_group_id', 'bug_group_id'); + +-- +-- TOC Entry ID 477 (OID 27311345) +-- +-- Name: RI_ConstraintTrigger_27311344 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER bug_group_fk AFTER UPDATE ON bug_group NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('bug_group_fk', 'bug', 'bug_group', 'FULL', 'bug_group_id', 'bug_group_id'); + +-- +-- TOC Entry ID 485 (OID 27311347) +-- +-- Name: RI_ConstraintTrigger_27311346 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER forum_posted_by_fk AFTER INSERT OR UPDATE ON forum NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('forum_posted_by_fk', 'forum', 'users', 'FULL', 'posted_by', 'user_id'); + +-- +-- TOC Entry ID 545 (OID 27311349) +-- +-- Name: RI_ConstraintTrigger_27311348 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER forum_posted_by_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('forum_posted_by_fk', 'forum', 'users', 'FULL', 'posted_by', 'user_id'); + +-- +-- TOC Entry ID 546 (OID 27311351) +-- +-- Name: RI_ConstraintTrigger_27311350 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER forum_posted_by_fk AFTER UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('forum_posted_by_fk', 'forum', 'users', 'FULL', 'posted_by', 'user_id'); + +-- +-- TOC Entry ID 484 (OID 27311353) +-- +-- Name: RI_ConstraintTrigger_27311352 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER forum_group_forum_id_fk AFTER INSERT OR UPDATE ON forum NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('forum_group_forum_id_fk', 'forum', 'forum_group_list', 'FULL', 'group_forum_id', 'group_forum_id'); + +-- +-- TOC Entry ID 489 (OID 27311355) +-- +-- Name: RI_ConstraintTrigger_27311354 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER forum_group_forum_id_fk AFTER DELETE ON forum_group_list NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('forum_group_forum_id_fk', 'forum', 'forum_group_list', 'FULL', 'group_forum_id', 'group_forum_id'); + +-- +-- TOC Entry ID 488 (OID 27311357) +-- +-- Name: RI_ConstraintTrigger_27311356 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER forum_group_forum_id_fk AFTER UPDATE ON forum_group_list NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('forum_group_forum_id_fk', 'forum', 'forum_group_list', 'FULL', 'group_forum_id', 'group_forum_id'); + +-- +-- TOC Entry ID 518 (OID 27311359) +-- +-- Name: RI_ConstraintTrigger_27311358 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER project_group_list_group_id_fk AFTER INSERT OR UPDATE ON project_group_list NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('project_group_list_group_id_fk', 'project_group_list', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 498 (OID 27311361) +-- +-- Name: RI_ConstraintTrigger_27311360 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER project_group_list_group_id_fk AFTER DELETE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('project_group_list_group_id_fk', 'project_group_list', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 497 (OID 27311363) +-- +-- Name: RI_ConstraintTrigger_27311362 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER project_group_list_group_id_fk AFTER UPDATE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('project_group_list_group_id_fk', 'project_group_list', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 523 (OID 27311365) +-- +-- Name: RI_ConstraintTrigger_27311364 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER project_task_group_project_id_f AFTER INSERT OR UPDATE ON project_task NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('project_task_group_project_id_f', 'project_task', 'project_group_list', 'FULL', 'group_project_id', 'group_project_id'); + +-- +-- TOC Entry ID 517 (OID 27311367) +-- +-- Name: RI_ConstraintTrigger_27311366 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER project_task_group_project_id_f AFTER DELETE ON project_group_list NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('project_task_group_project_id_f', 'project_task', 'project_group_list', 'FULL', 'group_project_id', 'group_project_id'); + +-- +-- TOC Entry ID 516 (OID 27311369) +-- +-- Name: RI_ConstraintTrigger_27311368 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER project_task_group_project_id_f AFTER UPDATE ON project_group_list NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('project_task_group_project_id_f', 'project_task', 'project_group_list', 'FULL', 'group_project_id', 'group_project_id'); + +-- +-- TOC Entry ID 522 (OID 27311371) +-- +-- Name: RI_ConstraintTrigger_27311370 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER project_task_created_by_fk AFTER INSERT OR UPDATE ON project_task NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('project_task_created_by_fk', 'project_task', 'users', 'FULL', 'created_by', 'user_id'); + +-- +-- TOC Entry ID 547 (OID 27311373) +-- +-- Name: RI_ConstraintTrigger_27311372 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER project_task_created_by_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('project_task_created_by_fk', 'project_task', 'users', 'FULL', 'created_by', 'user_id'); + +-- +-- TOC Entry ID 548 (OID 27311375) +-- +-- Name: RI_ConstraintTrigger_27311374 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER project_task_created_by_fk AFTER UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('project_task_created_by_fk', 'project_task', 'users', 'FULL', 'created_by', 'user_id'); + +-- +-- TOC Entry ID 521 (OID 27311377) +-- +-- Name: RI_ConstraintTrigger_27311376 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER project_task_status_id_fk AFTER INSERT OR UPDATE ON project_task NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('project_task_status_id_fk', 'project_task', 'project_status', 'FULL', 'status_id', 'status_id'); + +-- +-- TOC Entry ID 520 (OID 27311379) +-- +-- Name: RI_ConstraintTrigger_27311378 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER project_task_status_id_fk AFTER DELETE ON project_status NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('project_task_status_id_fk', 'project_task', 'project_status', 'FULL', 'status_id', 'status_id'); + +-- +-- TOC Entry ID 519 (OID 27311381) +-- +-- Name: RI_ConstraintTrigger_27311380 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER project_task_status_id_fk AFTER UPDATE ON project_status NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('project_task_status_id_fk', 'project_task', 'project_status', 'FULL', 'status_id', 'status_id'); + +-- +-- TOC Entry ID 510 (OID 27311383) +-- +-- Name: RI_ConstraintTrigger_27311382 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER patch_status_id_fk AFTER INSERT OR UPDATE ON patch NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('patch_status_id_fk', 'patch', 'patch_status', 'FULL', 'patch_status_id', 'patch_status_id'); + +-- +-- TOC Entry ID 515 (OID 27311385) +-- +-- Name: RI_ConstraintTrigger_27311384 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER patch_status_id_fk AFTER DELETE ON patch_status NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('patch_status_id_fk', 'patch', 'patch_status', 'FULL', 'patch_status_id', 'patch_status_id'); + +-- +-- TOC Entry ID 514 (OID 27311387) +-- +-- Name: RI_ConstraintTrigger_27311386 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER patch_status_id_fk AFTER UPDATE ON patch_status NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('patch_status_id_fk', 'patch', 'patch_status', 'FULL', 'patch_status_id', 'patch_status_id'); + +-- +-- TOC Entry ID 509 (OID 27311389) +-- +-- Name: RI_ConstraintTrigger_27311388 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER patch_category_id_fk AFTER INSERT OR UPDATE ON patch NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('patch_category_id_fk', 'patch', 'patch_category', 'FULL', 'patch_category_id', 'patch_category_id'); + +-- +-- TOC Entry ID 513 (OID 27311391) +-- +-- Name: RI_ConstraintTrigger_27311390 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER patch_category_id_fk AFTER DELETE ON patch_category NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('patch_category_id_fk', 'patch', 'patch_category', 'FULL', 'patch_category_id', 'patch_category_id'); + +-- +-- TOC Entry ID 512 (OID 27311393) +-- +-- Name: RI_ConstraintTrigger_27311392 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER patch_category_id_fk AFTER UPDATE ON patch_category NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('patch_category_id_fk', 'patch', 'patch_category', 'FULL', 'patch_category_id', 'patch_category_id'); + +-- +-- TOC Entry ID 508 (OID 27311395) +-- +-- Name: RI_ConstraintTrigger_27311394 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER patch_submitted_by_fk AFTER INSERT OR UPDATE ON patch NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('patch_submitted_by_fk', 'patch', 'users', 'FULL', 'submitted_by', 'user_id'); + +-- +-- TOC Entry ID 549 (OID 27311397) +-- +-- Name: RI_ConstraintTrigger_27311396 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER patch_submitted_by_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('patch_submitted_by_fk', 'patch', 'users', 'FULL', 'submitted_by', 'user_id'); + +-- +-- TOC Entry ID 550 (OID 27311399) +-- +-- Name: RI_ConstraintTrigger_27311398 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER patch_submitted_by_fk AFTER UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('patch_submitted_by_fk', 'patch', 'users', 'FULL', 'submitted_by', 'user_id'); + +-- +-- TOC Entry ID 507 (OID 27311401) +-- +-- Name: RI_ConstraintTrigger_27311400 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER patch_assigned_to_fk AFTER INSERT OR UPDATE ON patch NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('patch_assigned_to_fk', 'patch', 'users', 'FULL', 'assigned_to', 'user_id'); + +-- +-- TOC Entry ID 551 (OID 27311403) +-- +-- Name: RI_ConstraintTrigger_27311402 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER patch_assigned_to_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('patch_assigned_to_fk', 'patch', 'users', 'FULL', 'assigned_to', 'user_id'); + +-- +-- TOC Entry ID 552 (OID 27311405) +-- +-- Name: RI_ConstraintTrigger_27311404 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER patch_assigned_to_fk AFTER UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('patch_assigned_to_fk', 'patch', 'users', 'FULL', 'assigned_to', 'user_id'); + +-- +-- TOC Entry ID 511 (OID 27311407) +-- +-- Name: RI_ConstraintTrigger_27311406 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER patch_category_group_id_fk AFTER INSERT OR UPDATE ON patch_category NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('patch_category_group_id_fk', 'patch_category', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 496 (OID 27311409) +-- +-- Name: RI_ConstraintTrigger_27311408 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER patch_category_group_id_fk AFTER DELETE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('patch_category_group_id_fk', 'patch_category', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 495 (OID 27311411) +-- +-- Name: RI_ConstraintTrigger_27311410 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER patch_category_group_id_fk AFTER UPDATE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('patch_category_group_id_fk', 'patch_category', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 527 (OID 27311413) +-- +-- Name: RI_ConstraintTrigger_27311412 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER support_status_id_fk AFTER INSERT OR UPDATE ON support NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('support_status_id_fk', 'support', 'support_status', 'FULL', 'support_status_id', 'support_status_id'); + +-- +-- TOC Entry ID 532 (OID 27311415) +-- +-- Name: RI_ConstraintTrigger_27311414 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER support_status_id_fk AFTER DELETE ON support_status NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('support_status_id_fk', 'support', 'support_status', 'FULL', 'support_status_id', 'support_status_id'); + +-- +-- TOC Entry ID 531 (OID 27311417) +-- +-- Name: RI_ConstraintTrigger_27311416 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER support_status_id_fk AFTER UPDATE ON support_status NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('support_status_id_fk', 'support', 'support_status', 'FULL', 'support_status_id', 'support_status_id'); + +-- +-- TOC Entry ID 526 (OID 27311419) +-- +-- Name: RI_ConstraintTrigger_27311418 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER support_category_id_fk AFTER INSERT OR UPDATE ON support NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('support_category_id_fk', 'support', 'support_category', 'FULL', 'support_category_id', 'support_category_id'); + +-- +-- TOC Entry ID 530 (OID 27311421) +-- +-- Name: RI_ConstraintTrigger_27311420 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER support_category_id_fk AFTER DELETE ON support_category NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('support_category_id_fk', 'support', 'support_category', 'FULL', 'support_category_id', 'support_category_id'); + +-- +-- TOC Entry ID 529 (OID 27311423) +-- +-- Name: RI_ConstraintTrigger_27311422 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER support_category_id_fk AFTER UPDATE ON support_category NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('support_category_id_fk', 'support', 'support_category', 'FULL', 'support_category_id', 'support_category_id'); + +-- +-- TOC Entry ID 525 (OID 27311425) +-- +-- Name: RI_ConstraintTrigger_27311424 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER support_submitted_by_fk AFTER INSERT OR UPDATE ON support NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('support_submitted_by_fk', 'support', 'users', 'FULL', 'submitted_by', 'user_id'); + +-- +-- TOC Entry ID 553 (OID 27311427) +-- +-- Name: RI_ConstraintTrigger_27311426 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER support_submitted_by_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('support_submitted_by_fk', 'support', 'users', 'FULL', 'submitted_by', 'user_id'); + +-- +-- TOC Entry ID 554 (OID 27311429) +-- +-- Name: RI_ConstraintTrigger_27311428 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER support_submitted_by_fk AFTER UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('support_submitted_by_fk', 'support', 'users', 'FULL', 'submitted_by', 'user_id'); + +-- +-- TOC Entry ID 524 (OID 27311431) +-- +-- Name: RI_ConstraintTrigger_27311430 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER support_assigned_to_fk AFTER INSERT OR UPDATE ON support NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('support_assigned_to_fk', 'support', 'users', 'FULL', 'assigned_to', 'user_id'); + +-- +-- TOC Entry ID 555 (OID 27311433) +-- +-- Name: RI_ConstraintTrigger_27311432 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER support_assigned_to_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('support_assigned_to_fk', 'support', 'users', 'FULL', 'assigned_to', 'user_id'); + +-- +-- TOC Entry ID 556 (OID 27311435) +-- +-- Name: RI_ConstraintTrigger_27311434 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER support_assigned_to_fk AFTER UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('support_assigned_to_fk', 'support', 'users', 'FULL', 'assigned_to', 'user_id'); + +-- +-- TOC Entry ID 528 (OID 27311437) +-- +-- Name: RI_ConstraintTrigger_27311436 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER support_category_group_id_fk AFTER INSERT OR UPDATE ON support_category NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('support_category_group_id_fk', 'support_category', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 494 (OID 27311439) +-- +-- Name: RI_ConstraintTrigger_27311438 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER support_category_group_id_fk AFTER DELETE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('support_category_group_id_fk', 'support_category', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 493 (OID 27311441) +-- +-- Name: RI_ConstraintTrigger_27311440 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER support_category_group_id_fk AFTER UPDATE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('support_category_group_id_fk', 'support_category', 'groups', 'FULL', 'group_id', 'group_id'); + +-- +-- TOC Entry ID 557 (OID 27311443) +-- +-- Name: RI_ConstraintTrigger_27311442 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER users_languageid_fk AFTER INSERT OR UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('users_languageid_fk', 'users', 'supported_languages', 'FULL', 'language', 'language_id'); + +-- +-- TOC Entry ID 534 (OID 27311445) +-- +-- Name: RI_ConstraintTrigger_27311444 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER users_languageid_fk AFTER DELETE ON supported_languages NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('users_languageid_fk', 'users', 'supported_languages', 'FULL', 'language', 'language_id'); + +-- +-- TOC Entry ID 533 (OID 27311447) +-- +-- Name: RI_ConstraintTrigger_27311446 Type: TRIGGER +-- + +-- CREATE CONSTRAINT TRIGGER users_languageid_fk AFTER UPDATE ON supported_languages NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('users_languageid_fk', 'users', 'supported_languages', 'FULL', 'language', 'language_id'); + +-- +-- TOC Entry ID 3 (OID 18138427) +-- +-- Name: bug_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('bug_pk_seq', 125359, 't'); + +-- +-- TOC Entry ID 5 (OID 18138495) +-- +-- Name: bug_bug_dependencies_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('bug_bug_dependencies_pk_seq', 44691, 't'); + +-- +-- TOC Entry ID 7 (OID 18138531) +-- +-- Name: bug_canned_responses_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('bug_canned_responses_pk_seq', 100204, 't'); + +-- +-- TOC Entry ID 9 (OID 18138582) +-- +-- Name: bug_category_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('bug_category_pk_seq', 5053, 't'); + +-- +-- TOC Entry ID 11 (OID 18138632) +-- +-- Name: bug_filter_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('bug_filter_pk_seq', 140, 't'); + +-- +-- TOC Entry ID 13 (OID 18138687) +-- +-- Name: bug_group_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('bug_group_pk_seq', 2780, 't'); + +-- +-- TOC Entry ID 15 (OID 18138738) +-- +-- Name: bug_history_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('bug_history_pk_seq', 106196, 't'); + +-- +-- TOC Entry ID 17 (OID 18138794) +-- +-- Name: bug_resolution_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('bug_resolution_pk_seq', 101, 't'); + +-- +-- TOC Entry ID 19 (OID 18138843) +-- +-- Name: bug_status_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('bug_status_pk_seq', 100, 't'); + +-- +-- TOC Entry ID 21 (OID 18138891) +-- +-- Name: bug_task_dependencies_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('bug_task_dependencies_pk_seq', 44583, 't'); + +-- +-- TOC Entry ID 23 (OID 18138927) +-- +-- Name: canned_responses_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('canned_responses_pk_seq', 5, 't'); + +-- +-- TOC Entry ID 25 (OID 18138977) +-- +-- Name: db_images_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('db_images_pk_seq', 1128, 't'); + +-- +-- TOC Entry ID 27 (OID 18139040) +-- +-- Name: doc_data_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('doc_data_pk_seq', 2124, 't'); + +-- +-- TOC Entry ID 29 (OID 18139104) +-- +-- Name: doc_groups_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('doc_groups_pk_seq', 1815, 't'); + +-- +-- TOC Entry ID 31 (OID 18139140) +-- +-- Name: doc_states_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('doc_states_pk_seq', 5, 't'); + +-- +-- TOC Entry ID 33 (OID 18139174) +-- +-- Name: filemodule_monitor_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('filemodule_monitor_pk_seq', 312, 't'); + +-- +-- TOC Entry ID 35 (OID 18139210) +-- +-- Name: forum_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('forum_pk_seq', 84486, 't'); + +-- +-- TOC Entry ID 37 (OID 18139291) +-- +-- Name: forum_group_list_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('forum_group_list_pk_seq', 51981, 't'); + +-- +-- TOC Entry ID 39 (OID 18139348) +-- +-- Name: forum_monitored_forums_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('forum_monitored_forums_pk_seq', 14831, 't'); + +-- +-- TOC Entry ID 41 (OID 18139384) +-- +-- Name: forum_saved_place_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('forum_saved_place_pk_seq', 1835, 't'); + +-- +-- TOC Entry ID 43 (OID 18139492) +-- +-- Name: foundry_news_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('foundry_news_pk_seq', 1973, 't'); + +-- +-- TOC Entry ID 45 (OID 18139532) +-- +-- Name: foundry_preferred_projec_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('foundry_preferred_projec_pk_seq', 165, 't'); + +-- +-- TOC Entry ID 47 (OID 18139570) +-- +-- Name: foundry_projects_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('foundry_projects_pk_seq', 320807, 't'); + +-- +-- TOC Entry ID 49 (OID 18139695) +-- +-- Name: frs_file_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('frs_file_pk_seq', 29214, 't'); + +-- +-- TOC Entry ID 51 (OID 18139756) +-- +-- Name: frs_filetype_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('frs_filetype_pk_seq', 9999, 't'); + +-- +-- TOC Entry ID 53 (OID 18139804) +-- +-- Name: frs_package_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('frs_package_pk_seq', 12688, 't'); + +-- +-- TOC Entry ID 55 (OID 18139856) +-- +-- Name: frs_processor_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('frs_processor_pk_seq', 9999, 't'); + +-- +-- TOC Entry ID 57 (OID 18139904) +-- +-- Name: frs_release_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('frs_release_pk_seq', 17983, 't'); + +-- +-- TOC Entry ID 59 (OID 18139964) +-- +-- Name: frs_status_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('frs_status_pk_seq', 3, 't'); + +-- +-- TOC Entry ID 61 (OID 18140012) +-- +-- Name: group_cvs_history_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('group_cvs_history_pk_seq', 1, 'f'); + +-- +-- TOC Entry ID 63 (OID 18140056) +-- +-- Name: group_history_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('group_history_pk_seq', 29283, 't'); + +-- +-- TOC Entry ID 65 (OID 18140112) +-- +-- Name: group_type_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('group_type_pk_seq', 2, 't'); + +-- +-- TOC Entry ID 67 (OID 18140160) +-- +-- Name: groups_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('groups_pk_seq', 16379, 't'); + +-- +-- TOC Entry ID 69 (OID 18140301) +-- +-- Name: mail_group_list_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('mail_group_list_pk_seq', 7581, 't'); + +-- +-- TOC Entry ID 71 (OID 18140359) +-- +-- Name: news_bytes_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('news_bytes_pk_seq', 10299, 't'); + +-- +-- TOC Entry ID 73 (OID 18140419) +-- +-- Name: patch_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('patch_pk_seq', 102785, 't'); + +-- +-- TOC Entry ID 75 (OID 18140483) +-- +-- Name: patch_category_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('patch_category_pk_seq', 10607, 't'); + +-- +-- TOC Entry ID 77 (OID 18140534) +-- +-- Name: patch_history_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('patch_history_pk_seq', 9813, 't'); + +-- +-- TOC Entry ID 79 (OID 18140590) +-- +-- Name: patch_status_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('patch_status_pk_seq', 103, 't'); + +-- +-- TOC Entry ID 81 (OID 18140638) +-- +-- Name: people_job_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('people_job_pk_seq', 1641, 't'); + +-- +-- TOC Entry ID 83 (OID 18140697) +-- +-- Name: people_job_category_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('people_job_category_pk_seq', 102, 't'); + +-- +-- TOC Entry ID 85 (OID 18140747) +-- +-- Name: people_job_inventory_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('people_job_inventory_pk_seq', 1970, 't'); + +-- +-- TOC Entry ID 87 (OID 18140787) +-- +-- Name: people_job_status_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('people_job_status_pk_seq', 3, 't'); + +-- +-- TOC Entry ID 89 (OID 18140835) +-- +-- Name: people_skill_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('people_skill_pk_seq', 33, 't'); + +-- +-- TOC Entry ID 91 (OID 18140884) +-- +-- Name: people_skill_inventory_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('people_skill_inventory_pk_seq', 60179, 't'); + +-- +-- TOC Entry ID 93 (OID 18140924) +-- +-- Name: people_skill_level_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('people_skill_level_pk_seq', 5, 't'); + +-- +-- TOC Entry ID 95 (OID 18140972) +-- +-- Name: people_skill_year_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('people_skill_year_pk_seq', 5, 't'); + +-- +-- TOC Entry ID 97 (OID 18141020) +-- +-- Name: project_assigned_to_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('project_assigned_to_pk_seq', 30257, 't'); + +-- +-- TOC Entry ID 99 (OID 18141110) +-- +-- Name: project_dependencies_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('project_dependencies_pk_seq', 25231, 't'); + +-- +-- TOC Entry ID 101 (OID 18141146) +-- +-- Name: project_group_list_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('project_group_list_pk_seq', 6360, 't'); + +-- +-- TOC Entry ID 103 (OID 18141200) +-- +-- Name: project_history_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('project_history_pk_seq', 27347, 't'); + +-- +-- TOC Entry ID 105 (OID 18141257) +-- +-- Name: project_metric_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('project_metric_pk_seq', 13274, 't'); + +-- +-- TOC Entry ID 107 (OID 18141292) +-- +-- Name: project_metric_tmp1_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('project_metric_tmp1_pk_seq', 13274, 't'); + +-- +-- TOC Entry ID 109 (OID 18141327) +-- +-- Name: project_metric_weekly_tm_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('project_metric_weekly_tm_pk_seq', 2213, 't'); + +-- +-- TOC Entry ID 111 (OID 18141363) +-- +-- Name: project_status_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('project_status_pk_seq', 100, 't'); + +-- +-- TOC Entry ID 113 (OID 18141412) +-- +-- Name: project_task_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('project_task_pk_seq', 23295, 't'); + +-- +-- TOC Entry ID 115 (OID 18141479) +-- +-- Name: project_weekly_metric_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('project_weekly_metric_pk_seq', 2213, 't'); + +-- +-- TOC Entry ID 117 (OID 18141534) +-- +-- Name: snippet_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('snippet_pk_seq', 100501, 't'); + +-- +-- TOC Entry ID 119 (OID 18141593) +-- +-- Name: snippet_package_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('snippet_package_pk_seq', 100035, 't'); + +-- +-- TOC Entry ID 121 (OID 18141648) +-- +-- Name: snippet_package_item_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('snippet_package_item_pk_seq', 100100, 't'); + +-- +-- TOC Entry ID 123 (OID 18141684) +-- +-- Name: snippet_package_version_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('snippet_package_version_pk_seq', 100035, 't'); + +-- +-- TOC Entry ID 125 (OID 18141739) +-- +-- Name: snippet_version_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('snippet_version_pk_seq', 100662, 't'); + +-- +-- TOC Entry ID 127 (OID 18142132) +-- +-- Name: support_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('support_pk_seq', 109672, 't'); + +-- +-- TOC Entry ID 129 (OID 18142196) +-- +-- Name: support_canned_responses_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('support_canned_responses_pk_seq', 100088, 't'); + +-- +-- TOC Entry ID 131 (OID 18142247) +-- +-- Name: support_category_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('support_category_pk_seq', 10699, 't'); + +-- +-- TOC Entry ID 133 (OID 18142298) +-- +-- Name: support_history_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('support_history_pk_seq', 24027, 't'); + +-- +-- TOC Entry ID 135 (OID 18142354) +-- +-- Name: support_messages_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('support_messages_pk_seq', 122077, 't'); + +-- +-- TOC Entry ID 137 (OID 18142407) +-- +-- Name: support_status_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('support_status_pk_seq', 3, 't'); + +-- +-- TOC Entry ID 139 (OID 18142455) +-- +-- Name: supported_languages_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('supported_languages_pk_seq', 21, 't'); + +-- +-- TOC Entry ID 141 (OID 18142506) +-- +-- Name: survey_question_types_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('survey_question_types_pk_seq', 100, 't'); + +-- +-- TOC Entry ID 143 (OID 18142555) +-- +-- Name: survey_questions_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('survey_questions_pk_seq', 14662, 't'); + +-- +-- TOC Entry ID 145 (OID 18142680) +-- +-- Name: surveys_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('surveys_pk_seq', 11185, 't'); + +-- +-- TOC Entry ID 147 (OID 18142735) +-- +-- Name: system_history_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('system_history_pk_seq', 1, 'f'); + +-- +-- TOC Entry ID 149 (OID 18142787) +-- +-- Name: system_machines_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('system_machines_pk_seq', 1, 'f'); + +-- +-- TOC Entry ID 151 (OID 18142836) +-- +-- Name: system_news_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('system_news_pk_seq', 1, 'f'); + +-- +-- TOC Entry ID 153 (OID 18142895) +-- +-- Name: system_services_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('system_services_pk_seq', 1, 'f'); + +-- +-- TOC Entry ID 155 (OID 18142944) +-- +-- Name: system_status_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('system_status_pk_seq', 1, 'f'); + +-- +-- TOC Entry ID 157 (OID 18143020) +-- +-- Name: themes_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('themes_pk_seq', 2, 't'); + +-- +-- TOC Entry ID 159 (OID 18143113) +-- +-- Name: trove_cat_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('trove_cat_pk_seq', 281, 't'); + +-- +-- TOC Entry ID 161 (OID 18143176) +-- +-- Name: trove_group_link_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('trove_group_link_pk_seq', 111628, 't'); + +-- +-- TOC Entry ID 163 (OID 18143216) +-- +-- Name: trove_treesums_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('trove_treesums_pk_seq', 765, 't'); + +-- +-- TOC Entry ID 165 (OID 18143286) +-- +-- Name: user_bookmarks_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('user_bookmarks_pk_seq', 23482, 't'); + +-- +-- TOC Entry ID 167 (OID 18143337) +-- +-- Name: user_diary_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('user_diary_pk_seq', 892, 't'); + +-- +-- TOC Entry ID 169 (OID 18143392) +-- +-- Name: user_diary_monitor_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('user_diary_monitor_pk_seq', 521, 't'); + +-- +-- TOC Entry ID 171 (OID 18143428) +-- +-- Name: user_group_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('user_group_pk_seq', 27204, 't'); + +-- +-- TOC Entry ID 173 (OID 18143484) +-- +-- Name: user_metric_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('user_metric_pk_seq', 115, 't'); + +-- +-- TOC Entry ID 175 (OID 18143530) +-- +-- Name: user_metric0_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('user_metric0_pk_seq', 5, 't'); + +-- +-- TOC Entry ID 177 (OID 18143608) +-- +-- Name: users_pk_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('users_pk_seq', 120800, 't'); + +-- +-- TOC Entry ID 179 (OID 27311232) +-- +-- Name: unix_uid_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('unix_uid_seq', 21044, 't'); + +-- +-- TOC Entry ID 181 (OID 27311250) +-- +-- Name: forum_thread_seq Type: SEQUENCE SET Owner: +-- + +-- SELECT setval ('forum_thread_seq', 59698, 't'); + diff --git a/gforge/db/oci8port/pssonline/database-oci8.php b/gforge/db/oci8port/pssonline/database-oci8.php new file mode 100644 index 0000000000..82e81f9a1a --- /dev/null +++ b/gforge/db/oci8port/pssonline/database-oci8.php @@ -0,0 +1,509 @@ +'; + return 0; + } else { + + if ($limit > 0) { + if (!$offset || $offset < 0) { + $offset=0; + } + } + + $res = ociexecute($stmt,$sys_db_oci_commit_mode); + + if ( !$res ) { + echo $qstring.'
    '; + return 0; + } + else if ( strcmp(ocistatementtype($stmt),"SELECT")==0 ) { + + //store fieldnames for use in db_fieldname and db_numfields + for ($i=0;$i 0) { + for ($i=0; $i<$offset; $i++) { + //burn them off + if (!ocifetchinto($stmt,$res)) { + //if no data be returned + //get out of loop + $more_data=false; + break; + } + } + } + + //store the data into $sys_db_results[$stmt] + //this is needed since there is the possiblity of calling + //db_result($qhandle,$row,$field) with any $row value + //db_result and db_fetch_array could be rewritten to + //eliminate the need for fetching all of the data up front + $row=0; + while ($more_data) { + $more = ocifetchinto($stmt,$res,OCI_RETURN_NULLS+OCI_RETURN_LOBS); + + //see if data is being returned && we are + //still within the requested $limit + if ( !$more || (($limit >= 0) && ($row >= $limit))) { + $more_data=false; + } + else { + //populate sys_db_results with an array that can be indexed + //by field number or field name + for ($col=0;$col 0) ) { + return db_result($res,0,0); + } else { + return 0; + } +} + +/** + * + * Returns the last error from the database + * + */ + +function db_error() { + global $conn,$stmt; + if ($stmt) { + $err= ocierror($stmt); + } + else if ($conn) { + $err= ocierror($conn); + } + else { + $err= ocierror(); + } + if ($err) { + return $err['message']; + } else { + return false; + } +} + +?> diff --git a/gforge/db/oci8port/pssonline/trove_defaults.sql b/gforge/db/oci8port/pssonline/trove_defaults.sql new file mode 100644 index 0000000000..0d8e5a6ce8 --- /dev/null +++ b/gforge/db/oci8port/pssonline/trove_defaults.sql @@ -0,0 +1,280 @@ +# MySQL dump 8.8 +# +# Host: localhost Database: alexandria +#-------------------------------------------------------- +# Server version 3.23.22-beta + +# +# Dumping data for table 'trove_cat' +# + +INSERT INTO trove_cat VALUES (1,2000031601,0,0,'audience','Intended Audience','The main class of people likely to be interested in this resource.',0,0,'Intended Audience','1'); +INSERT INTO trove_cat VALUES (2,2000032401,1,1,'endusers','End Users/Desktop','Programs and resources for software end users. Software for the desktop.',0,0,'Intended Audience :: End Users/Desktop','1 :: 2'); +INSERT INTO trove_cat VALUES (3,2000041101,1,1,'developers','Developers','Programs and resources for software developers, to include libraries.',0,0,'Intended Audience :: Developers','1 :: 3'); +INSERT INTO trove_cat VALUES (4,2000031601,1,1,'sysadmins','System Administrators','Programs and resources for people who administer computers and networks.',0,0,'Intended Audience :: System Administrators','1 :: 4'); +INSERT INTO trove_cat VALUES (5,2000040701,1,1,'other','Other Audience','Programs and resources for an unlisted audience.',0,0,'Intended Audience :: Other Audience','1 :: 5'); +INSERT INTO trove_cat VALUES (6,2000031601,0,0,'developmentstatus','Development Status','An indication of the development status of the software or resource.',0,0,'Development Status','6'); +INSERT INTO trove_cat VALUES (7,2000040701,6,6,'planning','1 - Planning','This resource is in the planning stages only. There is no code.',0,0,'Development Status :: 1 - Planning','6 :: 7'); +INSERT INTO trove_cat VALUES (8,2000040701,6,6,'prealpha','2 - Pre-Alpha','There is code for this project, but it is not usable except for further development.',0,0,'Development Status :: 2 - Pre-Alpha','6 :: 8'); +INSERT INTO trove_cat VALUES (9,2000041101,6,6,'alpha','3 - Alpha','Resource is in early development, and probably incomplete and/or extremely buggy.',0,0,'Development Status :: 3 - Alpha','6 :: 9'); +INSERT INTO trove_cat VALUES (10,2000040701,6,6,'beta','4 - Beta','Resource is in late phases of development. Deliverables are essentially complete, but may still have significant bugs.',0,0,'Development Status :: 4 - Beta','6 :: 10'); +INSERT INTO trove_cat VALUES (11,2000040701,6,6,'production','5 - Production/Stable','Deliverables are complete and usable by the intended audience.',0,0,'Development Status :: 5 - Production/Stable','6 :: 11'); +INSERT INTO trove_cat VALUES (12,2000040701,6,6,'mature','6 - Mature','This resource has an extensive history of successful use and has probably undergone several stable revisions.',0,0,'Development Status :: 6 - Mature','6 :: 12'); +INSERT INTO trove_cat VALUES (13,2000031601,0,0,'license','License','License terms under which the resource is distributed.',0,0,'License','13'); +INSERT INTO trove_cat VALUES (14,2000032401,13,13,'osi','OSI Approved','Licenses that have been approved by OSI as approved',0,0,'License :: OSI Approved','13 :: 14'); +INSERT INTO trove_cat VALUES (15,2000032001,14,13,'gpl','GNU General Public License (GPL)','GNU General Public License.',0,0,'License :: OSI Approved :: GNU General Public License (GPL)','13 :: 14 :: 15'); +INSERT INTO trove_cat VALUES (16,2000050801,14,13,'lgpl','GNU Lesser General Public License (LGPL)','GNU Lesser General Public License',0,0,'License :: OSI Approved :: GNU Lesser General Public License (LGPL)','13 :: 14 :: 16'); +INSERT INTO trove_cat VALUES (17,2000032001,14,13,'artistic','Artistic License','The Perl Artistic License',0,0,'License :: OSI Approved :: Artistic License','13 :: 14 :: 17'); +INSERT INTO trove_cat VALUES (18,2000031601,0,0,'topic','Topic','Topic categorization.',0,0,'Topic','18'); +INSERT INTO trove_cat VALUES (19,2000032001,136,18,'archiving','Archiving','Tools for maintaining and searching software or document archives.',0,0,'Topic :: System :: Archiving','18 :: 136 :: 19'); +INSERT INTO trove_cat VALUES (20,2000032401,18,18,'communications','Communications','Programs intended to facilitate communication between people.',0,0,'Topic :: Communications','18 :: 20'); +INSERT INTO trove_cat VALUES (21,2000031601,20,18,'bbs','BBS','Bulletin Board systems.',0,0,'Topic :: Communications :: BBS','18 :: 20 :: 21'); +INSERT INTO trove_cat VALUES (22,2000031601,20,18,'chat','Chat','Programs to support real-time communication over the Internet.',0,0,'Topic :: Communications :: Chat','18 :: 20 :: 22'); +INSERT INTO trove_cat VALUES (23,2000031601,22,18,'icq','ICQ','Programs to support ICQ.',0,0,'Topic :: Communications :: Chat :: ICQ','18 :: 20 :: 22 :: 23'); +INSERT INTO trove_cat VALUES (24,2000041101,22,18,'irc','Internet Relay Chat','Programs to support Internet Relay Chat.',0,0,'Topic :: Communications :: Chat :: Internet Relay Chat','18 :: 20 :: 22 :: 24'); +INSERT INTO trove_cat VALUES (25,2000031601,22,18,'talk','Unix Talk','Programs to support Unix Talk protocol.',0,0,'Topic :: Communications :: Chat :: Unix Talk','18 :: 20 :: 22 :: 25'); +INSERT INTO trove_cat VALUES (26,2000031601,22,18,'aim','AOL Instant Messanger','Programs to support AOL Instant Messanger.',0,0,'Topic :: Communications :: Chat :: AOL Instant Messanger','18 :: 20 :: 22 :: 26'); +INSERT INTO trove_cat VALUES (27,2000031601,20,18,'conferencing','Conferencing','Software to support real-time conferencing over the Internet.',0,0,'Topic :: Communications :: Conferencing','18 :: 20 :: 27'); +INSERT INTO trove_cat VALUES (28,2000031601,20,18,'email','Email','Programs for sending, processing, and handling electronic mail.',0,0,'Topic :: Communications :: Email','18 :: 20 :: 28'); +INSERT INTO trove_cat VALUES (29,2000031601,28,18,'filters','Filters','Content-driven filters and dispatchers for Email.',0,0,'Topic :: Communications :: Email :: Filters','18 :: 20 :: 28 :: 29'); +INSERT INTO trove_cat VALUES (30,2000031601,28,18,'listservers','Mailing List Servers','Tools for managing electronic mailing lists.',0,0,'Topic :: Communications :: Email :: Mailing List Servers','18 :: 20 :: 28 :: 30'); +INSERT INTO trove_cat VALUES (31,2000031601,28,18,'mua','Email Clients (MUA)','Programs for interactively reading and sending Email.',0,0,'Topic :: Communications :: Email :: Email Clients (MUA)','18 :: 20 :: 28 :: 31'); +INSERT INTO trove_cat VALUES (32,2000031601,28,18,'mta','Mail Transport Agents','Email transport and gatewaying software.',0,0,'Topic :: Communications :: Email :: Mail Transport Agents','18 :: 20 :: 28 :: 32'); +INSERT INTO trove_cat VALUES (33,2000031601,28,18,'postoffice','Post-Office','Programs to support post-office protocols, including POP and IMAP.',0,0,'Topic :: Communications :: Email :: Post-Office','18 :: 20 :: 28 :: 33'); +INSERT INTO trove_cat VALUES (34,2000031601,33,18,'pop3','POP3','Programs to support POP3 (Post-Office Protocol, version 3).',0,0,'Topic :: Communications :: Email :: Post-Office :: POP3','18 :: 20 :: 28 :: 33 :: 34'); +INSERT INTO trove_cat VALUES (35,2000031601,33,18,'imap','IMAP','Programs to support IMAP protocol (Internet Message Access Protocol).',0,0,'Topic :: Communications :: Email :: Post-Office :: IMAP','18 :: 20 :: 28 :: 33 :: 35'); +INSERT INTO trove_cat VALUES (36,2000031601,20,18,'fax','Fax','Tools for sending and receiving facsimile messages.',0,0,'Topic :: Communications :: Fax','18 :: 20 :: 36'); +INSERT INTO trove_cat VALUES (37,2000031601,20,18,'fido','FIDO','Tools for FIDOnet mail and echoes.',0,0,'Topic :: Communications :: FIDO','18 :: 20 :: 37'); +INSERT INTO trove_cat VALUES (38,2000031601,20,18,'hamradio','Ham Radio','Tools and resources for amateur radio.',0,0,'Topic :: Communications :: Ham Radio','18 :: 20 :: 38'); +INSERT INTO trove_cat VALUES (39,2000031601,20,18,'usenet','Usenet News','Software to support USENET news.',0,0,'Topic :: Communications :: Usenet News','18 :: 20 :: 39'); +INSERT INTO trove_cat VALUES (40,2000031601,20,18,'internetphone','Internet Phone','Software to support real-time speech communication over the Internet.',0,0,'Topic :: Communications :: Internet Phone','18 :: 20 :: 40'); +INSERT INTO trove_cat VALUES (41,2000031601,19,18,'packaging','Packaging','Tools for packing and unpacking multi-file formats. Includes data-only formats and software package systems.',0,0,'Topic :: System :: Archiving :: Packaging','18 :: 136 :: 19 :: 41'); +INSERT INTO trove_cat VALUES (42,2000031601,19,18,'compression','Compression','Tools and libraries for data compression.',0,0,'Topic :: System :: Archiving :: Compression','18 :: 136 :: 19 :: 42'); +INSERT INTO trove_cat VALUES (43,2000031601,18,18,'security','Security','Security-related software, to include system administration and cryptography.',0,0,'Topic :: Security','18 :: 43'); +INSERT INTO trove_cat VALUES (44,2000031601,43,18,'cryptography','Cryptography','Cryptography programs, algorithms, and libraries.',0,0,'Topic :: Security :: Cryptography','18 :: 43 :: 44'); +INSERT INTO trove_cat VALUES (45,2000031601,18,18,'development','Software Development','Software used to aid software development.',0,0,'Topic :: Software Development','18 :: 45'); +INSERT INTO trove_cat VALUES (46,2000031601,45,18,'build','Build Tools','Software for the build process.',0,0,'Topic :: Software Development :: Build Tools','18 :: 45 :: 46'); +INSERT INTO trove_cat VALUES (47,2000031601,45,18,'debuggers','Debuggers','Programs for controlling and monitoring the execution of compiled binaries.',0,0,'Topic :: Software Development :: Debuggers','18 :: 45 :: 47'); +INSERT INTO trove_cat VALUES (48,2000031601,45,18,'compilers','Compilers','Programs for compiling high-level languges into machine code.',0,0,'Topic :: Software Development :: Compilers','18 :: 45 :: 48'); +INSERT INTO trove_cat VALUES (49,2000031601,45,18,'interpreters','Interpreters','Programs for interpreting and executing high-level languages directly.',0,0,'Topic :: Software Development :: Interpreters','18 :: 45 :: 49'); +INSERT INTO trove_cat VALUES (50,2000031601,45,18,'objectbrokering','Object Brokering','Object brokering libraries and tools.',0,0,'Topic :: Software Development :: Object Brokering','18 :: 45 :: 50'); +INSERT INTO trove_cat VALUES (51,2000031601,50,18,'corba','CORBA','Tools for implementation and use of CORBA.',0,0,'Topic :: Software Development :: Object Brokering :: CORBA','18 :: 45 :: 50 :: 51'); +INSERT INTO trove_cat VALUES (52,2000031601,45,18,'versioncontrol','Version Control','Tools for managing multiple versions of evolving sources or documents.',0,0,'Topic :: Software Development :: Version Control','18 :: 45 :: 52'); +INSERT INTO trove_cat VALUES (53,2000031601,52,18,'cvs','CVS','Tools for CVS (Concurrent Versioning System).',0,0,'Topic :: Software Development :: Version Control :: CVS','18 :: 45 :: 52 :: 53'); +INSERT INTO trove_cat VALUES (54,2000031601,52,18,'rcs','RCS','Tools for RCS (Revision Control System).',0,0,'Topic :: Software Development :: Version Control :: RCS','18 :: 45 :: 52 :: 54'); +INSERT INTO trove_cat VALUES (55,2000031601,18,18,'desktop','Desktop Environment','Accessories, managers, and utilities for your GUI desktop.',0,0,'Topic :: Desktop Environment','18 :: 55'); +INSERT INTO trove_cat VALUES (56,2000031601,55,18,'windowmanagers','Window Managers','Programs that provide window control and application launching.',0,0,'Topic :: Desktop Environment :: Window Managers','18 :: 55 :: 56'); +INSERT INTO trove_cat VALUES (57,2000031601,55,18,'kde','K Desktop Environment (KDE)','Software for the KDE desktop.',0,0,'Topic :: Desktop Environment :: K Desktop Environment (KDE)','18 :: 55 :: 57'); +INSERT INTO trove_cat VALUES (58,2000031601,55,18,'gnome','Gnome','Software for the Gnome desktop.',0,0,'Topic :: Desktop Environment :: Gnome','18 :: 55 :: 58'); +INSERT INTO trove_cat VALUES (59,2000031601,56,18,'enlightenment','Enlightenment','Software for the Enlightenment window manager.',0,0,'Topic :: Desktop Environment :: Window Managers :: Enlightenment','18 :: 55 :: 56 :: 59'); +INSERT INTO trove_cat VALUES (60,2000031601,59,18,'themes','Themes','Themes for the Enlightenment window manager.',0,0,'Topic :: Desktop Environment :: Window Managers :: Enlightenment :: Themes','18 :: 55 :: 56 :: 59 :: 60'); +INSERT INTO trove_cat VALUES (61,2000031601,57,18,'themes','Themes','Themes for KDE.',0,0,'Topic :: Desktop Environment :: K Desktop Environment (KDE) :: Themes','18 :: 55 :: 57 :: 61'); +INSERT INTO trove_cat VALUES (62,2000031601,55,18,'screensavers','Screen Savers','Screen savers and lockers.',0,0,'Topic :: Desktop Environment :: Screen Savers','18 :: 55 :: 62'); +INSERT INTO trove_cat VALUES (63,2000032001,18,18,'editors','Text Editors','Programs for editing code and documents.',0,0,'Topic :: Text Editors','18 :: 63'); +INSERT INTO trove_cat VALUES (64,2000031601,63,18,'emacs','Emacs','GNU Emacs and its imitators and tools.',0,0,'Topic :: Text Editors :: Emacs','18 :: 63 :: 64'); +INSERT INTO trove_cat VALUES (65,2000031601,63,18,'ide','Integrated Development Environments (IDE)','Complete editing environments for code, including cababilities such as compilation and code building assistance.',0,0,'Topic :: Text Editors :: Integrated Development Environments (IDE)','18 :: 63 :: 65'); +INSERT INTO trove_cat VALUES (66,2000031601,18,18,'database','Database','Front ends, engines, and tools for database work.',0,0,'Topic :: Database','18 :: 66'); +INSERT INTO trove_cat VALUES (67,2000031601,66,18,'engines','Database Engines/Servers','Programs that manage data and provide control via some query language.',0,0,'Topic :: Database :: Database Engines/Servers','18 :: 66 :: 67'); +INSERT INTO trove_cat VALUES (68,2000031601,66,18,'frontends','Front-Ends','Clients and front-ends for generating queries to database engines.',0,0,'Topic :: Database :: Front-Ends','18 :: 66 :: 68'); +INSERT INTO trove_cat VALUES (69,2000031601,63,18,'documentation','Documentation','Tools for the creation and use of documentation.',0,0,'Topic :: Text Editors :: Documentation','18 :: 63 :: 69'); +INSERT INTO trove_cat VALUES (70,2000031601,63,18,'wordprocessors','Word Processors','WYSIWYG word processors.',0,0,'Topic :: Text Editors :: Word Processors','18 :: 63 :: 70'); +INSERT INTO trove_cat VALUES (71,2000031601,18,18,'education','Education','Programs and tools for educating yourself or others.',0,0,'Topic :: Education','18 :: 71'); +INSERT INTO trove_cat VALUES (72,2000031601,71,18,'cai','Computer Aided Instruction (CAI)','Programs for authoring or using Computer Aided Instrution courses.',0,0,'Topic :: Education :: Computer Aided Instruction (CAI)','18 :: 71 :: 72'); +INSERT INTO trove_cat VALUES (73,2000031601,71,18,'testing','Testing','Tools for testing someone''s knowledge on a subject.',0,0,'Topic :: Education :: Testing','18 :: 71 :: 73'); +INSERT INTO trove_cat VALUES (74,2000042701,136,18,'emulators','Emulators','Emulations of foreign operating systme and machines.',0,0,'Topic :: System :: Emulators','18 :: 136 :: 74'); +INSERT INTO trove_cat VALUES (75,2000031701,129,18,'financial','Financial','Programs related to finance.',0,0,'Topic :: Office/Business :: Financial','18 :: 129 :: 75'); +INSERT INTO trove_cat VALUES (76,2000031601,75,18,'accounting','Accounting','Checkbook balancers and accounting programs.',0,0,'Topic :: Office/Business :: Financial :: Accounting','18 :: 129 :: 75 :: 76'); +INSERT INTO trove_cat VALUES (77,2000031601,75,18,'investment','Investment','Programs for assisting in financial investment.',0,0,'Topic :: Office/Business :: Financial :: Investment','18 :: 129 :: 75 :: 77'); +INSERT INTO trove_cat VALUES (78,2000031601,75,18,'spreadsheet','Spreadsheet','Spreadsheet applications.',0,0,'Topic :: Office/Business :: Financial :: Spreadsheet','18 :: 129 :: 75 :: 78'); +INSERT INTO trove_cat VALUES (79,2000031601,75,18,'pointofsale','Point-Of-Sale','Point-Of-Sale applications.',0,0,'Topic :: Office/Business :: Financial :: Point-Of-Sale','18 :: 129 :: 75 :: 79'); +INSERT INTO trove_cat VALUES (80,2000031601,18,18,'games','Games/Entertainment','Games and Entertainment software.',0,0,'Topic :: Games/Entertainment','18 :: 80'); +INSERT INTO trove_cat VALUES (81,2000031601,80,18,'realtimestrategy','Real Time Strategy','Real Time strategy games',0,0,'Topic :: Games/Entertainment :: Real Time Strategy','18 :: 80 :: 81'); +INSERT INTO trove_cat VALUES (82,2000031601,80,18,'firstpersonshooters','First Person Shooters','First Person Shooters.',0,0,'Topic :: Games/Entertainment :: First Person Shooters','18 :: 80 :: 82'); +INSERT INTO trove_cat VALUES (83,2000032401,80,18,'turnbasedstrategy','Turn Based Strategy','Turn Based Strategy',0,0,'Topic :: Games/Entertainment :: Turn Based Strategy','18 :: 80 :: 83'); +INSERT INTO trove_cat VALUES (84,2000031601,80,18,'rpg','Role-Playing','Role-Playing games',0,0,'Topic :: Games/Entertainment :: Role-Playing','18 :: 80 :: 84'); +INSERT INTO trove_cat VALUES (85,2000031601,80,18,'simulation','Simulation','Simulation games',0,0,'Topic :: Games/Entertainment :: Simulation','18 :: 80 :: 85'); +INSERT INTO trove_cat VALUES (86,2000031601,80,18,'mud','Multi-User Dungeons (MUD)','Massively-multiplayer text based games.',0,0,'Topic :: Games/Entertainment :: Multi-User Dungeons (MUD)','18 :: 80 :: 86'); +INSERT INTO trove_cat VALUES (87,2000031601,18,18,'internet','Internet','Tools to assist human access to the Internet.',0,0,'Topic :: Internet','18 :: 87'); +INSERT INTO trove_cat VALUES (88,2000031601,87,18,'finger','Finger','The Finger protocol for getting information about users.',0,0,'Topic :: Internet :: Finger','18 :: 87 :: 88'); +INSERT INTO trove_cat VALUES (89,2000031601,87,18,'ftp','File Transfer Protocol (FTP)','Programs and tools for file transfer via FTP.',0,0,'Topic :: Internet :: File Transfer Protocol (FTP)','18 :: 87 :: 89'); +INSERT INTO trove_cat VALUES (90,2000031601,87,18,'www','WWW/HTTP','Programs and tools for the World Wide Web.',0,0,'Topic :: Internet :: WWW/HTTP','18 :: 87 :: 90'); +INSERT INTO trove_cat VALUES (91,2000031601,90,18,'browsers','Browsers','Web Browsers',0,0,'Topic :: Internet :: WWW/HTTP :: Browsers','18 :: 87 :: 90 :: 91'); +INSERT INTO trove_cat VALUES (92,2000031601,90,18,'dynamic','Dynamic Content','Common Gateway Interface scripting and server-side parsing.',0,0,'Topic :: Internet :: WWW/HTTP :: Dynamic Content','18 :: 87 :: 90 :: 92'); +INSERT INTO trove_cat VALUES (93,2000031601,90,18,'indexing','Indexing/Search','Indexing and search tools for the Web.',0,0,'Topic :: Internet :: WWW/HTTP :: Indexing/Search','18 :: 87 :: 90 :: 93'); +INSERT INTO trove_cat VALUES (94,2000031601,92,18,'counters','Page Counters','Scripts to count numbers of pageviews.',0,0,'Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Page Counters','18 :: 87 :: 90 :: 92 :: 94'); +INSERT INTO trove_cat VALUES (95,2000031601,92,18,'messageboards','Message Boards','Online message boards',0,0,'Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Message Boards','18 :: 87 :: 90 :: 92 :: 95'); +INSERT INTO trove_cat VALUES (96,2000031601,92,18,'cgi','CGI Tools/Libraries','Tools for the Common Gateway Interface',0,0,'Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries','18 :: 87 :: 90 :: 92 :: 96'); +INSERT INTO trove_cat VALUES (97,2000042701,18,18,'scientific','Scientific/Engineering','Scientific applications, to include research, applied and pure mathematics and sciences.',0,0,'Topic :: Scientific/Engineering','18 :: 97'); +INSERT INTO trove_cat VALUES (98,2000031601,97,18,'mathematics','Mathematics','Software to support pure and applied mathematics.',0,0,'Topic :: Scientific/Engineering :: Mathematics','18 :: 97 :: 98'); +INSERT INTO trove_cat VALUES (99,2000031601,18,18,'multimedia','Multimedia','Graphics, sound, video, and multimedia.',0,0,'Topic :: Multimedia','18 :: 99'); +INSERT INTO trove_cat VALUES (100,2000031601,99,18,'graphics','Graphics','Tools and resources for computer graphics.',0,0,'Topic :: Multimedia :: Graphics','18 :: 99 :: 100'); +INSERT INTO trove_cat VALUES (101,2000031601,100,18,'capture','Capture','Support for scanners, cameras, and screen capture.',0,0,'Topic :: Multimedia :: Graphics :: Capture','18 :: 99 :: 100 :: 101'); +INSERT INTO trove_cat VALUES (102,2000031601,101,18,'scanners','Scanners','Support for graphic scanners.',0,0,'Topic :: Multimedia :: Graphics :: Capture :: Scanners','18 :: 99 :: 100 :: 101 :: 102'); +INSERT INTO trove_cat VALUES (103,2000031601,101,18,'cameras','Digital Camera','Digital Camera',0,0,'Topic :: Multimedia :: Graphics :: Capture :: Digital Camera','18 :: 99 :: 100 :: 101 :: 103'); +INSERT INTO trove_cat VALUES (104,2000031601,101,18,'screencapture','Screen Capture','Screen capture tools and processors.',0,0,'Topic :: Multimedia :: Graphics :: Capture :: Screen Capture','18 :: 99 :: 100 :: 101 :: 104'); +INSERT INTO trove_cat VALUES (105,2000031701,100,18,'conversion','Graphics Conversion','Programs which convert between graphics formats.',0,0,'Topic :: Multimedia :: Graphics :: Graphics Conversion','18 :: 99 :: 100 :: 105'); +INSERT INTO trove_cat VALUES (106,2000031701,100,18,'editors','Editors','Drawing, painting, and structured editing programs.',0,0,'Topic :: Multimedia :: Graphics :: Editors','18 :: 99 :: 100 :: 106'); +INSERT INTO trove_cat VALUES (107,2000031701,106,18,'vector','Vector-Based','Vector-Based drawing programs.',0,0,'Topic :: Multimedia :: Graphics :: Editors :: Vector-Based','18 :: 99 :: 100 :: 106 :: 107'); +INSERT INTO trove_cat VALUES (108,2000031701,106,18,'raster','Raster-Based','Raster/Bitmap based drawing programs.',0,0,'Topic :: Multimedia :: Graphics :: Editors :: Raster-Based','18 :: 99 :: 100 :: 106 :: 108'); +INSERT INTO trove_cat VALUES (109,2000031701,100,18,'3dmodeling','3D Modeling','Programs for working with 3D Models.',0,0,'Topic :: Multimedia :: Graphics :: 3D Modeling','18 :: 99 :: 100 :: 109'); +INSERT INTO trove_cat VALUES (110,2000031701,100,18,'3drendering','3D Rendering','Programs which render 3D models.',0,0,'Topic :: Multimedia :: Graphics :: 3D Rendering','18 :: 99 :: 100 :: 110'); +INSERT INTO trove_cat VALUES (111,2000031701,100,18,'presentation','Presentation','Tools for generating presentation graphics and slides.',0,0,'Topic :: Multimedia :: Graphics :: Presentation','18 :: 99 :: 100 :: 111'); +INSERT INTO trove_cat VALUES (112,2000031701,100,18,'viewers','Viewers','Programs that can display various graphics formats.',0,0,'Topic :: Multimedia :: Graphics :: Viewers','18 :: 99 :: 100 :: 112'); +INSERT INTO trove_cat VALUES (113,2000031701,99,18,'sound','Sound/Audio','Tools for generating, editing, analyzing, and playing sound.',0,0,'Topic :: Multimedia :: Sound/Audio','18 :: 99 :: 113'); +INSERT INTO trove_cat VALUES (114,2000031701,113,18,'analysis','Analysis','Sound analysis tools, to include frequency analysis.',0,0,'Topic :: Multimedia :: Sound/Audio :: Analysis','18 :: 99 :: 113 :: 114'); +INSERT INTO trove_cat VALUES (115,2000031701,113,18,'capture','Capture/Recording','Sound capture and recording.',0,0,'Topic :: Multimedia :: Sound/Audio :: Capture/Recording','18 :: 99 :: 113 :: 115'); +INSERT INTO trove_cat VALUES (116,2000031701,113,18,'cdaudio','CD Audio','Programs to play and manipulate audio CDs.',0,0,'Topic :: Multimedia :: Sound/Audio :: CD Audio','18 :: 99 :: 113 :: 116'); +INSERT INTO trove_cat VALUES (117,2000031701,116,18,'cdplay','CD Playing','CD Playing software, to include jukebox software.',0,0,'Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Playing','18 :: 99 :: 113 :: 116 :: 117'); +INSERT INTO trove_cat VALUES (118,2000031701,116,18,'cdripping','CD Ripping','Software to convert CD Audio to other digital formats.',0,0,'Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Ripping','18 :: 99 :: 113 :: 116 :: 118'); +INSERT INTO trove_cat VALUES (119,2000031701,113,18,'conversion','Conversion','Programs to convert between audio formats.',0,0,'Topic :: Multimedia :: Sound/Audio :: Conversion','18 :: 99 :: 113 :: 119'); +INSERT INTO trove_cat VALUES (120,2000031701,113,18,'editors','Editors','Programs to edit/manipulate sound data.',0,0,'Topic :: Multimedia :: Sound/Audio :: Editors','18 :: 99 :: 113 :: 120'); +INSERT INTO trove_cat VALUES (121,2000031701,113,18,'mixers','Mixers','Programs to mix audio.',0,0,'Topic :: Multimedia :: Sound/Audio :: Mixers','18 :: 99 :: 113 :: 121'); +INSERT INTO trove_cat VALUES (122,2000031701,113,18,'players','Players','Programs to play audio files to a sound device.',0,0,'Topic :: Multimedia :: Sound/Audio :: Players','18 :: 99 :: 113 :: 122'); +INSERT INTO trove_cat VALUES (123,2000031701,122,18,'mp3','MP3','Programs to play MP3 audio files.',0,0,'Topic :: Multimedia :: Sound/Audio :: Players :: MP3','18 :: 99 :: 113 :: 122 :: 123'); +INSERT INTO trove_cat VALUES (124,2000031701,113,18,'speech','Speech','Speech manipulation and intepretation tools.',0,0,'Topic :: Multimedia :: Sound/Audio :: Speech','18 :: 99 :: 113 :: 124'); +INSERT INTO trove_cat VALUES (125,2000031701,99,18,'video','Video','Video capture, editing, and playback.',0,0,'Topic :: Multimedia :: Video','18 :: 99 :: 125'); +INSERT INTO trove_cat VALUES (126,2000031701,125,18,'capture','Capture','Video capture tools.',0,0,'Topic :: Multimedia :: Video :: Capture','18 :: 99 :: 125 :: 126'); +INSERT INTO trove_cat VALUES (127,2000031701,125,18,'conversion','Conversion','Programs which convert between video formats.',0,0,'Topic :: Multimedia :: Video :: Conversion','18 :: 99 :: 125 :: 127'); +INSERT INTO trove_cat VALUES (128,2000031701,125,18,'display','Display','Programs which display various video formats.',0,0,'Topic :: Multimedia :: Video :: Display','18 :: 99 :: 125 :: 128'); +INSERT INTO trove_cat VALUES (129,2000031701,18,18,'office','Office/Business','Software for assisting and organizing work at your desk.',0,0,'Topic :: Office/Business','18 :: 129'); +INSERT INTO trove_cat VALUES (130,2000031701,129,18,'scheduling','Scheduling','Projects for scheduling time, to include project management.',0,0,'Topic :: Office/Business :: Scheduling','18 :: 129 :: 130'); +INSERT INTO trove_cat VALUES (131,2000032001,129,18,'suites','Office Suites','Integrated office suites (word processing, presentation, spreadsheet, database, etc).',0,0,'Topic :: Office/Business :: Office Suites','18 :: 129 :: 131'); +INSERT INTO trove_cat VALUES (132,2000032001,18,18,'religion','Religion','Programs relating to religion and sacred texts.',0,0,'Topic :: Religion','18 :: 132'); +INSERT INTO trove_cat VALUES (133,2000032001,97,18,'ai','Artificial Intelligence','Artificial Intelligence.',0,0,'Topic :: Scientific/Engineering :: Artificial Intelligence','18 :: 97 :: 133'); +INSERT INTO trove_cat VALUES (134,2000032001,97,18,'astronomy','Astronomy','Software and tools related to astronomy.',0,0,'Topic :: Scientific/Engineering :: Astronomy','18 :: 97 :: 134'); +INSERT INTO trove_cat VALUES (135,2000032001,97,18,'visualization','Visualization','Software for scientific visualization.',0,0,'Topic :: Scientific/Engineering :: Visualization','18 :: 97 :: 135'); +INSERT INTO trove_cat VALUES (136,2000032001,18,18,'system','System','Operating system core and administration utilities.',0,0,'Topic :: System','18 :: 136'); +INSERT INTO trove_cat VALUES (137,2000032001,19,18,'backup','Backup','Programs to manage and sequence system backup.',0,0,'Topic :: System :: Archiving :: Backup','18 :: 136 :: 19 :: 137'); +INSERT INTO trove_cat VALUES (138,2000032001,136,18,'benchmark','Benchmark','Programs for benchmarking system performance.',0,0,'Topic :: System :: Benchmark','18 :: 136 :: 138'); +INSERT INTO trove_cat VALUES (139,2000032001,136,18,'boot','Boot','Programs for bootstrapping your OS.',0,0,'Topic :: System :: Boot','18 :: 136 :: 139'); +INSERT INTO trove_cat VALUES (140,2000032001,139,18,'init','Init','Init-time programs to start system services after boot.',0,0,'Topic :: System :: Boot :: Init','18 :: 136 :: 139 :: 140'); +INSERT INTO trove_cat VALUES (141,2000032001,136,18,'clustering','Clustering/Distributed Networks','Tools for automatically distributing computation across a network.',0,0,'Topic :: System :: Clustering/Distributed Networks','18 :: 136 :: 141'); +INSERT INTO trove_cat VALUES (142,2000032001,136,18,'filesystems','Filesystems','Support for creating, editing, reading, and writing file systems.',0,0,'Topic :: System :: Filesystems','18 :: 136 :: 142'); +INSERT INTO trove_cat VALUES (143,2000032001,144,18,'linux','Linux','The Linux kernel, patches, and modules.',0,0,'Topic :: System :: Operating System Kernels :: Linux','18 :: 136 :: 144 :: 143'); +INSERT INTO trove_cat VALUES (144,2000032001,136,18,'kernels','Operating System Kernels','OS Kernels, patches, modules, and tools.',0,0,'Topic :: System :: Operating System Kernels','18 :: 136 :: 144'); +INSERT INTO trove_cat VALUES (145,2000032001,144,18,'bsd','BSD','Code relating to any of the BSD kernels.',0,0,'Topic :: System :: Operating System Kernels :: BSD','18 :: 136 :: 144 :: 145'); +INSERT INTO trove_cat VALUES (146,2000032001,136,18,'hardware','Hardware','Tools for direct, non-kernel control and configuration of hardware.',0,0,'Topic :: System :: Hardware','18 :: 136 :: 146'); +INSERT INTO trove_cat VALUES (147,2000032001,136,18,'setup','Installation/Setup','Tools for installation and setup of the operating system and other programs.',0,0,'Topic :: System :: Installation/Setup','18 :: 136 :: 147'); +INSERT INTO trove_cat VALUES (148,2000032001,136,18,'logging','Logging','Utilities for clearing, rotating, and digesting system logs.',0,0,'Topic :: System :: Logging','18 :: 136 :: 148'); +INSERT INTO trove_cat VALUES (149,2000032001,87,18,'dns','Name Service (DNS)','Domain name system servers and utilities.',0,0,'Topic :: Internet :: Name Service (DNS)','18 :: 87 :: 149'); +INSERT INTO trove_cat VALUES (150,2000032001,136,18,'networking','Networking','Network configuration and administration.',0,0,'Topic :: System :: Networking','18 :: 136 :: 150'); +INSERT INTO trove_cat VALUES (151,2000032001,150,18,'firewalls','Firewalls','Firewalls and filtering systems.',0,0,'Topic :: System :: Networking :: Firewalls','18 :: 136 :: 150 :: 151'); +INSERT INTO trove_cat VALUES (152,2000032001,150,18,'monitoring','Monitoring','System monitoring, traffic analysis, and sniffers.',0,0,'Topic :: System :: Networking :: Monitoring','18 :: 136 :: 150 :: 152'); +INSERT INTO trove_cat VALUES (153,2000032001,136,18,'power','Power (UPS)','Code for communication with uninterruptible power supplies.',0,0,'Topic :: System :: Power (UPS)','18 :: 136 :: 153'); +INSERT INTO trove_cat VALUES (154,2000032001,18,18,'printing','Printing','Tools, daemons, and utilities for printer control.',0,0,'Topic :: Printing','18 :: 154'); +INSERT INTO trove_cat VALUES (155,2000032001,152,18,'watchdog','Hardware Watchdog','Software to monitor and perform actions or shutdown on hardware trouble detection.',0,0,'Topic :: System :: Networking :: Monitoring :: Hardware Watchdog','18 :: 136 :: 150 :: 152 :: 155'); +INSERT INTO trove_cat VALUES (156,2000032001,18,18,'terminals','Terminals','Terminal emulators, terminal programs, and terminal session utilities.',0,0,'Topic :: Terminals','18 :: 156'); +INSERT INTO trove_cat VALUES (157,2000032001,156,18,'serial','Serial','Dialup, terminal emulation, and file transfer over serial lines.',0,0,'Topic :: Terminals :: Serial','18 :: 156 :: 157'); +INSERT INTO trove_cat VALUES (158,2000032001,156,18,'virtual','Terminal Emulators/X Terminals','Programs to handle multiple terminal sessions. Includes terminal emulations for X and other window systems.',0,0,'Topic :: Terminals :: Terminal Emulators/X Terminals','18 :: 156 :: 158'); +INSERT INTO trove_cat VALUES (159,2000032001,156,18,'telnet','Telnet','Support for telnet; terminal sessions across Internet links.',0,0,'Topic :: Terminals :: Telnet','18 :: 156 :: 159'); +INSERT INTO trove_cat VALUES (160,2000032001,0,0,'language','Programming Language','Language in which this program was written, or was meant to support.',0,0,'Programming Language','160'); +INSERT INTO trove_cat VALUES (161,2000032001,160,160,'apl','APL','APL',0,0,'Programming Language :: APL','160 :: 161'); +INSERT INTO trove_cat VALUES (164,2000032001,160,160,'c','C','C',0,0,'Programming Language :: C','160 :: 164'); +INSERT INTO trove_cat VALUES (162,2000032001,160,160,'assembly','Assembly','Assembly-level programs. Platform specific.',0,0,'Programming Language :: Assembly','160 :: 162'); +INSERT INTO trove_cat VALUES (163,2000051001,160,160,'ada','Ada','Ada',0,0,'Programming Language :: Ada','160 :: 163'); +INSERT INTO trove_cat VALUES (165,2000032001,160,160,'cpp','C++','C++',0,0,'Programming Language :: C++','160 :: 165'); +INSERT INTO trove_cat VALUES (166,2000032401,160,160,'eiffel','Eiffel','Eiffel',0,0,'Programming Language :: Eiffel','160 :: 166'); +INSERT INTO trove_cat VALUES (167,2000032001,160,160,'euler','Euler','Euler',0,0,'Programming Language :: Euler','160 :: 167'); +INSERT INTO trove_cat VALUES (168,2000032001,160,160,'forth','Forth','Forth',0,0,'Programming Language :: Forth','160 :: 168'); +INSERT INTO trove_cat VALUES (169,2000032001,160,160,'fortran','Fortran','Fortran',0,0,'Programming Language :: Fortran','160 :: 169'); +INSERT INTO trove_cat VALUES (170,2000032001,160,160,'lisp','Lisp','Lisp',0,0,'Programming Language :: Lisp','160 :: 170'); +INSERT INTO trove_cat VALUES (171,2000041101,160,160,'logo','Logo','Logo',0,0,'Programming Language :: Logo','160 :: 171'); +INSERT INTO trove_cat VALUES (172,2000032001,160,160,'ml','ML','ML',0,0,'Programming Language :: ML','160 :: 172'); +INSERT INTO trove_cat VALUES (173,2000032001,160,160,'modula','Modula','Modula-2 or Modula-3',0,0,'Programming Language :: Modula','160 :: 173'); +INSERT INTO trove_cat VALUES (174,2000032001,160,160,'objectivec','Objective C','Objective C',0,0,'Programming Language :: Objective C','160 :: 174'); +INSERT INTO trove_cat VALUES (175,2000032001,160,160,'pascal','Pascal','Pascal',0,0,'Programming Language :: Pascal','160 :: 175'); +INSERT INTO trove_cat VALUES (176,2000032001,160,160,'perl','Perl','Perl',0,0,'Programming Language :: Perl','160 :: 176'); +INSERT INTO trove_cat VALUES (177,2000032001,160,160,'prolog','Prolog','Prolog',0,0,'Programming Language :: Prolog','160 :: 177'); +INSERT INTO trove_cat VALUES (178,2000032001,160,160,'python','Python','Python',0,0,'Programming Language :: Python','160 :: 178'); +INSERT INTO trove_cat VALUES (179,2000032001,160,160,'rexx','Rexx','Rexx',0,0,'Programming Language :: Rexx','160 :: 179'); +INSERT INTO trove_cat VALUES (180,2000032001,160,160,'simula','Simula','Simula',0,0,'Programming Language :: Simula','160 :: 180'); +INSERT INTO trove_cat VALUES (181,2000032001,160,160,'smalltalk','Smalltalk','Smalltalk',0,0,'Programming Language :: Smalltalk','160 :: 181'); +INSERT INTO trove_cat VALUES (182,2000032001,160,160,'tcl','Tcl','Tcl',0,0,'Programming Language :: Tcl','160 :: 182'); +INSERT INTO trove_cat VALUES (183,2000032001,160,160,'php','PHP','PHP',0,0,'Programming Language :: PHP','160 :: 183'); +INSERT INTO trove_cat VALUES (184,2000032001,160,160,'asp','ASP','Active Server Pages',0,0,'Programming Language :: ASP','160 :: 184'); +INSERT INTO trove_cat VALUES (185,2000032001,160,160,'shell','Unix Shell','Unix Shell',0,0,'Programming Language :: Unix Shell','160 :: 185'); +INSERT INTO trove_cat VALUES (186,2000032001,160,160,'visualbasic','Visual Basic','Visual Basic',0,0,'Programming Language :: Visual Basic','160 :: 186'); +INSERT INTO trove_cat VALUES (187,2000032001,14,13,'bsd','BSD License','BSD License',0,0,'License :: OSI Approved :: BSD License','13 :: 14 :: 187'); +INSERT INTO trove_cat VALUES (188,2000032001,14,13,'mit','MIT/X Consortium License','MIT License, also the X Consortium License.',0,0,'License :: OSI Approved :: MIT/X Consortium License','13 :: 14 :: 188'); +INSERT INTO trove_cat VALUES (189,2000032001,14,13,'mpl','Mozilla Public License (MPL)','Mozilla Public License (MPL)',0,0,'License :: OSI Approved :: Mozilla Public License (MPL)','13 :: 14 :: 189'); +INSERT INTO trove_cat VALUES (190,2000032001,14,13,'qpl','QT Public License (QPL)','QT Public License',0,0,'License :: OSI Approved :: QT Public License (QPL)','13 :: 14 :: 190'); +INSERT INTO trove_cat VALUES (191,2000032001,14,13,'ibm','IBM Public License','IBM Public License',0,0,'License :: OSI Approved :: IBM Public License','13 :: 14 :: 191'); +INSERT INTO trove_cat VALUES (192,2000032001,14,13,'cvw','MITRE Collaborative Virtual Workspace License (CVW)','MITRE Collaborative Virtual Workspace License (CVW)',0,0,'License :: OSI Approved :: MITRE Collaborative Virtual Workspace License (CVW)','13 :: 14 :: 192'); +INSERT INTO trove_cat VALUES (193,2000032001,14,13,'ricoh','Ricoh Source Code Public License','Ricoh Source Code Public License',0,0,'License :: OSI Approved :: Ricoh Source Code Public License','13 :: 14 :: 193'); +INSERT INTO trove_cat VALUES (194,2000032001,14,13,'python','Python License','Python License',0,0,'License :: OSI Approved :: Python License','13 :: 14 :: 194'); +INSERT INTO trove_cat VALUES (195,2000032001,14,13,'zlib','zlib/libpng License','zlib/libpng License',0,0,'License :: OSI Approved :: zlib/libpng License','13 :: 14 :: 195'); +INSERT INTO trove_cat VALUES (196,2000040701,13,13,'other','Other/Proprietary License','Non OSI-Approved/Proprietary license.',0,0,'License :: Other/Proprietary License','13 :: 196'); +INSERT INTO trove_cat VALUES (197,2000032001,13,13,'publicdomain','Public Domain','Public Domain. No author-retained rights.',0,0,'License :: Public Domain','13 :: 197'); +INSERT INTO trove_cat VALUES (198,2000032001,160,160,'java','Java','Java',0,0,'Programming Language :: Java','160 :: 198'); +INSERT INTO trove_cat VALUES (199,2000032101,0,0,'os','Operating System','What operating system the program requires to run, if any.',0,0,'Operating System','199'); +INSERT INTO trove_cat VALUES (200,2000032101,199,199,'posix','POSIX','POSIX plus standard Berkeley socket facilities. Don''t list a more specific OS unless your program requires it.',0,0,'Operating System :: POSIX','199 :: 200'); +INSERT INTO trove_cat VALUES (201,2000032101,200,199,'linux','Linux','Any version of Linux. Don''t specify a subcategory unless the program requires a particular distribution.',0,0,'Operating System :: POSIX :: Linux','199 :: 200 :: 201'); +INSERT INTO trove_cat VALUES (202,2000032101,200,199,'bsd','BSD','Any variant of BSD. Don''t specify a subcategory unless the program requires a particular BSD flavor.',0,0,'Operating System :: POSIX :: BSD','199 :: 200 :: 202'); +INSERT INTO trove_cat VALUES (203,2000041101,202,199,'freebsd','FreeBSD','FreeBSD',0,0,'Operating System :: POSIX :: BSD :: FreeBSD','199 :: 200 :: 202 :: 203'); +INSERT INTO trove_cat VALUES (204,2000032101,202,199,'netbsd','NetBSD','NetBSD',0,0,'Operating System :: POSIX :: BSD :: NetBSD','199 :: 200 :: 202 :: 204'); +INSERT INTO trove_cat VALUES (205,2000032101,202,199,'openbsd','OpenBSD','OpenBSD',0,0,'Operating System :: POSIX :: BSD :: OpenBSD','199 :: 200 :: 202 :: 205'); +INSERT INTO trove_cat VALUES (206,2000032101,202,199,'bsdos','BSD/OS','BSD/OS',0,0,'Operating System :: POSIX :: BSD :: BSD/OS','199 :: 200 :: 202 :: 206'); +INSERT INTO trove_cat VALUES (207,2000032101,200,199,'sun','SunOS/Solaris','Any Sun Microsystems OS.',0,0,'Operating System :: POSIX :: SunOS/Solaris','199 :: 200 :: 207'); +INSERT INTO trove_cat VALUES (208,2000032101,200,199,'sco','SCO','SCO',0,0,'Operating System :: POSIX :: SCO','199 :: 200 :: 208'); +INSERT INTO trove_cat VALUES (209,2000032101,200,199,'hpux','HP-UX','HP-UX',0,0,'Operating System :: POSIX :: HP-UX','199 :: 200 :: 209'); +INSERT INTO trove_cat VALUES (210,2000032101,200,199,'aix','AIX','AIX',0,0,'Operating System :: POSIX :: AIX','199 :: 200 :: 210'); +INSERT INTO trove_cat VALUES (211,2000032101,200,199,'irix','IRIX','IRIX',0,0,'Operating System :: POSIX :: IRIX','199 :: 200 :: 211'); +INSERT INTO trove_cat VALUES (212,2000032101,200,199,'other','Other','Other specific POSIX OS, specified in description.',0,0,'Operating System :: POSIX :: Other','199 :: 200 :: 212'); +INSERT INTO trove_cat VALUES (213,2000032101,160,160,'other','Other','Other programming language, specified in description.',0,0,'Programming Language :: Other','160 :: 213'); +INSERT INTO trove_cat VALUES (214,2000032101,199,199,'microsoft','Microsoft','Microsoft operating systems.',0,0,'Operating System :: Microsoft','199 :: 214'); +INSERT INTO trove_cat VALUES (215,2000032101,214,199,'msdos','MS-DOS','Microsoft Disk Operating System (DOS)',0,0,'Operating System :: Microsoft :: MS-DOS','199 :: 214 :: 215'); +INSERT INTO trove_cat VALUES (216,2000032101,214,199,'windows','Windows','Windows software, not specific to any particular version of Windows.',0,0,'Operating System :: Microsoft :: Windows','199 :: 214 :: 216'); +INSERT INTO trove_cat VALUES (217,2000032101,216,199,'win31','Windows 3.1 or Earlier','Windows 3.1 or Earlier',0,0,'Operating System :: Microsoft :: Windows :: Windows 3.1 or Earlier','199 :: 214 :: 216 :: 217'); +INSERT INTO trove_cat VALUES (218,2000032101,216,199,'win95','Windows 95/98/2000','Windows 95, Windows 98, and Windows 2000.',0,0,'Operating System :: Microsoft :: Windows :: Windows 95/98/2000','199 :: 214 :: 216 :: 218'); +INSERT INTO trove_cat VALUES (219,2000041101,216,199,'winnt','Windows NT/2000','Windows NT and Windows 2000.',0,0,'Operating System :: Microsoft :: Windows :: Windows NT/2000','199 :: 214 :: 216 :: 219'); +INSERT INTO trove_cat VALUES (220,2000032101,199,199,'os2','OS/2','OS/2',0,0,'Operating System :: OS/2','199 :: 220'); +INSERT INTO trove_cat VALUES (221,2000032101,199,199,'macos','MacOS','MacOS',0,0,'Operating System :: MacOS','199 :: 221'); +INSERT INTO trove_cat VALUES (222,2000032101,216,199,'wince','Windows CE','Windows CE',0,0,'Operating System :: Microsoft :: Windows :: Windows CE','199 :: 214 :: 216 :: 222'); +INSERT INTO trove_cat VALUES (223,2000032101,199,199,'palmos','PalmOS','PalmOS (for Palm Pilot)',0,0,'Operating System :: PalmOS','199 :: 223'); +INSERT INTO trove_cat VALUES (224,2000032101,199,199,'beos','BeOS','BeOS',0,0,'Operating System :: BeOS','199 :: 224'); +INSERT INTO trove_cat VALUES (225,2000032101,0,0,'environment','Environment','Run-time environment required for this program.',0,0,'Environment','225'); +INSERT INTO trove_cat VALUES (226,2000041101,225,225,'console','Console (Text Based)','Console-based programs.',0,0,'Environment :: Console (Text Based)','225 :: 226'); +INSERT INTO trove_cat VALUES (227,2000032401,226,225,'curses','Curses','Curses-based software.',0,0,'Environment :: Console (Text Based) :: Curses','225 :: 226 :: 227'); +INSERT INTO trove_cat VALUES (228,2000040701,226,225,'newt','Newt','Newt',0,0,'Environment :: Console (Text Based) :: Newt','225 :: 226 :: 228'); +INSERT INTO trove_cat VALUES (229,2000040701,225,225,'x11','X11 Applications','Programs that run in an X windowing environment.',0,0,'Environment :: X11 Applications','225 :: 229'); +INSERT INTO trove_cat VALUES (230,2000040701,225,225,'win32','Win32 (MS Windows)','Programs designed to run in a graphical Microsoft Windows environment.',0,0,'Environment :: Win32 (MS Windows)','225 :: 230'); +INSERT INTO trove_cat VALUES (231,2000040701,229,225,'gnome','Gnome','Programs designed to run in a Gnome environment.',0,0,'Environment :: X11 Applications :: Gnome','225 :: 229 :: 231'); +INSERT INTO trove_cat VALUES (232,2000040701,229,225,'kde','KDE','Programs designed to run in a KDE environment.',0,0,'Environment :: X11 Applications :: KDE','225 :: 229 :: 232'); +INSERT INTO trove_cat VALUES (233,2000040701,225,225,'other','Other Environment','Programs designed to run in an environment other than one listed.',0,0,'Environment :: Other Environment','225 :: 233'); +INSERT INTO trove_cat VALUES (234,2000040701,18,18,'other','Other/Nonlisted Topic','Topic does not fit into any listed category.',0,0,'Topic :: Other/Nonlisted Topic','18 :: 234'); +INSERT INTO trove_cat VALUES (235,2000041001,199,199,'independent','OS Independent','This software does not depend on any particular operating system.',0,0,'Operating System :: OS Independent','199 :: 235'); +INSERT INTO trove_cat VALUES (236,2000040701,199,199,'other','Other OS','Program is designe for a nonlisted operating system.',0,0,'Operating System :: Other OS','199 :: 236'); +INSERT INTO trove_cat VALUES (237,2000041001,225,225,'web','Web Environment','This software is designed for a web environment.',0,0,'Environment :: Web Environment','225 :: 237'); +INSERT INTO trove_cat VALUES (238,2000041101,225,225,'daemon','No Input/Output (Daemon)','This program has no input or output, but is intended to run in the background as a daemon.',0,0,'Environment :: No Input/Output (Daemon)','225 :: 238'); +INSERT INTO trove_cat VALUES (239,2000041301,144,18,'gnuhurd','GNU Hurd','Kernel code and modules for GNU Hurd.',0,0,'Topic :: System :: Operating System Kernels :: GNU Hurd','18 :: 136 :: 144 :: 239'); +INSERT INTO trove_cat VALUES (240,2000041301,200,199,'gnuhurd','GNU Hurd','GNU Hurd',0,0,'Operating System :: POSIX :: GNU Hurd','199 :: 200 :: 240'); +INSERT INTO trove_cat VALUES (241,2000050101,251,18,'napster','Napster','Clients and servers for the Napster file sharing protocol.',0,0,'Topic :: Communications :: File Sharing :: Napster','18 :: 20 :: 251 :: 241'); +INSERT INTO trove_cat VALUES (242,2000042701,160,160,'scheme','Scheme','Scheme programming language.',0,0,'Programming Language :: Scheme','160 :: 242'); +INSERT INTO trove_cat VALUES (243,2000042701,90,18,'sitemanagement','Site Management','Tools for maintanance and management of web sites.',0,0,'Topic :: Internet :: WWW/HTTP :: Site Management','18 :: 87 :: 90 :: 243'); +INSERT INTO trove_cat VALUES (244,2000042701,243,18,'linkchecking','Link Checking','Tools to assist in checking for broken links.',0,0,'Topic :: Internet :: WWW/HTTP :: Site Management :: Link Checking','18 :: 87 :: 90 :: 243 :: 244'); +INSERT INTO trove_cat VALUES (245,2000042701,87,18,'loganalysis','Log Analysis','Software to help analyze various log files.',0,0,'Topic :: Internet :: Log Analysis','18 :: 87 :: 245'); +INSERT INTO trove_cat VALUES (246,2000042701,97,18,'eda','Electronic Design Automation (EDA)','Tools for circuit design, schematics, board layout, and more.',0,0,'Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)','18 :: 97 :: 246'); +INSERT INTO trove_cat VALUES (247,2000042701,20,18,'telephony','Telephony','Telephony related applications, to include automated voice response systems.',0,0,'Topic :: Communications :: Telephony','18 :: 20 :: 247'); +INSERT INTO trove_cat VALUES (248,2000042801,113,18,'midi','MIDI','Software related to MIDI synthesis and playback.',0,0,'Topic :: Multimedia :: Sound/Audio :: MIDI','18 :: 99 :: 113 :: 248'); +INSERT INTO trove_cat VALUES (249,2000042801,113,18,'synthesis','Sound Synthesis','Software for creation and synthesis of sound.',0,0,'Topic :: Multimedia :: Sound/Audio :: Sound Synthesis','18 :: 99 :: 113 :: 249'); +INSERT INTO trove_cat VALUES (250,2000042801,90,18,'httpservers','HTTP Servers','Software designed to serve content via the HTTP protocol.',0,0,'Topic :: Internet :: WWW/HTTP :: HTTP Servers','18 :: 87 :: 90 :: 250'); +INSERT INTO trove_cat VALUES (251,2000050101,20,18,'filesharing','File Sharing','Software for person-to-person online file sharing.',0,0,'Topic :: Communications :: File Sharing','18 :: 20 :: 251'); +INSERT INTO trove_cat VALUES (252,2000071101,97,18,'bioinformatics','Bio-Informatics','Category for gene software (e.g. Gene Ontology)',0,0,'Topic :: Scientific/Engineering :: Bio-Informatics','18 :: 97 :: 252'); +INSERT INTO trove_cat VALUES (253,2000071101,136,18,'sysadministration','Systems Administration','Systems Administration Software (e.g. configuration apps.)',0,0,'Topic :: System :: Systems Administration','18 :: 136 :: 253'); +INSERT INTO trove_cat VALUES (254,2000071101,160,160,'plsql','PL/SQL','PL/SQL Programming Language',0,0,'Programming Language :: PL/SQL','160 :: 254'); +INSERT INTO trove_cat VALUES (255,2000071101,160,160,'progress','PROGRESS','PROGRESS Programming Language',0,0,'Programming Language :: PROGRESS','160 :: 255'); +INSERT INTO trove_cat VALUES (256,2000071101,125,18,'nonlineareditor','Non-Linear Editor','Video Non-Linear Editors',0,0,'Topic :: Multimedia :: Video :: Non-Linear Editor','18 :: 99 :: 125 :: 256'); +INSERT INTO trove_cat VALUES (257,2000071101,136,18,'softwaredist','Software Distribution','Systems software for distributing other software.',0,0,'Topic :: System :: Software Distribution','18 :: 136 :: 257'); +INSERT INTO trove_cat VALUES (258,2000071101,160,160,'objectpascal','Object Pascal','Object Pascal',0,0,'Programming Language :: Object Pascal','160 :: 258'); +INSERT INTO trove_cat VALUES (259,2000071401,45,18,'codegen','Code Generators','Code Generators',0,0,'Topic :: Software Development :: Code Generators','18 :: 45 :: 259'); +INSERT INTO trove_cat VALUES (260,2000071401,52,18,'SCCS','SCCS','SCCS',0,0,'Topic :: Software Development :: Version Control :: SCCS','18 :: 45 :: 52 :: 260'); +INSERT INTO trove_cat VALUES (261,2000072501,160,160,'xbasic','XBasic','XBasic programming language',0,0,'Programming Language :: XBasic','160 :: 261'); +INSERT INTO trove_cat VALUES (262,2000073101,160,160,'coldfusion','Cold Fusion','Cold Fusion Language',0,0,'Programming Language :: Cold Fusion','160 :: 262'); +INSERT INTO trove_cat VALUES (263,2000080401,160,160,'euphoria','Euphoria','Euphoria programming language - http://www.rapideuphoria.com/',0,0,'Programming Language :: Euphoria','160 :: 263'); +INSERT INTO trove_cat VALUES (264,2000080701,160,160,'erlang','Erlang','Erlang - developed by Ericsson - http://www.erlang.org/',0,0,'Programming Language :: Erlang','160 :: 264'); +INSERT INTO trove_cat VALUES (265,2000080801,160,160,'Delphi','Delphi','Borland/Inprise Delphi',0,0,'Programming Language :: Delphi','160 :: 265'); +INSERT INTO trove_cat VALUES (266,2000081601,97,18,'medical','Medical Science Apps.','Medical / BioMedical Science Apps.',0,0,'Topic :: Scientific/Engineering :: Medical Science Apps.','18 :: 97 :: 266'); +INSERT INTO trove_cat VALUES (267,2000082001,160,160,'zope','Zope','Zope Object Publishing',0,0,'Programming Language :: Zope','160 :: 267'); +INSERT INTO trove_cat VALUES (268,2000082101,80,18,'Puzzles','Puzzle Games','Puzzle Games',0,0,'Topic :: Games/Entertainment :: Puzzle Games','18 :: 80 :: 268'); +INSERT INTO trove_cat VALUES (269,2000082801,160,160,'asm','Assembly','ASM programming',0,0,'Programming Language :: Assembly','160 :: 269'); + diff --git a/gforge/db/oci8port/shaguo/SourceForge2.5_oci8.sql b/gforge/db/oci8port/shaguo/SourceForge2.5_oci8.sql new file mode 100644 index 0000000000..37cb90d132 --- /dev/null +++ b/gforge/db/oci8port/shaguo/SourceForge2.5_oci8.sql @@ -0,0 +1,5322 @@ +-- +-- Selected TOC Entries: +-- +--\connect - tperdue +-- +-- TOC Entry ID 2 (OID 18138427) +-- +-- Name: bug_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE bug_pk_seq START WITH 1; + +-- +-- TOC Entry ID 182 (OID 18138445) +-- +-- Name: bug Type: TABLE Owner: tperdue +-- + +CREATE TABLE bug ( + bug_id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + status_id number(*) DEFAULT '0' NOT NULL, + priority number(*) DEFAULT '0' NOT NULL, + category_id number(*) DEFAULT '0' NOT NULL, + submitted_by number(*) DEFAULT '0' NOT NULL, + assigned_to number(*) DEFAULT '0' NOT NULL, + date1 number(*) DEFAULT '0' NOT NULL, + summary varchar2(4000), + details varchar2(4000), + close_date number(*), + bug_group_id number(*) DEFAULT '0' NOT NULL, + resolution_id number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (bug_id) +); + +-- +-- TOC Entry ID 4 (OID 18138495) +-- +-- Name: bug_bug_dependencies_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE bug_bug_dependencies_pk_seq START WITH 1; + +-- +-- TOC Entry ID 183 (OID 18138513) +-- +-- Name: bug_bug_dependencies Type: TABLE Owner: tperdue +-- + +CREATE TABLE bug_bug_dependencies ( + bug_depend_id number(*) NOT NULL, + bug_id number(*) DEFAULT '0' NOT NULL, + is_dependent_on_bug_id number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (bug_depend_id) +); + +-- +-- TOC Entry ID 6 (OID 18138531) +-- +-- Name: bug_canned_responses_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE bug_canned_responses_pk_seq START WITH 1; + +-- +-- TOC Entry ID 184 (OID 18138549) +-- +-- Name: bug_canned_responses Type: TABLE Owner: tperdue +-- + +CREATE TABLE bug_canned_responses ( + bug_canned_id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + title varchar2(4000), + body varchar2(4000), + PRIMARY KEY (bug_canned_id) +); + +-- +-- TOC Entry ID 8 (OID 18138582) +-- +-- Name: bug_category_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE bug_category_pk_seq START WITH 1; + +-- +-- TOC Entry ID 185 (OID 18138600) +-- +-- Name: bug_category Type: TABLE Owner: tperdue +-- + +CREATE TABLE bug_category ( + bug_category_id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + category_name varchar2(4000), + PRIMARY KEY (bug_category_id) +); + +-- +-- TOC Entry ID 10 (OID 18138632) +-- +-- Name: bug_filter_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE bug_filter_pk_seq START WITH 1; + +-- +-- TOC Entry ID 186 (OID 18138650) +-- +-- Name: bug_filter Type: TABLE Owner: tperdue +-- + +CREATE TABLE bug_filter ( + filter_id number(*) NOT NULL, + user_id number(*) DEFAULT '0' NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + sql_clause varchar2(4000) DEFAULT ' ' NOT NULL, + is_active number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (filter_id) +); + +-- +-- TOC Entry ID 12 (OID 18138687) +-- +-- Name: bug_group_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE bug_group_pk_seq START WITH 1; + +-- +-- TOC Entry ID 187 (OID 18138705) +-- +-- Name: bug_group Type: TABLE Owner: tperdue +-- + +CREATE TABLE bug_group ( + bug_group_id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + group_name varchar2(4000) DEFAULT ' ' NOT NULL, + PRIMARY KEY (bug_group_id) +); + +-- +-- TOC Entry ID 14 (OID 18138738) +-- +-- Name: bug_history_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE bug_history_pk_seq START WITH 1; + +-- +-- TOC Entry ID 188 (OID 18138756) +-- +-- Name: bug_history Type: TABLE Owner: tperdue +-- + +CREATE TABLE bug_history ( + bug_history_id number(*) NOT NULL, + bug_id number(*) DEFAULT '0' NOT NULL, + field_name varchar2(4000) DEFAULT ' ' NOT NULL, + old_value varchar2(4000) DEFAULT ' ' NOT NULL, + mod_by number(*) DEFAULT '0' NOT NULL, + date1 number(*), + PRIMARY KEY (bug_history_id) +); + +-- +-- TOC Entry ID 16 (OID 18138794) +-- +-- Name: bug_resolution_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE bug_resolution_pk_seq START WITH 1; + +-- +-- TOC Entry ID 189 (OID 18138812) +-- +-- Name: bug_resolution Type: TABLE Owner: tperdue +-- + +CREATE TABLE bug_resolution ( + resolution_id number(*) NOT NULL, + resolution_name varchar2(4000) DEFAULT ' ' NOT NULL, + PRIMARY KEY (resolution_id) +); + +-- +-- TOC Entry ID 18 (OID 18138843) +-- +-- Name: bug_status_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE bug_status_pk_seq START WITH 1; + +-- +-- TOC Entry ID 190 (OID 18138861) +-- +-- Name: bug_status Type: TABLE Owner: tperdue +-- + +CREATE TABLE bug_status ( + status_id number(*) NOT NULL, + status_name varchar2(4000), + PRIMARY KEY (status_id) +); + +-- +-- TOC Entry ID 20 (OID 18138891) +-- +-- Name: bug_task_dependencies_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE bug_task_dependencies_pk_seq START WITH 1; + +-- +-- TOC Entry ID 191 (OID 18138909) +-- +-- Name: bug_task_dependencies Type: TABLE Owner: tperdue +-- + +CREATE TABLE bug_task_dependencies ( + bug_depend_id number(*) NOT NULL, + bug_id number(*) DEFAULT '0' NOT NULL, + is_dependent_on_task_id number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (bug_depend_id) +); + +-- +-- TOC Entry ID 22 (OID 18138927) +-- +-- Name: canned_responses_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE canned_responses_pk_seq START WITH 1; + +-- +-- TOC Entry ID 192 (OID 18138946) +-- +-- Name: canned_responses Type: TABLE Owner: tperdue +-- + +CREATE TABLE canned_responses ( + response_id number(*) NOT NULL, + response_title character varying(25), + response_text varchar2(4000), + PRIMARY KEY (response_id) +); + +-- +-- TOC Entry ID 24 (OID 18138977) +-- +-- Name: db_images_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE db_images_pk_seq START WITH 1; + +-- +-- TOC Entry ID 193 (OID 18138995) +-- +-- Name: db_images Type: TABLE Owner: tperdue +-- + +CREATE TABLE db_images ( + id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + description varchar2(4000) DEFAULT ' ' NOT NULL, + bin_data varchar2(4000) DEFAULT ' ' NOT NULL, + filename varchar2(4000) DEFAULT ' ' NOT NULL, + filesize number(*) DEFAULT '0' NOT NULL, + filetype varchar2(4000) DEFAULT ' ' NOT NULL, + width number(*) DEFAULT '0' NOT NULL, + height number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (id) +); + +-- +-- TOC Entry ID 26 (OID 18139040) +-- +-- Name: doc_data_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE doc_data_pk_seq START WITH 1; + +-- +-- TOC Entry ID 194 (OID 18139058) +-- +-- Name: doc_data Type: TABLE Owner: tperdue +-- + +CREATE TABLE doc_data ( + docid number(*) NOT NULL, + stateid number(*) DEFAULT '0' NOT NULL, + title character varying(255) DEFAULT ' ' NOT NULL, + data varchar2(4000) DEFAULT ' ' NOT NULL, + updatedate1 number(*) DEFAULT '0' NOT NULL, + createdate1 number(*) DEFAULT '0' NOT NULL, + created_by number(*) DEFAULT '0' NOT NULL, + doc_group number(*) DEFAULT '0' NOT NULL, + description varchar2(4000), + language_id number(*) DEFAULT '1' NOT NULL, + PRIMARY KEY (docid) +); + +-- +-- TOC Entry ID 28 (OID 18139104) +-- +-- Name: doc_groups_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE doc_groups_pk_seq START WITH 1; + +-- +-- TOC Entry ID 195 (OID 18139122) +-- +-- Name: doc_groups Type: TABLE Owner: tperdue +-- + +CREATE TABLE doc_groups ( + doc_group number(*) NOT NULL, + groupname character varying(255) DEFAULT ' ' NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (doc_group) +); + +-- +-- TOC Entry ID 30 (OID 18139140) +-- +-- Name: doc_states_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE doc_states_pk_seq START WITH 1; + +-- +-- TOC Entry ID 196 (OID 18139158) +-- +-- Name: doc_states Type: TABLE Owner: tperdue +-- + +CREATE TABLE doc_states ( + stateid number(*) NOT NULL, + name character varying(255) DEFAULT ' ' NOT NULL, + PRIMARY KEY (stateid) +); + +-- +-- TOC Entry ID 32 (OID 18139174) +-- +-- Name: filemodule_monitor_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE filemodule_monitor_pk_seq START WITH 1; + +-- +-- TOC Entry ID 197 (OID 18139192) +-- +-- Name: filemodule_monitor Type: TABLE Owner: tperdue +-- + +CREATE TABLE filemodule_monitor ( + id number(*) NOT NULL, + filemodule_id number(*) DEFAULT '0' NOT NULL, + user_id number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (id) +); + +-- +-- TOC Entry ID 34 (OID 18139210) +-- +-- Name: forum_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE forum_pk_seq START WITH 1; + +-- +-- TOC Entry ID 198 (OID 18139228) +-- +-- Name: forum Type: TABLE Owner: tperdue +-- + +CREATE TABLE forum ( + msg_id number(*) NOT NULL, + group_forum_id number(*) DEFAULT '0' NOT NULL, + posted_by number(*) DEFAULT '0' NOT NULL, + subject varchar2(4000) DEFAULT ' ' NOT NULL, + body varchar2(4000) DEFAULT ' ' NOT NULL, + date1 number(*) DEFAULT '0' NOT NULL, + is_followup_to number(*) DEFAULT '0' NOT NULL, + thread_id number(*) DEFAULT '0' NOT NULL, + has_followups number(*) DEFAULT '0', + most_recent_date number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (msg_id) +); + +-- +-- TOC Entry ID 199 (OID 18139275) +-- +-- Name: forum_agg_msg_count Type: TABLE Owner: tperdue +-- + +CREATE TABLE forum_agg_msg_count ( + group_forum_id number(*) DEFAULT '0' NOT NULL, + count number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (group_forum_id) +); + +-- +-- TOC Entry ID 36 (OID 18139291) +-- +-- Name: forum_group_list_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE forum_group_list_pk_seq START WITH 1; + +-- +-- TOC Entry ID 200 (OID 18139309) +-- +-- Name: forum_group_list Type: TABLE Owner: tperdue +-- + +CREATE TABLE forum_group_list ( + group_forum_id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + forum_name varchar2(4000) DEFAULT ' ' NOT NULL, + is_public number(*) DEFAULT '0' NOT NULL, + description varchar2(4000), + allow_anonymous number(*) DEFAULT '0' NOT NULL, + send_all_posts_to varchar2(4000), + PRIMARY KEY (group_forum_id) +); + +-- +-- TOC Entry ID 38 (OID 18139348) +-- +-- Name: forum_monitor_forums_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE forum_monitor_forums_pk_seq START WITH 1; + +-- +-- TOC Entry ID 201 (OID 18139366) +-- +-- Name: forum_monitored_forums Type: TABLE Owner: tperdue +-- + +CREATE TABLE forum_monitored_forums ( + monitor_id number(*) NOT NULL, + forum_id number(*) DEFAULT '0' NOT NULL, + user_id number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (monitor_id) +); + +-- +-- TOC Entry ID 40 (OID 18139384) +-- +-- Name: forum_saved_place_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE forum_saved_place_pk_seq START WITH 1; + +-- +-- TOC Entry ID 202 (OID 18139402) +-- +-- Name: forum_saved_place Type: TABLE Owner: tperdue +-- + +CREATE TABLE forum_saved_place ( + saved_place_id number(*) NOT NULL, + user_id number(*) DEFAULT '0' NOT NULL, + forum_id number(*) DEFAULT '0' NOT NULL, + save_date number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (saved_place_id) +); + +-- +-- TOC Entry ID 203 (OID 18139454) +-- +-- Name: foundry_data Type: TABLE Owner: tperdue +-- + +CREATE TABLE foundry_data ( + foundry_id number(*) DEFAULT '0' NOT NULL, + freeform1_html varchar2(4000), + freeform2_html varchar2(4000), + sponsor1_html varchar2(4000), + sponsor2_html varchar2(4000), + guide_image_id number(*) DEFAULT '0' NOT NULL, + logo_image_id number(*) DEFAULT '0' NOT NULL, + trove_categories varchar2(4000), + PRIMARY KEY (foundry_id) +); + +-- +-- TOC Entry ID 42 (OID 18139492) +-- +-- Name: foundry_news_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE foundry_news_pk_seq START WITH 1; + +-- +-- TOC Entry ID 204 (OID 18139510) +-- +-- Name: foundry_news Type: TABLE Owner: tperdue +-- + +CREATE TABLE foundry_news ( + foundry_news_id number(*) NOT NULL, + foundry_id number(*) DEFAULT '0' NOT NULL, + news_id number(*) DEFAULT '0' NOT NULL, + approve_date number(*) DEFAULT '0' NOT NULL, + is_approved number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (foundry_news_id) +); + +-- +-- TOC Entry ID 44 (OID 18139532) +-- +-- Name: foundry_prefer_proj_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE foundry_prefer_proj_pk_seq START WITH 1; + +-- +-- TOC Entry ID 205 (OID 18139550) +-- +-- Name: foundry_preferred_projects Type: TABLE Owner: tperdue +-- + +CREATE TABLE foundry_preferred_projects ( + foundry_project_id number(*) NOT NULL, + foundry_id number(*) DEFAULT '0' NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + rank number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (foundry_project_id) +); + +-- +-- TOC Entry ID 46 (OID 18139570) +-- +-- Name: foundry_projects_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE foundry_projects_pk_seq START WITH 1; + +-- +-- TOC Entry ID 206 (OID 18139588) +-- +-- Name: foundry_projects Type: TABLE Owner: tperdue +-- + +CREATE TABLE foundry_projects ( + id number(*) NOT NULL, + foundry_id number(*) DEFAULT '0' NOT NULL, + project_id number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (id) +); + +-- +-- TOC Entry ID 207 (OID 18139606) +-- +-- Name: frs_dlstats_agg Type: TABLE Owner: tperdue +-- + +CREATE TABLE frs_dlstats_agg ( + file_id number(*) DEFAULT '0' NOT NULL, + day number(*) DEFAULT '0' NOT NULL, + downloads_http number(*) DEFAULT '0' NOT NULL, + downloads_ftp number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 208 (OID 18139623) +-- +-- Name: frs_dlstats_file_agg Type: TABLE Owner: tperdue +-- + +CREATE TABLE frs_dlstats_file_agg ( + file_id number(*) DEFAULT '0' NOT NULL, + day number(*) DEFAULT '0' NOT NULL, + downloads number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 209 (OID 18139638) +-- +-- Name: frs_dlstats_filetotal_agg Type: TABLE Owner: tperdue +-- + +CREATE TABLE frs_dlstats_filetotal_agg ( + file_id number(*) DEFAULT '0' NOT NULL, + downloads number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (file_id) +); + +-- +-- TOC Entry ID 210 (OID 18139654) +-- +-- Name: frs_dlstats_filetotal_agg_old Type: TABLE Owner: tperdue +-- + +CREATE TABLE frs_dlstats_filetotal_agg_old ( + file_id number(*) DEFAULT '0' NOT NULL, + downloads number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 211 (OID 18139667) +-- +-- Name: frs_dlstats_group_agg Type: TABLE Owner: tperdue +-- + +CREATE TABLE frs_dlstats_group_agg ( + group_id number(*) DEFAULT '0' NOT NULL, + day number(*) DEFAULT '0' NOT NULL, + downloads number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 212 (OID 18139682) +-- +-- Name: frs_dlstats_grouptotal_agg Type: TABLE Owner: tperdue +-- + +CREATE TABLE frs_dlstats_grouptotal_agg ( + group_id number(*) DEFAULT '0' NOT NULL, + downloads number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 48 (OID 18139695) +-- +-- Name: frs_file_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE frs_file_pk_seq START WITH 1; + +-- +-- TOC Entry ID 213 (OID 18139714) +-- +-- Name: frs_file Type: TABLE Owner: tperdue +-- + +CREATE TABLE frs_file ( + file_id number(*) NOT NULL, + filename varchar2(200), + release_id number(*) DEFAULT '0' NOT NULL, + type_id number(*) DEFAULT '0' NOT NULL, + processor_id number(*) DEFAULT '0' NOT NULL, + release_time number(*) DEFAULT '0' NOT NULL, + file_size number(*) DEFAULT '0' NOT NULL, + post_date number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (file_id) +); + +-- +-- TOC Entry ID 50 (OID 18139756) +-- +-- Name: frs_filetype_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE frs_filetype_pk_seq START WITH 1; + +-- +-- TOC Entry ID 214 (OID 18139774) +-- +-- Name: frs_filetype Type: TABLE Owner: tperdue +-- + +CREATE TABLE frs_filetype ( + type_id number(*) NOT NULL, + name varchar2(4000), + PRIMARY KEY (type_id) +); + +-- +-- TOC Entry ID 52 (OID 18139804) +-- +-- Name: frs_package_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE frs_package_pk_seq START WITH 1; + +-- +-- TOC Entry ID 215 (OID 18139822) +-- +-- Name: frs_package Type: TABLE Owner: tperdue +-- + +CREATE TABLE frs_package ( + package_id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + name varchar2(4000), + status_id number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (package_id) +); + +-- +-- TOC Entry ID 54 (OID 18139856) +-- +-- Name: frs_processor_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE frs_processor_pk_seq START WITH 1; + +-- +-- TOC Entry ID 216 (OID 18139874) +-- +-- Name: frs_processor Type: TABLE Owner: tperdue +-- + +CREATE TABLE frs_processor ( + processor_id number(*) NOT NULL, + name varchar2(4000), + PRIMARY KEY (processor_id) +); + +-- +-- TOC Entry ID 56 (OID 18139904) +-- +-- Name: frs_release_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE frs_release_pk_seq START WITH 1; + +-- +-- TOC Entry ID 217 (OID 18139922) +-- +-- Name: frs_release Type: TABLE Owner: tperdue +-- + +CREATE TABLE frs_release ( + release_id number(*) NOT NULL, + package_id number(*) DEFAULT '0' NOT NULL, + name varchar2(4000), + notes varchar2(4000), + changes varchar2(4000), + status_id number(*) DEFAULT '0' NOT NULL, + preformatted number(*) DEFAULT '0' NOT NULL, + release_date number(*) DEFAULT '0' NOT NULL, + released_by number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (release_id) +); + +-- +-- TOC Entry ID 58 (OID 18139964) +-- +-- Name: frs_status_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE frs_status_pk_seq START WITH 1; + +-- +-- TOC Entry ID 218 (OID 18139982) +-- +-- Name: frs_status Type: TABLE Owner: tperdue +-- + +CREATE TABLE frs_status ( + status_id number(*) NOT NULL, + name varchar2(4000), + PRIMARY KEY (status_id) +); + +-- +-- TOC Entry ID 60 (OID 18140012) +-- +-- Name: group_cvs_history_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE group_cvs_history_pk_seq START WITH 1; + +-- +-- TOC Entry ID 219 (OID 18140030) +-- +-- Name: group_cvs_history Type: TABLE Owner: tperdue +-- + +CREATE TABLE group_cvs_history ( + id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + user_name character varying(80) DEFAULT ' ' NOT NULL, + cvs_commits number(*) DEFAULT '0' NOT NULL, + cvs_commits_wk number(*) DEFAULT '0' NOT NULL, + cvs_adds number(*) DEFAULT '0' NOT NULL, + cvs_adds_wk number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (id) +); + +-- +-- TOC Entry ID 62 (OID 18140056) +-- +-- Name: group_history_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE group_history_pk_seq START WITH 1; + +-- +-- TOC Entry ID 220 (OID 18140074) +-- +-- Name: group_history Type: TABLE Owner: tperdue +-- + +CREATE TABLE group_history ( + group_history_id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + field_name varchar2(4000) DEFAULT ' ' NOT NULL, + old_value varchar2(4000) DEFAULT ' ' NOT NULL, + mod_by number(*) DEFAULT '0' NOT NULL, + date1 number(*), + PRIMARY KEY (group_history_id) +); + +-- +-- TOC Entry ID 64 (OID 18140112) +-- +-- Name: group_type_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE group_type_pk_seq START WITH 1; + +-- +-- TOC Entry ID 221 (OID 18140130) +-- +-- Name: group_type Type: TABLE Owner: tperdue +-- + +CREATE TABLE group_type ( + type_id number(*) NOT NULL, + name varchar2(4000), + PRIMARY KEY (type_id) +); + +-- +-- TOC Entry ID 66 (OID 18140160) +-- +-- Name: groups_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE groups_pk_seq START WITH 1; + +-- +-- TOC Entry ID 222 (OID 18140178) +-- +-- Name: groups Type: TABLE Owner: tperdue +-- + +CREATE TABLE groups ( + group_id number(*) NOT NULL, + group_name character varying(40), + homepage character varying(128), + is_public number(*) DEFAULT '0' NOT NULL, + status character(1) DEFAULT 'A' NOT NULL, + unix_group_name character varying(30) DEFAULT ' ' NOT NULL, + unix_box character varying(20) DEFAULT 'shell1' NOT NULL, + http_domain character varying(80), + short_description character varying(255), + cvs_box character varying(20) DEFAULT 'cvs1' NOT NULL, + license character varying(16), + register_purpose varchar2(4000), + license_other varchar2(4000), + register_time number(*) DEFAULT '0' NOT NULL, + use_bugs number(*) DEFAULT '1' NOT NULL, + rand_hash varchar2(4000), + use_mail number(*) DEFAULT '1' NOT NULL, + use_survey number(*) DEFAULT '1' NOT NULL, + use_patch number(*) DEFAULT '1' NOT NULL, + use_forum number(*) DEFAULT '1' NOT NULL, + use_pm number(*) DEFAULT '1' NOT NULL, + use_cvs number(*) DEFAULT '1' NOT NULL, + use_news number(*) DEFAULT '1' NOT NULL, + use_support number(*) DEFAULT '1' NOT NULL, + new_bug_address varchar2(4000) DEFAULT ' ' NOT NULL, + new_patch_address varchar2(4000) DEFAULT ' ' NOT NULL, + new_support_address varchar2(4000) DEFAULT ' ' NOT NULL, + type number(*) DEFAULT '1' NOT NULL, + use_docman number(*) DEFAULT '1' NOT NULL, + send_all_bugs number(*) DEFAULT '0' NOT NULL, + send_all_patches number(*) DEFAULT '0' NOT NULL, + send_all_support number(*) DEFAULT '0' NOT NULL, + new_task_address varchar2(4000) DEFAULT ' ' NOT NULL, + send_all_tasks number(*) DEFAULT '0' NOT NULL, + use_bug_depend_box number(*) DEFAULT '1' NOT NULL, + use_pm_depend_box number(*) DEFAULT '1' NOT NULL, + PRIMARY KEY (group_id) +); + +-- +-- TOC Entry ID 223 (OID 18140269) +-- +-- Name: intel_agreement Type: TABLE Owner: tperdue +-- + +CREATE TABLE intel_agreement ( + user_id number(*) DEFAULT '0' NOT NULL, + message varchar2(4000), + is_approved number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (user_id) +); + +-- +-- TOC Entry ID 68 (OID 18140301) +-- +-- Name: mail_group_list_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE mail_group_list_pk_seq START WITH 1; + +-- +-- TOC Entry ID 224 (OID 18140319) +-- +-- Name: mail_group_list Type: TABLE Owner: tperdue +-- + +CREATE TABLE mail_group_list ( + group_list_id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + list_name varchar2(4000), + is_public number(*) DEFAULT '0' NOT NULL, + password character varying(16), + list_admin number(*) DEFAULT '0' NOT NULL, + status number(*) DEFAULT '0' NOT NULL, + description varchar2(4000), + PRIMARY KEY (group_list_id) +); + +-- +-- TOC Entry ID 70 (OID 18140359) +-- +-- Name: news_bytes_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE news_bytes_pk_seq START WITH 1; + +-- +-- TOC Entry ID 225 (OID 18140377) +-- +-- Name: news_bytes Type: TABLE Owner: tperdue +-- + +CREATE TABLE news_bytes ( + id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + submitted_by number(*) DEFAULT '0' NOT NULL, + is_approved number(*) DEFAULT '0' NOT NULL, + date1 number(*) DEFAULT '0' NOT NULL, + forum_id number(*) DEFAULT '0' NOT NULL, + summary varchar2(4000), + details varchar2(4000), + PRIMARY KEY (id) +); + +-- +-- TOC Entry ID 72 (OID 18140419) +-- +-- Name: patch_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE patch_pk_seq START WITH 1; + +-- +-- TOC Entry ID 226 (OID 18140437) +-- +-- Name: patch Type: TABLE Owner: tperdue +-- + +CREATE TABLE patch ( + patch_id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + patch_status_id number(*) DEFAULT '0' NOT NULL, + patch_category_id number(*) DEFAULT '0' NOT NULL, + submitted_by number(*) DEFAULT '0' NOT NULL, + assigned_to number(*) DEFAULT '0' NOT NULL, + open_date number(*) DEFAULT '0' NOT NULL, + summary varchar2(4000), + code varchar2(4000), + close_date number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (patch_id) +); + +-- +-- TOC Entry ID 74 (OID 18140483) +-- +-- Name: patch_category_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE patch_category_pk_seq START WITH 1; + +-- +-- TOC Entry ID 227 (OID 18140501) +-- +-- Name: patch_category Type: TABLE Owner: tperdue +-- + +CREATE TABLE patch_category ( + patch_category_id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + category_name varchar2(4000) DEFAULT ' ' NOT NULL, + PRIMARY KEY (patch_category_id) +); + +-- +-- TOC Entry ID 76 (OID 18140534) +-- +-- Name: patch_history_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE patch_history_pk_seq START WITH 1; + +-- +-- TOC Entry ID 228 (OID 18140552) +-- +-- Name: patch_history Type: TABLE Owner: tperdue +-- + +CREATE TABLE patch_history ( + patch_history_id number(*) NOT NULL, + patch_id number(*) DEFAULT '0' NOT NULL, + field_name varchar2(4000) DEFAULT ' ' NOT NULL, + old_value varchar2(4000) DEFAULT ' ' NOT NULL, + mod_by number(*) DEFAULT '0' NOT NULL, + date1 number(*), + PRIMARY KEY (patch_history_id) +); + +-- +-- TOC Entry ID 78 (OID 18140590) +-- +-- Name: patch_status_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE patch_status_pk_seq START WITH 1; + +-- +-- TOC Entry ID 229 (OID 18140608) +-- +-- Name: patch_status Type: TABLE Owner: tperdue +-- + +CREATE TABLE patch_status ( + patch_status_id number(*) NOT NULL, + status_name varchar2(4000), + PRIMARY KEY (patch_status_id) +); + +-- +-- TOC Entry ID 80 (OID 18140638) +-- +-- Name: people_job_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE people_job_pk_seq START WITH 1; + +-- +-- TOC Entry ID 230 (OID 18140656) +-- +-- Name: people_job Type: TABLE Owner: tperdue +-- + +CREATE TABLE people_job ( + job_id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + created_by number(*) DEFAULT '0' NOT NULL, + title varchar2(4000), + description varchar2(4000), + date1 number(*) DEFAULT '0' NOT NULL, + status_id number(*) DEFAULT '0' NOT NULL, + category_id number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (job_id) +); + +-- +-- TOC Entry ID 82 (OID 18140697) +-- +-- Name: people_job_category_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE people_job_category_pk_seq START WITH 1; + +-- +-- TOC Entry ID 231 (OID 18140715) +-- +-- Name: people_job_category Type: TABLE Owner: tperdue +-- + +CREATE TABLE people_job_category ( + category_id number(*) NOT NULL, + name varchar2(4000), + private_flag number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (category_id) +); + +-- +-- TOC Entry ID 84 (OID 18140747) +-- +-- Name: people_job_inventory_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE people_job_inventory_pk_seq START WITH 1; + +-- +-- TOC Entry ID 232 (OID 18140765) +-- +-- Name: people_job_inventory Type: TABLE Owner: tperdue +-- + +CREATE TABLE people_job_inventory ( + job_inventory_id number(*) NOT NULL, + job_id number(*) DEFAULT '0' NOT NULL, + skill_id number(*) DEFAULT '0' NOT NULL, + skill_level_id number(*) DEFAULT '0' NOT NULL, + skill_year_id number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (job_inventory_id) +); + +-- +-- TOC Entry ID 86 (OID 18140787) +-- +-- Name: people_job_status_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE people_job_status_pk_seq START WITH 1; + +-- +-- TOC Entry ID 233 (OID 18140805) +-- +-- Name: people_job_status Type: TABLE Owner: tperdue +-- + +CREATE TABLE people_job_status ( + status_id number(*) NOT NULL, + name varchar2(4000), + PRIMARY KEY (status_id) +); + +-- +-- TOC Entry ID 88 (OID 18140835) +-- +-- Name: people_skill_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE people_skill_pk_seq START WITH 1; + +-- +-- TOC Entry ID 234 (OID 18140853) +-- +-- Name: people_skill Type: TABLE Owner: tperdue +-- + +CREATE TABLE people_skill ( + skill_id number(*) NOT NULL, + name varchar2(4000), + PRIMARY KEY (skill_id) +); + +-- +-- TOC Entry ID 90 (OID 18140884) +-- +-- Name: people_skill_inv_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE people_skill_inv_pk_seq START WITH 1; + +-- +-- TOC Entry ID 235 (OID 18140902) +-- +-- Name: people_skill_inventory Type: TABLE Owner: tperdue +-- + +CREATE TABLE people_skill_inventory ( + skill_inventory_id number(*) NOT NULL, + user_id number(*) DEFAULT '0' NOT NULL, + skill_id number(*) DEFAULT '0' NOT NULL, + skill_level_id number(*) DEFAULT '0' NOT NULL, + skill_year_id number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (skill_inventory_id) +); + +-- +-- TOC Entry ID 92 (OID 18140924) +-- +-- Name: people_skill_level_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE people_skill_level_pk_seq START WITH 1; + +-- +-- TOC Entry ID 236 (OID 18140942) +-- +-- Name: people_skill_level Type: TABLE Owner: tperdue +-- + +CREATE TABLE people_skill_level ( + skill_level_id number(*) NOT NULL, + name varchar2(4000), + PRIMARY KEY (skill_level_id) +); + +-- +-- TOC Entry ID 94 (OID 18140972) +-- +-- Name: people_skill_year_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE people_skill_year_pk_seq START WITH 1; + +-- +-- TOC Entry ID 237 (OID 18140990) +-- +-- Name: people_skill_year Type: TABLE Owner: tperdue +-- + +CREATE TABLE people_skill_year ( + skill_year_id number(*) NOT NULL, + name varchar2(4000), + PRIMARY KEY (skill_year_id) +); + +-- +-- TOC Entry ID 96 (OID 18141020) +-- +-- Name: project_assigned_to_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE project_assigned_to_pk_seq START WITH 1; + +-- +-- TOC Entry ID 238 (OID 18141038) +-- +-- Name: project_assigned_to Type: TABLE Owner: tperdue +-- + +CREATE TABLE project_assigned_to ( + project_assigned_id number(*) NOT NULL, + project_task_id number(*) DEFAULT '0' NOT NULL, + assigned_to_id number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (project_assigned_id) +); + +-- +-- TOC Entry ID 239 (OID 18141056) +-- +-- Name: project_counts_tmp Type: TABLE Owner: tperdue +-- + +CREATE TABLE project_counts_tmp ( + group_id number(*), + type varchar2(4000), + count double precision +); + +-- +-- TOC Entry ID 240 (OID 18141083) +-- +-- Name: project_counts_weekly_tmp Type: TABLE Owner: tperdue +-- + +CREATE TABLE project_counts_weekly_tmp ( + group_id number(*), + type varchar2(4000), + count double precision +); + +-- +-- TOC Entry ID 98 (OID 18141110) +-- +-- Name: project_dependencies_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE project_dependencies_pk_seq START WITH 1; + +-- +-- TOC Entry ID 241 (OID 18141128) +-- +-- Name: project_dependencies Type: TABLE Owner: tperdue +-- + +CREATE TABLE project_dependencies ( + project_depend_id number(*) NOT NULL, + project_task_id number(*) DEFAULT '0' NOT NULL, + is_dependent_on_task_id number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (project_depend_id) +); + +-- +-- TOC Entry ID 100 (OID 18141146) +-- +-- Name: project_group_list_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE project_group_list_pk_seq START WITH 1; + +-- +-- TOC Entry ID 242 (OID 18141164) +-- +-- Name: project_group_list Type: TABLE Owner: tperdue +-- + +CREATE TABLE project_group_list ( + group_project_id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + project_name varchar2(4000) DEFAULT ' ' NOT NULL, + is_public number(*) DEFAULT '0' NOT NULL, + description varchar2(4000), + PRIMARY KEY (group_project_id) +); + +-- +-- TOC Entry ID 102 (OID 18141200) +-- +-- Name: project_history_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE project_history_pk_seq START WITH 1; + +-- +-- TOC Entry ID 243 (OID 18141218) +-- +-- Name: project_history Type: TABLE Owner: tperdue +-- + +CREATE TABLE project_history ( + project_history_id number(*) NOT NULL, + project_task_id number(*) DEFAULT '0' NOT NULL, + field_name varchar2(4000) DEFAULT ' ' NOT NULL, + old_value varchar2(4000) DEFAULT ' ' NOT NULL, + mod_by number(*) DEFAULT '0' NOT NULL, + date1 number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (project_history_id) +); + +-- +-- TOC Entry ID 104 (OID 18141257) +-- +-- Name: project_metric_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE project_metric_pk_seq START WITH 1; + +-- +-- TOC Entry ID 244 (OID 18141275) +-- +-- Name: project_metric Type: TABLE Owner: tperdue +-- + +CREATE TABLE project_metric ( + ranking number(*) NOT NULL, + percentile double precision, + group_id number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (ranking) +); + +-- +-- TOC Entry ID 106 (OID 18141292) +-- +-- Name: project_metric_tmp1_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE project_metric_tmp1_pk_seq START WITH 1; + +-- +-- TOC Entry ID 245 (OID 18141310) +-- +-- Name: project_metric_tmp1 Type: TABLE Owner: tperdue +-- + +CREATE TABLE project_metric_tmp1 ( + ranking number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + value double precision, + PRIMARY KEY (ranking) +); + +-- +-- TOC Entry ID 108 (OID 18141327) +-- +-- Name: proj_metric_weekly_tm_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE proj_metric_weekly_tm_pk_seq START WITH 1; + +-- +-- TOC Entry ID 246 (OID 18141346) +-- +-- Name: project_metric_weekly_tmp1 Type: TABLE Owner: tperdue +-- + +CREATE TABLE project_metric_weekly_tmp1 ( + ranking number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + value double precision, + PRIMARY KEY (ranking) +); + +-- +-- TOC Entry ID 110 (OID 18141363) +-- +-- Name: project_status_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE project_status_pk_seq START WITH 1; + +-- +-- TOC Entry ID 247 (OID 18141381) +-- +-- Name: project_status Type: TABLE Owner: tperdue +-- + +CREATE TABLE project_status ( + status_id number(*) NOT NULL, + status_name varchar2(4000) DEFAULT ' ' NOT NULL, + PRIMARY KEY (status_id) +); + +-- +-- TOC Entry ID 112 (OID 18141412) +-- +-- Name: project_task_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE project_task_pk_seq START WITH 1; + +-- +-- TOC Entry ID 248 (OID 18141430) +-- +-- Name: project_task Type: TABLE Owner: tperdue +-- + +CREATE TABLE project_task ( + project_task_id number(*) NOT NULL, + group_project_id number(*) DEFAULT '0' NOT NULL, + summary varchar2(4000) DEFAULT ' ' NOT NULL, + details varchar2(4000) DEFAULT ' ' NOT NULL, + percent_complete number(*) DEFAULT '0' NOT NULL, + priority number(*) DEFAULT '0' NOT NULL, + hours double precision DEFAULT '0.00' NOT NULL, + start_date number(*) DEFAULT '0' NOT NULL, + end_date number(*) DEFAULT '0' NOT NULL, + created_by number(*) DEFAULT '0' NOT NULL, + status_id number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (project_task_id) +); + +-- +-- TOC Entry ID 114 (OID 18141479) +-- +-- Name: project_weekly_metric_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE project_weekly_metric_pk_seq START WITH 1; + +-- +-- TOC Entry ID 249 (OID 18141497) +-- +-- Name: project_weekly_metric Type: TABLE Owner: tperdue +-- + +CREATE TABLE project_weekly_metric ( + ranking number(*) NOT NULL, + percentile double precision, + group_id number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (ranking) +); + +-- +-- TOC Entry ID 250 (OID 18141514) +-- +-- Name: session Type: TABLE Owner: tperdue +-- + +CREATE TABLE session1 ( + user_id number(*) DEFAULT '0' NOT NULL, + session_hash character(32) DEFAULT ' ' NOT NULL, + ip_addr character(15) DEFAULT ' ' NOT NULL, + time number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (session_hash) +); + +-- +-- TOC Entry ID 116 (OID 18141534) +-- +-- Name: snippet_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE snippet_pk_seq START WITH 1; + +-- +-- TOC Entry ID 251 (OID 18141552) +-- +-- Name: snippet Type: TABLE Owner: tperdue +-- + +CREATE TABLE snippet ( + snippet_id number(*) NOT NULL, + created_by number(*) DEFAULT '0' NOT NULL, + name varchar2(4000), + description varchar2(4000), + type number(*) DEFAULT '0' NOT NULL, + language number(*) DEFAULT '0' NOT NULL, + license varchar2(4000) DEFAULT ' ' NOT NULL, + category number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (snippet_id) +); + +-- +-- TOC Entry ID 118 (OID 18141593) +-- +-- Name: snippet_package_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE snippet_package_pk_seq START WITH 1; + +-- +-- TOC Entry ID 252 (OID 18141611) +-- +-- Name: snippet_package Type: TABLE Owner: tperdue +-- + +CREATE TABLE snippet_package ( + snippet_package_id number(*) NOT NULL, + created_by number(*) DEFAULT '0' NOT NULL, + name varchar2(4000), + description varchar2(4000), + category number(*) DEFAULT '0' NOT NULL, + language number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (snippet_package_id) +); + +-- +-- TOC Entry ID 120 (OID 18141648) +-- +-- Name: snippet_package_item_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE snippet_package_item_pk_seq START WITH 1; + +-- +-- TOC Entry ID 253 (OID 18141666) +-- +-- Name: snippet_package_item Type: TABLE Owner: tperdue +-- + +CREATE TABLE snippet_package_item ( + snippet_package_item_id number(*) NOT NULL, + snippet_package_version_id number(*) DEFAULT '0' NOT NULL, + snippet_version_id number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (snippet_package_item_id) +); + +-- +-- TOC Entry ID 122 (OID 18141684) +-- +-- Name: snippet_package_ver_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE snippet_package_ver_pk_seq START WITH 1; + +-- +-- TOC Entry ID 254 (OID 18141702) +-- +-- Name: snippet_package_version Type: TABLE Owner: tperdue +-- + +CREATE TABLE snippet_package_version ( + snippet_package_version_id number(*) NOT NULL, + snippet_package_id number(*) DEFAULT '0' NOT NULL, + changes varchar2(4000), + version varchar2(4000), + submitted_by number(*) DEFAULT '0' NOT NULL, + date1 number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (snippet_package_version_id) +); + +-- +-- TOC Entry ID 124 (OID 18141739) +-- +-- Name: snippet_version_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE snippet_version_pk_seq START WITH 1; + +-- +-- TOC Entry ID 255 (OID 18141757) +-- +-- Name: snippet_version Type: TABLE Owner: tperdue +-- + +CREATE TABLE snippet_version ( + snippet_version_id number(*) NOT NULL, + snippet_id number(*) DEFAULT '0' NOT NULL, + changes varchar2(4000), + version varchar2(4000), + submitted_by number(*) DEFAULT '0' NOT NULL, + date1 number(*) DEFAULT '0' NOT NULL, + code varchar2(4000), + PRIMARY KEY (snippet_version_id) +); + +-- +-- TOC Entry ID 256 (OID 18141795) +-- +-- Name: stats_agg_logo_by_day Type: TABLE Owner: tperdue +-- + +CREATE TABLE stats_agg_logo_by_day ( + day number(*), + count integer +); + +-- +-- TOC Entry ID 257 (OID 18141806) +-- +-- Name: stats_agg_logo_by_group Type: TABLE Owner: tperdue +-- + +CREATE TABLE stats_agg_logo_by_group ( + day number(*), + group_id number(*), + count integer +); + +-- +-- TOC Entry ID 258 (OID 18141818) +-- +-- Name: stats_agg_pages_by_browser Type: TABLE Owner: tperdue +-- + +CREATE TABLE stats_agg_pages_by_browser ( + browser character varying(8), + count integer +); + +-- +-- TOC Entry ID 259 (OID 18141829) +-- +-- Name: stats_agg_pages_by_day Type: TABLE Owner: tperdue +-- + +CREATE TABLE stats_agg_pages_by_day ( + day number(*) DEFAULT '0' NOT NULL, + count number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 260 (OID 18141842) +-- +-- Name: stats_agg_pages_by_day_old Type: TABLE Owner: tperdue +-- + +CREATE TABLE stats_agg_pages_by_day_old ( + day number(*), + count integer +); + +-- +-- TOC Entry ID 261 (OID 18141853) +-- +-- Name: stats_agg_site_by_day Type: TABLE Owner: tperdue +-- + +CREATE TABLE stats_agg_site_by_day ( + day number(*) DEFAULT '0' NOT NULL, + count number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 262 (OID 18141866) +-- +-- Name: stats_agg_site_by_group Type: TABLE Owner: tperdue +-- + +CREATE TABLE stats_agg_site_by_group ( + day number(*) DEFAULT '0' NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + count number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 263 (OID 18141881) +-- +-- Name: stats_agr_filerelease Type: TABLE Owner: tperdue +-- + +CREATE TABLE stats_agr_filerelease ( + filerelease_id number(*) DEFAULT '0' NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + downloads number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 264 (OID 18141896) +-- +-- Name: stats_agr_project Type: TABLE Owner: tperdue +-- + +CREATE TABLE stats_agr_project ( + group_id number(*) DEFAULT '0' NOT NULL, + group_ranking number(*) DEFAULT '0' NOT NULL, + group_metric double precision DEFAULT '0.00000' NOT NULL, + developers number(*) DEFAULT '0' NOT NULL, + file_releases number(*) DEFAULT '0' NOT NULL, + downloads number(*) DEFAULT '0' NOT NULL, + site_views number(*) DEFAULT '0' NOT NULL, + logo_views number(*) DEFAULT '0' NOT NULL, + msg_posted number(*) DEFAULT '0' NOT NULL, + msg_uniq_auth number(*) DEFAULT '0' NOT NULL, + bugs_opened number(*) DEFAULT '0' NOT NULL, + bugs_closed number(*) DEFAULT '0' NOT NULL, + support_opened number(*) DEFAULT '0' NOT NULL, + support_closed number(*) DEFAULT '0' NOT NULL, + patches_opened number(*) DEFAULT '0' NOT NULL, + patches_closed number(*) DEFAULT '0' NOT NULL, + tasks_opened number(*) DEFAULT '0' NOT NULL, + tasks_closed number(*) DEFAULT '0' NOT NULL, + help_requests number(*) DEFAULT '0' NOT NULL, + cvs_checkouts number(*) DEFAULT '0' NOT NULL, + cvs_commits number(*) DEFAULT '0' NOT NULL, + cvs_adds number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 265 (OID 18141949) +-- +-- Name: stats_ftp_downloads Type: TABLE Owner: tperdue +-- + +CREATE TABLE stats_ftp_downloads ( + day number(*) DEFAULT '0' NOT NULL, + filerelease_id number(*) DEFAULT '0' NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + downloads number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 266 (OID 18141966) +-- +-- Name: stats_http_downloads Type: TABLE Owner: tperdue +-- + +CREATE TABLE stats_http_downloads ( + day number(*) DEFAULT '0' NOT NULL, + filerelease_id number(*) DEFAULT '0' NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + downloads number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 267 (OID 18141983) +-- +-- Name: stats_project Type: TABLE Owner: tperdue +-- + +CREATE TABLE stats_project ( + month number(*) DEFAULT '0' NOT NULL, + week number(*) DEFAULT '0' NOT NULL, + day number(*) DEFAULT '0' NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + group_ranking number(*) DEFAULT '0' NOT NULL, + group_metric double precision DEFAULT '0.00000' NOT NULL, + developers number(*) DEFAULT '0' NOT NULL, + file_releases number(*) DEFAULT '0' NOT NULL, + downloads number(*) DEFAULT '0' NOT NULL, + site_views number(*) DEFAULT '0' NOT NULL, + subdomain_views number(*) DEFAULT '0' NOT NULL, + msg_posted number(*) DEFAULT '0' NOT NULL, + msg_uniq_auth number(*) DEFAULT '0' NOT NULL, + bugs_opened number(*) DEFAULT '0' NOT NULL, + bugs_closed number(*) DEFAULT '0' NOT NULL, + support_opened number(*) DEFAULT '0' NOT NULL, + support_closed number(*) DEFAULT '0' NOT NULL, + patches_opened number(*) DEFAULT '0' NOT NULL, + patches_closed number(*) DEFAULT '0' NOT NULL, + tasks_opened number(*) DEFAULT '0' NOT NULL, + tasks_closed number(*) DEFAULT '0' NOT NULL, + help_requests number(*) DEFAULT '0' NOT NULL, + cvs_checkouts number(*) DEFAULT '0' NOT NULL, + cvs_commits number(*) DEFAULT '0' NOT NULL, + cvs_adds number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 268 (OID 18142042) +-- +-- Name: stats_project_tmp Type: TABLE Owner: tperdue +-- + +CREATE TABLE stats_project_tmp ( + month number(*) DEFAULT '0' NOT NULL, + week number(*) DEFAULT '0' NOT NULL, + day number(*) DEFAULT '0' NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + group_ranking number(*) DEFAULT '0' NOT NULL, + group_metric double precision DEFAULT '0.00000' NOT NULL, + developers number(*) DEFAULT '0' NOT NULL, + file_releases number(*) DEFAULT '0' NOT NULL, + downloads number(*) DEFAULT '0' NOT NULL, + site_views number(*) DEFAULT '0' NOT NULL, + subdomain_views number(*) DEFAULT '0' NOT NULL, + msg_posted number(*) DEFAULT '0' NOT NULL, + msg_uniq_auth number(*) DEFAULT '0' NOT NULL, + bugs_opened number(*) DEFAULT '0' NOT NULL, + bugs_closed number(*) DEFAULT '0' NOT NULL, + support_opened number(*) DEFAULT '0' NOT NULL, + support_closed number(*) DEFAULT '0' NOT NULL, + patches_opened number(*) DEFAULT '0' NOT NULL, + patches_closed number(*) DEFAULT '0' NOT NULL, + tasks_opened number(*) DEFAULT '0' NOT NULL, + tasks_closed number(*) DEFAULT '0' NOT NULL, + help_requests number(*) DEFAULT '0' NOT NULL, + cvs_checkouts number(*) DEFAULT '0' NOT NULL, + cvs_commits number(*) DEFAULT '0' NOT NULL, + cvs_adds number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 269 (OID 18142101) +-- +-- Name: stats_site Type: TABLE Owner: tperdue +-- + +CREATE TABLE stats_site ( + month number(*) DEFAULT '0' NOT NULL, + week number(*) DEFAULT '0' NOT NULL, + day number(*) DEFAULT '0' NOT NULL, + site_views number(*) DEFAULT '0' NOT NULL, + subdomain_views number(*) DEFAULT '0' NOT NULL, + downloads number(*) DEFAULT '0' NOT NULL, + uniq_users number(*) DEFAULT '0' NOT NULL, + sessions number(*) DEFAULT '0' NOT NULL, + total_users number(*) DEFAULT '0' NOT NULL, + new_users number(*) DEFAULT '0' NOT NULL, + new_projects number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 126 (OID 18142132) +-- +-- Name: support_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE support_pk_seq START WITH 1; + +-- +-- TOC Entry ID 270 (OID 18142150) +-- +-- Name: support Type: TABLE Owner: tperdue +-- + +CREATE TABLE support ( + support_id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + support_status_id number(*) DEFAULT '0' NOT NULL, + support_category_id number(*) DEFAULT '0' NOT NULL, + priority number(*) DEFAULT '0' NOT NULL, + submitted_by number(*) DEFAULT '0' NOT NULL, + assigned_to number(*) DEFAULT '0' NOT NULL, + open_date number(*) DEFAULT '0' NOT NULL, + summary varchar2(4000), + close_date number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (support_id) +); + +-- +-- TOC Entry ID 128 (OID 18142196) +-- +-- Name: support_canned_res_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE support_canned_res_pk_seq START WITH 1; + +-- +-- TOC Entry ID 271 (OID 18142214) +-- +-- Name: support_canned_responses Type: TABLE Owner: tperdue +-- + +CREATE TABLE support_canned_responses ( + support_canned_id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + title varchar2(4000), + body varchar2(4000), + PRIMARY KEY (support_canned_id) +); + +-- +-- TOC Entry ID 130 (OID 18142247) +-- +-- Name: support_category_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE support_category_pk_seq START WITH 1; + +-- +-- TOC Entry ID 272 (OID 18142265) +-- +-- Name: support_category Type: TABLE Owner: tperdue +-- + +CREATE TABLE support_category ( + support_category_id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + category_name varchar2(4000) DEFAULT ' ' NOT NULL, + PRIMARY KEY (support_category_id) +); + +-- +-- TOC Entry ID 132 (OID 18142298) +-- +-- Name: support_history_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE support_history_pk_seq START WITH 1; + +-- +-- TOC Entry ID 273 (OID 18142316) +-- +-- Name: support_history Type: TABLE Owner: tperdue +-- + +CREATE TABLE support_history ( + support_history_id number(*) NOT NULL, + support_id number(*) DEFAULT '0' NOT NULL, + field_name varchar2(4000) DEFAULT ' ' NOT NULL, + old_value varchar2(4000) DEFAULT ' ' NOT NULL, + mod_by number(*) DEFAULT '0' NOT NULL, + date1 number(*), + PRIMARY KEY (support_history_id) +); + +-- +-- TOC Entry ID 134 (OID 18142354) +-- +-- Name: support_messages_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE support_messages_pk_seq START WITH 1; + +-- +-- TOC Entry ID 274 (OID 18142372) +-- +-- Name: support_messages Type: TABLE Owner: tperdue +-- + +CREATE TABLE support_messages ( + support_message_id number(*) NOT NULL, + support_id number(*) DEFAULT '0' NOT NULL, + from_email varchar2(4000), + date1 number(*) DEFAULT '0' NOT NULL, + body varchar2(4000), + PRIMARY KEY (support_message_id) +); + +-- +-- TOC Entry ID 136 (OID 18142407) +-- +-- Name: support_status_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE support_status_pk_seq START WITH 1; + +-- +-- TOC Entry ID 275 (OID 18142425) +-- +-- Name: support_status Type: TABLE Owner: tperdue +-- + +CREATE TABLE support_status ( + support_status_id number(*) NOT NULL, + status_name varchar2(4000), + PRIMARY KEY (support_status_id) +); + +-- +-- TOC Entry ID 138 (OID 18142455) +-- +-- Name: supported_languages_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE supported_languages_pk_seq START WITH 1; + +-- +-- TOC Entry ID 276 (OID 18142473) +-- +-- Name: supported_languages Type: TABLE Owner: tperdue +-- + +CREATE TABLE supported_languages ( + language_id number(*) NOT NULL, + name varchar2(4000), + filename varchar2(4000), + classname varchar2(4000), + language_code character(2), + PRIMARY KEY (language_id) +); + +-- +-- TOC Entry ID 140 (OID 18142506) +-- +-- Name: survey_question_types_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE survey_question_types_pk_seq START WITH 1; + +-- +-- TOC Entry ID 277 (OID 18142524) +-- +-- Name: survey_question_types Type: TABLE Owner: tperdue +-- + +CREATE TABLE survey_question_types ( + id number(*) NOT NULL, + type varchar2(4000) DEFAULT ' ' NOT NULL, + PRIMARY KEY (id) +); + +-- +-- TOC Entry ID 142 (OID 18142555) +-- +-- Name: survey_questions_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE survey_questions_pk_seq START WITH 1; + +-- +-- TOC Entry ID 278 (OID 18142573) +-- +-- Name: survey_questions Type: TABLE Owner: tperdue +-- + +CREATE TABLE survey_questions ( + question_id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + question varchar2(4000) DEFAULT ' ' NOT NULL, + question_type number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (question_id) +); + +-- +-- TOC Entry ID 279 (OID 18142608) +-- +-- Name: survey_rating_aggregate Type: TABLE Owner: tperdue +-- + +CREATE TABLE survey_rating_aggregate ( + type number(*) DEFAULT '0' NOT NULL, + id number(*) DEFAULT '0' NOT NULL, + response double precision DEFAULT '0' NOT NULL, + count number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 280 (OID 18142625) +-- +-- Name: survey_rating_response Type: TABLE Owner: tperdue +-- + +CREATE TABLE survey_rating_response ( + user_id number(*) DEFAULT '0' NOT NULL, + type number(*) DEFAULT '0' NOT NULL, + id number(*) DEFAULT '0' NOT NULL, + response number(*) DEFAULT '0' NOT NULL, + date1 number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 281 (OID 18142644) +-- +-- Name: survey_responses Type: TABLE Owner: tperdue +-- + +CREATE TABLE survey_responses ( + user_id number(*) DEFAULT '0' NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + survey_id number(*) DEFAULT '0' NOT NULL, + question_id number(*) DEFAULT '0' NOT NULL, + response varchar2(4000) DEFAULT ' ' NOT NULL, + date1 number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 144 (OID 18142680) +-- +-- Name: surveys_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE surveys_pk_seq START WITH 1; + +-- +-- TOC Entry ID 282 (OID 18142698) +-- +-- Name: surveys Type: TABLE Owner: tperdue +-- + +CREATE TABLE surveys ( + survey_id number(*) NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + survey_title varchar2(4000) DEFAULT ' ' NOT NULL, + survey_questions varchar2(4000) DEFAULT ' ' NOT NULL, + is_active number(*) DEFAULT '1' NOT NULL, + PRIMARY KEY (survey_id) +); + +-- +-- TOC Entry ID 146 (OID 18142735) +-- +-- Name: system_history_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE system_history_pk_seq START WITH 1; + +-- +-- TOC Entry ID 148 (OID 18142787) +-- +-- Name: system_machines_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE system_machines_pk_seq START WITH 1; + +-- +-- TOC Entry ID 150 (OID 18142836) +-- +-- Name: system_news_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE system_news_pk_seq START WITH 1; + +-- +-- TOC Entry ID 152 (OID 18142895) +-- +-- Name: system_services_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE system_services_pk_seq START WITH 1; + +-- +-- TOC Entry ID 154 (OID 18142944) +-- +-- Name: system_status_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE system_status_pk_seq START WITH 1; + +-- +-- TOC Entry ID 283 (OID 18142992) +-- +-- Name: theme_prefs Type: TABLE Owner: tperdue +-- + +CREATE TABLE theme_prefs ( + user_id number(*) DEFAULT '0' NOT NULL, + user_theme number(*) DEFAULT '0' NOT NULL, + body_font character(80) DEFAULT '', + body_size character(5) DEFAULT '', + titlebar_font character(80) DEFAULT '', + titlebar_size character(5) DEFAULT '', + color_titlebar_back character(7) DEFAULT '', + color_ltback1 character(7) DEFAULT '', + PRIMARY KEY (user_id) +); + +-- +-- TOC Entry ID 156 (OID 18143020) +-- +-- Name: themes_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE themes_pk_seq START WITH 1; + +-- +-- TOC Entry ID 284 (OID 18143038) +-- +-- Name: themes Type: TABLE Owner: tperdue +-- + +CREATE TABLE themes ( + theme_id number(*) NOT NULL, + dirname character varying(80), + fullname character varying(80), + PRIMARY KEY (theme_id) +); + +-- +-- TOC Entry ID 285 (OID 18143054) +-- +-- Name: tmp_projs_releases_tmp Type: TABLE Owner: tperdue +-- + +CREATE TABLE tmp_projs_releases_tmp ( + year number(*) DEFAULT '0' NOT NULL, + month number(*) DEFAULT '0' NOT NULL, + total_proj number(*) DEFAULT '0' NOT NULL, + total_releases number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 286 (OID 18143071) +-- +-- Name: top_group Type: TABLE Owner: tperdue +-- + +CREATE TABLE top_group ( + group_id number(*) DEFAULT '0' NOT NULL, + group_name character varying(40), + downloads_all number(*) DEFAULT '0' NOT NULL, + rank_downloads_all number(*) DEFAULT '0' NOT NULL, + rank_downloads_all_old number(*) DEFAULT '0' NOT NULL, + downloads_week number(*) DEFAULT '0' NOT NULL, + rank_downloads_week number(*) DEFAULT '0' NOT NULL, + rank_downloads_week_old number(*) DEFAULT '0' NOT NULL, + userrank number(*) DEFAULT '0' NOT NULL, + rank_userrank number(*) DEFAULT '0' NOT NULL, + rank_userrank_old number(*) DEFAULT '0' NOT NULL, + forumposts_week number(*) DEFAULT '0' NOT NULL, + rank_forumposts_week number(*) DEFAULT '0' NOT NULL, + rank_forumposts_week_old number(*) DEFAULT '0' NOT NULL, + pageviews_proj number(*) DEFAULT '0' NOT NULL, + rank_pageviews_proj number(*) DEFAULT '0' NOT NULL, + rank_pageviews_proj_old number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 158 (OID 18143113) +-- +-- Name: trove_cat_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE trove_cat_pk_seq START WITH 1; + +-- +-- TOC Entry ID 287 (OID 18143131) +-- +-- Name: trove_cat Type: TABLE Owner: tperdue +-- + +CREATE TABLE trove_cat ( + trove_cat_id number(*) NOT NULL, + version number(*) DEFAULT '0' NOT NULL, + parent number(*) DEFAULT '0' NOT NULL, + root_parent number(*) DEFAULT '0' NOT NULL, + shortname character varying(80), + fullname character varying(80), + description character varying(255), + count_subcat number(*) DEFAULT '0' NOT NULL, + count_subproj number(*) DEFAULT '0' NOT NULL, + fullpath varchar2(4000) DEFAULT ' ' NOT NULL, + fullpath_ids varchar2(4000), + PRIMARY KEY (trove_cat_id) +); + +-- +-- TOC Entry ID 160 (OID 18143176) +-- +-- Name: trove_group_link_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE trove_group_link_pk_seq START WITH 1; + +-- +-- TOC Entry ID 288 (OID 18143194) +-- +-- Name: trove_group_link Type: TABLE Owner: tperdue +-- + +CREATE TABLE trove_group_link ( + trove_group_id number(*) NOT NULL, + trove_cat_id number(*) DEFAULT '0' NOT NULL, + trove_cat_version number(*) DEFAULT '0' NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + trove_cat_root number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (trove_group_id) +); + +-- +-- TOC Entry ID 162 (OID 18143216) +-- +-- Name: trove_treesums_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE trove_treesums_pk_seq START WITH 1; + +-- +-- TOC Entry ID 289 (OID 18143234) +-- +-- Name: trove_treesums Type: TABLE Owner: tperdue +-- + +CREATE TABLE trove_treesums ( + trove_treesums_id number(*) NOT NULL, + trove_cat_id number(*) DEFAULT '0' NOT NULL, + limit_1 number(*) DEFAULT '0' NOT NULL, + subprojects number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (trove_treesums_id) +); + +-- +-- TOC Entry ID 164 (OID 18143286) +-- +-- Name: user_bookmarks_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE user_bookmarks_pk_seq START WITH 1; + +-- +-- TOC Entry ID 290 (OID 18143304) +-- +-- Name: user_bookmarks Type: TABLE Owner: tperdue +-- + +CREATE TABLE user_bookmarks ( + bookmark_id number(*) NOT NULL, + user_id number(*) DEFAULT '0' NOT NULL, + bookmark_url varchar2(4000), + bookmark_title varchar2(4000), + PRIMARY KEY (bookmark_id) +); + +-- +-- TOC Entry ID 166 (OID 18143337) +-- +-- Name: user_diary_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE user_diary_pk_seq START WITH 1; + +-- +-- TOC Entry ID 291 (OID 18143355) +-- +-- Name: user_diary Type: TABLE Owner: tperdue +-- + +CREATE TABLE user_diary ( + id number(*) NOT NULL, + user_id number(*) DEFAULT '0' NOT NULL, + date_posted number(*) DEFAULT '0' NOT NULL, + summary varchar2(4000), + details varchar2(4000), + is_public number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (id) +); + +-- +-- TOC Entry ID 168 (OID 18143392) +-- +-- Name: user_diary_monitor_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE user_diary_monitor_pk_seq START WITH 1; + +-- +-- TOC Entry ID 292 (OID 18143410) +-- +-- Name: user_diary_monitor Type: TABLE Owner: tperdue +-- + +CREATE TABLE user_diary_monitor ( + monitor_id number(*) NOT NULL, + monitored_user number(*) DEFAULT '0' NOT NULL, + user_id number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (monitor_id) +); + +-- +-- TOC Entry ID 170 (OID 18143428) +-- +-- Name: user_group_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE user_group_pk_seq START WITH 1; + +-- +-- TOC Entry ID 293 (OID 18143446) +-- +-- Name: user_group Type: TABLE Owner: tperdue +-- + +CREATE TABLE user_group ( + user_group_id number(*) NOT NULL, + user_id number(*) DEFAULT '0' NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + admin_flags character(16) DEFAULT ' ' NOT NULL, + bug_flags number(*) DEFAULT '0' NOT NULL, + forum_flags number(*) DEFAULT '0' NOT NULL, + project_flags number(*) DEFAULT '2' NOT NULL, + patch_flags number(*) DEFAULT '1' NOT NULL, + support_flags number(*) DEFAULT '1' NOT NULL, + doc_flags number(*) DEFAULT '0' NOT NULL, + cvs_flags number(*) DEFAULT '1' NOT NULL, + member_role number(*) DEFAULT '100' NOT NULL, + release_flags number(*) DEFAULT '0' NOT NULL, + PRIMARY KEY (user_group_id) +); + +-- +-- TOC Entry ID 172 (OID 18143484) +-- +-- Name: user_metric_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE user_metric_pk_seq START WITH 1; + +-- +-- TOC Entry ID 294 (OID 18143502) +-- +-- Name: user_metric Type: TABLE Owner: tperdue +-- + +CREATE TABLE user_metric ( + ranking number(*) NOT NULL, + user_id number(*) DEFAULT '0' NOT NULL, + times_ranked number(*) DEFAULT '0' NOT NULL, + avg_raters_importance double precision DEFAULT '0.00000000' NOT NULL, + avg_rating double precision DEFAULT '0.00000000' NOT NULL, + metric double precision DEFAULT '0.00000000' NOT NULL, + percentile double precision DEFAULT '0.00000000' NOT NULL, + importance_factor double precision DEFAULT '0.00000000' NOT NULL, + PRIMARY KEY (ranking) +); + +-- +-- TOC Entry ID 174 (OID 18143530) +-- +-- Name: user_metric0_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE user_metric0_pk_seq START WITH 1; + +-- +-- TOC Entry ID 295 (OID 18143548) +-- +-- Name: user_metric0 Type: TABLE Owner: tperdue +-- + +CREATE TABLE user_metric0 ( + ranking number(*) NOT NULL, + user_id number(*) DEFAULT '0' NOT NULL, + times_ranked number(*) DEFAULT '0' NOT NULL, + avg_raters_importance double precision DEFAULT '0.00000000' NOT NULL, + avg_rating double precision DEFAULT '0.00000000' NOT NULL, + metric double precision DEFAULT '0.00000000' NOT NULL, + percentile double precision DEFAULT '0.00000000' NOT NULL, + importance_factor double precision DEFAULT '0.00000000' NOT NULL, + PRIMARY KEY (ranking) +); + +-- +-- TOC Entry ID 296 (OID 18143576) +-- +-- Name: user_preferences Type: TABLE Owner: tperdue +-- + +CREATE TABLE user_preferences ( + user_id number(*) DEFAULT '0' NOT NULL, + preference_name character varying(20), + preference_value character varying(20), + set_date number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 297 (OID 18143591) +-- +-- Name: user_ratings Type: TABLE Owner: tperdue +-- + +CREATE TABLE user_ratings ( + rated_by number(*) DEFAULT '0' NOT NULL, + user_id number(*) DEFAULT '0' NOT NULL, + rate_field number(*) DEFAULT '0' NOT NULL, + rating number(*) DEFAULT '0' NOT NULL +); + +-- +-- TOC Entry ID 176 (OID 18143608) +-- +-- Name: users_pk_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE users_pk_seq START WITH 1; + +-- +-- TOC Entry ID 298 (OID 18143626) +-- +-- Name: users Type: TABLE Owner: tperdue +-- + +CREATE TABLE users ( + user_id number(*) NOT NULL, + user_name varchar2(200) DEFAULT ' ' NOT NULL, + email varchar2(4000) DEFAULT ' ' NOT NULL, + user_pw character varying(32) DEFAULT ' ' NOT NULL, + realname character varying(32) DEFAULT ' ' NOT NULL, + status character(1) DEFAULT 'A' NOT NULL, + shell character varying(20) DEFAULT '/bin/bash' NOT NULL, + unix_pw character varying(40) DEFAULT ' ' NOT NULL, + unix_status character(1) DEFAULT 'N' NOT NULL, + unix_uid number(*) DEFAULT '0' NOT NULL, + unix_box character varying(10) DEFAULT 'shell1' NOT NULL, + add_date number(*) DEFAULT '0' NOT NULL, + confirm_hash character varying(32), + mail_siteupdates number(*) DEFAULT '0' NOT NULL, + mail_va number(*) DEFAULT '0' NOT NULL, + authorized_keys varchar2(4000), + email_new varchar2(4000), + people_view_skills number(*) DEFAULT '0' NOT NULL, + people_resume varchar2(4000) DEFAULT ' ' NOT NULL, + timezone character varying(64) DEFAULT 'GMT', + language number(*) DEFAULT '1' NOT NULL, + PRIMARY KEY (user_id) +); + +-- +-- TOC Entry ID 178 (OID 27311232) +-- +-- Name: unix_uid_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE unix_uid_seq START WITH 1; + +-- +-- TOC Entry ID 180 (OID 27311250) +-- +-- Name: forum_thread_seq Type: SEQUENCE Owner: tperdue +-- + +CREATE SEQUENCE forum_thread_seq START WITH 1; + +-- +-- TOC Entry ID 299 (OID 27311451) +-- +-- Name: trove_agg Type: TABLE Owner: tperdue +-- + +CREATE TABLE trove_agg ( + trove_cat_id number(*), + group_id number(*), + group_name character varying(40), + unix_group_name character varying(30), + status character(1), + register_time number(*), + short_description character varying(255), + percentile double precision, + ranking integer +); + +-- +-- TOC Entry ID 302 (OID 30136736) +-- +-- Name: activity_log Type: TABLE Owner: www +-- + +CREATE TABLE activity_log ( + day number(*) DEFAULT '0' NOT NULL, + hour number(*) DEFAULT '0' NOT NULL, + group_id number(*) DEFAULT '0' NOT NULL, + browser character varying(8) DEFAULT 'OTHER' NOT NULL, + ver double precision DEFAULT '0.00' NOT NULL, + platform character varying(8) DEFAULT 'OTHER' NOT NULL, + time number(*) DEFAULT '0' NOT NULL, + page varchar2(4000), + type number(*) DEFAULT '0' NOT NULL +); + +--\connect - tperdue +-- +-- TOC Entry ID 316 (OID 18138445) +-- +-- Name: bug_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX bug_group_id on bug ( group_id ); + +-- +-- TOC Entry ID 466 (OID 18138445) +-- +-- Name: bug_groupid_statusid Type: INDEX Owner: tperdue +-- + +CREATE INDEX bug_groupid_statusid on bug ( group_id, status_id ); + +-- +-- TOC Entry ID 467 (OID 18138445) +-- +-- Name: bug_groupid_assign_statusid Type: INDEX Owner: tperdue +-- + +CREATE INDEX bug_groupid_assign_statusid on bug ( group_id, assigned_to, status_id ); + +-- +-- TOC Entry ID 317 (OID 18138513) +-- +-- Name: bug_bug_dependencies_bug_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX bug_bug_dependencies_bug_id on bug_bug_dependencies ( bug_id ); + +-- +-- TOC Entry ID 318 (OID 18138513) +-- +-- Name: bug_bug_dependent_on_task_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX bug_bug_dependent_on_task_id on bug_bug_dependencies ( is_dependent_on_bug_id ); + +-- +-- TOC Entry ID 319 (OID 18138549) +-- +-- Name: bug_canned_response_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX bug_canned_response_group_id on bug_canned_responses ( group_id ); + +-- +-- TOC Entry ID 320 (OID 18138600) +-- +-- Name: bug_category_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX bug_category_group_id on bug_category ( group_id ); + +-- +-- TOC Entry ID 321 (OID 18138705) +-- +-- Name: bug_group_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX bug_group_group_id on bug_group ( group_id ); + +-- +-- TOC Entry ID 322 (OID 18138756) +-- +-- Name: bug_history_bug_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX bug_history_bug_id on bug_history ( bug_id ); + +-- +-- TOC Entry ID 323 (OID 18138909) +-- +-- Name: bug_task_dependencies_bug_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX bug_task_dependencies_bug_id on bug_task_dependencies ( bug_id ); + +-- +-- TOC Entry ID 324 (OID 18138909) +-- +-- Name: bug_task_dependent_on_task_i Type: INDEX Owner: tperdue +-- + +CREATE INDEX bug_task_dependent_on_task_i on bug_task_dependencies ( is_dependent_on_task_id ); + +-- +-- TOC Entry ID 325 (OID 18138995) +-- +-- Name: db_images_group Type: INDEX Owner: tperdue +-- + +CREATE INDEX db_images_group on db_images ( group_id ); + +-- +-- TOC Entry ID 326 (OID 18139058) +-- +-- Name: doc_group_doc_group Type: INDEX Owner: tperdue +-- + +CREATE INDEX doc_group_doc_group on doc_data ( doc_group ); + +-- +-- TOC Entry ID 327 (OID 18139122) +-- +-- Name: doc_groups_group Type: INDEX Owner: tperdue +-- + +CREATE INDEX doc_groups_group on doc_groups ( group_id ); + +-- +-- TOC Entry ID 328 (OID 18139192) +-- +-- Name: filemodule_monitor_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX filemodule_monitor_id on filemodule_monitor ( filemodule_id ); + +-- +-- TOC Entry ID 329 (OID 18139228) +-- +-- Name: forum_forumid_msgid Type: INDEX Owner: tperdue +-- + +CREATE INDEX forum_forumid_msgid on forum ( group_forum_id, msg_id ); + +-- +-- TOC Entry ID 330 (OID 18139228) +-- +-- Name: forum_group_forum_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX forum_group_forum_id on forum ( group_forum_id ); + +-- +-- TOC Entry ID 331 (OID 18139228) +-- +-- Name: forum_forumid_isfollowupto Type: INDEX Owner: tperdue +-- + +CREATE INDEX forum_forumid_isfollowupto on forum ( group_forum_id, is_followup_to ); + +-- +-- TOC Entry ID 332 (OID 18139228) +-- +-- Name: forum_forumid_threadid_mrec Type: INDEX Owner: tperdue +-- + +CREATE INDEX forum_forumid_threadid_mrec on forum ( group_forum_id, thread_id, most_recent_date ); + +-- +-- TOC Entry ID 333 (OID 18139228) +-- +-- Name: forum_threadid_isfollowupto Type: INDEX Owner: tperdue +-- + +CREATE INDEX forum_threadid_isfollowupto on forum ( thread_id, is_followup_to ); + +-- +-- TOC Entry ID 334 (OID 18139228) +-- +-- Name: forum_forumid_isfollto_mrec Type: INDEX Owner: tperdue +-- + +CREATE INDEX forum_forumid_isfollto_mrec on forum ( group_forum_id, is_followup_to, most_recent_date ); + +-- +-- TOC Entry ID 335 (OID 18139309) +-- +-- Name: forum_group_list_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX forum_group_list_group_id on forum_group_list ( group_id ); + +-- +-- TOC Entry ID 336 (OID 18139366) +-- +-- Name: forum_monitor_combo_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX forum_monitor_combo_id on forum_monitored_forums ( forum_id, user_id ); + +-- +-- TOC Entry ID 337 (OID 18139366) +-- +-- Name: forum_monitor_thread_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX forum_monitor_thread_id on forum_monitored_forums ( forum_id ); + +-- +-- TOC Entry ID 338 (OID 18139510) +-- +-- Name: foundry_news_foundry_app_d Type: INDEX Owner: tperdue +-- + +CREATE INDEX foundry_news_foundry_app_d on foundry_news ( foundry_id, is_approved, approve_date ); + +-- +-- TOC Entry ID 339 (OID 18139510) +-- +-- Name: foundry_news_foundry_approved Type: INDEX Owner: tperdue +-- + +CREATE INDEX foundry_news_foundry_approved on foundry_news ( foundry_id, is_approved ); + +-- +-- TOC Entry ID 340 (OID 18139510) +-- +-- Name: foundry_news_foundry Type: INDEX Owner: tperdue +-- + +CREATE INDEX foundry_news_foundry on foundry_news ( foundry_id ); + +-- +-- TOC Entry ID 463 (OID 18139510) +-- +-- Name: foundrynews_foundry_date_app Type: INDEX Owner: tperdue +-- + +CREATE INDEX foundrynews_foundry_date_app on foundry_news ( foundry_id, approve_date, is_approved ); + +-- +-- TOC Entry ID 341 (OID 18139550) +-- +-- Name: foundry_project_group_rank Type: INDEX Owner: tperdue +-- + +CREATE INDEX foundry_project_group_rank on foundry_preferred_projects ( group_id, rank ); + +-- +-- TOC Entry ID 342 (OID 18139550) +-- +-- Name: foundry_project_group Type: INDEX Owner: tperdue +-- + +CREATE INDEX foundry_project_group on foundry_preferred_projects ( group_id ); + +-- +-- TOC Entry ID 343 (OID 18139588) +-- +-- Name: foundry_projects_foundry Type: INDEX Owner: tperdue +-- + +CREATE INDEX foundry_projects_foundry on foundry_projects ( foundry_id ); + +-- +-- TOC Entry ID 344 (OID 18139606) +-- +-- Name: downloads_http_idx Type: INDEX Owner: tperdue +-- + +CREATE INDEX downloads_http_idx on frs_dlstats_agg ( downloads_http ); + +-- +-- TOC Entry ID 345 (OID 18139606) +-- +-- Name: downloads_ftp_idx Type: INDEX Owner: tperdue +-- + +CREATE INDEX downloads_ftp_idx on frs_dlstats_agg ( downloads_ftp ); + +-- +-- TOC Entry ID 346 (OID 18139606) +-- +-- Name: file_id_idx Type: INDEX Owner: tperdue +-- + +CREATE INDEX file_id_idx on frs_dlstats_agg ( file_id ); + +-- +-- TOC Entry ID 347 (OID 18139606) +-- +-- Name: day_idx Type: INDEX Owner: tperdue +-- + +CREATE INDEX day_idx on frs_dlstats_agg ( day ); + +-- +-- TOC Entry ID 348 (OID 18139623) +-- +-- Name: dlstats_file_down Type: INDEX Owner: tperdue +-- + +CREATE INDEX dlstats_file_down on frs_dlstats_file_agg ( downloads ); + +-- +-- TOC Entry ID 349 (OID 18139623) +-- +-- Name: dlstats_file_file_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX dlstats_file_file_id on frs_dlstats_file_agg ( file_id ); + +-- +-- TOC Entry ID 350 (OID 18139623) +-- +-- Name: dlstats_file_day Type: INDEX Owner: tperdue +-- + +CREATE INDEX dlstats_file_day on frs_dlstats_file_agg ( day ); + +-- +-- TOC Entry ID 351 (OID 18139638) +-- +-- Name: stats_agr_tmp_fid Type: INDEX Owner: tperdue +-- + +--CREATE INDEX stats_agr_tmp_fid on frs_dlstats_filetotal_agg ( file_id ); + +-- +-- TOC Entry ID 352 (OID 18139654) +-- +-- Name: frs_dlstats_filet_agg_old_f Type: INDEX Owner: tperdue +-- + +CREATE INDEX frs_dlstats_filet_agg_old_f on frs_dlstats_filetotal_agg_old ( file_id ); + +-- +-- TOC Entry ID 303 (OID 18139667) +-- +-- Name: frsdlstatsgroupagg_day_dls Type: INDEX Owner: tperdue +-- + +CREATE INDEX frsdlstatsgroupagg_day_dls on frs_dlstats_group_agg ( day, downloads ); + +-- +-- TOC Entry ID 353 (OID 18139667) +-- +-- Name: group_id_idx Type: INDEX Owner: tperdue +-- + +CREATE INDEX group_id_idx on frs_dlstats_group_agg ( group_id ); + +-- +-- TOC Entry ID 355 (OID 18139667) +-- +-- Name: frs_dlstats_group_agg_day Type: INDEX Owner: tperdue +-- + +CREATE INDEX frs_dlstats_group_agg_day on frs_dlstats_group_agg ( day ); + +-- +-- TOC Entry ID 356 (OID 18139682) +-- +-- Name: stats_agr_tmp_gid Type: INDEX Owner: tperdue +-- + +CREATE INDEX stats_agr_tmp_gid on frs_dlstats_grouptotal_agg ( group_id ); + +-- +-- TOC Entry ID 357 (OID 18139714) +-- +-- Name: frs_file_name Type: INDEX Owner: tperdue +-- + +CREATE INDEX frs_file_name on frs_file ( filename ); + +-- +-- TOC Entry ID 358 (OID 18139714) +-- +-- Name: frs_file_date Type: INDEX Owner: tperdue +-- + +CREATE INDEX frs_file_date on frs_file ( post_date ); + +-- +-- TOC Entry ID 359 (OID 18139714) +-- +-- Name: frs_file_processor Type: INDEX Owner: tperdue +-- + +CREATE INDEX frs_file_processor on frs_file ( processor_id ); + +-- +-- TOC Entry ID 360 (OID 18139714) +-- +-- Name: frs_file_release_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX frs_file_release_id on frs_file ( release_id ); + +-- +-- TOC Entry ID 361 (OID 18139714) +-- +-- Name: frs_file_type Type: INDEX Owner: tperdue +-- + +CREATE INDEX frs_file_type on frs_file ( type_id ); + +-- +-- TOC Entry ID 362 (OID 18139822) +-- +-- Name: package_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX package_group_id on frs_package ( group_id ); + +-- +-- TOC Entry ID 363 (OID 18139922) +-- +-- Name: frs_release_package Type: INDEX Owner: tperdue +-- + +CREATE INDEX frs_release_package on frs_release ( package_id ); + +-- +-- TOC Entry ID 364 (OID 18139922) +-- +-- Name: frs_release_date Type: INDEX Owner: tperdue +-- + +CREATE INDEX frs_release_date on frs_release ( release_date ); + +-- +-- TOC Entry ID 365 (OID 18139922) +-- +-- Name: frs_release_by Type: INDEX Owner: tperdue +-- + +CREATE INDEX frs_release_by on frs_release ( released_by ); + +-- +-- TOC Entry ID 366 (OID 18140030) +-- +-- Name: group_cvs_history_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX group_cvs_history_group_id on group_cvs_history ( group_id ); + +-- +-- TOC Entry ID 367 (OID 18140030) +-- +-- Name: user_name_idx Type: INDEX Owner: tperdue +-- + +CREATE INDEX user_name_idx on group_cvs_history ( user_name ); + +-- +-- TOC Entry ID 368 (OID 18140074) +-- +-- Name: group_history_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX group_history_group_id on group_history ( group_id ); + +-- +-- TOC Entry ID 369 (OID 18140178) +-- +-- Name: groups_unix Type: INDEX Owner: tperdue +-- + +CREATE INDEX groups_unix on groups ( unix_group_name ); + +-- +-- TOC Entry ID 370 (OID 18140178) +-- +-- Name: groups_type Type: INDEX Owner: tperdue +-- + +CREATE INDEX groups_type on groups ( type ); + +-- +-- TOC Entry ID 371 (OID 18140178) +-- +-- Name: groups_public Type: INDEX Owner: tperdue +-- + +CREATE INDEX groups_public on groups ( is_public ); + +-- +-- TOC Entry ID 372 (OID 18140178) +-- +-- Name: groups_status Type: INDEX Owner: tperdue +-- + +CREATE INDEX groups_status on groups ( status ); + +-- +-- TOC Entry ID 373 (OID 18140319) +-- +-- Name: mail_group_list_group Type: INDEX Owner: tperdue +-- + +CREATE INDEX mail_group_list_group on mail_group_list ( group_id ); + +-- +-- TOC Entry ID 374 (OID 18140377) +-- +-- Name: news_bytes_group Type: INDEX Owner: tperdue +-- + +CREATE INDEX news_bytes_group on news_bytes ( group_id ); + +-- +-- TOC Entry ID 375 (OID 18140377) +-- +-- Name: news_bytes_approved Type: INDEX Owner: tperdue +-- + +CREATE INDEX news_bytes_approved on news_bytes ( is_approved ); + +-- +-- TOC Entry ID 376 (OID 18140377) +-- +-- Name: news_bytes_forum Type: INDEX Owner: tperdue +-- + +CREATE INDEX news_bytes_forum on news_bytes ( forum_id ); + +-- +-- TOC Entry ID 464 (OID 18140377) +-- +-- Name: news_group_date Type: INDEX Owner: tperdue +-- + +CREATE INDEX news_group_date on news_bytes ( group_id, date1 ); + +-- +-- TOC Entry ID 465 (OID 18140377) +-- +-- Name: news_approved_date Type: INDEX Owner: tperdue +-- + +CREATE INDEX news_approved_date on news_bytes ( is_approved, date1 ); + +-- +-- TOC Entry ID 377 (OID 18140437) +-- +-- Name: patch_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX patch_group_id on patch ( group_id ); + +-- +-- TOC Entry ID 451 (OID 18140437) +-- +-- Name: patch_groupid_assign_status Type: INDEX Owner: tperdue +-- + +CREATE INDEX patch_groupid_assign_status on patch ( group_id, assigned_to, patch_status_id ); + +-- +-- TOC Entry ID 452 (OID 18140437) +-- +-- Name: patch_groupid_assignedto Type: INDEX Owner: tperdue +-- + +CREATE INDEX patch_groupid_assignedto on patch ( group_id, assigned_to ); + +-- +-- TOC Entry ID 453 (OID 18140437) +-- +-- Name: patch_groupid_status Type: INDEX Owner: tperdue +-- + +CREATE INDEX patch_groupid_status on patch ( group_id, patch_status_id ); + +-- +-- TOC Entry ID 378 (OID 18140501) +-- +-- Name: patch_group_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX patch_group_group_id on patch_category ( group_id ); + +-- +-- TOC Entry ID 379 (OID 18140552) +-- +-- Name: patch_history_patch_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX patch_history_patch_id on patch_history ( patch_id ); + +-- +-- TOC Entry ID 461 (OID 18140656) +-- +-- Name: people_job_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX people_job_group_id on people_job ( group_id ); + +-- +-- TOC Entry ID 380 (OID 18141038) +-- +-- Name: project_assign_to_assigned_to Type: INDEX Owner: tperdue +-- + +CREATE INDEX project_assign_to_assigned_to on project_assigned_to ( assigned_to_id ); + +-- +-- TOC Entry ID 381 (OID 18141038) +-- +-- Name: project_assigned_to_task_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX project_assigned_to_task_id on project_assigned_to ( project_task_id ); + +-- +-- TOC Entry ID 382 (OID 18141128) +-- +-- Name: project_dependent_on_task_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX project_dependent_on_task_id on project_dependencies ( is_dependent_on_task_id ); + +-- +-- TOC Entry ID 383 (OID 18141128) +-- +-- Name: project_dependencies_task_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX project_dependencies_task_id on project_dependencies ( project_task_id ); + +-- +-- TOC Entry ID 384 (OID 18141164) +-- +-- Name: project_group_list_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX project_group_list_group_id on project_group_list ( group_id ); + +-- +-- TOC Entry ID 385 (OID 18141218) +-- +-- Name: project_history_task_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX project_history_task_id on project_history ( project_task_id ); + +-- +-- TOC Entry ID 386 (OID 18141275) +-- +-- Name: project_metric_group Type: INDEX Owner: tperdue +-- + +CREATE INDEX project_metric_group on project_metric ( group_id ); + +-- +-- TOC Entry ID 387 (OID 18141430) +-- +-- Name: project_task_group_project_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX project_task_group_project_id on project_task ( group_project_id ); + +-- +-- TOC Entry ID 454 (OID 18141430) +-- +-- Name: projecttask_projid_status Type: INDEX Owner: tperdue +-- + +CREATE INDEX projecttask_projid_status on project_task ( group_project_id, status_id ); + +-- +-- TOC Entry ID 354 (OID 18141497) +-- +-- Name: projectweeklymetric_ranking Type: INDEX Owner: tperdue +-- + +--CREATE INDEX projectweeklymetric_ranking on project_weekly_metric ( ranking ); + +-- +-- TOC Entry ID 388 (OID 18141497) +-- +-- Name: project_metric_weekly_group Type: INDEX Owner: tperdue +-- + +CREATE INDEX project_metric_weekly_group on project_weekly_metric ( group_id ); + +-- +-- TOC Entry ID 389 (OID 18141514) +-- +-- Name: session_user_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX session1_user_id on session1 ( user_id ); + +-- +-- TOC Entry ID 390 (OID 18141514) +-- +-- Name: session_time Type: INDEX Owner: tperdue +-- + +CREATE INDEX session1_time on session1 ( time ); + +-- +-- TOC Entry ID 391 (OID 18141552) +-- +-- Name: snippet_language Type: INDEX Owner: tperdue +-- + +CREATE INDEX snippet_language on snippet ( language ); + +-- +-- TOC Entry ID 392 (OID 18141552) +-- +-- Name: snippet_category Type: INDEX Owner: tperdue +-- + +CREATE INDEX snippet_category on snippet ( category ); + +-- +-- TOC Entry ID 393 (OID 18141611) +-- +-- Name: snippet_package_language Type: INDEX Owner: tperdue +-- + +CREATE INDEX snippet_package_language on snippet_package ( language ); + +-- +-- TOC Entry ID 394 (OID 18141611) +-- +-- Name: snippet_package_category Type: INDEX Owner: tperdue +-- + +CREATE INDEX snippet_package_category on snippet_package ( category ); + +-- +-- TOC Entry ID 395 (OID 18141666) +-- +-- Name: snippet_package_item_pkg_ver Type: INDEX Owner: tperdue +-- + +CREATE INDEX snippet_package_item_pkg_ver on snippet_package_item ( snippet_package_version_id ); + +-- +-- TOC Entry ID 396 (OID 18141702) +-- +-- Name: snippet_package_version_pkg_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX snippet_package_version_pkg_id on snippet_package_version ( snippet_package_id ); + +-- +-- TOC Entry ID 397 (OID 18141757) +-- +-- Name: snippet_version_snippet_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX snippet_version_snippet_id on snippet_version ( snippet_id ); + +-- +-- TOC Entry ID 398 (OID 18141829) +-- +-- Name: pages_by_day_day Type: INDEX Owner: tperdue +-- + +CREATE INDEX pages_by_day_day on stats_agg_pages_by_day ( day ); + +-- +-- TOC Entry ID 399 (OID 18141881) +-- +-- Name: stats_agr_filerelease_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX stats_agr_filerelease_group_id on stats_agr_filerelease ( group_id ); + +-- +-- TOC Entry ID 400 (OID 18141881) +-- +-- Name: stats_agr_filerel_filerelea Type: INDEX Owner: tperdue +-- + +CREATE INDEX stats_agr_filerel_filerelea on stats_agr_filerelease ( filerelease_id ); + +-- +-- TOC Entry ID 401 (OID 18141896) +-- +-- Name: project_agr_log_group Type: INDEX Owner: tperdue +-- + +CREATE INDEX project_agr_log_group on stats_agr_project ( group_id ); + +-- +-- TOC Entry ID 402 (OID 18141949) +-- +-- Name: ftpdl_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX ftpdl_group_id on stats_ftp_downloads ( group_id ); + +-- +-- TOC Entry ID 403 (OID 18141949) +-- +-- Name: ftpdl_fid Type: INDEX Owner: tperdue +-- + +CREATE INDEX ftpdl_fid on stats_ftp_downloads ( filerelease_id ); + +-- +-- TOC Entry ID 404 (OID 18141949) +-- +-- Name: ftpdl_day Type: INDEX Owner: tperdue +-- + +CREATE INDEX ftpdl_day on stats_ftp_downloads ( day ); + +-- +-- TOC Entry ID 405 (OID 18141966) +-- +-- Name: httpdl_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX httpdl_group_id on stats_http_downloads ( group_id ); + +-- +-- TOC Entry ID 406 (OID 18141966) +-- +-- Name: httpdl_fid Type: INDEX Owner: tperdue +-- + +CREATE INDEX httpdl_fid on stats_http_downloads ( filerelease_id ); + +-- +-- TOC Entry ID 407 (OID 18141966) +-- +-- Name: httpdl_day Type: INDEX Owner: tperdue +-- + +CREATE INDEX httpdl_day on stats_http_downloads ( day ); + +-- +-- TOC Entry ID 408 (OID 18141983) +-- +-- Name: archive_project_monthday Type: INDEX Owner: tperdue +-- + +CREATE INDEX archive_project_monthday on stats_project ( month, day ); + +-- +-- TOC Entry ID 409 (OID 18141983) +-- +-- Name: project_log_group Type: INDEX Owner: tperdue +-- + +CREATE INDEX project_log_group on stats_project ( group_id ); + +-- +-- TOC Entry ID 410 (OID 18141983) +-- +-- Name: archive_project_week Type: INDEX Owner: tperdue +-- + +CREATE INDEX archive_project_week on stats_project ( week ); + +-- +-- TOC Entry ID 411 (OID 18141983) +-- +-- Name: archive_project_day Type: INDEX Owner: tperdue +-- + +CREATE INDEX archive_project_day on stats_project ( day ); + +-- +-- TOC Entry ID 412 (OID 18141983) +-- +-- Name: archive_project_month Type: INDEX Owner: tperdue +-- + +CREATE INDEX archive_project_month on stats_project ( month ); + +-- +-- TOC Entry ID 413 (OID 18142042) +-- +-- Name: stats_project_tmp_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX stats_project_tmp_group_id on stats_project_tmp ( group_id ); + +-- +-- TOC Entry ID 414 (OID 18142042) +-- +-- Name: project_stats_week Type: INDEX Owner: tperdue +-- + +CREATE INDEX project_stats_week on stats_project_tmp ( week ); + +-- +-- TOC Entry ID 415 (OID 18142042) +-- +-- Name: project_stats_month Type: INDEX Owner: tperdue +-- + +CREATE INDEX project_stats_month on stats_project_tmp ( month ); + +-- +-- TOC Entry ID 416 (OID 18142042) +-- +-- Name: project_stats_day Type: INDEX Owner: tperdue +-- + +CREATE INDEX project_stats_day on stats_project_tmp ( day ); + +-- +-- TOC Entry ID 417 (OID 18142101) +-- +-- Name: stats_site_monthday Type: INDEX Owner: tperdue +-- + +CREATE INDEX stats_site_monthday on stats_site ( month, day ); + +-- +-- TOC Entry ID 418 (OID 18142101) +-- +-- Name: stats_site_week Type: INDEX Owner: tperdue +-- + +CREATE INDEX stats_site_week on stats_site ( week ); + +-- +-- TOC Entry ID 419 (OID 18142101) +-- +-- Name: stats_site_day Type: INDEX Owner: tperdue +-- + +CREATE INDEX stats_site_day on stats_site ( day ); + +-- +-- TOC Entry ID 420 (OID 18142101) +-- +-- Name: stats_site_month Type: INDEX Owner: tperdue +-- + +CREATE INDEX stats_site_month on stats_site ( month ); + +-- +-- TOC Entry ID 421 (OID 18142150) +-- +-- Name: support_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX support_group_id on support ( group_id ); + +-- +-- TOC Entry ID 448 (OID 18142150) +-- +-- Name: support_groupid_assignedto Type: INDEX Owner: tperdue +-- + +CREATE INDEX support_groupid_assignedto on support ( group_id, assigned_to ); + +-- +-- TOC Entry ID 449 (OID 18142150) +-- +-- Name: support_groupid_assign_stat Type: INDEX Owner: tperdue +-- + +CREATE INDEX support_groupid_assign_stat on support ( group_id, assigned_to, support_status_id ); + +-- +-- TOC Entry ID 450 (OID 18142150) +-- +-- Name: support_groupid_status Type: INDEX Owner: tperdue +-- + +CREATE INDEX support_groupid_status on support ( group_id, support_status_id ); + +-- +-- TOC Entry ID 422 (OID 18142214) +-- +-- Name: support_canned_res_group_i Type: INDEX Owner: tperdue +-- + +CREATE INDEX support_canned_res_group_i on support_canned_responses ( group_id ); + +-- +-- TOC Entry ID 423 (OID 18142265) +-- +-- Name: support_group_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX support_group_group_id on support_category ( group_id ); + +-- +-- TOC Entry ID 424 (OID 18142316) +-- +-- Name: support_history_support_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX support_history_support_id on support_history ( support_id ); + +-- +-- TOC Entry ID 425 (OID 18142372) +-- +-- Name: support_messages_support_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX support_messages_support_id on support_messages ( support_id ); + +-- +-- TOC Entry ID 426 (OID 18142473) +-- +-- Name: supported_languages_code Type: INDEX Owner: tperdue +-- + +CREATE INDEX supported_languages_code on supported_languages ( language_code ); + +-- +-- TOC Entry ID 427 (OID 18142573) +-- +-- Name: survey_questions_group Type: INDEX Owner: tperdue +-- + +CREATE INDEX survey_questions_group on survey_questions ( group_id ); + +-- +-- TOC Entry ID 428 (OID 18142608) +-- +-- Name: survey_rating_agg_type_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX survey_rating_agg_type_id on survey_rating_aggregate ( type, id ); + +-- +-- TOC Entry ID 429 (OID 18142625) +-- +-- Name: survey_rating_res_user_ty Type: INDEX Owner: tperdue +-- + +CREATE INDEX survey_rating_res_user_ty on survey_rating_response ( user_id, type, id ); + +-- +-- TOC Entry ID 430 (OID 18142625) +-- +-- Name: survey_rating_res_type_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX survey_rating_res_type_id on survey_rating_response ( type, id ); + +-- +-- TOC Entry ID 431 (OID 18142644) +-- +-- Name: survey_responses_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX survey_responses_group_id on survey_responses ( group_id ); + +-- +-- TOC Entry ID 432 (OID 18142644) +-- +-- Name: survey_res_user_survey_qu Type: INDEX Owner: tperdue +-- + +CREATE INDEX survey_res_user_survey_qu on survey_responses ( user_id, survey_id, question_id ); + +-- +-- TOC Entry ID 433 (OID 18142644) +-- +-- Name: survey_responses_user_survey Type: INDEX Owner: tperdue +-- + +CREATE INDEX survey_responses_user_survey on survey_responses ( user_id, survey_id ); + +-- +-- TOC Entry ID 434 (OID 18142644) +-- +-- Name: survey_res_survey_questio Type: INDEX Owner: tperdue +-- + +CREATE INDEX survey_res_survey_questio on survey_responses ( survey_id, question_id ); + +-- +-- TOC Entry ID 435 (OID 18142698) +-- +-- Name: surveys_group Type: INDEX Owner: tperdue +-- + +CREATE INDEX surveys_group on surveys ( group_id ); + +-- +-- TOC Entry ID 436 (OID 18143071) +-- +-- Name: rank_forumposts_week_idx Type: INDEX Owner: tperdue +-- + +CREATE INDEX rank_forumposts_week_idx on top_group ( rank_forumposts_week ); + +-- +-- TOC Entry ID 437 (OID 18143071) +-- +-- Name: rank_downloads_week_idx Type: INDEX Owner: tperdue +-- + +CREATE INDEX rank_downloads_week_idx on top_group ( rank_downloads_week ); + +-- +-- TOC Entry ID 438 (OID 18143071) +-- +-- Name: pageviews_proj_idx Type: INDEX Owner: tperdue +-- + +CREATE INDEX pageviews_proj_idx on top_group ( pageviews_proj ); + +-- +-- TOC Entry ID 439 (OID 18143071) +-- +-- Name: rank_userrank_idx Type: INDEX Owner: tperdue +-- + +CREATE INDEX rank_userrank_idx on top_group ( rank_userrank ); + +-- +-- TOC Entry ID 440 (OID 18143071) +-- +-- Name: rank_downloads_all_idx Type: INDEX Owner: tperdue +-- + +CREATE INDEX rank_downloads_all_idx on top_group ( rank_downloads_all ); + +-- +-- TOC Entry ID 441 (OID 18143131) +-- +-- Name: parent_idx Type: INDEX Owner: tperdue +-- + +CREATE INDEX parent_idx on trove_cat ( parent ); + +-- +-- TOC Entry ID 442 (OID 18143131) +-- +-- Name: root_parent_idx Type: INDEX Owner: tperdue +-- + +CREATE INDEX root_parent_idx on trove_cat ( root_parent ); + +-- +-- TOC Entry ID 443 (OID 18143131) +-- +-- Name: version_idx Type: INDEX Owner: tperdue +-- + +CREATE INDEX version_idx on trove_cat ( version ); + +-- +-- TOC Entry ID 444 (OID 18143194) +-- +-- Name: trove_group_link_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX trove_group_link_group_id on trove_group_link ( group_id ); + +-- +-- TOC Entry ID 445 (OID 18143194) +-- +-- Name: trove_group_link_cat_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX trove_group_link_cat_id on trove_group_link ( trove_cat_id ); + +-- +-- TOC Entry ID 446 (OID 18143304) +-- +-- Name: user_bookmark_user_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX user_bookmark_user_id on user_bookmarks ( user_id ); + +-- +-- TOC Entry ID 304 (OID 18143355) +-- +-- Name: user_diary_user Type: INDEX Owner: tperdue +-- + +CREATE INDEX user_diary_user on user_diary ( user_id ); + +-- +-- TOC Entry ID 305 (OID 18143355) +-- +-- Name: user_diary_user_date Type: INDEX Owner: tperdue +-- + +CREATE INDEX user_diary_user_date on user_diary ( user_id, date_posted ); + +-- +-- TOC Entry ID 306 (OID 18143355) +-- +-- Name: user_diary_date Type: INDEX Owner: tperdue +-- + +CREATE INDEX user_diary_date on user_diary ( date_posted ); + +-- +-- TOC Entry ID 307 (OID 18143410) +-- +-- Name: user_diary_monitor_user Type: INDEX Owner: tperdue +-- + +CREATE INDEX user_diary_monitor_user on user_diary_monitor ( user_id ); + +-- +-- TOC Entry ID 308 (OID 18143410) +-- +-- Name: user_diary_monitor_monitor_us Type: INDEX Owner: tperdue +-- + +CREATE INDEX user_diary_monitor_monitor_us on user_diary_monitor ( monitored_user ); + +-- +-- TOC Entry ID 309 (OID 18143446) +-- +-- Name: user_group_group_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX user_group_group_id on user_group ( group_id ); + +-- +-- TOC Entry ID 310 (OID 18143446) +-- +-- Name: bug_flags_idx Type: INDEX Owner: tperdue +-- + +CREATE INDEX bug_flags_idx on user_group ( bug_flags ); + +-- +-- TOC Entry ID 311 (OID 18143446) +-- +-- Name: project_flags_idx Type: INDEX Owner: tperdue +-- + +CREATE INDEX project_flags_idx on user_group ( project_flags ); + +-- +-- TOC Entry ID 312 (OID 18143446) +-- +-- Name: user_group_user_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX user_group_user_id on user_group ( user_id ); + +-- +-- TOC Entry ID 313 (OID 18143446) +-- +-- Name: admin_flags_idx Type: INDEX Owner: tperdue +-- + +CREATE INDEX admin_flags_idx on user_group ( admin_flags ); + +-- +-- TOC Entry ID 314 (OID 18143446) +-- +-- Name: forum_flags_idx Type: INDEX Owner: tperdue +-- + +CREATE INDEX forum_flags_idx on user_group ( forum_flags ); + +-- +-- TOC Entry ID 315 (OID 18143548) +-- +-- Name: user_metric0_user_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX user_metric0_user_id on user_metric0 ( user_id ); + +-- +-- TOC Entry ID 455 (OID 18143576) +-- +-- Name: user_pref_user_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX user_pref_user_id on user_preferences ( user_id ); + +-- +-- TOC Entry ID 456 (OID 18143591) +-- +-- Name: user_ratings_rated_by Type: INDEX Owner: tperdue +-- + +CREATE INDEX user_ratings_rated_by on user_ratings ( rated_by ); + +-- +-- TOC Entry ID 457 (OID 18143591) +-- +-- Name: user_ratings_user_id Type: INDEX Owner: tperdue +-- + +CREATE INDEX user_ratings_user_id on user_ratings ( user_id ); + +-- +-- TOC Entry ID 447 (OID 18143626) +-- +-- Name: users_status Type: INDEX Owner: tperdue +-- + +CREATE INDEX users_status on users ( status ); + +-- +-- TOC Entry ID 458 (OID 18143626) +-- +-- Name: user_user Type: INDEX Owner: tperdue +-- + +--CREATE INDEX user_user on users ( status ); + +-- +-- TOC Entry ID 459 (OID 18143626) +-- +-- Name: idx_users_username Type: INDEX Owner: tperdue +-- + +CREATE INDEX idx_users_username on users ( user_name ); + +-- +-- TOC Entry ID 462 (OID 18143626) +-- +-- Name: users_user_pw Type: INDEX Owner: tperdue +-- + +CREATE INDEX users_user_pw on users ( user_pw ); + +-- +-- TOC Entry ID 460 (OID 27311451) +-- +-- Name: troveagg_trovecatid Type: INDEX Owner: tperdue +-- + +CREATE INDEX troveagg_trovecatid on trove_agg ( trove_cat_id ); + +-- +-- TOC Entry ID 536 (OID 27311269) +-- +-- Name: RI_ConstraintTrigger_27311268 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 537 (OID 27311271) +-- +-- Name: RI_ConstraintTrigger_27311270 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 538 (OID 27311273) +-- +-- Name: RI_ConstraintTrigger_27311272 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 535 (OID 27311275) +-- +-- Name: RI_ConstraintTrigger_27311274 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 506 (OID 27311277) +-- +-- Name: RI_ConstraintTrigger_27311276 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 505 (OID 27311279) +-- +-- Name: RI_ConstraintTrigger_27311278 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 487 (OID 27311281) +-- +-- Name: RI_ConstraintTrigger_27311280 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 539 (OID 27311283) +-- +-- Name: RI_ConstraintTrigger_27311282 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 540 (OID 27311285) +-- +-- Name: RI_ConstraintTrigger_27311284 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 486 (OID 27311287) +-- +-- Name: RI_ConstraintTrigger_27311286 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 492 (OID 27311289) +-- +-- Name: RI_ConstraintTrigger_27311288 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 491 (OID 27311291) +-- +-- Name: RI_ConstraintTrigger_27311290 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 490 (OID 27311293) +-- +-- Name: RI_ConstraintTrigger_27311292 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 504 (OID 27311295) +-- +-- Name: RI_ConstraintTrigger_27311294 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 503 (OID 27311297) +-- +-- Name: RI_ConstraintTrigger_27311296 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 479 (OID 27311299) +-- +-- Name: RI_ConstraintTrigger_27311298 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 502 (OID 27311301) +-- +-- Name: RI_ConstraintTrigger_27311300 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 501 (OID 27311303) +-- +-- Name: RI_ConstraintTrigger_27311302 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 476 (OID 27311305) +-- +-- Name: RI_ConstraintTrigger_27311304 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 500 (OID 27311307) +-- +-- Name: RI_ConstraintTrigger_27311306 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 499 (OID 27311309) +-- +-- Name: RI_ConstraintTrigger_27311308 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 473 (OID 27311311) +-- +-- Name: RI_ConstraintTrigger_27311310 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 541 (OID 27311313) +-- +-- Name: RI_ConstraintTrigger_27311312 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 542 (OID 27311315) +-- +-- Name: RI_ConstraintTrigger_27311314 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 472 (OID 27311317) +-- +-- Name: RI_ConstraintTrigger_27311316 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 543 (OID 27311319) +-- +-- Name: RI_ConstraintTrigger_27311318 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 544 (OID 27311321) +-- +-- Name: RI_ConstraintTrigger_27311320 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 471 (OID 27311323) +-- +-- Name: RI_ConstraintTrigger_27311322 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 483 (OID 27311325) +-- +-- Name: RI_ConstraintTrigger_27311324 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 482 (OID 27311327) +-- +-- Name: RI_ConstraintTrigger_27311326 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 470 (OID 27311329) +-- +-- Name: RI_ConstraintTrigger_27311328 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 475 (OID 27311331) +-- +-- Name: RI_ConstraintTrigger_27311330 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 474 (OID 27311333) +-- +-- Name: RI_ConstraintTrigger_27311332 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 469 (OID 27311335) +-- +-- Name: RI_ConstraintTrigger_27311334 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 481 (OID 27311337) +-- +-- Name: RI_ConstraintTrigger_27311336 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 480 (OID 27311339) +-- +-- Name: RI_ConstraintTrigger_27311338 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 468 (OID 27311341) +-- +-- Name: RI_ConstraintTrigger_27311340 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 478 (OID 27311343) +-- +-- Name: RI_ConstraintTrigger_27311342 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 477 (OID 27311345) +-- +-- Name: RI_ConstraintTrigger_27311344 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 485 (OID 27311347) +-- +-- Name: RI_ConstraintTrigger_27311346 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 545 (OID 27311349) +-- +-- Name: RI_ConstraintTrigger_27311348 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 546 (OID 27311351) +-- +-- Name: RI_ConstraintTrigger_27311350 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 484 (OID 27311353) +-- +-- Name: RI_ConstraintTrigger_27311352 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 489 (OID 27311355) +-- +-- Name: RI_ConstraintTrigger_27311354 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 488 (OID 27311357) +-- +-- Name: RI_ConstraintTrigger_27311356 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 518 (OID 27311359) +-- +-- Name: RI_ConstraintTrigger_27311358 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 498 (OID 27311361) +-- +-- Name: RI_ConstraintTrigger_27311360 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 497 (OID 27311363) +-- +-- Name: RI_ConstraintTrigger_27311362 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 523 (OID 27311365) +-- +-- Name: RI_ConstraintTrigger_27311364 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 517 (OID 27311367) +-- +-- Name: RI_ConstraintTrigger_27311366 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 516 (OID 27311369) +-- +-- Name: RI_ConstraintTrigger_27311368 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 522 (OID 27311371) +-- +-- Name: RI_ConstraintTrigger_27311370 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 547 (OID 27311373) +-- +-- Name: RI_ConstraintTrigger_27311372 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 548 (OID 27311375) +-- +-- Name: RI_ConstraintTrigger_27311374 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 521 (OID 27311377) +-- +-- Name: RI_ConstraintTrigger_27311376 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 520 (OID 27311379) +-- +-- Name: RI_ConstraintTrigger_27311378 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 519 (OID 27311381) +-- +-- Name: RI_ConstraintTrigger_27311380 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 510 (OID 27311383) +-- +-- Name: RI_ConstraintTrigger_27311382 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 515 (OID 27311385) +-- +-- Name: RI_ConstraintTrigger_27311384 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 514 (OID 27311387) +-- +-- Name: RI_ConstraintTrigger_27311386 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 509 (OID 27311389) +-- +-- Name: RI_ConstraintTrigger_27311388 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 513 (OID 27311391) +-- +-- Name: RI_ConstraintTrigger_27311390 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 512 (OID 27311393) +-- +-- Name: RI_ConstraintTrigger_27311392 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 508 (OID 27311395) +-- +-- Name: RI_ConstraintTrigger_27311394 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 549 (OID 27311397) +-- +-- Name: RI_ConstraintTrigger_27311396 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 550 (OID 27311399) +-- +-- Name: RI_ConstraintTrigger_27311398 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 507 (OID 27311401) +-- +-- Name: RI_ConstraintTrigger_27311400 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 551 (OID 27311403) +-- +-- Name: RI_ConstraintTrigger_27311402 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 552 (OID 27311405) +-- +-- Name: RI_ConstraintTrigger_27311404 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 511 (OID 27311407) +-- +-- Name: RI_ConstraintTrigger_27311406 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 496 (OID 27311409) +-- +-- Name: RI_ConstraintTrigger_27311408 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 495 (OID 27311411) +-- +-- Name: RI_ConstraintTrigger_27311410 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 527 (OID 27311413) +-- +-- Name: RI_ConstraintTrigger_27311412 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 532 (OID 27311415) +-- +-- Name: RI_ConstraintTrigger_27311414 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 531 (OID 27311417) +-- +-- Name: RI_ConstraintTrigger_27311416 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 526 (OID 27311419) +-- +-- Name: RI_ConstraintTrigger_27311418 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 530 (OID 27311421) +-- +-- Name: RI_ConstraintTrigger_27311420 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 529 (OID 27311423) +-- +-- Name: RI_ConstraintTrigger_27311422 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 525 (OID 27311425) +-- +-- Name: RI_ConstraintTrigger_27311424 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 553 (OID 27311427) +-- +-- Name: RI_ConstraintTrigger_27311426 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 554 (OID 27311429) +-- +-- Name: RI_ConstraintTrigger_27311428 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 524 (OID 27311431) +-- +-- Name: RI_ConstraintTrigger_27311430 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 555 (OID 27311433) +-- +-- Name: RI_ConstraintTrigger_27311432 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 556 (OID 27311435) +-- +-- Name: RI_ConstraintTrigger_27311434 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 528 (OID 27311437) +-- +-- Name: RI_ConstraintTrigger_27311436 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 494 (OID 27311439) +-- +-- Name: RI_ConstraintTrigger_27311438 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 493 (OID 27311441) +-- +-- Name: RI_ConstraintTrigger_27311440 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 557 (OID 27311443) +-- +-- Name: RI_ConstraintTrigger_27311442 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 534 (OID 27311445) +-- +-- Name: RI_ConstraintTrigger_27311444 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 533 (OID 27311447) +-- +-- Name: RI_ConstraintTrigger_27311446 Type: TRIGGER Owner: tperdue +-- + + +-- +-- TOC Entry ID 3 (OID 18138427) +-- +-- Name: bug_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE bug_pk_seq; +CREATE SEQUENCE bug_pk_seq START WITH 125359; + +-- +-- TOC Entry ID 5 (OID 18138495) +-- +-- Name: bug_bug_dependencies_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE bug_bug_dependencies_pk_seq; +CREATE SEQUENCE bug_bug_dependencies_pk_seq START WITH 44691; + +-- +-- TOC Entry ID 7 (OID 18138531) +-- +-- Name: bug_canned_responses_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE bug_canned_responses_pk_seq; +CREATE SEQUENCE bug_canned_responses_pk_seq START WITH 100204; + +-- +-- TOC Entry ID 9 (OID 18138582) +-- +-- Name: bug_category_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE bug_category_pk_seq; +CREATE SEQUENCE bug_category_pk_seq START WITH 5053; + +-- +-- TOC Entry ID 11 (OID 18138632) +-- +-- Name: bug_filter_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE bug_filter_pk_seq; +CREATE SEQUENCE bug_filter_pk_seq START WITH 140; + +-- +-- TOC Entry ID 13 (OID 18138687) +-- +-- Name: bug_group_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE bug_group_pk_seq; +CREATE SEQUENCE bug_group_pk_seq START WITH 2780; + +-- +-- TOC Entry ID 15 (OID 18138738) +-- +-- Name: bug_history_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE bug_history_pk_seq; +CREATE SEQUENCE bug_history_pk_seq START WITH 106196; + +-- +-- TOC Entry ID 17 (OID 18138794) +-- +-- Name: bug_resolution_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE bug_resolution_pk_seq; +CREATE SEQUENCE bug_resolution_pk_seq START WITH 101; + +-- +-- TOC Entry ID 19 (OID 18138843) +-- +-- Name: bug_status_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE bug_status_pk_seq; +CREATE SEQUENCE bug_status_pk_seq START WITH 100; + +-- +-- TOC Entry ID 21 (OID 18138891) +-- +-- Name: bug_task_dependencies_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE bug_task_dependencies_pk_seq; +CREATE SEQUENCE bug_task_dependencies_pk_seq START WITH 44583; + +-- +-- TOC Entry ID 23 (OID 18138927) +-- +-- Name: canned_responses_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE canned_responses_pk_seq; +CREATE SEQUENCE canned_responses_pk_seq START WITH 5; + +-- +-- TOC Entry ID 25 (OID 18138977) +-- +-- Name: db_images_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE db_images_pk_seq; +CREATE SEQUENCE db_images_pk_seq START WITH 1128; + +-- +-- TOC Entry ID 27 (OID 18139040) +-- +-- Name: doc_data_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE doc_data_pk_seq; +CREATE SEQUENCE doc_data_pk_seq START WITH 2124; + +-- +-- TOC Entry ID 29 (OID 18139104) +-- +-- Name: doc_groups_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE doc_groups_pk_seq; +CREATE SEQUENCE doc_groups_pk_seq START WITH 1815; + +-- +-- TOC Entry ID 31 (OID 18139140) +-- +-- Name: doc_states_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE doc_states_pk_seq; +CREATE SEQUENCE doc_states_pk_seq START WITH 5; + +-- +-- TOC Entry ID 33 (OID 18139174) +-- +-- Name: filemodule_monitor_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE filemodule_monitor_pk_seq; +CREATE SEQUENCE filemodule_monitor_pk_seq START WITH 312; + +-- +-- TOC Entry ID 35 (OID 18139210) +-- +-- Name: forum_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE forum_pk_seq; +CREATE SEQUENCE forum_pk_seq START WITH 84486; + +-- +-- TOC Entry ID 37 (OID 18139291) +-- +-- Name: forum_group_list_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE forum_group_list_pk_seq; +CREATE SEQUENCE forum_group_list_pk_seq START WITH 51981; + +-- +-- TOC Entry ID 39 (OID 18139348) +-- +-- Name: forum_monitor_forums_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE forum_monitor_forums_pk_seq; +CREATE SEQUENCE forum_monitor_forums_pk_seq START WITH 14831; + +-- +-- TOC Entry ID 41 (OID 18139384) +-- +-- Name: forum_saved_place_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE forum_saved_place_pk_seq; +CREATE SEQUENCE forum_saved_place_pk_seq START WITH 1835; + +-- +-- TOC Entry ID 43 (OID 18139492) +-- +-- Name: foundry_news_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE foundry_news_pk_seq; +CREATE SEQUENCE foundry_news_pk_seq START WITH 1973; + +-- +-- TOC Entry ID 45 (OID 18139532) +-- +-- Name: foundry_prefer_proj_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE foundry_prefer_proj_pk_seq; +CREATE SEQUENCE foundry_prefer_proj_pk_seq START WITH 165; + +-- +-- TOC Entry ID 47 (OID 18139570) +-- +-- Name: foundry_projects_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE foundry_projects_pk_seq; +CREATE SEQUENCE foundry_projects_pk_seq START WITH 320807; + +-- +-- TOC Entry ID 49 (OID 18139695) +-- +-- Name: frs_file_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE frs_file_pk_seq; +CREATE SEQUENCE frs_file_pk_seq START WITH 29214; + +-- +-- TOC Entry ID 51 (OID 18139756) +-- +-- Name: frs_filetype_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE frs_filetype_pk_seq; +CREATE SEQUENCE frs_filetype_pk_seq START WITH 9999; + +-- +-- TOC Entry ID 53 (OID 18139804) +-- +-- Name: frs_package_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE frs_package_pk_seq; +CREATE SEQUENCE frs_package_pk_seq START WITH 12688; + +-- +-- TOC Entry ID 55 (OID 18139856) +-- +-- Name: frs_processor_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE frs_processor_pk_seq; +CREATE SEQUENCE frs_processor_pk_seq START WITH 9999; + +-- +-- TOC Entry ID 57 (OID 18139904) +-- +-- Name: frs_release_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE frs_release_pk_seq; +CREATE SEQUENCE frs_release_pk_seq START WITH 17983; + +-- +-- TOC Entry ID 59 (OID 18139964) +-- +-- Name: frs_status_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE frs_status_pk_seq; +CREATE SEQUENCE frs_status_pk_seq START WITH 3; + +-- +-- TOC Entry ID 61 (OID 18140012) +-- +-- Name: group_cvs_history_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE group_cvs_history_pk_seq; +CREATE SEQUENCE group_cvs_history_pk_seq START WITH 1; + +-- +-- TOC Entry ID 63 (OID 18140056) +-- +-- Name: group_history_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE group_history_pk_seq; +CREATE SEQUENCE group_history_pk_seq START WITH 29283; + +-- +-- TOC Entry ID 65 (OID 18140112) +-- +-- Name: group_type_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE group_type_pk_seq; +CREATE SEQUENCE group_type_pk_seq START WITH 2; + +-- +-- TOC Entry ID 67 (OID 18140160) +-- +-- Name: groups_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE groups_pk_seq; +CREATE SEQUENCE groups_pk_seq START WITH 16379; + +-- +-- TOC Entry ID 69 (OID 18140301) +-- +-- Name: mail_group_list_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE mail_group_list_pk_seq; +CREATE SEQUENCE mail_group_list_pk_seq START WITH 7581; + +-- +-- TOC Entry ID 71 (OID 18140359) +-- +-- Name: news_bytes_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE news_bytes_pk_seq; +CREATE SEQUENCE news_bytes_pk_seq START WITH 10299; + +-- +-- TOC Entry ID 73 (OID 18140419) +-- +-- Name: patch_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE patch_pk_seq; +CREATE SEQUENCE patch_pk_seq START WITH 102785; + +-- +-- TOC Entry ID 75 (OID 18140483) +-- +-- Name: patch_category_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE patch_category_pk_seq; +CREATE SEQUENCE patch_category_pk_seq START WITH 10607; + +-- +-- TOC Entry ID 77 (OID 18140534) +-- +-- Name: patch_history_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE patch_history_pk_seq; +CREATE SEQUENCE patch_history_pk_seq START WITH 9813; + +-- +-- TOC Entry ID 79 (OID 18140590) +-- +-- Name: patch_status_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE patch_status_pk_seq; +CREATE SEQUENCE patch_status_pk_seq START WITH 103; + +-- +-- TOC Entry ID 81 (OID 18140638) +-- +-- Name: people_job_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE people_job_pk_seq; +CREATE SEQUENCE people_job_pk_seq START WITH 1641; + +-- +-- TOC Entry ID 83 (OID 18140697) +-- +-- Name: people_job_category_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE people_job_category_pk_seq; +CREATE SEQUENCE people_job_category_pk_seq START WITH 102; + +-- +-- TOC Entry ID 85 (OID 18140747) +-- +-- Name: people_job_inventory_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE people_job_inventory_pk_seq; +CREATE SEQUENCE people_job_inventory_pk_seq START WITH 1970; + +-- +-- TOC Entry ID 87 (OID 18140787) +-- +-- Name: people_job_status_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE people_job_status_pk_seq; +CREATE SEQUENCE people_job_status_pk_seq START WITH 3; + +-- +-- TOC Entry ID 89 (OID 18140835) +-- +-- Name: people_skill_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE people_skill_pk_seq; +CREATE SEQUENCE people_skill_pk_seq START WITH 33; + +-- +-- TOC Entry ID 91 (OID 18140884) +-- +-- Name: people_skill_inv_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE people_skill_inv_pk_seq; +CREATE SEQUENCE people_skill_inv_pk_seq START WITH 60179; + +-- +-- TOC Entry ID 93 (OID 18140924) +-- +-- Name: people_skill_level_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE people_skill_level_pk_seq; +CREATE SEQUENCE people_skill_level_pk_seq START WITH 5; + +-- +-- TOC Entry ID 95 (OID 18140972) +-- +-- Name: people_skill_year_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE people_skill_year_pk_seq; +CREATE SEQUENCE people_skill_year_pk_seq START WITH 5; + +-- +-- TOC Entry ID 97 (OID 18141020) +-- +-- Name: project_assigned_to_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE project_assigned_to_pk_seq; +CREATE SEQUENCE project_assigned_to_pk_seq START WITH 30257; + +-- +-- TOC Entry ID 99 (OID 18141110) +-- +-- Name: project_dependencies_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE project_dependencies_pk_seq; +CREATE SEQUENCE project_dependencies_pk_seq START WITH 25231; + +-- +-- TOC Entry ID 101 (OID 18141146) +-- +-- Name: project_group_list_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE project_group_list_pk_seq; +CREATE SEQUENCE project_group_list_pk_seq START WITH 6360; + +-- +-- TOC Entry ID 103 (OID 18141200) +-- +-- Name: project_history_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE project_history_pk_seq; +CREATE SEQUENCE project_history_pk_seq START WITH 27347; + +-- +-- TOC Entry ID 105 (OID 18141257) +-- +-- Name: project_metric_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE project_metric_pk_seq; +CREATE SEQUENCE project_metric_pk_seq START WITH 13274; + +-- +-- TOC Entry ID 107 (OID 18141292) +-- +-- Name: project_metric_tmp1_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE project_metric_tmp1_pk_seq; +CREATE SEQUENCE project_metric_tmp1_pk_seq START WITH 13274; + +-- +-- TOC Entry ID 109 (OID 18141327) +-- +-- Name: proj_metric_weekly_tm_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE proj_metric_weekly_tm_pk_seq; +CREATE SEQUENCE proj_metric_weekly_tm_pk_seq START WITH 2213; + +-- +-- TOC Entry ID 111 (OID 18141363) +-- +-- Name: project_status_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE project_status_pk_seq; +CREATE SEQUENCE project_status_pk_seq START WITH 100; + +-- +-- TOC Entry ID 113 (OID 18141412) +-- +-- Name: project_task_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE project_task_pk_seq; +CREATE SEQUENCE project_task_pk_seq START WITH 23295; + +-- +-- TOC Entry ID 115 (OID 18141479) +-- +-- Name: project_weekly_metric_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE project_weekly_metric_pk_seq; +CREATE SEQUENCE project_weekly_metric_pk_seq START WITH 2213; + +-- +-- TOC Entry ID 117 (OID 18141534) +-- +-- Name: snippet_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE snippet_pk_seq; +CREATE SEQUENCE snippet_pk_seq START WITH 100501; + +-- +-- TOC Entry ID 119 (OID 18141593) +-- +-- Name: snippet_package_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE snippet_package_pk_seq; +CREATE SEQUENCE snippet_package_pk_seq START WITH 100035; + +-- +-- TOC Entry ID 121 (OID 18141648) +-- +-- Name: snippet_package_item_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE snippet_package_item_pk_seq; +CREATE SEQUENCE snippet_package_item_pk_seq START WITH 100100; + +-- +-- TOC Entry ID 123 (OID 18141684) +-- +-- Name: snippet_package_ver_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE snippet_package_ver_pk_seq; +CREATE SEQUENCE snippet_package_ver_pk_seq START WITH 100035; + +-- +-- TOC Entry ID 125 (OID 18141739) +-- +-- Name: snippet_version_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE snippet_version_pk_seq; +CREATE SEQUENCE snippet_version_pk_seq START WITH 100662; + +-- +-- TOC Entry ID 127 (OID 18142132) +-- +-- Name: support_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE support_pk_seq; +CREATE SEQUENCE support_pk_seq START WITH 109672; + +-- +-- TOC Entry ID 129 (OID 18142196) +-- +-- Name: support_canned_res_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE support_canned_res_pk_seq; +CREATE SEQUENCE support_canned_res_pk_seq START WITH 100088; + +-- +-- TOC Entry ID 131 (OID 18142247) +-- +-- Name: support_category_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE support_category_pk_seq; +CREATE SEQUENCE support_category_pk_seq START WITH 10699; + +-- +-- TOC Entry ID 133 (OID 18142298) +-- +-- Name: support_history_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE support_history_pk_seq; +CREATE SEQUENCE support_history_pk_seq START WITH 24027; + +-- +-- TOC Entry ID 135 (OID 18142354) +-- +-- Name: support_messages_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE support_messages_pk_seq; +CREATE SEQUENCE support_messages_pk_seq START WITH 122077; + +-- +-- TOC Entry ID 137 (OID 18142407) +-- +-- Name: support_status_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE support_status_pk_seq; +CREATE SEQUENCE support_status_pk_seq START WITH 3; + +-- +-- TOC Entry ID 139 (OID 18142455) +-- +-- Name: supported_languages_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE supported_languages_pk_seq; +CREATE SEQUENCE supported_languages_pk_seq START WITH 21; + +-- +-- TOC Entry ID 141 (OID 18142506) +-- +-- Name: survey_question_types_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE survey_question_types_pk_seq; +CREATE SEQUENCE survey_question_types_pk_seq START WITH 100; + +-- +-- TOC Entry ID 143 (OID 18142555) +-- +-- Name: survey_questions_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE survey_questions_pk_seq; +CREATE SEQUENCE survey_questions_pk_seq START WITH 14662; + +-- +-- TOC Entry ID 145 (OID 18142680) +-- +-- Name: surveys_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE surveys_pk_seq; +CREATE SEQUENCE surveys_pk_seq START WITH 11185; + +-- +-- TOC Entry ID 147 (OID 18142735) +-- +-- Name: system_history_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE system_history_pk_seq; +CREATE SEQUENCE system_history_pk_seq START WITH 1; + +-- +-- TOC Entry ID 149 (OID 18142787) +-- +-- Name: system_machines_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE system_machines_pk_seq; +CREATE SEQUENCE system_machines_pk_seq START WITH 1; + +-- +-- TOC Entry ID 151 (OID 18142836) +-- +-- Name: system_news_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE system_news_pk_seq; +CREATE SEQUENCE system_news_pk_seq START WITH 1; + +-- +-- TOC Entry ID 153 (OID 18142895) +-- +-- Name: system_services_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE system_services_pk_seq; +CREATE SEQUENCE system_services_pk_seq START WITH 1; + +-- +-- TOC Entry ID 155 (OID 18142944) +-- +-- Name: system_status_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE system_status_pk_seq; +CREATE SEQUENCE system_status_pk_seq START WITH 1; + +-- +-- TOC Entry ID 157 (OID 18143020) +-- +-- Name: themes_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE themes_pk_seq; +CREATE SEQUENCE themes_pk_seq START WITH 2; + +-- +-- TOC Entry ID 159 (OID 18143113) +-- +-- Name: trove_cat_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE trove_cat_pk_seq; +CREATE SEQUENCE trove_cat_pk_seq START WITH 281; + +-- +-- TOC Entry ID 161 (OID 18143176) +-- +-- Name: trove_group_link_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE trove_group_link_pk_seq; +CREATE SEQUENCE trove_group_link_pk_seq START WITH 111628; + +-- +-- TOC Entry ID 163 (OID 18143216) +-- +-- Name: trove_treesums_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE trove_treesums_pk_seq; +CREATE SEQUENCE trove_treesums_pk_seq START WITH 765; + +-- +-- TOC Entry ID 165 (OID 18143286) +-- +-- Name: user_bookmarks_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE user_bookmarks_pk_seq; +CREATE SEQUENCE user_bookmarks_pk_seq START WITH 23482; + +-- +-- TOC Entry ID 167 (OID 18143337) +-- +-- Name: user_diary_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE user_diary_pk_seq; +CREATE SEQUENCE user_diary_pk_seq START WITH 892; + +-- +-- TOC Entry ID 169 (OID 18143392) +-- +-- Name: user_diary_monitor_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE user_diary_monitor_pk_seq; +CREATE SEQUENCE user_diary_monitor_pk_seq START WITH 521; + +-- +-- TOC Entry ID 171 (OID 18143428) +-- +-- Name: user_group_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE user_group_pk_seq; +CREATE SEQUENCE user_group_pk_seq START WITH 27204; + +-- +-- TOC Entry ID 173 (OID 18143484) +-- +-- Name: user_metric_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE user_metric_pk_seq; +CREATE SEQUENCE user_metric_pk_seq START WITH 115; + +-- +-- TOC Entry ID 175 (OID 18143530) +-- +-- Name: user_metric0_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE user_metric0_pk_seq; +CREATE SEQUENCE user_metric0_pk_seq START WITH 5; + +-- +-- TOC Entry ID 177 (OID 18143608) +-- +-- Name: users_pk_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE users_pk_seq; +CREATE SEQUENCE users_pk_seq START WITH 120800; + +-- +-- TOC Entry ID 179 (OID 27311232) +-- +-- Name: unix_uid_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE unix_uid_seq; +CREATE SEQUENCE unix_uid_seq START WITH 21044; + +-- +-- TOC Entry ID 181 (OID 27311250) +-- +-- Name: forum_thread_seq Type: SEQUENCE SET Owner: +-- + +DROP SEQUENCE forum_thread_seq; +CREATE SEQUENCE forum_thread_seq START WITH 59698; + diff --git a/gforge/db/oci8port/shaguo/SourceForge2.5oci8-Trigger_auto.sql b/gforge/db/oci8port/shaguo/SourceForge2.5oci8-Trigger_auto.sql new file mode 100644 index 0000000000..e50891d199 --- /dev/null +++ b/gforge/db/oci8port/shaguo/SourceForge2.5oci8-Trigger_auto.sql @@ -0,0 +1,1400 @@ + +CREATE OR REPLACE TRIGGER A_bug_pk_seq + BEFORE INSERT OR UPDATE of bug_id + ON bug FOR EACH ROW +BEGIN + IF (:new.bug_id is null) then + IF INSERTING THEN + SELECT bug_pk_seq.nextval INTO :new.bug_id FROM DUAL; + ELSIF UPDATING THEN + :new.bug_id := :old.bug_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_bug_bug_dependencies_pk_seq + BEFORE INSERT OR UPDATE of bug_depend_id + ON bug_bug_dependencies FOR EACH ROW +BEGIN + IF (:new.bug_depend_id is null) then + IF INSERTING THEN + SELECT bug_bug_dependencies_pk_seq.nextval INTO :new.bug_depend_id FROM DUAL; + ELSIF UPDATING THEN + :new.bug_depend_id := :old.bug_depend_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_bug_canned_responses_pk_seq + BEFORE INSERT OR UPDATE of bug_canned_id + ON bug_canned_responses FOR EACH ROW +BEGIN + IF (:new.bug_canned_id is null) then + IF INSERTING THEN + SELECT bug_canned_responses_pk_seq.nextval INTO :new.bug_canned_id FROM DUAL; + ELSIF UPDATING THEN + :new.bug_canned_id := :old.bug_canned_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_bug_category_pk_seq + BEFORE INSERT OR UPDATE of bug_category_id + ON bug_category FOR EACH ROW +BEGIN + IF (:new.bug_category_id is null) then + IF INSERTING THEN + SELECT bug_category_pk_seq.nextval INTO :new.bug_category_id FROM DUAL; + ELSIF UPDATING THEN + :new.bug_category_id := :old.bug_category_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_bug_filter_pk_seq + BEFORE INSERT OR UPDATE of filter_id + ON bug_filter FOR EACH ROW +BEGIN + IF (:new.filter_id is null) then + IF INSERTING THEN + SELECT bug_filter_pk_seq.nextval INTO :new.filter_id FROM DUAL; + ELSIF UPDATING THEN + :new.filter_id := :old.filter_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_bug_group_pk_seq + BEFORE INSERT OR UPDATE of bug_group_id + ON bug_group FOR EACH ROW +BEGIN + IF (:new.bug_group_id is null) then + IF INSERTING THEN + SELECT bug_group_pk_seq.nextval INTO :new.bug_group_id FROM DUAL; + ELSIF UPDATING THEN + :new.bug_group_id := :old.bug_group_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_bug_history_pk_seq + BEFORE INSERT OR UPDATE of bug_history_id + ON bug_history FOR EACH ROW +BEGIN + IF (:new.bug_history_id is null) then + IF INSERTING THEN + SELECT bug_history_pk_seq.nextval INTO :new.bug_history_id FROM DUAL; + ELSIF UPDATING THEN + :new.bug_history_id := :old.bug_history_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_bug_resolution_pk_seq + BEFORE INSERT OR UPDATE of resolution_id + ON bug_resolution FOR EACH ROW +BEGIN + IF (:new.resolution_id is null) then + IF INSERTING THEN + SELECT bug_resolution_pk_seq.nextval INTO :new.resolution_id FROM DUAL; + ELSIF UPDATING THEN + :new.resolution_id := :old.resolution_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_bug_status_pk_seq + BEFORE INSERT OR UPDATE of status_id + ON bug_status FOR EACH ROW +BEGIN + IF (:new.status_id is null) then + IF INSERTING THEN + SELECT bug_status_pk_seq.nextval INTO :new.status_id FROM DUAL; + ELSIF UPDATING THEN + :new.status_id := :old.status_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_bug_task_dependencies_pk_seq + BEFORE INSERT OR UPDATE of bug_depend_id + ON bug_task_dependencies FOR EACH ROW +BEGIN + IF (:new.bug_depend_id is null) then + IF INSERTING THEN + SELECT bug_task_dependencies_pk_seq.nextval INTO :new.bug_depend_id FROM DUAL; + ELSIF UPDATING THEN + :new.bug_depend_id := :old.bug_depend_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_canned_responses_pk_seq + BEFORE INSERT OR UPDATE of response_id + ON canned_responses FOR EACH ROW +BEGIN + IF (:new.response_id is null) then + IF INSERTING THEN + SELECT canned_responses_pk_seq.nextval INTO :new.response_id FROM DUAL; + ELSIF UPDATING THEN + :new.response_id := :old.response_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_db_images_pk_seq + BEFORE INSERT OR UPDATE of id + ON db_images FOR EACH ROW +BEGIN + IF (:new.id is null) then + IF INSERTING THEN + SELECT db_images_pk_seq.nextval INTO :new.id FROM DUAL; + ELSIF UPDATING THEN + :new.id := :old.id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_doc_data_pk_seq + BEFORE INSERT OR UPDATE of docid + ON doc_data FOR EACH ROW +BEGIN + IF (:new.docid is null) then + IF INSERTING THEN + SELECT doc_data_pk_seq.nextval INTO :new.docid FROM DUAL; + ELSIF UPDATING THEN + :new.docid := :old.docid; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_doc_groups_pk_seq + BEFORE INSERT OR UPDATE of doc_group + ON doc_groups FOR EACH ROW +BEGIN + IF (:new.doc_group is null) then + IF INSERTING THEN + SELECT doc_groups_pk_seq.nextval INTO :new.doc_group FROM DUAL; + ELSIF UPDATING THEN + :new.doc_group := :old.doc_group; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_doc_states_pk_seq + BEFORE INSERT OR UPDATE of stateid + ON doc_states FOR EACH ROW +BEGIN + IF (:new.stateid is null) then + IF INSERTING THEN + SELECT doc_states_pk_seq.nextval INTO :new.stateid FROM DUAL; + ELSIF UPDATING THEN + :new.stateid := :old.stateid; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_filemodule_monitor_pk_seq + BEFORE INSERT OR UPDATE of id + ON filemodule_monitor FOR EACH ROW +BEGIN + IF (:new.id is null) then + IF INSERTING THEN + SELECT filemodule_monitor_pk_seq.nextval INTO :new.id FROM DUAL; + ELSIF UPDATING THEN + :new.id := :old.id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_forum_pk_seq + BEFORE INSERT OR UPDATE of msg_id + ON forum FOR EACH ROW +BEGIN + IF (:new.msg_id is null) then + IF INSERTING THEN + SELECT forum_pk_seq.nextval INTO :new.msg_id FROM DUAL; + ELSIF UPDATING THEN + :new.msg_id := :old.msg_id; + END IF; + END IF; +END; + + +/ + +/ + +CREATE OR REPLACE TRIGGER A_forum_group_list_pk_seq + BEFORE INSERT OR UPDATE of group_forum_id + ON forum_group_list FOR EACH ROW +BEGIN + IF (:new.group_forum_id is null) then + IF INSERTING THEN + SELECT forum_group_list_pk_seq.nextval INTO :new.group_forum_id FROM DUAL; + ELSIF UPDATING THEN + :new.group_forum_id := :old.group_forum_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_forum_monitor_forums_pk_seq + BEFORE INSERT OR UPDATE of monitor_id + ON forum_monitored_forums FOR EACH ROW +BEGIN + IF (:new.monitor_id is null) then + IF INSERTING THEN + SELECT forum_monitor_forums_pk_seq.nextval INTO :new.monitor_id FROM DUAL; + ELSIF UPDATING THEN + :new.monitor_id := :old.monitor_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_forum_saved_place_pk_seq + BEFORE INSERT OR UPDATE of saved_place_id + ON forum_saved_place FOR EACH ROW +BEGIN + IF (:new.saved_place_id is null) then + IF INSERTING THEN + SELECT forum_saved_place_pk_seq.nextval INTO :new.saved_place_id FROM DUAL; + ELSIF UPDATING THEN + :new.saved_place_id := :old.saved_place_id; + END IF; + END IF; +END; + + +/ + +/ + +CREATE OR REPLACE TRIGGER A_foundry_news_pk_seq + BEFORE INSERT OR UPDATE of foundry_news_id + ON foundry_news FOR EACH ROW +BEGIN + IF (:new.foundry_news_id is null) then + IF INSERTING THEN + SELECT foundry_news_pk_seq.nextval INTO :new.foundry_news_id FROM DUAL; + ELSIF UPDATING THEN + :new.foundry_news_id := :old.foundry_news_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_foundry_prefer_proj_pk_seq + BEFORE INSERT OR UPDATE of foundry_project_id + ON foundry_preferred_projects FOR EACH ROW +BEGIN + IF (:new.foundry_project_id is null) then + IF INSERTING THEN + SELECT foundry_prefer_proj_pk_seq.nextval INTO :new.foundry_project_id FROM DUAL; + ELSIF UPDATING THEN + :new.foundry_project_id := :old.foundry_project_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_foundry_projects_pk_seq + BEFORE INSERT OR UPDATE of id + ON foundry_projects FOR EACH ROW +BEGIN + IF (:new.id is null) then + IF INSERTING THEN + SELECT foundry_projects_pk_seq.nextval INTO :new.id FROM DUAL; + ELSIF UPDATING THEN + :new.id := :old.id; + END IF; + END IF; +END; + + +/ + +/ + +/ + +/ + +/ + +/ + +/ + +CREATE OR REPLACE TRIGGER A_frs_file_pk_seq + BEFORE INSERT OR UPDATE of file_id + ON frs_file FOR EACH ROW +BEGIN + IF (:new.file_id is null) then + IF INSERTING THEN + SELECT frs_file_pk_seq.nextval INTO :new.file_id FROM DUAL; + ELSIF UPDATING THEN + :new.file_id := :old.file_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_frs_filetype_pk_seq + BEFORE INSERT OR UPDATE of type_id + ON frs_filetype FOR EACH ROW +BEGIN + IF (:new.type_id is null) then + IF INSERTING THEN + SELECT frs_filetype_pk_seq.nextval INTO :new.type_id FROM DUAL; + ELSIF UPDATING THEN + :new.type_id := :old.type_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_frs_package_pk_seq + BEFORE INSERT OR UPDATE of package_id + ON frs_package FOR EACH ROW +BEGIN + IF (:new.package_id is null) then + IF INSERTING THEN + SELECT frs_package_pk_seq.nextval INTO :new.package_id FROM DUAL; + ELSIF UPDATING THEN + :new.package_id := :old.package_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_frs_processor_pk_seq + BEFORE INSERT OR UPDATE of processor_id + ON frs_processor FOR EACH ROW +BEGIN + IF (:new.processor_id is null) then + IF INSERTING THEN + SELECT frs_processor_pk_seq.nextval INTO :new.processor_id FROM DUAL; + ELSIF UPDATING THEN + :new.processor_id := :old.processor_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_frs_release_pk_seq + BEFORE INSERT OR UPDATE of release_id + ON frs_release FOR EACH ROW +BEGIN + IF (:new.release_id is null) then + IF INSERTING THEN + SELECT frs_release_pk_seq.nextval INTO :new.release_id FROM DUAL; + ELSIF UPDATING THEN + :new.release_id := :old.release_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_frs_status_pk_seq + BEFORE INSERT OR UPDATE of status_id + ON frs_status FOR EACH ROW +BEGIN + IF (:new.status_id is null) then + IF INSERTING THEN + SELECT frs_status_pk_seq.nextval INTO :new.status_id FROM DUAL; + ELSIF UPDATING THEN + :new.status_id := :old.status_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_group_cvs_history_pk_seq + BEFORE INSERT OR UPDATE of id + ON group_cvs_history FOR EACH ROW +BEGIN + IF (:new.id is null) then + IF INSERTING THEN + SELECT group_cvs_history_pk_seq.nextval INTO :new.id FROM DUAL; + ELSIF UPDATING THEN + :new.id := :old.id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_group_history_pk_seq + BEFORE INSERT OR UPDATE of group_history_id + ON group_history FOR EACH ROW +BEGIN + IF (:new.group_history_id is null) then + IF INSERTING THEN + SELECT group_history_pk_seq.nextval INTO :new.group_history_id FROM DUAL; + ELSIF UPDATING THEN + :new.group_history_id := :old.group_history_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_group_type_pk_seq + BEFORE INSERT OR UPDATE of type_id + ON group_type FOR EACH ROW +BEGIN + IF (:new.type_id is null) then + IF INSERTING THEN + SELECT group_type_pk_seq.nextval INTO :new.type_id FROM DUAL; + ELSIF UPDATING THEN + :new.type_id := :old.type_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_groups_pk_seq + BEFORE INSERT OR UPDATE of group_id + ON groups FOR EACH ROW +BEGIN + IF (:new.group_id is null) then + IF INSERTING THEN + SELECT groups_pk_seq.nextval INTO :new.group_id FROM DUAL; + ELSIF UPDATING THEN + :new.group_id := :old.group_id; + END IF; + END IF; +END; + + +/ + +/ + +CREATE OR REPLACE TRIGGER A_mail_group_list_pk_seq + BEFORE INSERT OR UPDATE of group_list_id + ON mail_group_list FOR EACH ROW +BEGIN + IF (:new.group_list_id is null) then + IF INSERTING THEN + SELECT mail_group_list_pk_seq.nextval INTO :new.group_list_id FROM DUAL; + ELSIF UPDATING THEN + :new.group_list_id := :old.group_list_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_news_bytes_pk_seq + BEFORE INSERT OR UPDATE of id + ON news_bytes FOR EACH ROW +BEGIN + IF (:new.id is null) then + IF INSERTING THEN + SELECT news_bytes_pk_seq.nextval INTO :new.id FROM DUAL; + ELSIF UPDATING THEN + :new.id := :old.id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_patch_pk_seq + BEFORE INSERT OR UPDATE of patch_id + ON patch FOR EACH ROW +BEGIN + IF (:new.patch_id is null) then + IF INSERTING THEN + SELECT patch_pk_seq.nextval INTO :new.patch_id FROM DUAL; + ELSIF UPDATING THEN + :new.patch_id := :old.patch_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_patch_category_pk_seq + BEFORE INSERT OR UPDATE of patch_category_id + ON patch_category FOR EACH ROW +BEGIN + IF (:new.patch_category_id is null) then + IF INSERTING THEN + SELECT patch_category_pk_seq.nextval INTO :new.patch_category_id FROM DUAL; + ELSIF UPDATING THEN + :new.patch_category_id := :old.patch_category_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_patch_history_pk_seq + BEFORE INSERT OR UPDATE of patch_history_id + ON patch_history FOR EACH ROW +BEGIN + IF (:new.patch_history_id is null) then + IF INSERTING THEN + SELECT patch_history_pk_seq.nextval INTO :new.patch_history_id FROM DUAL; + ELSIF UPDATING THEN + :new.patch_history_id := :old.patch_history_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_patch_status_pk_seq + BEFORE INSERT OR UPDATE of patch_status_id + ON patch_status FOR EACH ROW +BEGIN + IF (:new.patch_status_id is null) then + IF INSERTING THEN + SELECT patch_status_pk_seq.nextval INTO :new.patch_status_id FROM DUAL; + ELSIF UPDATING THEN + :new.patch_status_id := :old.patch_status_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_people_job_pk_seq + BEFORE INSERT OR UPDATE of job_id + ON people_job FOR EACH ROW +BEGIN + IF (:new.job_id is null) then + IF INSERTING THEN + SELECT people_job_pk_seq.nextval INTO :new.job_id FROM DUAL; + ELSIF UPDATING THEN + :new.job_id := :old.job_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_people_job_category_pk_seq + BEFORE INSERT OR UPDATE of category_id + ON people_job_category FOR EACH ROW +BEGIN + IF (:new.category_id is null) then + IF INSERTING THEN + SELECT people_job_category_pk_seq.nextval INTO :new.category_id FROM DUAL; + ELSIF UPDATING THEN + :new.category_id := :old.category_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_people_job_inventory_pk_seq + BEFORE INSERT OR UPDATE of job_inventory_id + ON people_job_inventory FOR EACH ROW +BEGIN + IF (:new.job_inventory_id is null) then + IF INSERTING THEN + SELECT people_job_inventory_pk_seq.nextval INTO :new.job_inventory_id FROM DUAL; + ELSIF UPDATING THEN + :new.job_inventory_id := :old.job_inventory_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_people_job_status_pk_seq + BEFORE INSERT OR UPDATE of status_id + ON people_job_status FOR EACH ROW +BEGIN + IF (:new.status_id is null) then + IF INSERTING THEN + SELECT people_job_status_pk_seq.nextval INTO :new.status_id FROM DUAL; + ELSIF UPDATING THEN + :new.status_id := :old.status_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_people_skill_pk_seq + BEFORE INSERT OR UPDATE of skill_id + ON people_skill FOR EACH ROW +BEGIN + IF (:new.skill_id is null) then + IF INSERTING THEN + SELECT people_skill_pk_seq.nextval INTO :new.skill_id FROM DUAL; + ELSIF UPDATING THEN + :new.skill_id := :old.skill_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_people_skill_inv_pk_seq + BEFORE INSERT OR UPDATE of skill_inventory_id + ON people_skill_inventory FOR EACH ROW +BEGIN + IF (:new.skill_inventory_id is null) then + IF INSERTING THEN + SELECT people_skill_inv_pk_seq.nextval INTO :new.skill_inventory_id FROM DUAL; + ELSIF UPDATING THEN + :new.skill_inventory_id := :old.skill_inventory_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_people_skill_level_pk_seq + BEFORE INSERT OR UPDATE of skill_level_id + ON people_skill_level FOR EACH ROW +BEGIN + IF (:new.skill_level_id is null) then + IF INSERTING THEN + SELECT people_skill_level_pk_seq.nextval INTO :new.skill_level_id FROM DUAL; + ELSIF UPDATING THEN + :new.skill_level_id := :old.skill_level_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_people_skill_year_pk_seq + BEFORE INSERT OR UPDATE of skill_year_id + ON people_skill_year FOR EACH ROW +BEGIN + IF (:new.skill_year_id is null) then + IF INSERTING THEN + SELECT people_skill_year_pk_seq.nextval INTO :new.skill_year_id FROM DUAL; + ELSIF UPDATING THEN + :new.skill_year_id := :old.skill_year_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_project_assigned_to_pk_seq + BEFORE INSERT OR UPDATE of project_assigned_id + ON project_assigned_to FOR EACH ROW +BEGIN + IF (:new.project_assigned_id is null) then + IF INSERTING THEN + SELECT project_assigned_to_pk_seq.nextval INTO :new.project_assigned_id FROM DUAL; + ELSIF UPDATING THEN + :new.project_assigned_id := :old.project_assigned_id; + END IF; + END IF; +END; + + +/ + +/ + +/ + +CREATE OR REPLACE TRIGGER A_project_dependencies_pk_seq + BEFORE INSERT OR UPDATE of project_depend_id + ON project_dependencies FOR EACH ROW +BEGIN + IF (:new.project_depend_id is null) then + IF INSERTING THEN + SELECT project_dependencies_pk_seq.nextval INTO :new.project_depend_id FROM DUAL; + ELSIF UPDATING THEN + :new.project_depend_id := :old.project_depend_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_project_group_list_pk_seq + BEFORE INSERT OR UPDATE of group_project_id + ON project_group_list FOR EACH ROW +BEGIN + IF (:new.group_project_id is null) then + IF INSERTING THEN + SELECT project_group_list_pk_seq.nextval INTO :new.group_project_id FROM DUAL; + ELSIF UPDATING THEN + :new.group_project_id := :old.group_project_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_project_history_pk_seq + BEFORE INSERT OR UPDATE of project_history_id + ON project_history FOR EACH ROW +BEGIN + IF (:new.project_history_id is null) then + IF INSERTING THEN + SELECT project_history_pk_seq.nextval INTO :new.project_history_id FROM DUAL; + ELSIF UPDATING THEN + :new.project_history_id := :old.project_history_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_project_metric_pk_seq + BEFORE INSERT OR UPDATE of ranking + ON project_metric FOR EACH ROW +BEGIN + IF (:new.ranking is null) then + IF INSERTING THEN + SELECT project_metric_pk_seq.nextval INTO :new.ranking FROM DUAL; + ELSIF UPDATING THEN + :new.ranking := :old.ranking; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_project_metric_tmp1_pk_seq + BEFORE INSERT OR UPDATE of ranking + ON project_metric_tmp1 FOR EACH ROW +BEGIN + IF (:new.ranking is null) then + IF INSERTING THEN + SELECT project_metric_tmp1_pk_seq.nextval INTO :new.ranking FROM DUAL; + ELSIF UPDATING THEN + :new.ranking := :old.ranking; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_proj_metric_weekly_tm_pk_seq + BEFORE INSERT OR UPDATE of ranking + ON project_metric_weekly_tmp1 FOR EACH ROW +BEGIN + IF (:new.ranking is null) then + IF INSERTING THEN + SELECT proj_metric_weekly_tm_pk_seq.nextval INTO :new.ranking FROM DUAL; + ELSIF UPDATING THEN + :new.ranking := :old.ranking; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_project_status_pk_seq + BEFORE INSERT OR UPDATE of status_id + ON project_status FOR EACH ROW +BEGIN + IF (:new.status_id is null) then + IF INSERTING THEN + SELECT project_status_pk_seq.nextval INTO :new.status_id FROM DUAL; + ELSIF UPDATING THEN + :new.status_id := :old.status_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_project_task_pk_seq + BEFORE INSERT OR UPDATE of project_task_id + ON project_task FOR EACH ROW +BEGIN + IF (:new.project_task_id is null) then + IF INSERTING THEN + SELECT project_task_pk_seq.nextval INTO :new.project_task_id FROM DUAL; + ELSIF UPDATING THEN + :new.project_task_id := :old.project_task_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_project_weekly_metric_pk_seq + BEFORE INSERT OR UPDATE of ranking + ON project_weekly_metric FOR EACH ROW +BEGIN + IF (:new.ranking is null) then + IF INSERTING THEN + SELECT project_weekly_metric_pk_seq.nextval INTO :new.ranking FROM DUAL; + ELSIF UPDATING THEN + :new.ranking := :old.ranking; + END IF; + END IF; +END; + + +/ + +/ + +CREATE OR REPLACE TRIGGER A_snippet_pk_seq + BEFORE INSERT OR UPDATE of snippet_id + ON snippet FOR EACH ROW +BEGIN + IF (:new.snippet_id is null) then + IF INSERTING THEN + SELECT snippet_pk_seq.nextval INTO :new.snippet_id FROM DUAL; + ELSIF UPDATING THEN + :new.snippet_id := :old.snippet_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_snippet_package_pk_seq + BEFORE INSERT OR UPDATE of snippet_package_id + ON snippet_package FOR EACH ROW +BEGIN + IF (:new.snippet_package_id is null) then + IF INSERTING THEN + SELECT snippet_package_pk_seq.nextval INTO :new.snippet_package_id FROM DUAL; + ELSIF UPDATING THEN + :new.snippet_package_id := :old.snippet_package_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_snippet_package_item_pk_seq + BEFORE INSERT OR UPDATE of snippet_package_item_id + ON snippet_package_item FOR EACH ROW +BEGIN + IF (:new.snippet_package_item_id is null) then + IF INSERTING THEN + SELECT snippet_package_item_pk_seq.nextval INTO :new.snippet_package_item_id FROM DUAL; + ELSIF UPDATING THEN + :new.snippet_package_item_id := :old.snippet_package_item_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_snippet_package_ver_pk_seq + BEFORE INSERT OR UPDATE of snippet_package_version_id + ON snippet_package_version FOR EACH ROW +BEGIN + IF (:new.snippet_package_version_id is null) then + IF INSERTING THEN + SELECT snippet_package_ver_pk_seq.nextval INTO :new.snippet_package_version_id FROM DUAL; + ELSIF UPDATING THEN + :new.snippet_package_version_id := :old.snippet_package_version_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_snippet_version_pk_seq + BEFORE INSERT OR UPDATE of snippet_version_id + ON snippet_version FOR EACH ROW +BEGIN + IF (:new.snippet_version_id is null) then + IF INSERTING THEN + SELECT snippet_version_pk_seq.nextval INTO :new.snippet_version_id FROM DUAL; + ELSIF UPDATING THEN + :new.snippet_version_id := :old.snippet_version_id; + END IF; + END IF; +END; + + +/ + +/ + +/ + +/ + +/ + +/ + +/ + +/ + +/ + +/ + +/ + +/ + +/ + +/ + +/ + +CREATE OR REPLACE TRIGGER A_support_pk_seq + BEFORE INSERT OR UPDATE of support_id + ON support FOR EACH ROW +BEGIN + IF (:new.support_id is null) then + IF INSERTING THEN + SELECT support_pk_seq.nextval INTO :new.support_id FROM DUAL; + ELSIF UPDATING THEN + :new.support_id := :old.support_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_support_canned_res_pk_seq + BEFORE INSERT OR UPDATE of support_canned_id + ON support_canned_responses FOR EACH ROW +BEGIN + IF (:new.support_canned_id is null) then + IF INSERTING THEN + SELECT support_canned_res_pk_seq.nextval INTO :new.support_canned_id FROM DUAL; + ELSIF UPDATING THEN + :new.support_canned_id := :old.support_canned_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_support_category_pk_seq + BEFORE INSERT OR UPDATE of support_category_id + ON support_category FOR EACH ROW +BEGIN + IF (:new.support_category_id is null) then + IF INSERTING THEN + SELECT support_category_pk_seq.nextval INTO :new.support_category_id FROM DUAL; + ELSIF UPDATING THEN + :new.support_category_id := :old.support_category_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_support_history_pk_seq + BEFORE INSERT OR UPDATE of support_history_id + ON support_history FOR EACH ROW +BEGIN + IF (:new.support_history_id is null) then + IF INSERTING THEN + SELECT support_history_pk_seq.nextval INTO :new.support_history_id FROM DUAL; + ELSIF UPDATING THEN + :new.support_history_id := :old.support_history_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_support_messages_pk_seq + BEFORE INSERT OR UPDATE of support_message_id + ON support_messages FOR EACH ROW +BEGIN + IF (:new.support_message_id is null) then + IF INSERTING THEN + SELECT support_messages_pk_seq.nextval INTO :new.support_message_id FROM DUAL; + ELSIF UPDATING THEN + :new.support_message_id := :old.support_message_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_support_status_pk_seq + BEFORE INSERT OR UPDATE of support_status_id + ON support_status FOR EACH ROW +BEGIN + IF (:new.support_status_id is null) then + IF INSERTING THEN + SELECT support_status_pk_seq.nextval INTO :new.support_status_id FROM DUAL; + ELSIF UPDATING THEN + :new.support_status_id := :old.support_status_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_supported_languages_pk_seq + BEFORE INSERT OR UPDATE of language_id + ON supported_languages FOR EACH ROW +BEGIN + IF (:new.language_id is null) then + IF INSERTING THEN + SELECT supported_languages_pk_seq.nextval INTO :new.language_id FROM DUAL; + ELSIF UPDATING THEN + :new.language_id := :old.language_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_survey_question_types_pk_seq + BEFORE INSERT OR UPDATE of id + ON survey_question_types FOR EACH ROW +BEGIN + IF (:new.id is null) then + IF INSERTING THEN + SELECT survey_question_types_pk_seq.nextval INTO :new.id FROM DUAL; + ELSIF UPDATING THEN + :new.id := :old.id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_survey_questions_pk_seq + BEFORE INSERT OR UPDATE of question_id + ON survey_questions FOR EACH ROW +BEGIN + IF (:new.question_id is null) then + IF INSERTING THEN + SELECT survey_questions_pk_seq.nextval INTO :new.question_id FROM DUAL; + ELSIF UPDATING THEN + :new.question_id := :old.question_id; + END IF; + END IF; +END; + + +/ + +/ + +/ + +/ + +CREATE OR REPLACE TRIGGER A_surveys_pk_seq + BEFORE INSERT OR UPDATE of survey_id + ON surveys FOR EACH ROW +BEGIN + IF (:new.survey_id is null) then + IF INSERTING THEN + SELECT surveys_pk_seq.nextval INTO :new.survey_id FROM DUAL; + ELSIF UPDATING THEN + :new.survey_id := :old.survey_id; + END IF; + END IF; +END; + + +/ + +/ + +CREATE OR REPLACE TRIGGER A_themes_pk_seq + BEFORE INSERT OR UPDATE of theme_id + ON themes FOR EACH ROW +BEGIN + IF (:new.theme_id is null) then + IF INSERTING THEN + SELECT themes_pk_seq.nextval INTO :new.theme_id FROM DUAL; + ELSIF UPDATING THEN + :new.theme_id := :old.theme_id; + END IF; + END IF; +END; + + +/ + +/ + +/ + +CREATE OR REPLACE TRIGGER A_trove_cat_pk_seq + BEFORE INSERT OR UPDATE of trove_cat_id + ON trove_cat FOR EACH ROW +BEGIN + IF (:new.trove_cat_id is null) then + IF INSERTING THEN + SELECT trove_cat_pk_seq.nextval INTO :new.trove_cat_id FROM DUAL; + ELSIF UPDATING THEN + :new.trove_cat_id := :old.trove_cat_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_trove_group_link_pk_seq + BEFORE INSERT OR UPDATE of trove_group_id + ON trove_group_link FOR EACH ROW +BEGIN + IF (:new.trove_group_id is null) then + IF INSERTING THEN + SELECT trove_group_link_pk_seq.nextval INTO :new.trove_group_id FROM DUAL; + ELSIF UPDATING THEN + :new.trove_group_id := :old.trove_group_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_trove_treesums_pk_seq + BEFORE INSERT OR UPDATE of trove_treesums_id + ON trove_treesums FOR EACH ROW +BEGIN + IF (:new.trove_treesums_id is null) then + IF INSERTING THEN + SELECT trove_treesums_pk_seq.nextval INTO :new.trove_treesums_id FROM DUAL; + ELSIF UPDATING THEN + :new.trove_treesums_id := :old.trove_treesums_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_user_bookmarks_pk_seq + BEFORE INSERT OR UPDATE of bookmark_id + ON user_bookmarks FOR EACH ROW +BEGIN + IF (:new.bookmark_id is null) then + IF INSERTING THEN + SELECT user_bookmarks_pk_seq.nextval INTO :new.bookmark_id FROM DUAL; + ELSIF UPDATING THEN + :new.bookmark_id := :old.bookmark_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_user_diary_pk_seq + BEFORE INSERT OR UPDATE of id + ON user_diary FOR EACH ROW +BEGIN + IF (:new.id is null) then + IF INSERTING THEN + SELECT user_diary_pk_seq.nextval INTO :new.id FROM DUAL; + ELSIF UPDATING THEN + :new.id := :old.id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_user_diary_monitor_pk_seq + BEFORE INSERT OR UPDATE of monitor_id + ON user_diary_monitor FOR EACH ROW +BEGIN + IF (:new.monitor_id is null) then + IF INSERTING THEN + SELECT user_diary_monitor_pk_seq.nextval INTO :new.monitor_id FROM DUAL; + ELSIF UPDATING THEN + :new.monitor_id := :old.monitor_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_user_group_pk_seq + BEFORE INSERT OR UPDATE of user_group_id + ON user_group FOR EACH ROW +BEGIN + IF (:new.user_group_id is null) then + IF INSERTING THEN + SELECT user_group_pk_seq.nextval INTO :new.user_group_id FROM DUAL; + ELSIF UPDATING THEN + :new.user_group_id := :old.user_group_id; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_user_metric_pk_seq + BEFORE INSERT OR UPDATE of ranking + ON user_metric FOR EACH ROW +BEGIN + IF (:new.ranking is null) then + IF INSERTING THEN + SELECT user_metric_pk_seq.nextval INTO :new.ranking FROM DUAL; + ELSIF UPDATING THEN + :new.ranking := :old.ranking; + END IF; + END IF; +END; + + +/ + +CREATE OR REPLACE TRIGGER A_user_metric0_pk_seq + BEFORE INSERT OR UPDATE of ranking + ON user_metric0 FOR EACH ROW +BEGIN + IF (:new.ranking is null) then + IF INSERTING THEN + SELECT user_metric0_pk_seq.nextval INTO :new.ranking FROM DUAL; + ELSIF UPDATING THEN + :new.ranking := :old.ranking; + END IF; + END IF; +END; + + +/ + +/ + +/ + +CREATE OR REPLACE TRIGGER A_users_pk_seq + BEFORE INSERT OR UPDATE of user_id + ON users FOR EACH ROW +BEGIN + IF (:new.user_id is null) then + IF INSERTING THEN + SELECT users_pk_seq.nextval INTO :new.user_id FROM DUAL; + ELSIF UPDATING THEN + :new.user_id := :old.user_id; + END IF; + END IF; +END; + + +/ + +/ + +/ diff --git a/gforge/db/oci8port/shaguo/SourceForge2.5oci8-Trigger_er.sql b/gforge/db/oci8port/shaguo/SourceForge2.5oci8-Trigger_er.sql new file mode 100644 index 0000000000..0e75b59810 --- /dev/null +++ b/gforge/db/oci8port/shaguo/SourceForge2.5oci8-Trigger_er.sql @@ -0,0 +1,420 @@ +CREATE OR REPLACE TRIGGER user_group_user_id_fk + AFTER INSERT OR UPDATE + ON user_group FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from users + where :new.user_id = users.user_id; + if (:new.user_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE user_group using non-existing user_id (user_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER user_group_group_id_fk + AFTER INSERT OR UPDATE + ON user_group FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from groups + where :new.group_id = groups.group_id; + if (:new.group_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE user_group using non-existing group_id (group_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER forum_posted_by_fk + AFTER INSERT OR UPDATE + ON forum FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from users + where :new.posted_by = users.user_id; + if (:new.posted_by is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE forum using non-existing user_id (posted_by).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER forum_group_forum_id_fk + AFTER INSERT OR UPDATE + ON forum FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from forum_group_list + where :new.group_forum_id = forum_group_list.group_forum_id; + if (:new.group_forum_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE forum using non-existing group_forum_id (group_forum_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER forum_group_list_group_id_fk + AFTER INSERT OR UPDATE + ON forum_group_list FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from groups + where :new.group_id = groups.group_id; + if (:new.group_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE forum_group_list using non-existing group_id (group_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER bug_group_group_fk + AFTER INSERT OR UPDATE + ON bug_group FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from groups + where :new.group_id = groups.group_id; + if (:new.group_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE bug_group using non-existing group_id (group_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER bug_category_group_fk + AFTER INSERT OR UPDATE + ON bug_category FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from groups + where :new.group_id = groups.group_id; + if (:new.group_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE bug_category using non-existing group_id (group_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER bug_submitted_by_fk + AFTER INSERT OR UPDATE + ON bug FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from users + where :new.submitted_by = users.user_id; + if (:new.submitted_by is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE bug using non-existing user_id (submitted_by).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER bug_assigned_to_fk + AFTER INSERT OR UPDATE + ON bug FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from users + where :new.assigned_to = users.user_id; + if (:new.assigned_to is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE bug using non-existing user_id (assigned_to).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER bug_status_fk + AFTER INSERT OR UPDATE + ON bug FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from bug_status + where :new.status_id = bug_status.status_id; + if (:new.status_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE bug using non-existing status_id (status_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER bug_category_fk + AFTER INSERT OR UPDATE + ON bug FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from bug_category + where :new.category_id = bug_category.bug_category_id; + if (:new.category_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE bug using non-existing bug_category_id (category_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER bug_resolution_fk + AFTER INSERT OR UPDATE + ON bug FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from bug_resolution + where :new.resolution_id = bug_resolution.resolution_id; + if (:new.resolution_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE bug using non-existing resolution_id (resolution_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER bug_group_fk + AFTER INSERT OR UPDATE + ON bug FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from bug_group + where :new.bug_group_id = bug_group.bug_group_id; + if (:new.bug_group_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE bug using non-existing bug_group_id (bug_group_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER forum_posted_by_fk + AFTER INSERT OR UPDATE + ON forum FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from users + where :new.posted_by = users.user_id; + if (:new.posted_by is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE forum using non-existing user_id (posted_by).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER forum_group_forum_id_fk + AFTER INSERT OR UPDATE + ON forum FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from forum_group_list + where :new.group_forum_id = forum_group_list.group_forum_id; + if (:new.group_forum_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE forum using non-existing group_forum_id (group_forum_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER project_group_list_group_id_fk + AFTER INSERT OR UPDATE + ON project_group_list FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from groups + where :new.group_id = groups.group_id; + if (:new.group_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE project_group_list using non-existing group_id (group_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER project_task_group_proj_id_f + AFTER INSERT OR UPDATE + ON project_task FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from project_group_list + where :new.group_project_id = project_group_list.group_project_id; + if (:new.group_project_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE project_task using non-existing group_project_id (group_project_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER project_task_created_by_fk + AFTER INSERT OR UPDATE + ON project_task FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from users + where :new.created_by = users.user_id; + if (:new.created_by is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE project_task using non-existing user_id (created_by).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER project_task_status_id_fk + AFTER INSERT OR UPDATE + ON project_task FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from project_status + where :new.status_id = project_status.status_id; + if (:new.status_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE project_task using non-existing status_id (status_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER patch_status_id_fk + AFTER INSERT OR UPDATE + ON patch FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from patch_status + where :new.patch_status_id = patch_status.patch_status_id; + if (:new.patch_status_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE patch using non-existing patch_status_id (patch_status_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER patch_category_id_fk + AFTER INSERT OR UPDATE + ON patch FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from patch_category + where :new.patch_category_id = patch_category.patch_category_id; + if (:new.patch_category_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE patch using non-existing patch_category_id (patch_category_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER patch_submitted_by_fk + AFTER INSERT OR UPDATE + ON patch FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from users + where :new.submitted_by = users.user_id; + if (:new.submitted_by is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE patch using non-existing user_id (submitted_by).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER patch_assigned_to_fk + AFTER INSERT OR UPDATE + ON patch FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from users + where :new.assigned_to = users.user_id; + if (:new.assigned_to is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE patch using non-existing user_id (assigned_to).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER patch_category_group_id_fk + AFTER INSERT OR UPDATE + ON patch_category FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from groups + where :new.group_id = groups.group_id; + if (:new.group_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE patch_category using non-existing group_id (group_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER support_status_id_fk + AFTER INSERT OR UPDATE + ON support FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from support_status + where :new.support_status_id = support_status.support_status_id; + if (:new.support_status_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE support using non-existing support_status_id (support_status_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER support_category_id_fk + AFTER INSERT OR UPDATE + ON support FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from support_category + where :new.support_category_id = support_category.support_category_id; + if (:new.support_category_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE support using non-existing support_category_id (support_category_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER support_submitted_by_fk + AFTER INSERT OR UPDATE + ON support FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from users + where :new.submitted_by = users.user_id; + if (:new.submitted_by is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE support using non-existing user_id (submitted_by).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER support_assigned_to_fk + AFTER INSERT OR UPDATE + ON support FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from users + where :new.assigned_to = users.user_id; + if (:new.assigned_to is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE support using non-existing user_id (assigned_to).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER support_category_group_id_fk + AFTER INSERT OR UPDATE + ON support_category FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from groups + where :new.group_id = groups.group_id; + if (:new.group_id is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE support_category using non-existing group_id (group_id).'); + end if; +end; + +/ +CREATE OR REPLACE TRIGGER users_languageid_fk + AFTER INSERT OR UPDATE + ON users FOR EACH ROW +declare numrows INTEGER; +begin + select count(*) into numrows from supported_languages + where :new.language = supported_languages.language_id; + if (:new.language is not null and numrows = 0) then + raise_application_error(-20001, + 'Cannot INSERT/UPDATE users using non-existing language_id (language).'); + end if; +end; + +/ diff --git a/gforge/db/oci8port/shaguo/database.php b/gforge/db/oci8port/shaguo/database.php new file mode 100644 index 0000000000..5d29714819 --- /dev/null +++ b/gforge/db/oci8port/shaguo/database.php @@ -0,0 +1,506 @@ + 0) { + if (!$offset || $offset < 0) { + $offset=0; + } + } + + $res=ociexecute($stmt,$sys_db_oci_commit_mode); + ocicommit($conn); + + if (!$res) { + return 0; + } else { + //if offset, seek to starting point + //potentially expensive if large offset + //however there is no data_seek feature AFAICT + $col_name = OCIColumnName($stmt,1); + + $more_data=true; + if ($offset > 0) { + for ($i=0; $i<$offset; $i++) { + //burn them off + ocifetchinto($stmt,&$x,OCI_ASSOC+OCI_NUM); + if (!$x[$col_name]) { + //if no data be returned + //get out of loop + $more_data=false; + break; + } + } + } + + $i=0; + while ($more_data) { + + unset($x); + $ret = ocifetchinto($stmt,&$x,OCI_ASSOC+OCI_NUM); + if (!$ret) { + //if no data be returned + //get out of loop + $more_data=false; + break; + } + + $i++; + + $sys_db_results[$stmt][$i-1]=$x; + + //see if data is being returned && we are + //still within the requested $limit + if (count($x) < 1 || (($limit > 0) && + ($i >= $limit))) + { + $more_data=false; + } + } + $sys_db_row_pointer[$stmt]=0; + + return $stmt; + } + } +} + +/** + * db_begin() + * + * begin a transaction + */ +function db_begin() { + global $sys_db_oci_commit_mode; + $sys_db_oci_commit_mode='OCI_DEFAULT'; +} + +/** + * db_commit() + * + * commit a transaction + */ +function db_commit() { + global $sys_db_oci_commit_mode,$conn; + $sys_db_oci_commit_mode='OCI_COMMIT_ON_SUCCESS'; + return ocicommit($conn); +} + +/** + * db_rollback() + * + * rollback a transaction + */ +function db_rollback() { + global $sys_db_oci_commit_mode,$conn; + $sys_db_oci_commit_mode='OCI_COMMIT_ON_SUCCESS'; + return ocirollback($conn); +} + +/** + * + * Returns the number of rows in this result set + * + * @param qhandle query result set handle + * + */ +function db_numrows($qhandle) { + global $sys_db_results; + // return only if qhandle exists, otherwise 0 + + if ($qhandle) { + + return count($sys_db_results[$qhandle]); + } else { + return 0; + } +} + +/** + * + * Frees a database result properly + * + * @param qhandle query result set handle + * + */ + +function db_free_result($qhandle) { + global $sys_db_results; + unset($sys_db_results[$qhandle]); + return ocifreestatement($qhandle); +} + +/** + * + * Reset is useful for db_fetch_array + * sometimes you need to start over + * + * @param qhandle query result set handle + * @param row - integer row number + * + */ + +function db_reset_result($qhandle,$row=0) { + global $sys_db_row_pointer; + return $sys_db_row_pointer[$qhandle]=$row; +} + +/** + * + * Returns a field from a result set + * + * @param qhandle query result set handle + * @param row - integer row number + * @param field - text field name + * + */ + +function db_result($qhandle,$row,$field) { + global $sys_db_results; + $fieldu = strtoupper($field); + + return $sys_db_results[$qhandle][$row][$fieldu]; +} + +/** + * + * Returns the number of fields in this result set + * + * @param qhandle query result set handle + * + */ + +function db_numfields($lhandle) { + return ocinumcols($lhandle); +} + +/** + * + * Returns the number of rows changed in the last query + * + * @param qhandle - query result set handle + * @param fnumber - column number + * + */ + +function db_fieldname($lhandle,$fnumber) { + return ocicolumnname($lhandle,$fnumber); +} + +/** + * + * Returns the number of rows changed in the last query + * + * @param qhandle query result set handle + * + */ + +function db_affected_rows($qhandle) { + return ocirowcount($qhandle); +} + +/** + * + * Returns an associative array from + * the current row of this database result + * Use db_reset_result to seek a particular row + * + * @param qhandle query result set handle + * + */ + +function db_fetch_array($qhandle) { + global $sys_db_results,$sys_db_row_pointer; + $row = $sys_db_row_pointer[$qhandle]; + $sys_db_row_pointer[$qhandle] = $sys_db_row_pointer[$qhandle] + 1; + //$sys_db_row_pointer = $sys_db_row_pointer + 1; + return $sys_db_results[$qhandle][$row]; +} + +/** + * + * Returns the last primary key from an insert + * + * @param qhandle query result set handle + * @param table_name is the name of the table you inserted into + * @param pkey_field_name is the field name of the primary key + * + */ + +function db_insertid($qhandle,$table_name,$pkey_field_name) { + $res=db_query("SELECT max($pkey_field_name) AS id FROM $table_name"); + if ($res && db_numrows($res) > 0) { + return db_result($res,0,'id'); + } else { + return 0; + } +} + +/** + * + * Returns the last error from the database + * + */ + +function db_error() { + global $conn; + $err= ocierror($conn); + if ($err) { + return $err['message']; + } else { + return false; + } +} + +?> diff --git a/gforge/db/oci8port/shaguo/pgdb-convert.pl b/gforge/db/oci8port/shaguo/pgdb-convert.pl new file mode 100644 index 0000000000..d256ca5200 --- /dev/null +++ b/gforge/db/oci8port/shaguo/pgdb-convert.pl @@ -0,0 +1,223 @@ +#!/usr/local/bin/perl + +#conver the postgres schema to oracle 8 + +$postgres_file = "SourceForge.sql"; +$oracle_file = "SourceForge_oci8.sql"; +$trigger_auto = "Trigger_auto.sql"; +$trigger_er = "Trigger_er.sql"; +$drop_file = "Drop.sql"; + +if (!(open (POSTGRES, "<$postgres_file"))) +{ + die "Can not open $postgres_file\n"; +} +if (!(open (ORACLE, ">$oracle_file"))) +{ + die "Can not open $oracle_file\n"; +} +if (!(open (TRIGGER_AUTO, ">$trigger_auto"))) +{ + die "Can not open $trigger_auto\n"; +} +if (!(open (TRIGGER_ER, ">$trigger_er"))) +{ + die "Can not open $trigger_er\n"; +} +if (!(open (DROP , ">$drop_file"))) +{ + die "Can not open $drop_file\n"; +} + +$table = ''; + +while () +{ + # filter " + $_ =~ s/\"//g; + + if ($_ =~ /CREATE\s+TABLE\s+(\w+)/i) + { + $table = $1; + if ($table =~ /session/i) + { + $table = 'session1'; + } + $_ =~ s/session/session1/g; + + print DROP "drop table $table;\n"; + + if (length($table) > 30) + { + print STDOUT "TAB NAME: $table\n"; + } + } + + # change the sequence creation statement + if ($_ =~ /CREATE\s+SEQUENCE (\w+)/i) + { + $_ = "CREATE SEQUENCE $1 START WITH 1;\n"; + print DROP "drop sequence $1;\n"; + } + + # change the index creation statement + $_ =~ s/ using btree//g; + $_ =~ s/ int4_ops//g; + $_ =~ s/ text_ops//g; + $_ =~ s/ varchar_ops//g; + $_ =~ s/ bpchar_ops//g; + + if ($_ =~ /CREATE\s+INDEX\s+(\w+)/i) + { + if (length($1) > 30) + { + print STDOUT "IND NAME: $1\n"; + } + if ($1 =~ /session/i) + { + $_ =~ s/session/session1/g; + } + } + + # replace the nextval with a trigger + if ($_ =~ /\s+(\w+)\s+\w+\s+DEFAULT\s+nextval\(\'(\w+)\'/i) + { + + if (length($2) > 30) + { + print STDOUT "SEQ NAME: $2\n"; + } + + if (length($2) > 28) + { + print STDOUT "N_T NAME: A_$2\n"; + } + + $trigger = < 30) + { + print STDOUT "R_T NAME: $t_name\n"; + } + + if ($_ =~ /\('(\w+)',\s+'(\w+)',\s+'(\w+)',\s+'(\w+)',\s+'(\w+)',\s+'(\w+)'\)/i) + { + $trigger_new = < + + + SourceForge: PHP Coding Standards + + + + + + + + +
    + SourceForge: PHP Coding Standards
    + $Id: coding_standards.html,v 1.3 2001/05/17 17:19:37 dbrogdon Exp $
    + SourceForge Engine Team [email]
    +
    + +
    + + +


    + +

    + 0. Introduction +
    + +
    + 1. Comments +
    + +
    + 2. Formatting +
    + +
    + 3. Templating +
    + +
    + 4. Expressions +
    + +
    + 5. Functions +
    + +
    + 6. Objects +
    + +
    + 7. Naming +
    + +
    + 8. Control Statements +
    + +
    + 9. Including PHP Files +
    + + +


    + +0. Introduction + +

    +Coding Standards. Live them, love them. + +

    +Then come up with a new introduction... + + +


    + +1. Comments + +

    +Guidelines + +

    +Non-documentation comments are strongly encouraged. A general rule of +thumb is that if you look at a section of code and think "Wow, I don't +want to try and describe that", you need to comment it before you +forget how it works. + +

      +
    • C++ style comments (/* */) and standard C comments (//) are both acceptable. +
    • Use of perl/shell style comments (#) is prohibited. +
    + +

    +PHPdoc Tags + +

    +Inline documentation for classes should follow the PHPDoc convention, +similar to Javadoc. More information about PHPDoc can be found here: + +

    +http://www.phpdoc.de/ + +

    +File Comments: + +

    +Every file should start with a comment block describing its purpose, +version, author and a copyright message. The comment block should be a +block comment in standard JavaDoc format along with a CVS Id tag. +While all JavaDoc tags are allowed, only the tags in the examples +below will be parsed by PHPdoc. The following header should be used in +all PHP files: + +

    + + +
    +
    +/**
    + *
    + * brief description.
    + * long description.  more long description.
    + *
    + * SourceForge: Breaking Down the Barriers to Open Source Development
    + * Copyright 1999-2001 (c) VA Linux Systems
    + * http://sourceforge.net
    + *
    + * @version   $Id: coding_standards.html,v 1.3 2001/05/17 17:19:37 dbrogdon Exp $
    + *
    + */
    +
    +
    + +

    +Function and Class Comments: + +

    +Similarly, every function should have a block comment specifying name, +parameters, return values, and last change date. + +

    + + +
    +
    +/**
    + * brief description.
    + * long description.  more long description.
    + *
    + * @author    firstname lastname email
    + * @param     variable  description
    + * @return    value     description
    + * @date      YYYY-MM-DD
    + * @deprecated
    + * @see
    + *
    + */
    +
    +
    + +

    +Note + +

    +The placement of periods in the short and long descriptions is +important to the PHPdoc parser. The first period always ends the +short description. All future periods are part of the long +description, ending with a blank comment line. The long comment is +optional. + + +


    + +2. Formatting + +

    +Indenting + +

    +All indenting is done with TABS. Before committing any file to CVS, make sure +you first replace spaces with tabs and verify the formatting. + +

    +PHP Tags + +

    +The use of <?php ?> to delimit PHP code is +required. Using <? ?> is not valid. This is the +most portable way to include PHP code on differing operating systems +and webserver setups. Also, XML parsers are confused by the +shorthand syntax. + + +


    + +3. Templating + +

    +In the SourceForge system, PHP itself is used as the template +language. To make the templating clearer, template files should be +separated out and included once objects and database results are +established. Detailed examples are in the docs repository and online +at: + +

    +http://webdev.docs.sourceforge.net/architecture/templating.php + +

    +Variables in the templates are presented surrounded by <?php ?> +tags instead of the {} tags that some other template libraries would +use. The end result is the same, with less bloat and more efficient code. + + +


    + +4. Expressions + +

      +
    • Use parentheses liberally to resolve ambiguity. +
    • Using parentheses can force an order of evaluation. This saves the time a reader may spend remembering precedence of operators. +
    • Don't sacrifice clarity for cleverness. +
    • Write conditional expressions so that they read naturally aloud. +
    • Sometimes eliminating a not operator (!) will make an expression more understandable. +
    • Keep each line simple. +
    • The ternary operator (x ? 1 : 2) usually indicates too much code on one line. if... else if... else is usually more readable. +
    + + +


    + +5. Functions + +

    +Function Calls + +

    +Functions shall be called with no spaces between the function name, +the opening parenthesis, and the first parameter; spaces between +commas and each parameter, and no space between the last parameter, +the closing parenthesis, and the semicolon. Here's an example: + +

    + + +
    +
    +$var = foo($bar, $baz, $quux);
    +
    +
    + +

    +As displayed above, there should be one space on either side of an +equals sign used to assign the return value of a function to a +variable. In the case of a block of related assignments, more space +may be inserted to promote readability: + +

    + + +
    +
    +$short		= foo($bar);
    +$long_variable	= foo($baz);
    +
    +
    + +

    +Function Definitions + +

    +Function declarations follow the unix convention: + +

    + + +
    +
    +function fooFunction($arg1, $arg2 = '') {
    +    if (condition) {
    +        statement;
    +    }
    +    return $val;
    +}
    +
    +
    + +

    +Arguments with default values go at the end of the argument list. +Always attempt to return a meaningful value from a function if one is +appropriate. Here is a slightly longer example: + +

    + + +
    +
    +function connect(&$dsn, $persistent = false) {
    +    if (is_array($dsn)) {
    +        $dsninfo = &$dsn;
    +    } else {
    +        $dsninfo = DB::parseDSN($dsn);
    +    }
    +
    +    if (!$dsninfo || !$dsninfo['phptype']) {
    +        return $this->raiseError();
    +    }
    +
    +    return true;
    +}
    +
    +
    + + +


    + +6. Objects + +

    +Objects should generally be "normalized" similar to a +database so they contain only the attributes that make sense. + +

    +Each object should have Error.class as the abstract parent object +unless the object or its subclasses will never produce errors. + +

    +Each object should also have a create() method which does +the work of inserting a new row into the database table that this +object represents. + +

    +An update() method is also required for any objects +that can be changed. Individual set() methods are +generally not a good idea as doing separate updates to each field in +the database is a performance bottleneck. + +

    +Common sense about performance should be used when designing objects. + + +


    + +7. Naming + +

      + +
    • Constants should always be uppercase, with underscores to separate +words. Prefix constant names with the name of the class/package they +are used in. For example, the constants used by the DB:: package all +begin with "DB_". + +
    • True and false are built in to the php language and behave like +constants, but should be written in lowercase to distinguish them from +user-defined constants. + + +
    • Function names should suggest an action or verb: +updateAddress, makeStateSelector + +
    • Variable names should suggest a property or noun: UserName, +Width + +
    • Use pronounceable names. Common abbreviations are acceptable as +long as they are used the same way throughout the project. + +
    • Be consistent, use parallelism. If you are abbreviating number as +'num', always use that abbreviation. Don't switch to using +no or nmbr. + +
    • +Use descriptive names for variables used globally, use short names for +variables used locally.
    • + +

      + + +
      +
      +$AddressInfo = array(...);
      +
      +for($i=0; $i < count($list); $i++)
      +
      +
      + +

    + + +


    + +8. Control Structures + +

    +These include if, for, while, switch, etc. Here is an example if +statement, since it is the most complicated form: + +

    + + +
    +
    +if ((condition1) || (condition2)) {
    +    action1;
    +} elseif ((condition3) && (condition4)) {
    +    action2;
    +} else {
    +    defaultaction;
    +}
    +
    +
    + +

    +Control statements shall have one space between the control +keyword and opening parenthesis, to distinguish them from function +calls. + +

    +You should use curly braces even in situations where they are +technically optional. Having them increases readability and decreases +the likelihood of logic errors being introduced when new lines are +added. + +

    +For switch statements: + +

    + + +
    +
    switch (condition) {
    +    case 1: {
    +        action1;
    +        break;
    +    }
    +    case 2: {
    +        action2;
    +        break;
    +    }
    +    default: {
    +        defaultaction;
    +        break;
    +    }
    +}
    +
    + + +


    + +9. Including PHP Files + +

    +Anywhere you are unconditionally including a class file, use +require_once. Anywhere you are conditionally including a class file +(for example, factory methods), use include_once. Either of these will +ensure that class files are included only once. They share the same +file list, so you don't need to worry about mixing them - a file +included with require_once will not be included again by include_once. + +Note: include_once and require_once are statements, not functions. You +don't need parentheses around the filename to be included, however you +should do it anyway and use ' (apostrophes) not " (quotes): + +

    + + +
    +
    include('pre.php');
    +
    + + + +


    + +

    + + Copyright © 1999, 2000, 2001 VA Linux Systems, Inc. + + + diff --git a/gforge/docs/architecture/sf2.sda b/gforge/docs/architecture/sf2.sda new file mode 100644 index 0000000000000000000000000000000000000000..d7c70ee481ef2b94a52a6c7e50b874c99f49f248 GIT binary patch literal 89088 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 literal 0 HcmV?d00001 diff --git a/gforge/docs/architecture/stats/stats-process.sda b/gforge/docs/architecture/stats/stats-process.sda new file mode 100644 index 0000000000000000000000000000000000000000..11ec5e062a0b300df5f28659ff83fd446c90aa62 GIT binary patch literal 81408 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 + +Templating Standards + + + +

    Coding Example:

    +

    +The following code examples demonstrate how all coding on SourceForge +is going to be done in the future. The first example shows the "switchbox" +page (taken from www/tracker/index.php) - where the various objects +are included, instantiated and checked for errors every step of the way. +

    +Once the objects are instantiated, the template file can be included. In this +example, the template file is detail.php (example2). +

    +isError()) { + exit_no_group(); + } + + // + // Create the ArtifactType object + // + $ath = new ArtifactTypeHtml($group,$atid); + if (!$ath || !is_object($ath)) { + exit_error(\'Error\',\'ArtifactType could not be created\'); + } + if ($ath->isError()) { + exit_error(\'Error\',$ath->getErrorMessage()); + } + + // + // Fusebox-like architecture + // + switch ($func) { + + case \'detail\' : { + // + // users can modify their own tickets if they submitted them + // even if they are not artifact admins + // + $ah=new ArtifactHtml($ath,$aid); + if (!$ah || !is_object($ah)) { + exit_error(\'ERROR\',\'Artifact Could Not Be Created\'); + } else if ($ah->isError()) { + exit_error(\'ERROR\',$ah->getErrorMessage()); + } else { + // + // Include the template file + // + include \'../tracker/detail.php\'; + } + break; + } + default : { + //foo + } + + } + +} else { + exit_missing_params(); +} + +?>'; + +$example2='header(array (\'title\'=>\'Detail: \'.$ah->getID(). \' \'.$ah->getSummary())); + +?> +

    [ #getID(); ?> ] getSummary(); ?>

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Email:   + + + + +
    Date:
    getOpenDate() ); ?>
    Priority:
    getPriority(); ?>
    Submitted By:
    getSubmittedRealName(); ?> (getSubmittedUnixName(); ?>)
    Assigned To:
    getAssignedRealName(); ?> (getAssignedUnixName(); ?>)
    Category:
    getCategoryName(); ?>
    Status:
    getStatusName(); ?>
    +

    +

    DO NOT enter passwords or confidential information in your message!

    +

    + + +

    + +footer(array()); + +?>'; + +echo '

    Switchbox page:

    '; + +echo highlight_string($example); + + +echo '

    Template page (detail.php):

    '; + +echo highlight_string($example2); + +?> + + + + diff --git a/gforge/docs/architecture/tour/first0.gif b/gforge/docs/architecture/tour/first0.gif new file mode 100644 index 0000000000000000000000000000000000000000..f2c88143f6019198fdb8e4babd70d5fc50939aca GIT binary patch literal 1240 zcmZ?wbhEHbRA5kG_`m=J{~7-OSNzGs$N&`30SSO)+NGqVR8&+nG&FpCe4HX90|EkK zV`EcOQSBAd2;E+i~s-s|6%?Ovitvkkd32YGz11&2ypyo zaO9BjxWL@TEhJ?Salzpb3y&O!*Bpxt&MZs}Mp<_}6r9+*L~LVN1Qs|nv5T5ytoY#I z*vPVQM*vWV(1 z3xUbaF8my;qE2{~HM6ecNaN~ZNH}nHQ;N1jZ@|QchNThmDOYb_Ze(DRcidpR;d{zu z_O|MxR)#~&m*%z$tGw&1_{7G=$RWWJpzz-FbceICtiS^W23B9qIU;9+zcOF56=iVX zXwXkRyvFtLv!4tNENl$-w)yGYGR;3Nt;LYQ5aaCs__(~o{SDR4Yz*9D3*=_*5*W@NDP>U$&m3 zO2J|h22-M#3L7Sd8fT>{GX{C41V<|$`Wh1Ac2}gqFO^YMgemUgl^Y(aSEpa{(w!(4 j%wpk{Dd;BM>dC;;=xI68QRvS$hGL-@hKW-c85yhr0Y2q4 literal 0 HcmV?d00001 diff --git a/gforge/docs/architecture/tour/first1.gif b/gforge/docs/architecture/tour/first1.gif new file mode 100644 index 0000000000000000000000000000000000000000..10d14c91d2e11afc51954c4abb5ae37e0da77b05 GIT binary patch literal 1223 zcmZ?wbhEHbRA5kG_`m=J{~7-OSNzGs$iSe)paT*B$+SyJNvWu)XlQ7dnVGq}yZiX~ zI7LPV1O&vz#rda#KvHRGYDGn5Wo7=-rDZEuR;*ezWy+LUvu3p|S<<~?MdOAIJ=?d> z+P{Cnf(2W*Zr!zO*StfAR-Zbx=jzpC$BvyjbLQ-`XaE2I|HJ$n%AF`&BUbHf*yl+$~mTnaRe$UsJte??Q4Iy_xOH4ymkKL)AfG0M3R~qBp!%I<<9V2 z5a}Y!5O5>?_Dk~z?7f^{B;vyNUJ>_i;53^Ml@q&lK~Q0;L%3s{BEz(Zu*?NlBZWL& zMZ1n=eid;Il4X4y?|YUbh&_&V!sG}chE%a|g-(}CjOt6b1bMR`P!WzY@$@+8aU=6f X$`se4f<{(RiwSdBr5!|49T= literal 0 HcmV?d00001 diff --git a/gforge/docs/architecture/tour/img0.htm b/gforge/docs/architecture/tour/img0.htm new file mode 100644 index 0000000000..2889b0b5c0 --- /dev/null +++ b/gforge/docs/architecture/tour/img0.htm @@ -0,0 +1,10 @@ + + +Slide 1 + + +

    +First page Back Continue Last page Overview

    +
    + + \ No newline at end of file diff --git a/gforge/docs/architecture/tour/img0.jpg b/gforge/docs/architecture/tour/img0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8106cfdf8f51c8740d26eed6d861171eac606f75 GIT binary patch literal 33655 zcmeFYWmH^kmnM9WAO#DD;1Jvi4#7$A;K71hfDqgRqzD8FPGP~_3GVJL!J%+ZfS`e( z#hko7J=4$A?|j`e-^`C$YYNU zIe7&|C9PN5I=XuLuPrRC-dNk%zIAnT_we-cejoTLC^#haa~LcxJ|QvbOL9t1ZeD&t zVNr2ObxmzueM4hYb9YZ~U;n`1(D2ms%fwkkk&vqb0(zY{fI#%6PsPt zg-Oq+c|vUNG6^AJ;NM_8{Uh2xB>T?^7Vy6$*?$x4zsm&&uu+ge<)PpMlECj9mK=Y` z|20)p@H;fKD&76rS)I%jhtv*JdWQt?l_;M8AF)8W|StkVU z%$-sG_xCNn(!m(>FW1=KI#oYy`sDD&k&7p`mYar!;VFd+jvJQ*otMsZ_hklSruJf< z(Xd&-*5O(D5f-vw(6YpqJ5_r;(u{`T+Gk(C4Jd}8v}5`HBz)r8<0u}A!6oT_1z85{ zZDi*(N;iSNtMe^^#Mli^A>EVom8fiipG&=^Vw!mPkAEkVX_jHh_ENrzgN*hYx}vPpkJG?TUS&JdQ%a=rs-46zsmC0;dyLLBwD*V3 zf!_jOlS}rRU>w|ReQ!2ycr&1Zsei@tUEVgbJPQ9G0ik`Ijv6O>J&^`F zQw|ane&}&KBUL62KVsFeF~kT&h)p`F#Trg=dtRO5tKFXUvYgCvMAET%u1C-FZ)m}Or3>dTH%AKm#c%JU{N|0xqe~7g$ z%=>0=tsp3(hbij6{NdJJ91)N7gGfUb_&;?KZ+v)iN)vqSYgcB|L0rqOtoJibBF=}n zwQJX(FKC6~on8Pb9@^t4=fQw(vxXG4&}tQg9N`0|vlc%7?VIes`(DZGMerD~>)Zfqtlhenuo8vsHDdeOCl@{r7e zgXoixk2@!bs*;10`mgsjU-yk)D|*d+Mq8Maf|NA%JMjeu)_DyM0q0P1lkW(ctEQs0 z=bMqb-8XH0IpN_gk&N7&<@8H<8W=QBZ_{8H!mxICK}b*UYToBc-*fLy@zGx#z) zT%WNKhW0t(ja$ScvNsqMD74Im0Ut7R{KX`

    (l{v97Fp5i}V-W5}yV`dq%La;Zpa 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 X@7M9)Ir*KF-(%qa-!XvtG4p=_)3Ka* literal 0 HcmV?d00001 diff --git a/gforge/docs/architecture/tour/img1.htm b/gforge/docs/architecture/tour/img1.htm new file mode 100644 index 0000000000..c62e81452a --- /dev/null +++ b/gforge/docs/architecture/tour/img1.htm @@ -0,0 +1,10 @@ + + +Slide 2 + + +

    +First page Back Continue Last page Overview

    +
    + + \ No newline at end of file diff --git a/gforge/docs/architecture/tour/img1.jpg b/gforge/docs/architecture/tour/img1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6307756509bac00e11e7c7c352f77dabb9bc6c71 GIT binary patch literal 43478 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 VKL~sO?fCxB-@g+*NBcSV{{cinhwA_U literal 0 HcmV?d00001 diff --git a/gforge/docs/architecture/tour/img2.htm b/gforge/docs/architecture/tour/img2.htm new file mode 100644 index 0000000000..bdf0eba9f3 --- /dev/null +++ b/gforge/docs/architecture/tour/img2.htm @@ -0,0 +1,10 @@ + + +Slide 3 + + +
    +First page Back Continue Last page Overview

    +
    + + \ No newline at end of file diff --git a/gforge/docs/architecture/tour/img2.jpg b/gforge/docs/architecture/tour/img2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d6614ae0a8adf9747dbfb21ec80cd460a452a8a3 GIT binary patch literal 39758 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
      Lv!?)HA8UKG(~M)^oOxXCd4dz(4gBi60j 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 R-}3*C%m2q~0PBAC{{TFk8dm@S literal 0 HcmV?d00001 diff --git a/gforge/docs/architecture/tour/index.gif b/gforge/docs/architecture/tour/index.gif new file mode 100644 index 0000000000000000000000000000000000000000..287be984ecc7a512eb4e5e1d612de2bfdb9340f3 GIT binary patch literal 1223 zcmZ?wbhEHbRA5kG_`m=J{~7-OSNzGs$iN`SpaT*B$+SyJNvWu)XlQ7-ySw}N_&7yI z1_T7e#>U1K6{V)8CY6?^R#a40R^~5VTDEd!#i~_Prc9YNYgYG)6+PRxFIcc(>(;Hi zcI}#X=+Np@r}kXEdhFP-GiT16efI4C|NnoOe}ioO{~u)6C>RZaK^X!Z{~2sKWIQG? zw{Z*0S!8@jIK;{$!{If@VnTBZ6C*>$ogEt+S~^73qjZ3|g^^8AE8{|dA`>%{q-_(= zOU1)YlQ@-fZk*hl-ohd&nzCRfBO?QoK$TV~S0e)hi?e!~Lgj)(m$;bOV%8Qs$h^|U z#UQhxptQklt+%d4sKMptmc?PyXWi`x%Vb?Hq?P2OHU06;)dEZ+3_r~rBlnlAS7Vqk zo!M=!w`9s(>zN0yax`%<87N#g^6#}()i)J*pulk6=Iph*3|6KMSEVHw95@(0`JD=n z-T#dnH2a54c_N>&}i!w->b!w*+0aJ>s{vGU-w znDBtWmc~Gjr`tk;;{-*+7%YG8IOy+KD|*R8b?%f)Ub=flF1wp}9#JWgIvMhG68q0< N49d5+?kiW0A3uKP%$dVCZ=QVec?PkKku^F&UQ!r%PVP2)LKu^DWp>z;v{y{-5cIvXu|d+l$&9IP>MDBLkPse3rAD zQ(HK?j{XW^U{GY(J^7>5v>Zpr79K&lh!b}dnHpLc?mWwzo3K2a?|{6{Ij#mqW`-l( z;n)5}9sIy2qhN7v0*~B*Ce|CFkDq2HZq45(lQ8*tz~5a(&tBiQu9uJB@rF+##GR4h zweIyvDeP|F@5UYvZJ1T{>+2P1mV>%Cf|<5vUYMD>X6v$sitf~OsT9Tu%kP%SB~6>l zI-8S?A@Q{C)EoKXmTDK+OGV2<*{Z*O4NuV9_VrqX#EH-gzHEQYQ~V_*7#O02DjNbr zz0;nmFa~<2h(zz$`&1;vq_QBG!D=Gwlz`ZaDoq{|ich1xw6}f<@)2ILbQy%w^4VU}WWvG}my+Vq;;j1^@vq{$T(B literal 0 HcmV?d00001 diff --git a/gforge/docs/architecture/tour/last1.gif b/gforge/docs/architecture/tour/last1.gif new file mode 100644 index 0000000000000000000000000000000000000000..5d94c53fb03e5d3523be8f59cd300bb6b5de3686 GIT binary patch literal 1218 zcmZ?wbhEHbRA5kG_`m=J{~7-OSNzGs$iSe)paT*B$+SyJNvWu)XlQ7dnVGq}yZiX~ zI7LPV1O&vz#rda#KvHRGYDGn5Wo7=-rDZEuR;*ezWy+LUvu3p|S<<~?MdOAIJ=?d> z+P{Cnf(2W*Zr!zO*StfAR-Zbx=jzpC$BvyjbLQ-`XaE2I|HJ$nUDdpGMO1T z7#-5?MwMpI6Jm&{U|690_Ug9$`V$Nf81wm8npg4F-F7ZyXPEFk#crk*!>MzU-~86i z(f@k>i1ewM&*FAhU%JERKY9PZ-=EK2=f6Jbf6nc{=avZwvm7vpH93FbTde|PnxHR( zL*oC9(_)X=cBg{l)mLT1ho z>GBU$xf-bV?#Puemr79wza&qFDUmUaDng#@bEaJK65PQu*+=V=%ApCTa*r&T>{L|X S=)`Bi(8wz7@Fc~7!5RRX4&Vj= literal 0 HcmV?d00001 diff --git a/gforge/docs/architecture/tour/next0.gif b/gforge/docs/architecture/tour/next0.gif new file mode 100644 index 0000000000000000000000000000000000000000..d1620987820bf0cdea9dd50562aeadda765f6f2e GIT binary patch literal 1196 zcmZ?wbhEHbRA5kG_`m=J{~7-OSNzGs$N&`30SSO)+NGqVR8&+nG&FpCe4HX90|EkK zV`EcOQSBAd2;E+i~s-s|6%?Ovitvkkd32YGz11&2ypyo zaO9BjxWL@TEhJ?Salzpb3y&O!*Bpxt&MZs}Mp<_}6r9+*L~LVN1Qs|nv5T5ytoY#I z*vPVQM*vWV(1 z3xUbaF8my;qE2{~HM6ecNaN~ZNH}nHQ;N1jZ@|QchNY462kt&_U})@DxFM(T`@xgA zbpj3*4!ex=nGUCFvM3}7I5ci*H9jmW@IZlqb%uYI+G+*{Cx$9cX}voVubCNyBp51Q zTbRCHBg$YfVXb1xE3U;evluocFgDyA0cDWtK5#Y1(XZ!ROp_259s(qINFSFtMraTk}|@KDuk rnB=9Sc_7k9FyO@^SBcyw%8UXG&mOt3c?#TS+U;4u=%UBQ!e9*mbC}k} literal 0 HcmV?d00001 diff --git a/gforge/docs/architecture/tour/next1.gif b/gforge/docs/architecture/tour/next1.gif new file mode 100644 index 0000000000000000000000000000000000000000..98d91ef03a371f4661e477ec791bc34858beeb3a GIT binary patch literal 1182 zcmZ?wbhEHbRA5kG_`m=J{~7-OSNzGs$iSe)paT*B$+SyJNvWu)XlQ7dnVGq}yZiX~ zI7LPV1O&vz#rda#KvHRGYDGn5Wo7=-rDZEuR;*ezWy+LUvu3p|S<<~?MdOAIJ=?d> z+P{Cnf(2W*Zr!zO*StfAR-Zbx=jzpC$BvyjbLQ-`XaE2I|HJ$n)sqKsiddBnx-Yq`=rZkHFWmSiyTd0SKR-nMXxElqQxqFbgi(62zi+P$jt8 fq%+`AzSLd`SBAd2;E+i~s-s|6%?Ovitvkkd32YGz11&2ypyo zaO9BjxWL@TEhJ?Salzpb3y&O!*Bpxt&MZs}Mp<_}6r9+*L~LVN1Qs|nv5T5ytoY#I z*vPVQM*vWV(1 z3xUbaF8my;qE2{~HM6ecNaN~ZNH}nHQ;N1jZ@|QchNT7a6G{~t4!8^C@E^GQ;ekrz zIsu0Yhh3X<5)VgevM3}7I5h52S4@``c%Z<*nyNWRXU+6AObi^1Q;vDf+K_gQLB)XK z!?u+#F0Fmclwc6eeC@Vvar#w;go8{B`(}&fy{R${d$cFh-S0w##Wk+osw>pI9UJ3b zpGx-c`XN*G<@GX72AeHB-@jEZV`Xqi>G@gfe{u>Vvp~;H%iwh-jTab$DlE5!$Jf7n zek~#LB&$OMQzL5wW3u6k$*gQVOQ$)=B&1AjwF#Y|$Qb0A5**EX=xa!b+g*_czlE%( yQ^HL&&4N7dE!`62J?E&%!8X&VmWysKLJW>grgg22ESq!>%w`dH2uXHeum%9!X4?4x literal 0 HcmV?d00001 diff --git a/gforge/docs/architecture/tour/prev1.gif b/gforge/docs/architecture/tour/prev1.gif new file mode 100644 index 0000000000000000000000000000000000000000..87e957c3d47299f1f8285d697312991f1e9ceff8 GIT binary patch literal 1183 zcmZ?wbhEHbRA5kG_`m=J{~7-OSNzGs$iSe)paT*B$+SyJNvWu)XlQ7dnVGq}yZiX~ zI7LPV1O&vz#rda#KvHRGYDGn5Wo7=-rDZEuR;*ezWy+LUvu3p|S<<~?MdOAIJ=?d> z+P{Cnf(2W*Zr!zO*StfAR-Zbx=jzpC$BvyjbLQ-`XaE2I|HJ$n}~IR)=p(h*Z7^4`(!(#iHq#F%1=v#;^KeE z{4&pE;J=<3hY hqfG9)AM`k$`6a1GwWy$xRn%g^Y*uLpkz@x3YXCYd&iViV literal 0 HcmV?d00001 diff --git a/gforge/docs/architecture/tour/standards.htm b/gforge/docs/architecture/tour/standards.htm new file mode 100644 index 0000000000..c8d79d4e02 --- /dev/null +++ b/gforge/docs/architecture/tour/standards.htm @@ -0,0 +1,18 @@ + + +Slide 1 + + +
      +

      Click here to start

      +
      +
      + +
      +

      Table of contents

      Slide 1

      +

      Slide 2

      +

      Slide 3

      +
      +
      + + \ No newline at end of file diff --git a/gforge/docs/background/charter.html b/gforge/docs/background/charter.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gforge/docs/background/org_chart.html b/gforge/docs/background/org_chart.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gforge/docs/background/whos_who.html b/gforge/docs/background/whos_who.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gforge/docs/doc_utils.php b/gforge/docs/doc_utils.php new file mode 100644 index 0000000000..2cd7b74009 --- /dev/null +++ b/gforge/docs/doc_utils.php @@ -0,0 +1,117 @@ +" . $cvsfile . " " . $result["version"] . " " . $result["date_RFC"] . " " . $result["author"] . ""; + if (time() < ($result["date_UNIX"] + $threshold)) { + $result["status"] = "" . $result["status"] . ""; + } // if + + } // if ... else + + return $result; + +} // util_cvs_query + +// utility function to call util_cvs_query +// +function util_cvs_status($path) { + + $result = util_cvs_query($path); + + if (is_array($result)) { + return $result["status"] . " "; + } + else { + return "revision history n/a "; + } // if +} // function util_cvs_status + +?> diff --git a/gforge/docs/index.php b/gforge/docs/index.php new file mode 100644 index 0000000000..d13bd256ce --- /dev/null +++ b/gforge/docs/index.php @@ -0,0 +1,255 @@ + + + + + + SourceForge: Engine Team Documentation + + + + + + + + +
      + SourceForge: Engine Team Documentation
      + $Id$
      + SourceForge Engine Team [email]
      +
      + +
      + + +


      + +

      + 0. Quick Links +
      + +
      + 1. Background +
      + +
      + 2. Project Management +
      + +
      + 3. Requirements, Design, Implementation +
      + +
      + 4. Projects +
      + +

      + Note: revision histories in bold denote changes in the last week. +

      + + +


      + +0. Quick Links + +

      + List Archives: | alexandria-devel | alexandria-cvs | sf-engine | sf-onsite|
      + Sandboxes: | tperdue | dbrogdon | pfalcon | jbyers |
      + Reference: | ViewCVS | product marketing |
      +

      + + + + +


      + +1. Background + +

        + + + + + + + + + + + + + + + + + + +
        Engine Team Charter, Vision[HTML]
        Engine Team Org Chart[HTML]
        Who's Who[HTML]
        +
      + + +


      + +2. Project Management + +

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        MRD, ERD, PRD: Requirements Discovery[HTML]
        Change Control and the Change Czar[HTML]
        Source Control[HTML]
        Source Control: Branching Diagram[SDA]
        Community Involvement[HTML]
        Technical and Document Review[HTML]
        Development Process[HTML]
        PS Engineers on the Engine Team[HTML]
        +
      + + +


      + +3. Requirements, Design, Implementation + +

        + + + + + + + + + + + + + + + + + + + + + + + + +
        Architecture Tour (slides)[HTML]
        PHP Template Example: Logic and Presentation[HTML]
        Coding Standards[HTML]
        Site-Wide Structure and Use Cases[HTML]
        +
      + + +


      + +4. Projects + +

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Code Cleanup (March Madness and April Fool's)[HTML]
        XML Interface[HTML]
        Site Searching[HTML]
        Geocrawler II[HTML]
        Reporting and Statistics Engine[HTML]
        UI Redesign[HTML]
        Doc Manager II[HTML]
        Content Manager[HTML]
        Foundry II[HTML]
        +
      + + +


      + +

      + + Copyright © 1999, 2000, 2001 VA Linux Systems, Inc. + + + +
      + + + diff --git a/gforge/docs/project_management/change_control.html b/gforge/docs/project_management/change_control.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gforge/docs/project_management/community.html b/gforge/docs/project_management/community.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gforge/docs/project_management/development_process.html b/gforge/docs/project_management/development_process.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gforge/docs/project_management/ps_engineers.html b/gforge/docs/project_management/ps_engineers.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gforge/docs/project_management/requirements.html b/gforge/docs/project_management/requirements.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gforge/docs/project_management/review.html b/gforge/docs/project_management/review.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gforge/docs/project_management/source_branching.sda b/gforge/docs/project_management/source_branching.sda new file mode 100644 index 0000000000000000000000000000000000000000..2c0167802ce2d58bac182e83ea77fd09abba10c8 GIT binary patch literal 38400 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 PUJ7Kzpo`4^$o&5wfi|s4 literal 0 HcmV?d00001 diff --git a/gforge/docs/project_management/source_control.html b/gforge/docs/project_management/source_control.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gforge/docs/templates/generic_document.html b/gforge/docs/templates/generic_document.html new file mode 100644 index 0000000000..0356d3adeb --- /dev/null +++ b/gforge/docs/templates/generic_document.html @@ -0,0 +1,56 @@ + + + + SourceForge: HTML Documentation Template + + + + + + + + +
      + SourceForge: HTML Documentation Template
      + $Id: generic_document.html,v 1.1 2001/03/14 01:46:18 jbyers Exp $
      + SourceForge Engine Team [email]
      +
      + +
      + + +


      + +

      + 0. section zero +
      + +
      + 1. section one +
      + + +


      + +0. section zero + +

      +Content foo. + + +


      + +1. section one + +

      +Content bar. + + +


      + +

      + + Copyright © 1999, 2000, 2001 VA Linux Systems, Inc. + + + diff --git a/gforge/docs/templates/project_index.html b/gforge/docs/templates/project_index.html new file mode 100644 index 0000000000..3f1312a01b --- /dev/null +++ b/gforge/docs/templates/project_index.html @@ -0,0 +1,181 @@ + + + + SourceForge: [TODO] Project Documents + + + + + + + + +
      + SourceForge: [TODO] Project Documents
      + $Id: project_index.html,v 1.1 2001/03/14 01:46:18 jbyers Exp $
      + SourceForge Engine Team [email]
      +
      + +
      + + +


      + +

      + 0. Requirements +
      + +
      + 1. Project Management +
      + +
      + 2. Design +
      + +
      + 3. Implementation +
      + + +


      + +0. Requirements + +

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Project Charter, Vision[HTML]
        Use Case Requirements[HTML]
        Non-Functional Requirements[HTML]
        Interface Requirements / Mockup[HTML]
        Acceptance Plan[HTML]
        Enhancement Proposals[HTML]
        +
      + + +


      + +1. Project Management + +

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Development Process[HTML]
        Resources[HTML]
        Schedule and Milestones[HTML]
        Risk Management (Top 10 Risks)[HTML]
        Text Archive (Emails, Meeting Minutes, IRC Logs)[HTML]
        +
      + + +


      + +2. Design + +

        + + + + + + + + + + + + + + + + + + +
        Project Architecture[HTML]
        Project Interfaces and Interactions[HTML]
        Object Model (UML)[HTML]
        +
      + + +


      + +3. Implementation + +

        + + + + + + + + + + + + +
        Development Notes[HTML]
        Deployment and Installation Notes[HTML]
        +
      + + +


      + +

      + + Copyright © 1999, 2000, 2001 VA Linux Systems, Inc. + + + diff --git a/gforge/pager.php3 b/gforge/pager.php3 new file mode 100644 index 0000000000..8a7f10cbf0 --- /dev/null +++ b/gforge/pager.php3 @@ -0,0 +1,17 @@ + diff --git a/gforge/utils/download/README b/gforge/utils/download/README new file mode 100644 index 0000000000..75497e3a08 --- /dev/null +++ b/gforge/utils/download/README @@ -0,0 +1,10 @@ +# +# +# download_filemaint.pl +# +# -runs once a minute to clear out files that +# admins have requested to be deleted +# -depends on a file called .delete_files in the incoming directory +# .delete_file must be owned by nobody:nobody so the web servers +# can write to it +# diff --git a/gforge/utils/groupCreator b/gforge/utils/groupCreator new file mode 100755 index 0000000000..b4e16e598d --- /dev/null +++ b/gforge/utils/groupCreator @@ -0,0 +1,120 @@ +#!/usr/bin/perl -w +# +# $Id$ +# +# groupCreator - perl script to create /home/groups/* and /cvsroot/* from +# ldap properly. It's made independant of the other scripts +# for a reason. +# +use strict; +use Net::LDAP; +use Getopt::Std; + +# initialize our variables +umask(002); +my ($basedn, $binddn, $bindpw, $ldap, $filter, $uid, $gid, $type, $cvsdir); +my ($entry, $attr, $mesg, @groupArray, $counter, $ticker, $group, %opts); + +@groupArray = (); +$counter = 0; +$ticker = 0; + +# unbuffer our output +$| = 1; + +# configuration +$basedn = 'dc=sourceforge,dc=net'; +$binddn = 'cn=Manager, dc=sourceforge, dc=net'; +$bindpw = ''; +$filter = '(&(objectClass=posixGroup)(memberUid=*))'; + +# proccess the command line args +getopt('t', \%opts); +if (!$opts{'t'} || $opts{'t'} ne 'shell' && $opts{'t'} ne 'cvs') { + print <new('sf-ldap1') or die $@; + +$ldap->bind( + dn => $binddn, + password => $bindpw +); + +print "Performing search query $filter: "; +$mesg = $ldap->search( + base => $basedn, + filter => $filter, + scope => 'sub', + attrs => 'cn' +) or die $@; +print "done.\n"; + + +# build an array of group names +foreach $entry ($mesg->entries) { + $counter++; + push @groupArray, $entry->get('cn'); +} + +print "Preparing to process $counter groups: "; +@groupArray = sort @groupArray; +print "done.\n"; + +print "Processing: "; +foreach $group (@groupArray) { + $ticker++; + + # print a . for every 1000 groups we process + if ($ticker == 1000) { + print "."; + $ticker=0; + } + + # get numeric uid for the user and group + $uid = getpwnam('nobody'); + $gid = getgrnam($group); + + # uh oh! nobody or the group doesn't seem to exist on this machine?? + if (!$uid || !$gid) { die "\nhouston, we have a problem: $group\n"; } + + # process this batch like we're on a shell server (create /home/groups/*, /home/groups/*/htdocs, /home/groups/*/cgi-bin) + if ($opts{'t'} eq 'shell') { + if (! -e "/home/groups/$group" && $group eq 'alexandria') { + mkdir "/home/precision/groups/$group", 0775 or die "Can't create top-level directory for $group: $!\n"; + mkdir "/home/precision/groups/$group/htdocs", 0775 or die "Can't create htdocs directory for $group: $!\n"; + mkdir "/home/precision/groups/$group/cgi-bin", 0775 or die "Can't create cgi-bin directory for $group: $!\n"; + chown $uid, $gid, ("/home/precision/groups/$group", "/home/precision/groups/$group/htdocs", "/home/precision/groups/$group/cgi-bin"); + } + + # proccess the batch like a cvs server (create /cvsroot/* and init the repository) + } elsif ($opts{'t'} eq 'cvs') { + $cvsdir = "/home/precision/groups/cvsroot/$group"; + if (! -e $cvsdir && $group eq 'alexandria') { + mkdir $cvsdir, 0775 or die "Can't create $cvsdir: $!\n"; + system("/usr/bin/cvs -d$cvsdir init"); + system("echo \"\" > $cvsdir/CVSROOT/writers"); + system("echo \"anonymous\" > $cvsdir/CVSROOT/readers"); + system("echo \"anonymous:\\\$1\\\$0H\\\$2/LSjjwDfsSA0gaDYY5Df/:anoncvs_$group\" > $cvsdir/CVSROOT/passwd"); + + # setup loginfo to make group ownership every commit + system("echo \"ALL chgrp -R $group $cvsdir\" > $cvsdir/CVSROOT/loginfo"); + system("echo \"\" > $cvsdir/CVSROOT/val-tags"); + chmod 0644, "$cvsdir/CVSROOT/val-tags"; + + # set group ownership, anonymous group user + system("chown -R $uid:$gid $cvsdir"); + system("chmod g+rw $cvsdir/CVSROOT/*"); + } + } + +} +print " done.\n" diff --git a/gforge/utils/ldap-check-replica b/gforge/utils/ldap-check-replica new file mode 100755 index 0000000000..9a5c58be8c --- /dev/null +++ b/gforge/utils/ldap-check-replica @@ -0,0 +1,37 @@ +#!/usr/bin/perl +# +# Check proper installation of LDAP replication +# by pfalcon@sourceforge.net 2001-01-16 +# $Id: ldap-check-replica,v 1.1 2001/01/24 22:17:31 pfalcon Exp $ +# + +require("include.pl"); # Include all the predefined functions +&parse_local_inc; + +$ldap1="sf-ldap1"; +$ldap2="sf-ldap2"; + +print "Making change to the master server.\n"; +$time=time(); +$cmd = " +echo ' +dn: cn=Replicator,dc=sourceforge,dc=net +changetype: modify +replace: description +description: modified at $time +' | +${ldap_prefix}ldapmodify -h $ldap1 -p $ldap1 -D '$sys_ldap_bind_dn' -w $sys_ldap_passwd +"; +system($cmd); + +print "Allowing for propogation delay...\n\n"; +sleep(10); + +print "Querying master server:\n"; +$cmd = "${ldap_prefix}ldapsearch -h $ldap1 -p $sys_ldap_port -LLL -D '$sys_ldap_bind_dn' -w $sys_ldap_passwd -b '$sys_ldap_base_dn' '(cn=Replicator)' description"; +system($cmd); +print "Querying slave server 1:\n"; +$cmd = "${ldap_prefix}ldapsearch -h $ldap2 -p $sys_ldap_port -LLL -D '$sys_ldap_bind_dn' -w $sys_ldap_passwd -b '$sys_ldap_base_dn' '(cn=Replicator)' description"; +system($cmd); + +print "If two requests above differ, LDAP replication is NOT functioning\n"; diff --git a/gforge/www/account/unsubscribe.php b/gforge/www/account/unsubscribe.php new file mode 100644 index 0000000000..6dd63fa486 --- /dev/null +++ b/gforge/www/account/unsubscribe.php @@ -0,0 +1,62 @@ + 1) { + exit_error("Error","This confirm hash exists more than once."); +} +if (db_numrows($res_user) < 1) { + exit_error("Error","Invalid confirmation hash."); +} + +$row_user = db_fetch_array($res_user); +$user =& user_get_object($row_user['user_id'], $res_user); +exit_assert_object($user, 'User'); + +$user->unsubscribeFromMailings($all); + +site_header(array('title'=>"Unsubscription Complete")); + +if ($all) { + $what = $Language->getText('account_unsubscribe', 'all_mailings'); +} else { + $what = $Language->getText('account_unsubscribe', 'site_mailings'); +} +?> + +

      Unsubscription Complete

      +

      +You have been unsubscribed from . In case you +will want to re-activate your subscriptions in the future, login +and visit your Account Maintenance page. +

      + +

      +getText('general', 'return'); ?> +

      + + diff --git a/gforge/www/admin/admin_table.php b/gforge/www/admin/admin_table.php new file mode 100644 index 0000000000..0a9f335fa5 --- /dev/null +++ b/gforge/www/admin/admin_table.php @@ -0,0 +1,276 @@ + + '; + + for ($i = 0; $i < $cols; $i++) { + $fieldname = db_fieldname($result, $i); + + echo ''; + echo ''; + } + echo '
      '.$fieldname.'
      +
      + +
      '; + } else { + echo db_error(); + } +} + +/** + * admin_table_postadd() - update the database based on a submitted change + * + * @param $table - the table to act on + * @param $unit - the name of the "units" described by the table's records + * @param $primary_key - the primary key of the table + */ +function admin_table_postadd($table, $unit, $primary_key) { + global $HTTP_POST_VARS; + + $sql = "INSERT INTO $table (" + . join(',', array_keys($HTTP_POST_VARS)) + . ") VALUES ('" + . htmlspecialchars(join("','", array_values($HTTP_POST_VARS))) + . "')"; + + if (db_query($sql)) { + echo ucfirst($unit).' successfully added.'; + } else { + echo db_error(); + } +} + +/** + * admin_table_confirmdelete() - present a form to confirm requested record deletion + * + * @param $table - the table to act on + * @param $unit - the name of the "units" described by the table's records + * @param $primary_key - the primary key of the table + * @param $id - the id of the record to act on + */ +function admin_table_confirmdelete($table, $unit, $primary_key, $id) { + global $PHP_SELF; + + $result = db_query("SELECT * FROM $table WHERE $primary_key=$id"); + + if ($result) { + $cols = db_numfields($result); + + echo 'Are you sure you want to delete this '.$unit.'? +
        '; + for ($i = 0; $i < $cols; $i++) { + echo '
      • '.db_fieldname($result,$i).' '.db_result($result,0,$i).'
      • '; + } + echo '
      +
      + +
      +
      + +
      '; + } else { + echo db_error(); + } +} + +/** + * admin_table_delete() - delete a record from the database after confirmation + * + * @param $table - the table to act on + * @param $unit - the name of the "units" described by the table's records + * @param $primary_key - the primary key of the table + * @param $id - the id of the record to act on + */ +function admin_table_delete($table, $unit, $primary_key, $id) { + if (db_query("DELETE FROM $table WHERE $primary_key=$id")) { + echo ucfirst($unit).' successfully deleted.'; + } else { + echo db_error(); + } +} + +/** + * admin_table_edit() - present a form for editing a record in the specified table + * + * @param $table - the table to act on + * @param $unit - the name of the "units" described by the table's records + * @param $primary_key - the primary key of the table + * @param $id - the id of the record to act on + */ +function admin_table_edit($table, $unit, $primary_key, $id) { + global $PHP_SELF; + + $result = db_query("SELECT * FROM $table WHERE $primary_key=$id"); + + if ($result) { + $cols = db_numfields($result); + + echo 'Modify the '.$unit.' below: +
      + '; + + for ($i = 0; $i < $cols; $i++) { + $fieldname = db_fieldname($result, $i); + $value = db_result($result, 0, $i); + + echo ''; + + if ($fieldname == $primary_key) { + echo ""; + } else { + echo ''; + } + } + echo '
      '.$fieldname.'$value
      +
      + +
      '; + } else { + echo db_error(); + } +} + +/** + * admin_table_postedit() - update the database to reflect submitted modifications to a record + * + * @param $table - the table to act on + * @param $unit - the name of the "units" described by the table's records + * @param $primary_key - the primary key of the table + * @param $id - the id of the record to act on + */ +function admin_table_postedit($table, $unit, $primary_key, $id) { + global $HTTP_POST_VARS; + + $sql = 'UPDATE '.$table.' SET '; + while (list($var, $val) = each($HTTP_POST_VARS)) { + if ($var != $primary_key) { + $sql .= "$var='". htmlspecialchars($val) ."', "; + } + } + $sql = ereg_replace(', $', ' ', $sql); + $sql .= "WHERE $primary_key=$id"; + + if (db_query($sql)) { + echo ucfirst($unit) . ' successfully modified.'; + } else { + echo db_error(); + } +} + +/** + * admin_table_show() - display the specified table, sorted by the primary key, with links to add, edit, and delete + * + * @param $table - the table to act on + * @param $unit - the name of the "units" described by the table's records + * @param $primary_key - the primary key of the table + */ +function admin_table_show($table, $unit, $primary_key) { + global $HTML, $PHP_SELF; + + $result = db_query("SELECT * FROM $table ORDER BY $primary_key"); + + if ($result) { + $rows = db_numrows($result); + $cols = db_numfields($result); + + echo ' + + '; + + echo ' + '; + for ($i = 0; $i < $cols; $i++) { + echo ''; + } + echo ''; + + for ($j = 0; $j < $rows; $j++) { + echo ''; + + $id = db_result($result,$j,0); + echo ''; + for ($i = 0; $i < $cols; $i++) { + echo ''; + } + echo ''; + } + echo '
      '. ucwords($unit) .'s + [add new]
      '.db_fieldname($result,$i).'
      [edit]'; + echo '[delete] '. db_result($result, $j, $i) .'
      '; + } else { + echo db_error(); + } +} + + +require_once('pre.php'); +session_require(array('group'=>'1','admin_flags'=>'A')); + +$HTML->header(array('title'=>'Edit the '. ucwords($unit) .'s Table')); + +echo '

      Edit '. ucwords($unit) .'s

      +

      Site Admin Home +

      '; + +switch ($function) { + case 'add' : { + admin_table_add($table, $unit, $primary_key); + break; + } + case 'postadd' : { + admin_table_postadd($table, $unit, $primary_key); + break; + } + case 'confirmdelete' : { + admin_table_confirmdelete($table, $unit, $primary_key, $id); + break; + } + case 'delete' : { + admin_table_delete($table, $unit, $primary_key, $id); + break; + } + case 'edit' : { + admin_table_edit($table, $unit, $primary_key, $id); + break; + } + case 'postedit' : { + admin_table_postedit($table, $unit, $primary_key, $id); + break; + } +} + +echo admin_table_show($table, $unit, $primary_key); + +$HTML->footer(array()); + +?> diff --git a/gforge/www/admin/database.php b/gforge/www/admin/database.php new file mode 100644 index 0000000000..2b7037b071 --- /dev/null +++ b/gforge/www/admin/database.php @@ -0,0 +1,150 @@ +'1','admin_flags'=>'A')); + + +if ($submit) { + + $group_id = seek_gid($groupname); + + if ($group_id) { + + $group =& group_get_object($group_id); + exit_assert_object($group, 'Group'); + + $user =& session_get_user(); + exit_assert_object($user, 'User'); + + $res = db_query(" + INSERT INTO prdb_dbs(group_id, dbname, dbusername, dbuserpass, requestdate, dbtype, created_by, state) + VALUES ($group_id,'$dbname','$dbname','xxx',".time().",1,".$user->getID().",1) + "); + + if (!$res || db_affected_rows($res) < 1) { + $feedback .= 'Error adding databse: '.db_error(); + } else { + $feedback .= "Group ".$group->getUnixName()." added already active database"; + } + + } else { + + $feedback .= "Unable to insert already active database.."; + + } + +} + + +site_admin_header(array('title'=>"Site Admin: Groups' DB Maintanance")); + +$res_db = db_query(" + SELECT stateid,statename,COUNT(*) + FROM prdb_dbs,prdb_states + WHERE stateid=state + GROUP BY statename,stateid +"); + +echo '

      Statistics for Project Databases

      '; + +if (db_numrows($res_db) > 0) { + + echo ''; + + } + + echo '
      '; + $title=array(); + $title[]='Type'; + $title[]='Count'; + echo html_build_list_table_top($title); + + while ($row_db = db_fetch_array($res_db)) { + + print '
      '.$row_db['statename'].''.$row_db['count'].'
      '; + echo ''; + +} else { + echo '

      No databases defined

      '; +} + + +if ($displaydb) { + + $res_db = db_query(" + SELECT statename + FROM prdb_states + WHERE stateid=".$dbstate." + "); + + $row_db = db_fetch_array($res_db); + + print '

      Displaying Databases of Type: '.$row_db['statename'].'

      '; + + $res_db = db_query(" + SELECT * + FROM prdb_dbs + WHERE state=".$dbstate." + ORDER BY dbname + "); + + while ($row_db = db_fetch_array($res_db)) { + + print '
    1. '.$row_db['dbname'].""; + + } + + +} + + + +?> +
      + +

      Add an already active database

      + +
      + + + + + + + + + + + + + +
      Group Unix Name
      Database Name
      + +
      + + diff --git a/gforge/www/admin/edit_frs_filetype.php b/gforge/www/admin/edit_frs_filetype.php new file mode 100644 index 0000000000..468a3efb44 --- /dev/null +++ b/gforge/www/admin/edit_frs_filetype.php @@ -0,0 +1,21 @@ + diff --git a/gforge/www/admin/edit_frs_processor.php b/gforge/www/admin/edit_frs_processor.php new file mode 100644 index 0000000000..1f3b6a8ab0 --- /dev/null +++ b/gforge/www/admin/edit_frs_processor.php @@ -0,0 +1,21 @@ + diff --git a/gforge/www/admin/edit_supported_languages.php b/gforge/www/admin/edit_supported_languages.php new file mode 100644 index 0000000000..ffdeaa36d4 --- /dev/null +++ b/gforge/www/admin/edit_supported_languages.php @@ -0,0 +1,21 @@ + diff --git a/gforge/www/admin/intelapprove.php b/gforge/www/admin/intelapprove.php new file mode 100644 index 0000000000..eb9ca8988f --- /dev/null +++ b/gforge/www/admin/intelapprove.php @@ -0,0 +1,99 @@ +'5914','admin_flags'=>'A')); + +// group public choice +if ($submit) { + /* + update the project flag to active + */ + $accept_count=count($accept); + $delete_count=count($delete); + + $approve_message='Congratulations! Your proposal has been accepted and you now have +access to the Itanium(tm) processor prototype compile farm. This is a +great opportunity for members of the Open Source community and +SourceForge is excited to be able to provide this access. Please be +understanding if there are any issues with accessing the Itanium +processor prototype compile farm during the start-up phase. We will be +continually improving access to the machines. + +Remember that your access to the compile farm is subject to the terms +and conditions set forth by Intel and VA Linux as documented in the +click through license. + +Please wait at least 6 hours for your account to be activated +before trying to login. + +If you have questions, READ THE DOCS at http://sourceforge.net/compilefarm/ + +For find more resources on porting to IA-64 and for mailing lists, see +http://sourceforge.net/project/?group_id=1196'; + + $delete_message='I am sorry to inform you that your proposal to access the Itanium(tm) +processor prototype compile farm has been rejected because you did not +meet our criteria.'; + + + for ($i=0; $i<$accept_count; $i++){ + $result=db_query("UPDATE intel_agreement SET is_approved='1' WHERE user_id='$accept[$i]'"); + if (!$result) { + echo db_error(); + } + $sql="SELECT email FROM users WHERE user_id='$accept[$i]'"; + $result=db_query($sql); + mail (db_result($result,0,'email'),'You Have Been Approved',$approve_message,'From: esindelar@users.sourceforge.net'); + } + + for ($i=0; $i<$delete_count; $i++){ + $result=db_query("DELETE FROM intel_agreement WHERE user_id='$delete[$i]'"); + if (!$result) { + echo db_error(); + } + $sql="SELECT email FROM users WHERE user_id='$delete[$i]'"; + $result=db_query($sql); + mail (db_result($result,0,'email'),'You Could Not Be Approved',$delete_message,'From: esindelar@users.sourceforge.net'); + } + + +} + + +// get current information +$result = db_query("SELECT users.user_name,users.email,users.user_id,intel_agreement.message ". + "FROM users,intel_agreement ". + "WHERE users.user_id=intel_agreement.user_id AND is_approved='0'"); + +if (db_numrows($result) < 1) { + exit_error("None Found","No Pending Requests to Approve"); +} + +$HTML->header(array('title'=>'Approving Pending Requests')); + +echo ''; + +echo ' + + '; + +$rows=db_numrows($result); + +for ($i=0; $i<$rows; $i++) { + echo ' + + '; +} + +echo '
      user_nameEmailJustificationAcceptDelete
      '. db_result($result,$i,'user_name') .''. db_result($result,$i,'email') .''. nl2br(db_result($result,$i,'message')) .'
      '; + +$HTML->footer(array()); + +?> diff --git a/gforge/www/admin/massmail-old.php b/gforge/www/admin/massmail-old.php new file mode 100644 index 0000000000..080163fead --- /dev/null +++ b/gforge/www/admin/massmail-old.php @@ -0,0 +1,87 @@ +'1','admin_flags'=>'A')); +$HTML->header(array('title'=>"Administrative Mass Mail Engine")); + +// get numbers of users for each mailing +$res_count = db_query("SELECT count(*) AS count FROM users WHERE status='A' AND mail_va=1"); +$row_count = db_fetch_array($res_count); +$count_comm = $row_count[count]; +$res_count = db_query("SELECT count(*) AS count FROM users WHERE status='A' AND mail_siteupdates=1"); +$row_count = db_fetch_array($res_count); +$count_sf = $row_count[count]; +$res_count = db_query("SELECT count(*) AS count FROM users WHERE status='A'"); +$row_count = db_fetch_array($res_count); +$count_all = $row_count[count]; +$res_count = db_query("SELECT count(*) AS count FROM users,user_group WHERE " + ."users.user_id=user_group.user_id AND users.status='A' AND user_group.admin_flags='A'"); +$row_count = db_fetch_array($res_count); +$count_admin = $row_count[count]; +$res_count = db_query("SELECT count(*) AS count FROM users,user_group WHERE " + ."users.user_id=user_group.user_id AND users.status='A'"); +$row_count = db_fetch_array($res_count); +$count_devel = $row_count[count]; +$res_count = db_query("SELECT count(*) AS count FROM users,user_group WHERE " + ."users.user_id=user_group.user_id AND users.status='A' AND user_group.group_id=1"); +$row_count = db_fetch_array($res_count); +$count_sfadmin = $row_count[count]; + +print '

      Mail Engine for SourceForge Subscribers (MESS) + +

      Be VERY careful with this form, +because sutmitting it WILL send email to lots of users. + +

      + +Send only to users subscribed to "Additional Community Mailings" (' +.$count_comm +.')
      +Send only to users that agreed to receive "Site Updates" (' +.$count_sf +.')
      +Send only to project developers (' +.$count_devel +.')
      +Send only to project administrators (' +.$count_admin +.')
      +Send only to SourceForge administrators (test) (' +.$count_sfadmin +.')
      +Send to all users, regardless of their preferences (' +.$count_all +.') +

      Start With User ID: (for use when the process quits) +
      +

      +Subject: +
      + +

      Text of Message: +

      +
      +
      +

      + +

      +'; + +$HTML->footer(array()); + +?> diff --git a/gforge/www/admin/resetapc.php b/gforge/www/admin/resetapc.php new file mode 100644 index 0000000000..d1ec75ef9e --- /dev/null +++ b/gforge/www/admin/resetapc.php @@ -0,0 +1,16 @@ +'1','admin_flags'=>'A')); + +site_admin_header(array('title'=>"Site Admin")); + +echo '

      '.$sys_name.'

      '; + +apc_reset_cache(); + +site_admin_footer(array()); + +?> diff --git a/gforge/www/admin/unsubscribe.php b/gforge/www/admin/unsubscribe.php new file mode 100644 index 0000000000..5e461e43ae --- /dev/null +++ b/gforge/www/admin/unsubscribe.php @@ -0,0 +1,134 @@ +'1','admin_flags'=>'A')); + +if ($submit && $user_name) { + + if (!$type) { + + /* + Show form for unsubscription type selection + */ + + site_admin_header(array('title'=>'Site Mailings Subscription Maintanance')); + ?> + +

      Unsubscribe user:

      +

      + You can unsubscribe user either from admin-initiated + sitewide mailings or from all site mailings + (admin-initiated and automated mailings, like forum + and file release notifications). +

      +
      + + Unsubscription type: + +
      + + unsubscribeFromMailings($type=='ALL' ? 1 : 0)) { + exit_error( + 'Error', + 'Could not unsubscribe user: '.$u->getErrorMessage() + ); + } + + $feedback .= 'User unsubscribed
      '; + } +} + +site_admin_header(array('title'=>"Site Mailings Subscription Maintanance")); + +?> + +

      +Site Mailings Subscription Maintanance +

      + +

      +Use field below to find users which match given pattern with +the SourceForge username, real name, or email address +(substring match is preformed, use '%' in the middle of pattern +to specify 0 or more arbitrary characters). Click on the username +to unsubscribe user from site mailings (new form will appear). +

      + +
      +Pattern: + +
      + + +   + '.$row['user_id'].' + '.$row['user_name'].' + '.$row['realname'].' + '.$row['email'].' + '.$row['mail_siteupdates'].' + '.$row['mail_va'].' + + '; + } + + echo ''; +} + +site_admin_footer(array()); + +?> diff --git a/gforge/www/admin/vhost.php b/gforge/www/admin/vhost.php new file mode 100644 index 0000000000..26e1770139 --- /dev/null +++ b/gforge/www/admin/vhost.php @@ -0,0 +1,173 @@ +'1','admin_flags'=>'A')); + +if ($add) { + + $group_id = seek_gid($groupname); + + if ($group_id) { + + $group = &group_get_object($group_id); + exit_assert_object($group, 'Group'); + + if (valid_hostname($vhost_name)) { + + $homedir = account_group_homedir($group->getUnixName()); + $docdir = $homedir.'/htdocs/'; + $cgidir = $homedir.'/cgi-bin/'; + + + $res = db_query(" + INSERT INTO prweb_vhost(vhost_name, docdir, cgidir, group_id) + VALUES ('$vhost_name','$docdir','$cgidir',$group_id) + "); + + if (!$res || db_affected_rows($res) < 1) { + $feedback .= 'Error adding VHOST: '.db_error(); + } else { + $feedback .= "Virtual Host ".$vhost_name." scheduled for creation on group ".$group->getUnixName().""; + } + } else { + + $feedback .= "The provided group name does not exist."; + + } + + } +} + +if ($tweakcommit) { + + $res = db_query(" + UPDATE prweb_vhost + SET docdir='$docdir', + cgidir='$cgidir' + WHERE vhostid=$vhostid + "); + + if (!$res || db_affected_rows($res) < 1) { + $feedback .= 'Error updating VHOST entry: '.db_error(); + } else { + $feedback .= "Virtual Host entry updated."; + } + +} + + +site_admin_header(array('title'=>"Site Admin")); +?> + +

      Virtual Host Administration

      + +
      + +Add Virtual Host + + + + + + + + + + + + +
      Group Unix Name
      Virtual Host Name
      + + +
      + +

      + + +


      +Tweak Directories +
      + +
      + + + + +
      Virtual Host:
      + + + +
      + + 0) { + + $row_vh = db_fetch_array($res_vh); + + print '

      Update Record:


      '; + + $title=array(); + $title[]='VHOST ID'; + $title[]='VHOST Name'; + $title[]='Group'; + $title[]='Htdocs Dir'; + $title[]='CGI Dir'; + $title[]='Operations'; + echo html_build_list_table_top($title); + + print ' +
      + + '.html_build_list_table_top($title).' + '.$row_vh['vhostid'].' + '.$row_vh['vhost_name'].' + '.$row_vh['unix_group_name'].' + + + + + + +
      + '; + } else { + echo "No such VHOST: '$vhost_name'"; + } + +} + +site_admin_footer(array()); + +?> diff --git a/gforge/www/export/rss_foundry_featuredprojects.php b/gforge/www/export/rss_foundry_featuredprojects.php new file mode 100644 index 0000000000..3242bda983 --- /dev/null +++ b/gforge/www/export/rss_foundry_featuredprojects.php @@ -0,0 +1,55 @@ + + * @date 2001-06-06 + * @version $Id: rss_foundry_featuredprojects.php,v 1.2 2001/06/14 21:54:23 dbrogdon Exp $ + * + */ +require_once('pre.php'); +require_once('rss_utils.inc'); + +header("Content-Type: text/plain"); +print ''; +?> + + + Featured Projects + SourceForge.net Site Statistics +\n"; + echo " Project\n"; + echo ' ' . db_result($res_grp,$i,'group_name') . "\n"; + echo ' http://' . $GLOBALS[sys_default_domain] . '/projects/' . db_result($res_grp,$i,'unix_group_name') . "\n"; + echo " \n"; + } + } +?> + + diff --git a/gforge/www/export/rss_foundry_mostactive.php b/gforge/www/export/rss_foundry_mostactive.php new file mode 100644 index 0000000000..beaa572a4a --- /dev/null +++ b/gforge/www/export/rss_foundry_mostactive.php @@ -0,0 +1,48 @@ + + * @date 2001-06-06 + * @version $Id: rss_foundry_mostactive.php,v 1.2 2001/06/14 21:54:23 dbrogdon Exp $ + * + */ +require_once('pre.php'); +require_once('rss_utils.inc'); + +header("Content-Type: text/plain"); +print ''; +?> + + + Most Active Projects + SourceForge.net Site Statistics +\n"; + } else { + while ($row=db_fetch_array($result)) { + echo " \n"; + echo ' ' . $row['group_name'] . "\n"; + echo ' ' . $row['percentile'] . "%\n"; + echo ' http://' . $GLOBALS[sys_default_domain] . '/projects/' . $row['unix_group_name'] . "\n"; + echo " \n"; + } + } +?> + + diff --git a/gforge/www/export/rss_foundry_topdownloads.php b/gforge/www/export/rss_foundry_topdownloads.php new file mode 100644 index 0000000000..916bddb748 --- /dev/null +++ b/gforge/www/export/rss_foundry_topdownloads.php @@ -0,0 +1,49 @@ + + * @date 2001-06-06 + * @version $Id: rss_foundry_topdownloads.php,v 1.2 2001/06/14 21:54:23 dbrogdon Exp $ + * + */ +require_once('pre.php'); +require_once('rss_utils.inc'); + +header("Content-Type: text/plain"); +print ''; +?> + + + Top Downloads + SourceForge.net Site Statistics +\n"; + echo " No Projects\n"; + echo " \n"; + } else { + while ($row_topdown = db_fetch_array($res_topdown)) { + echo " \n"; + echo ' ' . $row_topdown['group_name'] . "\n"; + echo ' ' . $row_topdown['downloads'] . "\n"; + echo ' http://' . $GLOBALS[sys_default_domain] . '/projects/' . $row_topdown['group_name'] . "\n"; + echo " \n"; + } + } +?> + + diff --git a/gforge/www/export/rss_osdn_search.php b/gforge/www/export/rss_osdn_search.php new file mode 100644 index 0000000000..cdcfbe729d --- /dev/null +++ b/gforge/www/export/rss_osdn_search.php @@ -0,0 +1,85 @@ + + * @date 2001-06-15 + * @version $Id: rss_osdn_search.php,v 1.2 2001/06/21 21:38:00 jbyers Exp $ + * + */ +require_once('pre.php'); +require_once('rss_utils.inc'); + +header("Content-Type: text/plain"); +print ''; +?> + + + OSDN Universal Search + SourceForge export for OSDN Universal search +\n"; + echo " No Data\n"; + echo " \n"; + } else { + while ($row=db_fetch_array($result)) { + $weight = 10; + if (stristr($row['group_name'], $query_text)) { + $weight += 10; + } + + if (stristr($row['short_description'], $query_text)) { + $weight += 10; + } + + echo " \n"; + echo ' ' . $row['group_name'] . "\n"; + echo ' ' . $row['short_description'] . "\n"; + echo ' http://' . $GLOBALS[sys_default_domain] . '/projects/' . $row['unix_group_name'] . "\n"; + echo " $weight\n"; + echo " \n"; + } + } +?> + + + + diff --git a/gforge/www/export/rss_osdnnews.php b/gforge/www/export/rss_osdnnews.php new file mode 100644 index 0000000000..e4b0390010 --- /dev/null +++ b/gforge/www/export/rss_osdnnews.php @@ -0,0 +1,219 @@ + + * @date 2001-05-22 + * @version $Id: rss_osdnnews.php,v 1.2 2001/07/10 00:03:08 pfalcon Exp $ + * + */ +require_once('pre.php'); +require_once('rss_utils.inc'); + +if (!$days) { + $days = '7'; +} + +// +// Get the dates +// +$udate = date('U') - ($days * 86400); +$currudate = date('U'); + +$tmp1 = getdate($udate); +$month = pad_number($tmp1['mon']); +$day = pad_number($tmp1['mday']); +$year = $tmp1['year']; + +$tmp2 = getdate($currudate); +$curr_month = pad_number($tmp2['mon']); +$curr_day = pad_number($tmp2['mday']); +$curr_year = $tmp2['year']; + +$month_day = $year . $month; +$curr_month_day = $curr_year . $curr_month; + +header("Content-Type: text/plain"); +print ''; +?> + + + + SourceForge Stats + SourceForge.net Site Statistics + + Pageviews + + + + Downloads + + + + Registered Users + + + + Registered Projects + + + + + += '$day' + OR + s.month > '$month_day' + )"; + $res = db_query($sql, 1, 0, SYS_DB_STATS); + if (!$res) { + return 'ERROR'; + } + $http_stats = db_fetch_array($res); + + // + // Determine the total number of files and file sizes + // + $total_files = number_format($ftp_stats[0] + $http_stats[0]); + $total_size = number_format(($ftp_stats[1] + $http_stats[1]) / 1000); + + return "$total_files downloads accounting for " . $total_size . "Kb" . " of data."; +} + +/** + * get_registered_users() - Get a count of regiestered users + * + * This function retrieves both a count of current users and new users + * since '$days' ago. + * + * @returns String A string of data containing the current and new users or 'ERROR' on error. + * + */ +function get_registered_users() { + global $udate, $days; + + // + // Get the current users + // + $sql = "SELECT count(*) AS count FROM users WHERE status='A'"; + $res = db_query($sql, 1, 0, SYS_DB_STATS); + if (!$res) { + return 'ERROR'; + } + $curr_users = number_format(db_result($res, 0, 0)); + + // + // Get the users from '$days' offset + // + $sql = "SELECT count(*) AS count FROM users WHERE status='A' AND add_date >= '$udate'"; + $res = db_query($sql, 1, 0, SYS_DB_STATS); + if (!$res) { + return 'ERROR'; + } + $new_users = number_format(db_result($res, 0, 0)); + + return "$curr_users up $new_users from $days days ago."; +} + +/** + * get_registered_projects() - Get a count of registered projects + * + * This function retrieves both a count of current registered projects and + * new projects registered since '$days' ago. + * + * @returns String A string of data containing the current and new projects or 'ERROR' on error. + * + */ +function get_registered_projects() { + global $udate, $days; + + // + // Get the current projects + // + $sql = "SELECT count(*) AS count FROM groups WHERE status='A'"; + $res = db_query($sql, 1, 0, SYS_DB_STATS); + if (!$res) { + return 'ERROR'; + } + $curr_projx = number_format(db_result($res, 0, 0)); + + // + // Get the projects from '$days' offset + // + $sql = "SELECT count(*) AS count FROM groups WHERE status='A' AND register_time >= '$udate'"; + $res = db_query($sql, 1, 0, SYS_DB_STATS); + if (!$res) { + return 'ERROR'; + } + $new_projx = number_format(db_result($res, 0, 0)); + + if (!$new_projx) { + return 'ERROR'; + } + + return "$curr_projx up $new_projx from $days days ago."; +} + +/** + * get_pageviews() - Get the latest pageview count + * + * This function retreives the latest site-wide pageview count. + * + * @returns Int A count of total pageviews or 'ERROR' on error. + * + */ +function get_pageviews() { + $sql = 'SELECT sum(a.site_views) FROM stats_project_all a, groups g WHERE a.group_id=g.group_id'; + $res = db_query($sql, 1, 0, SYS_DB_STATS); + if (!$res) { + return 'ERROR'; + } + $pageviews = number_format(db_result($res, 0, 0)); + + return $pageviews; +} + +/** + * pad_number() - Zero-pad a number + * + * This function will zero-pad a single digit number + * + * @param $num Int A number that may need padding. + * @returns Int The padded number if $num was a single digit number or 'ERROR' on error. + * + */ +function pad_number($num) { + if (strlen($num) < 2) { + return ('0' . $num); + } else { + return $num; + } +} +?> diff --git a/gforge/www/export/sf_tracker_export.php b/gforge/www/export/sf_tracker_export.php new file mode 100644 index 0000000000..99d8502920 --- /dev/null +++ b/gforge/www/export/sf_tracker_export.php @@ -0,0 +1,170 @@ + + * @version $Id$ + * + */ + +set_time_limit(0); + +require_once('pre.php'); +require_once('common/tracker/Artifact.class'); +require_once('common/tracker/Artifacts.class'); +require_once('common/tracker/ArtifactFile.class'); +require_once('common/tracker/ArtifactType.class'); +require_once('common/tracker/ArtifactGroup.class'); +require_once('common/tracker/ArtifactCategory.class'); +require_once('common/tracker/ArtifactCanned.class'); +require_once('common/tracker/ArtifactResolution.class'); + +header("Content-Type: text/plain"); +?> + +isError()) { + echo(" Could not get the Group object\n"); + $errors = true; + } + + // + // Create the ArtifactType object + // + $ath = new ArtifactType($group,$atid); + if (!$ath || !is_object($ath)) { + echo(" ArtifactType could not be created\n"); + $errors = true; + } + if ($ath->isError()) { + echo(' ' . $ath->getErrorMessage() . "\n"); + $errors = true; + } + + // + // Create the Artifacts object + // + $artifacts = new Artifacts($ath); + if (!$artifacts || !is_object($ath)) { + echo(" Artifacts could not be created\n"); + $errors = true; + } + if ($artifacts->isError()) { + echo(' ' . $artifacts->getErrorMessage() . "\n"); + $errors = true; + } + + // + // Loop through each artifact object and show the results + // + if (!$alist =& $artifacts->getArtifacts($offset)) { + echo(' ' . $artifacts->getErrorMessage() . "\n"); + $errors = true; + } + + if ($errors) { + echo (''); + exit; + } + + for ($i=0; $i + + getSubmittedUnixName(); ?> + getOpenDate() ); ?> + getID(); ?> + getCategoryName(); ?> + getArtifactGroupID; ?> + getAssignedRealName(); ?> + getPriority(); ?> + getStatusName(); ?> + getResolutionName(); ?> + getSummary(); ?> + getDetails(); ?> +getMessages(); + $rows = db_numrows($result); + if ($rows > 0) { +?> + + + + + + + + + +getFiles(); + $count=count($file_list); + if ($count > 0) { +?> + + + + getID(); ?> + getName(); ?> + getDescription(); ?> + getSize(); ?> + getType(); ?> + getDate(); ?> + getSubmittedBy(); ?> + + + +getHistory(); + $rows = db_numrows($result); + + if ($rows > 0) { +?> + + + + + + + + + + + + +Group ID Not Set\n"); +} +?> + diff --git a/gforge/www/export/sf_tracker_export.xsd b/gforge/www/export/sf_tracker_export.xsd new file mode 100644 index 0000000000..1f8cf494cb --- /dev/null +++ b/gforge/www/export/sf_tracker_export.xsd @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gforge/www/help/tracker.php b/gforge/www/help/tracker.php new file mode 100644 index 0000000000..3476c09d02 --- /dev/null +++ b/gforge/www/help/tracker.php @@ -0,0 +1,93 @@ + + + + + + + + +
      +
      + You can set the status to \'Pending\' if you are waiting for a response from the tracker item author. When + the author responds the status is automatically reset to that of \'Open\'. Otherwise, if the author doesn\'t + respond with an admin-defined amount of time (default is 14 days) then the item is given a status of \'Deleted\'.'); + break; + case 'category': + print('This drop-down box represents the Category of the tracker items which is a particular section of a project.

      + Select \'Any\' for a broader result set.'); + break; + case 'group': + print('This drop-down box represents the Group of the tracker items which is a list of project admin-defined options.

      + If you are a project admin you can click the \'(admin)\' link to define your own groups.'); + break; + case 'sort_by': + print('The Sort By option allows you to determine how the browse results are sorted.

      You can sort by + ID, Priority, Summary, Open Date, Close Date, Submitter, or Assignee. You can also have the + results sorted in Ascending or Descending order.'); + break; + case 'data_type': + print('The Data Type option determines the type of tracker item this is. Since the tracker rolls into one the + bug, patch, support, etc... managers you need to be able to determine which one of these an item should belong. +

      This has the added benefit of enabling an admin to turn a support request into a bug.'); + break; + case 'priority': + print('The priority option allows a user to define a tracker item priority (ranging from 1-Lowest to 9-Highest).

      + This is especially helpful for bugs and support requests where a user might find a critical problem with a project.'); + break; + case 'resolution': + print('The resolution option represents a tracker items resolution if any.'); + break; + case 'summary': + print('The summary text-box represents a short tracker item summary. Useful when browsing through several tracker items.'); + break; + case 'canned_response': + print('The canned response drop-down represents a list of project admin-defined canned responses to common support or bug + submission.

      If you are a project admin you can click the \'(admin)\' link to define your own canned responses'); + break; + case 'comment': + print('The comment textarea allows you to attach a comment to a tracker item when a canned response isn\'t appropriate.'); + break; + case 'attach_file': + print('When you wish to attach a file to a tracker item you must check this checkbox before submitting changes.'); + break; + case 'monitor': + print('You can monitor or un-monitor this item by clicking the "Monitor" button.

      Note! this will send you additional email. If you add comments to this item, or submitted, or are assigned this item, you will also get emails for those reasons as well!'); + break; + default: + print("UNKNOWN HELP REQUEST: $helpname"); + break; + } +?> +
      +

      +
      + +
      +
      + + diff --git a/gforge/www/images/favicon.ico b/gforge/www/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0c5cc2fae9b78e23697499296ab5ba96b964efd2 GIT binary patch literal 3262 zcmeI#T}V@59LMn^T}57X5kXz-uJEplkgk+2iW2f72?`8)xe0G9g)%K#C_yRnCFe`f zEXtN|OC9+FW~iv)%Sc3`tNfN&z|$_cmB^92POz9 zyi_VdEPbjV>|=D8L&cHFks|Epymf8-uYdR(2!+<*aXaC%S>Se9;rIIxiEm&hr9{4U z-ULIV8jlOJQI>NM>XW-rnzb7h7Y{*qFBhYIEeHlf*v?**%YWBe3+=U|sJ?X`<@ax5 z#88){e*pd6GkBPtireV|?qnp@-8g|ouLpnHg>w1R18vZ&bKtelqutPnI&D21E)V2g z1-^Vne`6ua&+bLZF#(PF8Thuc1o?X9@`KAhJS{kmaA+0g1uLHEba>v>1Y>tM!eYt0 zlE#acX=tycp(tIzP^$*gRi*Q123t^jH4U*?6n2{(AI8UF?COMRY6^Cn4N_Mzv3`gp z&3G0jQFdw%bOo7+i=}k_SVtw)r&D45Gz+PpXe^45Skg?u@59$cFPu&X-WWO{e-`!C z=RAk>Dl}_~5D54o^(;Rp#Ih`yF+Mhmk>MdsO->*ZOTg5tLvu+M zr1eVYM9iOg*4-^*8 zy3qZy4im%uaELW0*8JQYmR42~iN+CH`<3)F45!_O_Ub|ytMU*DuR*?RrSqkG1;4Mr z?Q$TzzK*%skI?J1&}r0Yt}I5+t9s15??Bb%BY0brheSLMdFS%6()sdxNxu`P-HJiu zYqZxC?m!ZfC4?{-z!hiH$@;d>}>Rv7}8`cm77{{GE5GSi;u- I3jW^gZ_(W&zyJUM literal 0 HcmV?d00001 diff --git a/gforge/www/images/phorum/c.gif b/gforge/www/images/phorum/c.gif new file mode 100644 index 0000000000000000000000000000000000000000..4a45d92fcdbed898f097571af53fa7ef960d3170 GIT binary patch literal 55 zcmZ?wbhEHb0r5dH3`~4I{VPwu literal 0 HcmV?d00001 diff --git a/gforge/www/images/phorum/i.gif b/gforge/www/images/phorum/i.gif new file mode 100644 index 0000000000000000000000000000000000000000..a7cb3a2c4a64cd64e6512c5a28d33bc0fa25e4bc GIT binary patch literal 68 zcmZ?wbhEHb0r5dH3{28J%*$u(e#_U>;gy|srO!Sl RQI5H9dc?99S(U5|)&Mv*6Egq+ literal 0 HcmV?d00001 diff --git a/gforge/www/images/phorum/l.gif b/gforge/www/images/phorum/l.gif new file mode 100644 index 0000000000000000000000000000000000000000..171dcb625bd0365954665581d170a3211df7cbfa GIT binary patch literal 67 zcmZ?wbhEHb0r5dH3`|lz%*$u(e#_U>;gy|srO&>H R;n9o6XPwJl%@Sj<1^_oy6z2c{ literal 0 HcmV?d00001 diff --git a/gforge/www/images/phorum/m.gif b/gforge/www/images/phorum/m.gif new file mode 100644 index 0000000000000000000000000000000000000000..37eb3680d0793e6430332d6b022b0bded6a93ac5 GIT binary patch literal 66 zcmZ?wbhEHb0r5dH3`~+e{VPx3Wmp_Dfl2zw+Aj6} PjHnYaA)WKw85yhr8dnmQ literal 0 HcmV?d00001 diff --git a/gforge/www/images/phorum/n.gif b/gforge/www/images/phorum/n.gif new file mode 100644 index 0000000000000000000000000000000000000000..9cbf0a4ce9f77a8418c37a0b615ec15d2ef3163b GIT binary patch literal 61 zcmZ?wbhEHb0r5dH3``h#ku LTOREYVXy`O$P^MT literal 0 HcmV?d00001 diff --git a/gforge/www/images/phorum/p.gif b/gforge/www/images/phorum/p.gif new file mode 100644 index 0000000000000000000000000000000000000000..2d93766f7b5f09dd693502bbc933512851828e15 GIT binary patch literal 67 zcmZ?wbhEHb0r5dH3`|lz{VPx3Wmp{ZfuY)$FZAB3 R#Az!k<~1+V3T9xi1^_fc6K((i literal 0 HcmV?d00001 diff --git a/gforge/www/images/phorum/t.gif b/gforge/www/images/phorum/t.gif new file mode 100644 index 0000000000000000000000000000000000000000..cf2335f6da2d4f18f83fbb5b76205a010d070533 GIT binary patch literal 71 zcmZ?wbhEHb0r5dH3`}x8%*$u(e#_U>;gy|srO&>H V;gLlpPexqCtcCA>>9I0c0|0yV6$AhP literal 0 HcmV?d00001 diff --git a/gforge/www/images/phorum/trans.gif b/gforge/www/images/phorum/trans.gif new file mode 100644 index 0000000000000000000000000000000000000000..e92eaac290eb94ef378e40d3d96c9a69d29df71c GIT binary patch literal 42 ncmZ?wbhEHbWMp7uXkcLY4+e@qSr{3BKnFyCWEhwjT^OtZ45|tA literal 0 HcmV?d00001 diff --git a/gforge/www/include/languages/Base.tab b/gforge/www/include/languages/Base.tab new file mode 100644 index 0000000000..4a90133298 --- /dev/null +++ b/gforge/www/include/languages/Base.tab @@ -0,0 +1,374 @@ +#/** +# * +# * Default message catalog (English) +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * +# */ +about_foundries about_blurb SourceForge Foundries serve as places for developers to congregate, share expertise and news, get and give advice, and generally help each other develop better software faster (this is Open Source, after all).
       
      If you're interested in volunteering to help support or start a foundry, or have suggestions, ideas, or gripes please contact SourceForge. +about_foundries foundries_list Here is a list of all foundries on the system. Some are more complete than others. If you see a foundry you may want to contribute to, contact the existing foundry admins for that foundry. +account title Account Preferences +account_change_email message You have requested a change of email address on SourceForge.\nPlease visit the following URL to complete the email change:\n\n\n\n -- the SourceForge staff +account_change_email section Account Preferences +account_change_email subject SourceForge Verification +account_change_email title Change Email Address +account_change_pw confirmation

      SourceForge Password Change Confirmation

      Congratulations. You have changed your password.

      +account_change_pw section Account Preferences +account_change_pw title Change Password +account_editsshkeys section Account Preferences +account_editsshkeys title Edit CVS/SSH Shared Keys +account_first about_blurb You are now a registered user on SourceForge, the online development environment for Open Source projects.

      As a registered user, you can participate fully in the activities on the site. You may now post messages to the project message forums, post bugs for software in SourceForge, sign on as a project developer, or even start your own project.

      You should take some time to read through the Site Documentation so that you may take full advantage of SourceForge.

      Enjoy the site, and please provide us with feedback on ways that we can improve SourceForge.

      --the SourceForge staff +account_first title Welcome to SourceForge! +account_login deleted_account

      Your SourceForge account has been removed by SourceForge staff. This may occur for two reasons, either 1) you requested that your account be removed; or 2) some action has been performed using your account which has been seen as objectionable (i.e. you have breached the terms of service for use of your account) and your account has been revoked for administrative reasons. Should you have questions or concerns regarding this matter, please log asupport request.

      Thank you,

      SourceForge Staff

      +account_login pending_account

      Your account is currently pending your email confirmation. Visiting the link sent to you in this email will activate your account.

      If you need this email resent, please click below and a confirmation email will be sent to the email address you provided in registration.

      [Resend Confirmation Email]


      +account_login title SourceForge Site Login +account_lostpw message Someone (presumably you) on the SourceForge site requested a\npassword change through email verification. If this was not you,\nignore this message and nothing will happen.\n\nIf you requested this verification, visit the following URL\nto change your password:\n\n\n\n -- the SourceForge staff\n +account_lostpw subject SourceForge Verification +account_lostpw title Lost Your Password? +account_register title SourceForge New Account Registration +account_unsubscribe all_mailings all SourceForge mailings and notifications +account_unsubscribe site_mailings SourceForge site mailings +account_verify title SourceForge Account Verification +account_verify verify_blurb

      In order to complete your registration, login now. Your account willthen be activated for normal logins.

      +conf content_encoding iso-8859-1 +conf default_font verdana,arial,helvetica,sans-serif +conf language_code en +conf language_id 1 +contact about_blurb

      This is the contact page for SourceForge.net -- if you are having a problem with a project hosted by us please send your questions/info to the support/bug manager for that project. You can access those features by visiting that project's development home page at: sourceforge.net/projects/<project name> and clicking the approrpiate tool.

      If you have a support request, bug report or wish to communicate directly with the SourceForge staff, please take care in using the appropriate means:

      +contact title Contact SourceForge +cvs section Project: $1 +cvs title CVS +docman section Project: $1 +docman title Document Manager +docman_admin section $1 +docman_admin title Document Manager: Administration +docman_admin_docedit section Document Manager +docman_admin_docedit title Edit Document +docman_admin_editdocs section Document Manager Administration +docman_admin_editdocs title Edit Docs +docman_admin_editgroups section Document Manager Administration +docman_admin_editgroups title Edit Groups +docman_admin_groupdelete section Document Manager Administration +docman_admin_groupdelete title Delete Document Group +docman_admin_groupedit section Document Manager Administration +docman_admin_groupedit title Rename Document Group +docman_display_doc section Project: $1 +docman_display_doc title Document Manager: Display Document +docman_new section Project: $1 +docman_new title Document Manager: Submit New Documentation +forum section Project: $1 +forum title Forums +forum_admin section Project: $1 +forum_admin title Forums: Administration +forum_admin_addforum section Forum Administration +forum_admin_addforum title Add Forum +forum_admin_changestatus section Forum Administration +forum_admin_changestatus title Change Forum Status +forum_admin_delete section Forum Administration +forum_admin_delete title Delete Forum +forum_forum section Project: $1 +forum_forum title Forums: View Forum +forum_forum_thread section Forums +forum_forum_thread title View Thread +forum_message section Forums +forum_message title View Message +foundry section Foundry: $1 +foundry title Summary +foundry_admin section Foundry: $1 +foundry_admin title Foundry Administration +foundry_html_admin section Foundry Administration +foundry_html_admin title Foundry HTML Admin +foundry_news section Foundry Administration +foundry_news title Foundry News Summary +frs file_download Download +frs file_monitor Monitor +frs file_notes Notes +frs file_package Package +frs file_rel_date Date +frs file_version Version +frs latest_file_releases Latest File Releases +general return [Return to SourceForge] +general sitename SourceForge +group developer_info Developer Info +group developers Developers +group long_bugs Bug Tracking +group long_cvs CVS Repository +group long_docman DocManager: Project Documentation +group long_forum Public Forums +group long_foundries SourceForge Development Foundries +group long_ftp Anonymous FTP Space +group long_homepage Project Home Page +group long_mail Mailing Lists +group long_news Latest News +group long_patch Patch Manager +group long_pm Task Manager +group long_support Tech Support Manager +group long_survey Surveys +group project_admins Project Admins +group public_area Public Areas +group short_admin Admin +group short_bugs Bugs +group short_cvs CVS +group short_docman Docs +group short_files Files +group short_forum Forums +group short_homepage Home Page +group short_mail Lists +group short_main Main +group short_memberlist Developers +group short_news News +group short_patch Patches +group short_pm Tasks +group short_summary Summary +group short_support Support +group short_survey Surveys +group short_tracker Tracker +home about_blurb SourceForge is a free service to Open Source developers offering easy access to the best in CVS, mailing lists, bug tracking, message boards/forums, task management, site hosting, permanent file archival, full backups, and total web-based administration. [ more ][ FAQ ]
       

      Site Feedback and Participation

      In order to get the most out of SourceForge, you'll need to register as a site user. This will allow you to participate fully in all we have to offer. You may of course browse the site without registering, but will not have access to participate fully.

       
      Set Up Your Own Project

      Register as a site user, then Login and finally, Register Your Project. Thanks... and enjoy the site. +home breaking_down_barriers Breaking Down the Barriers to Open Source Development +home highest_ranked_users Highest Ranked Users +home most_active_this_week Most Active This Week +home sfos SourceForge OnSite +home sourceforge_statistics SourceForge Statistics +home top_project_downloads Top Project Downloads +mail provided_by

      Mailing lists provided via a SourceForge version of GNU Mailman. Thanks to the Mailman and Python crews for excellent software. +mail section Project: $1 +mail title Mailing Lists +mail_admin section Mailing Lists +mail_admin title Mailing List Admin +mail_admin_add_list section Mailing List Admin +mail_admin_add_list title Add List +mail_admin_change_status section Mailing List Admin +mail_admin_change_status title Admin / Update Lists +menu about_foundries About Foundries +menu about_sourceforge About SourceForge +menu account_maintenance Account Maintenance +menu bookmark_page Bookmark Page +menu change_my_theme Change My Theme +menu code_snippet_library Code Snippet Library +menu compile_farm Compile Farm +menu contact_us Contact SourceForge +menu discussion_forums Discussion Forums +menu documentation Site Docs +menu foundry_admin Foundry Admin +menu foundry_summary Foundry Summary +menu login Login via SSL +menu logout Logout +menu my_personal_page My Personal Page +menu new_project Register New Project +menu new_releases New Releases +menu new_user New User via SSL +menu other_site_mirrors Other Site Mirrors +menu project_admin Project Admin +menu project_help_wanted Project Help Wanted +menu project_summary Project Summary +menu search Search +menu site_status Site Status +menu software_map Software Map +menu top_projects Top Projects +my about_blurb Your personal page contains lists of bugs and tasks that you are assigned, plus a list of groups that you are a member of. +my no_bookmarks You currently do not have any bookmarks saved +my no_monitored_filemodules

      You are not monitoring any files

      If you monitor files, you will be sent new release notices viaemail, with a link to the new file on our download server.

      You can monitor files by visiting a project's "Summary Page" and clicking on the check box in the files section.
        +my no_monitored_forums

      You are not monitoring any forums

      If you monitor forums, you will be sent new posts in the form of an email, with a link to the new message.

      You can monitor forums by clicking "Monitor Forum" in any given discussion forum.
        +my no_open_tasks You have no open tasks assigned to you. +my no_projects You're not a member of any active projects +my no_tracker_items_assigned You have no open tracker items assigned to you. +my no_tracker_items_submitted You have no open tracker items submitted by you. +my title Personal Page For: $1 +my_bookmark_add section My Personal Page +my_bookmark_add title Add Bookmark +my_bookmark_delete section My Personal Page +my_bookmark_delete title Delete Bookmark +my_bookmark_edit section My Personal Page +my_bookmark_edit title Edit Bookmark +my_diary section My Personal Page +my_diary title Diary And Notes +new title New Releases +news section Project: $1 +news title News +news_admin section News +news_admin title News Admin +news_main title SourceForge News +news_submit post_blurb You can post news about your project if you are an admin on your project. You may also post "help wanted" notes if your project needs help.

      All posts for your project will appear instantly on your project summary page. Posts that are of special interest to the community will have to be approved by a member of the news team before they will appear on the SourceForge home page. +news_submit section News +news_submit title Submit News for $1 +partners about_blurb

      SourceForge is proud to partner with the following organizations:

      $1Cosource.com
      Cosource.com is a collaborative, reverse-auction web site enabling international consumers and developers of Open Source products to work together to fund development of innovative software solutions.
      +people about_blurb

      The SourceForge Project Help Wanted board is for non-commercial, project volunteer openings. Commercial use is prohibited.

      Project listings remain live for two weeks, or until closed by the poster, whichever comes first. (Project administrators may always re-post expired openings.)

      Browse through the category menu to find projects looking for your help.

      If you're a project admin, log in and submit help wanted requests through your project administration page.

      To suggest new job categories, submit a request via the support manager.

      +people section Project Help Wanted +people title Projects Needing Help +people_admin section Project Help Wanted +people_admin title Help Wanted Administration +people_admin_people_cat section Help Wanted Administration +people_admin_people_cat title Add Job Categories +people_admin_people_skills section Help Wanted Administration +people_admin_people_skills title Add Job Skills +people_cat section Help Wanted +people_cat title List Jobs By Category +people_createjob section Project Help Wanted +people_createjob title Create A New Job +people_editjob section Project Help Wanted +people_editjob title Edit Job +people_editprofile section Project Help Wanted +people_editprofile title Edit Your Profile +people_helpwanted_latest section Project Help Wanted +people_helpwanted_latest title Last Posts +people_proj section Project Help Wanted +people_proj title Project Help Wanted For $1 +people_viewjob section Project Help Wanted +people_viewjob title $1 wanted for $2 +people_viewprofile section User Info +people_viewprofile title View Developer Profile +pm section Project: $1 +pm title Task Manager: Subprojects And Tasks +pm_addtask section Task Manager +pm_addtask title Add A Task +pm_admin section $1 +pm_admin title Task Manager: Administration +pm_admin_change_status section Task Manager Administration +pm_admin_change_status title Update Information +pm_admin_projects section Task Manager Administration +pm_admin_projects title Add Subprojects +pm_browse_custom section Task Manager +pm_browse_custom title Browse Custom Tasks +pm_browse_my section Project $1 Task Manager +pm_browse_my title Browse My Tasks +pm_browse_open section Task Manager +pm_browse_open title Browse Open Tasks +pm_detailtask section Task Manager +pm_detailtask title Task Detail +pm_modtask section Task Manager +pm_modtask title Modify Task +pm_reporting section Task Manager +pm_reporting title Task Reporting System +project_admin section Project: $1 +project_admin title Administration Summary +project_admin_database section Project $1 - Administration +project_admin_database title Database Information +project_admin_editgroupinfo section Project $1 - Administration +project_admin_editgroupinfo title Edit Public Info +project_admin_editimages section Project $1 - Administration +project_admin_editimages title Edit Multimedia Data +project_admin_editpackages section Project $1 - Administration +project_admin_editpackages title Edit Packages +project_admin_editreleases section Project $1 - Administration +project_admin_editreleases title Edit Releases +project_admin_history section Project $1 - Administration +project_admin_history title History +project_admin_newrelease section Project $1 - Administration +project_admin_newrelease title Create New Release +project_admin_qrs section Project $1 - Administration +project_admin_qrs title Quick Release System +project_admin_userpermedit section Project $1 - Administration +project_admin_userpermedit title Edit Developer Permissions +project_admin_userperms section Project $1 - Administration +project_admin_userperms title User Permissions List +project_admin_vhost section Project $1 - Administration +project_admin_vhost title Virtual Host Management +project_memberlist joining

      If you would like to contribute to this project by becoming a developer, contact one of the project admins, designated in bold text below.

      +project_showfiles section Project: $1 +project_showfiles title File List +project_shownotes section Project: $1 +project_shownotes title Release Notes +projects section Project: $1 +projects title Summary +register title New Project Registration +register_complete section New Project Registration +register_complete title Registration Complete +register_projectinfo section New Project Registration +register_projectinfo title Project Information +register_requirements section New Project Registration +register_requirements title Services & Requirements +register_tos section New Project Registration +register_tos title Terms Of Service Agreement +search title Search +sendmessage about_blurb In an attempt to reduce spam, we are using this form to send email.

      Fill it out accurately and completely or the receiver may not be able to respond.

      IF YOU ARE WRITING FOR HELP: Did you read the site documentation? Did you include your user_id and user_name? If you are writing about a project, include your project id (group_id) and Project Name. +sendmessage title Send $1 A Message +snippet title Code Snippet Library +snippet_add_snippet_to_package section Code Snippet Library +snippet_add_snippet_to_package title Add Snippet To Package +snippet_addversion section Code Snippet Library +snippet_addversion title Post A New Version +snippet_browse section Code Snippet Library +snippet_browse title Browse Snippets +snippet_delete section Code Snippet Library +snippet_delete title Delete A Snippet +snippet_detail section Code Snippet Library +snippet_detail title View Snippet Detail +snippet_package section Code Snippet Library +snippet_package title Create Snippet Package +snippet_submit section Code Snippet Library +snippet_submit title Submit Snippet +softwaremap title Trove +staff about_blurb

      SourceForge Staff

      Patrick McGovern(pat)Patrick McGovern (pat) - Pat "Sounds Good" McGovern is the new Director of SourceForge.net. We're glad to have Pat on board, as he used to run valinux.com, so he knows a thing or two about running important web sites.
      Dan Bressler(dlb)Dan is the "Product Manager" for SourceForge. We're not sure what that means, only that he likes timelines and handles business development issues.
      Tim Perdue(bigdisk)Tim is the technical lead on SourceForge and is from Iowa. Yes Iowa. Not Idaho and not Ohio. Iowa. When he's not working you can locate him fairly easy as he has the only BMW Z3 in Iowa.

      Tim founded PHPBuilder.com and Geocrawler.com.

      Paul Sokolovsky(pfalcon)Paul is a developer, living in Ukraine. Yep, it's where Chernobyl is located. He *claims* he had nothing to do with what happened. He describes himself as a "confirmed geek/workaholic type".
      Darrell Brogdon(zelphyr)Darrell is also on the SourceForge development team. He worked for another company, but they wanted to ditch Open Source and move to ASP for their web applications... Now he works for us.
      Uriah Welcome(precision)Uriah is a system administrator/developer from the frosty regions of Minnesota. When he's not shoveling his driveway or defrosting his car you'll find him locked away in a dark room somewhere in front of a computer.
      Jacob Moorman(moorman)Jacob (aka roguemtl) is the Quality of Service Manager for SourceForge. He currently handles the bulk of the level two support requests, maintains the site status page, and helps to ensure everyone who logs a support request gets timely, correct service. He works from the northeastern US.
      Founders:
      Tony Guntharp
      Drew Streib
      Tim Perdue
      Uriah Welcome
       

      Signicant Outside Contributors:

      Wallace Lee(wallace)Wallace has contributed significant tweaks and improvements to the SourceForge core code base. We appreciate his efforts, as do the users who benefit from his contributions.
      +survey title Surveys For $1 +survey_admin section Survey Tool +survey_admin title Administration +survey_admin_add_question section Survey Tool Administration +survey_admin_add_question title Add Survey Question +survey_admin_add_survey section Survey Tool Administration +survey_admin_add_survey title Add Survey +survey_admin_edit_question section Survey Tool Administration +survey_admin_edit_question title Edit A Survey Question +survey_admin_edit_survey section Survey Tool Administration +survey_admin_edit_survey title Edit Survey +survey_admin_show_questions section Survey Tool Administration +survey_admin_show_questions title Show Survey Questions +survey_admin_show_results section Survey Tool Administration +survey_admin_show_results title Show Survey Results +survey_admin_show_results_aggregate section Survey Tool Administration +survey_admin_show_results_aggregate title Show A Surveys Results +survey_admin_show_results_comments section Survey Tool Administration +survey_admin_show_results_comments title Show Survey Comments +survey_admin_show_results_individual section Survey Tool Administration +survey_admin_show_results_individual title Show Individual Survey Results +survey_survey section Survey Tool +survey_survey title Display Survey +survey_survey_resp section Survey Tool +survey_survey_resp title Survey Processing / Response +thanks about_blurb

      SourceForge Acknowledgements

      The Developers of SourceForge would like to thank the following people for their support and encouragement:
      • VA Linux Systems
      • Larry Augustin
      • Brian Biles
      • John Hall
      • Steve Westmoreland
      • Chris DiBona
      • Joe Arruda
      • Jeff Ritter
      • Trae McCombs
      • Patrick Wong
      • Neil Doane
      • Rob Walker
      • Robert Flemming
      • Michael Turner
      • Dan Cox
      • Garrett LeSage
      • John Goebel
      • Kit Cosper
      • Eureka Endo
      • Kevin Collins
      • Steve Schaefer
      • Greg Pryzby
      • Adam Frey
      • James Byers
      • Lion Templin
      +themes section Account Preferences +themes title View/Change Theme +top about_blurb We track many project usage statistics on SourceForge, and display here the top ranked projects in several categories. +top active_all_time Most Active All Time +top active_weekly Most Active This Week +top downloads Top Downloads +top downloads_7_days Top Downloads (Past 7 Days) +top forum_posts Top Forum Post Counts +top pageviews Top Project Pageviews - Measured by impressions of the SourceForge 'button' logo +top title Top Projects +top_mostactive section Top Projects +top_mostactive title Most Active Projects: $1 +top_toplist section Top Projects +top_toplist title Top Project Lists +tracker section Project: $1 +tracker title Trackers +tracker_add section $1 +tracker_add title Submit Tracker Item +tracker_admin section Tracker +tracker_admin title Administration +tracker_admin_add_canned section Tracker Administration +tracker_admin_add_canned title Add Canned Responses To: $1 +tracker_admin_add_cat section Tracker Administration +tracker_admin_add_cat title Add Categories To: $1 +tracker_admin_add_group section Tracker Administration +tracker_admin_add_group title Add Groups To: $1 +tracker_admin_update_canned section Tracker Administration +tracker_admin_update_canned title Modify Canned Respnses In: $1 +tracker_admin_update_cat section Tracker Administration +tracker_admin_update_cat title Modify Category In: $1 +tracker_admin_update_group section Tracker Administration +tracker_admin_update_group title Modify A Group In: $1 +tracker_admin_update_type section Tracker Administration +tracker_admin_update_type title Update $1 +tracker_admin_update_users section Tracker Administration +tracker_admin_update_users title Add/Update Tracker User Permissions +tracker_browse section Project: $1 +tracker_browse title Browse $1 +tracker_detail section $1 +tracker_detail title Tracker Detailed View +tracker_reporting section $1 +tracker_reporting title Tracker Reporting +users title User Summary diff --git a/gforge/www/include/languages/Bulgarian.tab b/gforge/www/include/languages/Bulgarian.tab new file mode 100644 index 0000000000..94f900f46f --- /dev/null +++ b/gforge/www/include/languages/Bulgarian.tab @@ -0,0 +1,84 @@ +#/** +# * +# * Bulgarian message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Delyan Toshev +# * +# */ +# +# ChangeLog: +# +# 2000-10-14 Delyan Toshev +# * Initial translation +# +menu account_maintenance Ïðîôèë +menu bookmark_page Îòáåëåæè ñòðàíèöàòà +home breaking_down_barriers Äà ïðåìàõíåì ïðå÷êèòå ïðåä ðàçðàáîòâàíåòî íà ñîôòóåð ñ îòâîðåí êîä +menu change_my_theme Âúíøåí âèä +menu code_snippet_library Ñîôòóåðíà áèáëèîòåêà +menu compile_farm Ôàáðèêà çà êîìïèëèðàíå +menu contact_us Âðúçêà ñ íàñ +group developers Ðàçðàáîò÷èöè +group developer_info Ó÷àñòíèöè â ïðîåêòà +menu discussion_forums Äèñêóñèîííè ôîðóìè +menu documentation Äîêóìåíòè +frs file_download Èçòåãëè +frs file_monitor Íàáëþäåíèå +frs file_notes Áåëåæêè +frs file_package Ìîäóë +frs file_version Âåðñèÿ +group long_bugs Ïðîñëåäÿâàíå íà ãðåøêè +group long_cvs CVS õðàíèëèùå +group long_docman Ïðîåêòíà äîêóìåíòàöèÿ +group long_forum Ïóáëè÷íè ôîðóìè +group long_ftp Àíîíèìíî FTP ïðîñòðàíñòâî +group long_homepage Íà÷àëíà ñòðàíèöà íà ïðîåêòà +group long_mail Ñïèñúöè ñ ïîëó÷àòåëè +group long_news Ïîñëåäíè íîâèíè +group long_patch Óïðàâëÿâàíå íà ïîïðàâêèòå +group long_pm Óïðàâëÿâàíå íà çàäà÷èòå +group long_support Óïðàâëÿâàíå íà ïîääðúæêàòà +group long_survey Äîïèòâàíå +group short_bugs Ãðåøêè +group short_cvs CVS +group short_docman Äîêóìåíòè +group short_files Filesgroup short_forum Ôîðóìè +group short_homepage Íà÷àëî +group short_mail Ïîëó÷àòåëè +group short_main Îñíîâíî +group short_news Íîâèíè +group short_patch Ïîïðàâêè +group short_pm Çàäà÷è +group short_summary Ðåçþìå +group short_support Ïîääðúæêà +group short_survey Ïðîó÷âàíèÿ +home highest_ranked_users Íàé-ïîïóëÿðíèòå ïîòðåáèòåëè +home about_blurb SourceForge å áåçïëàòíà óñëóãà çà ðàçðàáîòâàùèòå ñîôòóåð ñ îòâîðåí êîä, ïðåäëàãàùà ëåñåí äîñòúï äî íàé-äîáðîòî îò CVS, äèñêóñèîííè ôîðóìè, ïðîñëåäÿâàíå íà ãðåøêè, óïðàâëåíèå íà çàäà÷è, áåçïëàòíî óåá ïðîñòðàíñòâî, ïîñòîÿííî àðõèâèðàíå íà ôàéëîâåòå, ïúëíî ðåçåðâíî ïîäñèãóðÿâàíå íà ïðîåêòà, è íàïúëíî óåá áàçèðàíî àäìèíèñòðèðàíå. [ ïîâå÷å ] [ FAQ ]
       

      Âêëþ÷âàíå è îáðàòíà âðúçêà

      Çà äà ìîæå äà èçïîëçâàòå íàé-åôåêòèâíî SourceForge, ùå òðÿáâà äà ñå ðåãèñòðèðàòå êàòî ïîòðåáèòåë. Òîâà ùå âè ïîçâîëè äà ó÷àñòâàòå íàïúëíî âúâ âñè÷êî, êîåòî ïðåäëàãàìå. Ðàçáèðà ñå, ìîæåòå äà ðàçãëåæäàòå âñè÷êî è áåç ðåãèñòðèðàíå, íî òàêà ùå ñå ëèøèòå îò âúçìîæíîñòòà çà ïúëíî âêëþ÷âàíå â ðàçëè÷íèòå óñëóãè.

       
      Ñúçäàéòå ñâîé ïðîåêò

      Ðåãèñòðèðàéòå ñå êàòî ïîòðåáèòåë, ñëåä êîåòî âëåçòå â ñâîÿò ïðîôèë è íàêðàÿ ðåãèñòðèðàéòå âàøèÿò ïðîåêò.

      Áëàãîäàðèì âè... è ïðèÿòíî ïîëçâàíå íà óñëóãèòå íè. +frs latest_file_releases Ïîñëåäíèòå èçëåçëè ôàéëîâå +menu login Âõîä (SSL çàùèòåíà âðúçêà) +menu logout Èçõîä +home most_active_this_week Íàé-àêòèâíè ïðåç òàçè ñåäìèöà +menu my_personal_page Ëè÷íà ñòðàíèöà +menu new_project Ðåãèñòðèðàíå íà íîâ ïðîåêò +menu new_releases Íîâîèçëåçëè +menu new_user Íîâ ïîòðåáèòåë (SSL çàùèòåíà âðúçêà) +menu other_site_mirrors Îãëåäàëíè êîïèÿ +menu project_admin Àäìèíèñòðèðàíå íà ïðîåêò +group project_admins Àäìèíèñòðàòîðè +menu project_help_wanted Ïðîåêòè òúðñåùè ïîìîù +menu project_summary Îáùà èíôîðìàöèÿ çà ïðîåêòà +group public_area Îáùîäîñòúïíè ìåñòà +menu search Òúðñåíå +menu software_map Êàðòà íà ñîôòóåðà +home sourceforge_statistics SourceForge ñòàòèñòèêà +menu top_projects Òîï ïðîåêòè +home top_project_downloads Íàé-ïîïóëÿðíèòå ïðîåêòè +conf content_encoding windows-1251 +conf default_font verdana,arial,helvetica,sans-serif +conf language_code bg +conf language_id 20 diff --git a/gforge/www/include/languages/Catalan.tab b/gforge/www/include/languages/Catalan.tab new file mode 100644 index 0000000000..68318805bd --- /dev/null +++ b/gforge/www/include/languages/Catalan.tab @@ -0,0 +1,90 @@ +#/** +# * +# * Catalan message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Enric Mart­nez +# * +# */ +# +# ChangeLog: +# +# 2000-09-23 Enric Mart­nez +# * Initial translation +# 2000-10-16 Evilio del Rio +# * Corrections: +# Els meus criteris de correcciã s'han basat en els +# segìents punts: +# +# . Correciã ortogr fica (catal  central) +# . Correciã teminolâgica (programari, etc.) +# . Nom©s hi majêscules a la lletra inicial i noms propis. +# . D'altres criteris trets de Soft Catal  (utilitzaciã del "vos"). +# +menu account_maintenance Manteniment de compte +menu bookmark_page Página de marcadors +home breaking_down_barriers Trencant les barreres per al desenvolupament de codi obert +menu change_my_theme Canviar el meu tema +menu code_snippet_library Biblioteca de bocinets de codi +menu compile_farm Granja de compilació +menu contact_us Contacteu +group developers Desenvolupadors +group developer_info Informació del desenvolupador +menu discussion_forums Fòrums de discussiò +menu documentation Documentació local +frs file_download Descàrrega +frs file_monitor Monitor +frs file_notes Notes +frs file_package Paquet +frs file_version Versió +group long_bugs Seguiment d'errors +group long_cvs Repositori CVS +group long_docman Gestor de documents +group long_forum Fòrums públics +group long_ftp Espai de FTP anònim +group long_homepage Pàgina d'inici del projecte +group long_mail Llistas de correu +group long_news Últimes notícies +group long_patch Gestor de pegats +group long_pm Gestor de tasques +group long_support Gestor de suport tècnic +group long_survey Enquestes +group short_bugs Errades +group short_cvs CVS +group short_docman Documents +group short_files Filesgroup short_forum Fòrums +group short_homepage Pàgina de inici +group short_mail Llistes +group short_news Notícies +group short_patch Pegats +group short_pm Tasques +group short_summary Sumari +group short_support Suport tècnic +group short_survey Enquestes +home highest_ranked_users Usuaris més actius +home about_blurb SourceForge és unservei gratuït per a desenvolupadors deCodi obert oferint fàçil accés als millors repositoris CVS, llistes de discussió, seguiment d'errors, taulers de anuncis, fòrums, gestió de tasques, hostatge de llocs web, arxius permanent de fitxers, còpies de seguretat completes i administració totalment basada en web. [ mes ] [ FAQ ]
       

      Retorn i participació

      Per poder obtenir el màxim de SourceForge, haureu d'enregistrar-vos com a usuari del lloc. Això us permetrà participar plenament en tot el que tenim per oferir. Podreu, és clar, navegar pel lloc sense enregistrar-vos, però no tindreu l'opció de participar plenament.

       
      Feu el vostre propi projecte

      Enregistreu-vos com a usuari del lloc, amb el vostre usuari i finalment, Doneu d'alta el vostre projecte.

      Moltes Gràcies... i gaudiu del lloc. +frs latest_file_releases Últimes versions dels arxius +menu login Accés via SSL +menu logout Sortir +home most_active_this_week El més actiu aquesta setmana +menu my_personal_page La meva pàgina personal +menu new_project Enregistrar un projecte nou +menu new_releases Noves sortides +menu new_user Usuari nou via SSL +menu other_site_mirrors Miralls d'altres llocs +menu project_admin Admininstració de projectes +group project_admins Administradors del projecte +menu project_help_wanted Es necessita ajuda per projectes +menu project_summary Sumari de projectes +group public_area Área pública +menu search Cercar +menu software_map Mapa de programari +home sourceforge_statistics Estadístiques de SourceForge +menu top_projects Projectes senyers +home top_project_downloads Projectes més descarregats +conf language_code ca +conf language_id 14 diff --git a/gforge/www/include/languages/Chinese.tab b/gforge/www/include/languages/Chinese.tab new file mode 100644 index 0000000000..c56ea1c911 --- /dev/null +++ b/gforge/www/include/languages/Chinese.tab @@ -0,0 +1,82 @@ +#/** +# * +# * Traditional Chinese message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Yu-Jui Lee +# * +# */ +# ChangeLog: +# +# 2000-10-01 Yu-Jui Lee +# * Initial translation +# +menu account_maintenance ±b¸¹ºûÅ@ +menu bookmark_page ®ÑÅÒ +home breaking_down_barriers ¬°¶}©ñ·½½Xªºµo®i¶}ÅP¤@±ø©Z³~ +menu change_my_theme ¥DÃDÅܧó +menu code_snippet_library ¤p¤ùÂ_·½½Xµ{¦¡®w +menu compile_farm ½sĶ¥D¾÷¸s +menu contact_us Ápµ¸§Ú­Ì +group developers ¶}µoªÌ +group developer_info ¶}µoªÌ¸ê°T +menu discussion_forums ½×¾Â +menu documentation ¤å¥ó +frs file_download ÀɮפU¸ü +frs file_monitor ºÊ¬Ý +frs file_notes ªþµù +frs file_package ÀÉ®×¥]»q +frs file_version Àɮת©¥» +group long_bugs ¯ä¦ä°lÂÜ +group long_cvs CVSµ{¦¡®w +group long_docman ±M®×¤å¥ó +group long_forum ¤½¦@½×¾Â +group long_ftp °Î¦WFTPªÅ¶¡ +group long_homepage ±M®×­º­¶ +group long_mail ¹q¤l¶l¥ó°Q½×¸s +group long_news ³Ì·s®ø®§ +group long_patch ­×¸ÉºÞ²zªÌ +group long_pm ¤u§@ºÞ²zªÌ +group long_support §Þ³N¤ä´©ºÞ²zªÌ +group long_survey ½Õ¬d +group short_bugs ¯ä¦ä +group short_cvs CVS +group short_docman ¤å¥ó +group short_files Filesgroup short_forum ½×ôÎ +group short_homepage ­º­¶ +group short_mail ¹q¤l¶l¥ó +group short_main ¥D­n +group short_news ·s»D +group short_patch ­×¸É +group short_pm ¤u¥ó +group short_summary ºK­n +group short_support ¤ä´© +group short_survey ½Õ¬d +home highest_ranked_users ³Ì°ªµû»ù¥Î¤á±Æ¦æº] +home about_blurb SourceForge¬°¤@´£¨Ñ§K¶OªA°Èµ¹ ¶}©ñ·½½Xµo®iªÌªººô¯¸ ¥]¬A¤FCVS, ¶l¥ó°Q½×¸s, ¯ä¦ä°lÂܨt²Î, °T®§½×¾Â, ¤u§@ºÞ²z, ºô¯¸ªÅ¶¡, ÀÉ®×Àx¦s, §¹¾ãªºÀɮ׳ƥ÷, ¥B§¹¥þ¥Hweb-based¨ÓºÞ²z. [ more ] [ FAQ ]
       

      ½Ð¥ß§Y¥[¤J¨Ã¤£§[«ü±Ð

      ¬°¥R¤À§Q¥ÎSourceForge©Ò´£¨ÑªºªA°È, ½Ð¥ß§Yµù¥U¦¨¬° ¥»¯¸¥Î¤á. ±z±N¯à¥R¤À°Ñ»P¥»¯¸©Ò´£¨Ñªº¦U¶µ¬¡°Ê, ±z­Y©|¥¼µù¥U¦¨¬°¥Î¤á, ¤´¯àÂsÄý¥»¯¸, ¦ýµLÅv¥R¥÷°Ñ»P¥»¯¸¬¡°Ê.

       
      ³]¸m±z¦Û¤vªº±M®×

      µù¥U¦¨¬°¥»¯¸¥Î¤á, ±µµÛ µn¤J ³Ì«á, µù¥U±zªº±M®×.

      ÁÂÁ±z... ¨Ã¯¬¨Ï¥Î¥»¯¸´r§Ö. +frs latest_file_releases ³Ì·sÀÉ®×µoªí +menu login ¸g¥ÑSSLµn¤J +menu logout µn¥X +home most_active_this_week ¥»¶g¬¡°Ê¤O³Ì±j±Æ¦æº] +menu my_personal_page §Úªº­º­¶ +menu new_project ·s±M®×µn¿ý +menu new_releases ·sµoªí³nÅé +menu new_user ¸g¥ÑSSL·s¥Î¤áµù¥U +menu other_site_mirrors ¨ä¥¦¬M®gºô¯¸ +menu project_admin ±M®×ºûÅ@ +group project_admins ±M®×ºÞ²zªÌ +menu project_help_wanted ¼x¨D¨ó§U +menu project_summary ±M®×ºK­n +group public_area ¤½¦@°Ï°ì +menu search ·j´M +menu software_map ³nÅé¤ÀÃþªí +home sourceforge_statistics SourceForge²Î­p¸ê®Æ +menu top_projects ¼öªù±M®× +home top_project_downloads ¼öªù±M®×¤U¸ü±Æ¦æº] +conf content_encoding BIG5 +conf language_code zh-TW +conf language_id 11 diff --git a/gforge/www/include/languages/Dutch.tab b/gforge/www/include/languages/Dutch.tab new file mode 100644 index 0000000000..be2b27d458 --- /dev/null +++ b/gforge/www/include/languages/Dutch.tab @@ -0,0 +1,83 @@ +#/** +# * +# * Dutch message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * +# */ +# +# ChangeLog: +# +# 2000-10-01 +# * Initial translation, based on CVS revision 1.15 of BaseLanguage.class +# +menu account_maintenance Account onderhouden +menu bookmark_page Bladwijzer van deze pagina maken +home breaking_down_barriers Breaking Down the Barriers to Open Source Development +menu change_my_theme Mijn thema wijzigen +menu code_snippet_library Code-knipsels bibliotheek +menu compile_farm Compilatie boerderij +menu contact_us Neem contact met ons op +group developers Ontwikkelaars +group developer_info Ontwikkelaar Info +menu discussion_forums Discussie forums +menu documentation Site documentatie +frs file_download Downloaden +frs file_monitor Monitor +frs file_notes Notitites +frs file_package Pakket +frs file_version Versie +group long_bugs Bug Tracking +group long_cvs CVS Repository +group long_docman DocManager: documentatie van project +group long_forum Publieke Forums +group long_ftp Anonieme FTP-ruimte +group long_homepage Homepage van project +group long_mail Mailing Lijsen +group long_news Laatste nieuws +group long_patch Patch Manager +group long_pm Takenmanager +group long_support Technische ondersteuningsmanager +group long_survey Enquêtes +group short_bugs Bugs +group short_cvs CVS +group short_docman Documentatie +group short_files Filesgroup short_forum Forums +group short_homepage Homepage +group short_mail Lijsten +group short_main Hoofd +group short_news Nieuws +group short_patch Patches +group short_pm Taken +group short_summary Samenvatting +group short_support Ondersteuning +group short_survey Enquêtes +home highest_ranked_users Gebruikers met de hoogste rang +home about_blurb SourceForge is een gratis service voor Open Source ontwikkelaars die gemakkelijke toegang tot het beste in CVS, mailing lijsen, bug tracking, berichtborden/forums, task management, site hosting, permanent file archival, full backups, en totale web-gebaseerde administratie geeft. [ meer ] [ FAQ ]
       

      Site feedback en hoe mee te doen

      Om het meeste uit SourceForge te halen, moet u naar registreren als een site gebruiker gaan. Dit stelt u in staat om volledig mee te doen met alles wat we te bieden hebben. U kan natuurlijk de site doorkijken zonder te registreren, maar u kan niet volledig meedoen.

       
      Uw eigen project opzetten

      Registreren als een site gebruiker, dan Inloggen en uiteindelijk, Nieuw project registreren.

      Bendankt... en veel succes met de site. +frs latest_file_releases Laatste bestandsuitgaven +menu login Inloggen via SSL +menu logout Uitloggen +home most_active_this_week Meest actief deze week +menu my_personal_page Mijn persoonlijke pagina +menu new_project Nieuw project registreren +menu new_releases Nieuwe uitgaves +menu new_user Nieuwe gebruiker via SSL +menu other_site_mirrors Andere site mirrors +menu project_admin Projectadministratie +group project_admins Project administrators +menu project_help_wanted Hulp gevraagd bij projecten +menu project_summary Projectsamenvatting +group public_area Publieke gebieden +menu search Zoeken +menu software_map Software kaart +home sourceforge_statistics SourceForge Statistieken +menu top_projects Top Projecten +home top_project_downloads Top projectendownloads +conf content_encoding iso-8859-1 +conf default_font verdana,arial,helvetica,sans-serif +conf language_code nl +conf language_id 12 diff --git a/gforge/www/include/languages/English.tab b/gforge/www/include/languages/English.tab new file mode 100644 index 0000000000..409e2c039f --- /dev/null +++ b/gforge/www/include/languages/English.tab @@ -0,0 +1,11 @@ +#/** +# * +# * English message catalog (empty) +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * +# */ diff --git a/gforge/www/include/languages/Esperanto.tab b/gforge/www/include/languages/Esperanto.tab new file mode 100644 index 0000000000..f047188fe6 --- /dev/null +++ b/gforge/www/include/languages/Esperanto.tab @@ -0,0 +1,97 @@ +#/** +# * +# * Esperanto message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Jim Kingdon +# * +# */ +# +# ChangeLog: +# +# 2000-10-14 Jim Kingdon +# * Initial translation +# 2000-10-26 FAGOT Alain +# * surbaze de jam ekzistanta traduko, gxustigoj laux +# Komputada Leksikono (spelling/lexical corrections) +# +# Mozilo, kaj (mi kredas) IE povas uzi la e-a signojn de +# UTF-8. Netcapo 4.x havas UTF-8, sed sen la e-aj signoj. +# Majuskla Minuskla +# Cx: Ĉ cx: ĉ +# Gx: Ĝ gx: ĝ +# Hx: Ĥ hx: ĥ +# Jx: Ĵ jx: ĵ +# Sx: Ŝ sx: ŝ +# Ux: Ŭ ux: ŭ +about_foundries about_blurb Pri fandejoj +menu about_sourceforge Pri SourceForge +menu account_maintenance Modifu konton +menu bookmark_page Legosignoj +home breaking_down_barriers Forigu obstaklojn por skribi liberajn programojn +menu change_my_theme Ŝanĝu aspekton +menu code_snippet_library Biblioteko de programeroj +menu compile_farm Muntejaj komputiloj +menu contact_us Kontaktu nin +group developers Programantoj +group developer_info Programanta informo +menu discussion_forums Forumoj de diskuto +menu documentation Dokumentado +frs file_download Elŝutu +frs file_monitor Priatenti dosieron +frs file_notes Notoj +frs file_package Pakaĵo +frs file_version Redakto +group long_bugs Cimilo +group long_cvs CVSejo +group long_docman Dokumentilo +group long_forum Publikaj Forumoj +group long_ftp Anonima FTPejo +group long_homepage Projekta hejmpaĝo +group long_mail Dissendolistoj +group long_news Lastaj novaĵoj +group long_patch Flikilo +group long_pm Taskilo +group long_support Subtenilo +group long_survey Demandilo +group short_bugs Cimoj +group short_cvs CVS +group short_docman Dokumentoj +group short_files Filesgroup short_forum Forumoj +group short_homepage Hejmpaĝo +group short_mail Listoj +group short_main Ĉefa paĝo +group short_news Novaĵoj +group short_patch Flikoj +group short_pm Taskoj +group short_summary Resumo +group short_support Subteno +group short_survey Demandilo +home highest_ranked_users Supre Rangitaj uzantoj +home about_blurb SourceForge estas senpaga servo por programantoj de Liberaj Programoj, kiu enhavas facilan uzon de la plej bonaj ecoj en CVS, retpoŝtaj listoj, cimilo, diskutforumoj, taskilo, reta gastigo, daŭra arkivo de dosieroj, bendarkivado, kaj TTTeja administrado. [ pli ] [ OD ]
       

      SourceForge reenmeto kaj partoprenado

      Por uzi SourceForge plene, vi bezonas registriĝi kiel uzanto. Vi povas rigardi SourceForge sen registriĝi sed ne partopreni plene.

       
      Aldonu Projekton

      Registriĝi kiel uzanto, poste Saluti kaj finfine, Registriĝi vian projekton.

      Dankon... kaj ĝuu SourceForge. +frs latest_file_releases Lastaj dosieraj redaktoj +menu login Salutu per SSL +menu logout Adiaŭu +home most_active_this_week Plej aktiva ĉi tiu semajno +menu my_personal_page Mia propra paĝo +menu new_project Nova projekto +menu new_releases Novaj versioj +menu new_user Nova uzanto per SSL +menu other_site_mirrors Speguloj +menu project_admin Administru projekton +group project_admins Projektaj estraranoj +menu project_help_wanted Projekthelpo dezirata +menu project_summary Projekta resumo +group public_area Publikaj regionoj +menu search Serĉu +menu software_map Mapo de programoj +home sourceforge_statistics Statistikaĵoj de SourceForge +menu top_projects Plej aktivaj projektoj +home top_project_downloads Plej aktivaj projektaj elŝutoj +conf content_encoding UTF-8 +conf language_code eo +conf language_id 13 diff --git a/gforge/www/include/languages/French.tab b/gforge/www/include/languages/French.tab new file mode 100644 index 0000000000..c40f6ebf09 --- /dev/null +++ b/gforge/www/include/languages/French.tab @@ -0,0 +1,86 @@ +#/** +# * +# * French message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Olivier Gerard +# * +# */ +# +# ChangeLog: +# +# 2000-09-25 Olivier Gerard +# * Initial translation +# 2000-10-15 Alexandre Aufrere +# * Translation and correction +# +menu account_maintenance Gestion du Compte +menu bookmark_page Favoris +home breaking_down_barriers Abaisser les barrières du développement Open Source +menu change_my_theme Changement du Thème +menu code_snippet_library Bibliothèque de Code +menu compile_farm Ferme de Compilation +menu contact_us Contact +group developers Développeurs +group developer_info Informations pour Développeurs +menu discussion_forums Forums de Discussion +menu documentation Documentation +frs file_download Téléchargement +frs file_monitor Surveillance +frs file_notes Remarques +frs file_package Package +frs file_version Version +group long_bugs Gestion des Bugs +group long_cvs Référentiel CVS +group long_docman Gestion de la Documentation +group long_forum Forums de Discussion +group long_ftp Espace FTP Anonyme +group long_homepage Page d'Accueil +group long_mail Listes de Diffusion +group long_news Dernières nouveautés +group long_patch Gestion des Corrections +group long_pm Gestion de Projet +group long_support Support Technique +group long_survey Sondages +group short_bugs Bugs +group short_cvs CVS +group short_docman Documentation +group short_files Filesgroup short_forum Forums +group short_homepage Accueil +group short_mail Mailing-listes +group short_main Ecran Principal +group short_news Nouveautés +group short_patch Patches +group short_pm Tâches +group short_summary Survol +group short_support Support +group short_survey Sondages +home highest_ranked_users Les Développeurs les Mieux Classés +home about_blurb SourceForge est un service gratuit pour les développeurs Open Source. SourceForge offre l'accès le plus simple aux meilleurs services CVS, listes de diffusion, gestion des bugs, forums de discussion, gestion des tâches, hébergement de site, archivage de fichiers, sauvegardes complètes, etc. via une interface d'administration entièrement par le web. [ plus ] [ FAQ ]
       

      Participation des développeurs

      Pour pouvoir utiliser SourceForge au mieux, il est necéssaire de s'enregistrer comme un développeur officiel. Cela vous permettra de profiter de tous ce que nous avons à vous offrir. Vous pouvez bien entendu parcourir le site sans vous enregistrer, mais vous ne pourrez pas y participer pleinement.

       
      Créer un nouveau projet

      Enregistrez-vous comme développeur, then Connectez-vous puis, Enregistrez votre Projet.

      Merci... et nous espérons que vous aimerez SourceForge! +frs latest_file_releases Dernières révisions des fichiers +menu login Connexion via SSL +menu logout Sortir +home most_active_this_week Les Plus Actifs cette Semaine +menu my_personal_page Ma Page Personnelle +menu new_project Nouveau Projet +menu new_releases Nouvelles Révisions +menu new_user Nouvel Utilisateur via SSL +menu other_site_mirrors Mirroirs d'Autres Sites +menu project_admin Admin. du Projet +group project_admins Admins. du Projet +menu project_help_wanted Demande d'Aide +menu project_summary Résumé du Projet +group public_area Zones Publiques +menu search Recherche +menu software_map Rech. Thématique +home sourceforge_statistics Statistiques de SourceForge +menu top_projects Meilleurs Projets +home top_project_downloads Projets les plus Téléchargés +conf content_encoding iso-8859-1 +conf default_font verdana,arial,helvetica,sans-serif +conf language_code fr +conf language_id 7 diff --git a/gforge/www/include/languages/German.tab b/gforge/www/include/languages/German.tab new file mode 100644 index 0000000000..ce7027cd11 --- /dev/null +++ b/gforge/www/include/languages/German.tab @@ -0,0 +1,84 @@ +#/** +# * +# * German message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Matthias Bauer +# * +# */ +# +# ChangeLog: +# +# 2000-10-15 Matthias Bauer +# * Initial translation +# +menu about_sourceforge Über SourceForge +menu account_maintenance Accountverwaltung +menu bookmark_page Lesezeichen +home breaking_down_barriers Wir reissen die Mauern zu Open-Source-Entwicklung nieder +menu change_my_theme Theme ändern +menu code_snippet_library Codeschnipsel-Sammlung +menu compile_farm Compile-Farm +menu contact_us Kontakt +group developers Entwickler +group developer_info Entwicklerinformationen +menu discussion_forums Diskussionsforen +menu documentation Dokumentation +frs file_download Downloaden +frs file_monitor Überwachen +frs file_notes Anmerkungen +frs file_package Paket +frs file_version Version +group long_bugs Bugtracking +group long_cvs CVS-Baum +group long_docman DocManager: Projekt-Dokumentation +group long_forum Öffentliche Foren +group long_ftp Anonymer FTP-Zugriff +group long_homepage Projekthomepage +group long_mail Mailinglisten +group long_news Letzte Neuigkeiten +group long_patch Patch-Verwaltung +group long_pm Aufgaben-Verwaltung +group long_support Support-Verwaltung +group long_survey Umfragen +group short_bugs Bugs +group short_cvs CVS +group short_docman Dokumentation +group short_files Filesgroup short_forum Foren +group short_homepage Homepage +group short_mail Mailinglisten +group short_news Neuigkeiten +group short_patch Patches +group short_pm Aufgaben +group short_summary Überblick +group short_support Support +group short_survey Umfragen +home highest_ranked_users Am höchsten eingestufte Benutzer +home about_blurb SourceForge ist ein freier Dienst für Open Source Entwickler und bietet einfachen Zugang zu dem Besten aus CVS, Mailinglisten, Bug-Tracking, Diskussionsforen, Aufgabenverwaltung, Webhosting, dauerhafte Dateiarchivierung, Backups und vollständige Verwaltung per Web-Interface. [ mehr ] [ FAQ ]
       

      Feedback und Teilnahme an der Site

      Um SourceForge bestmöglich zu nutzen, sollten Sie sich als Benutzer anmelden. Mit einem Benutzeraccount können Sie am vollen Spektrum der Website teilhaben. Natürlich können Sie SourceForge auch ohne Registrierung nutzen, haben dann allerdings nicht auf alle Bereiche vollen Zugriff.

       
      Starten Sie Ihr eigenes Projekt

      Melden Sie sich als Benutzer an, loggen Sie sich ein und registrieren Sie Ihr Projekt!

      Vielen Dank. Sie machen eine einfache Webseite sehr glücklich. +frs latest_file_releases Letzte Dateireleases +menu login Einloggen (SSL) +menu logout Ausloggen +home most_active_this_week Aktivste Projekte in dieser Woche +menu my_personal_page Personalisierte Seite +menu new_project Neues Projekt +menu new_releases Neue Releases +menu new_user Neuer Benutzer (SSL) +menu other_site_mirrors Mirrors +menu project_admin Projektadministrator +group project_admins Projektbetreuer +menu project_help_wanted Projekthilfe gesucht +menu project_summary Projektübersicht +group public_area Öffentliche Bereiche +menu search Suche +menu software_map Softwarekarte +home sourceforge_statistics SourceForge Statistieken +menu top_projects Top-Projekte +home top_project_downloads Populärste Downloads (nach Projekten) +conf content_encoding iso-8859-1 +conf default_font verdana,arial,helvetica,sans-serif +conf language_code de +conf language_id 6 diff --git a/gforge/www/include/languages/Greek.tab b/gforge/www/include/languages/Greek.tab new file mode 100644 index 0000000000..7fdf368a29 --- /dev/null +++ b/gforge/www/include/languages/Greek.tab @@ -0,0 +1,84 @@ +#/** +# * +# * Greek message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Simos Xenitellis +# * +# */ +# +# ChangeLog: +# +# 2000-10-15 Simos Xenitellis +# * Initial translation +# +menu account_maintenance ÅíçìÝñùóç Ëïãáñéáóìïý +menu bookmark_page Óåëßäá ÁãáðçìÝíùí +home breaking_down_barriers Êáôáëýùíôáò ôïõò öñáãìïýò óôçí ÁíÜðôõîç Åëåýèåñïõ Ëïãéóìéêïý +menu change_my_theme ÁëëáãÞ ôïõ ÈÝìáôüò Ìïõ +menu code_snippet_library ÂéâëéïèÞêç ØçãìÜôùí Êþäéêá +menu compile_farm ÖÜñìá Ìåôáãëþôôéóçò +menu contact_us Åðéêïéíùíßóôå ìáæß ìáò +group developers ÐñïãñáììáôéóôÝò +group developer_info Ðëçñïöïñßåò ÐñïãñáììáôéóôÞ +menu discussion_forums ÂÞìá ÓõæçôÞóåùí +menu documentation Ôåêìçñßùóç ÓõóôÞìáôïò +frs file_download Ìåôáöüñôùóç +frs file_monitor Ðáñáêïëïýèçóç +frs file_notes Óçìåéþóåéò +frs file_package ÐáêÝôï +frs file_version ¸êäïóç +group long_bugs Ðáñáêïëïýèçóç ÓöáëìÜôùí +group long_cvs ÁðïèÞêç CVS +group long_docman DocManager: Project Documentation +group long_forum Äçìüóéá ÂÞìáôá +group long_ftp ×þñïò Áíþíõìïõ FTP +group long_homepage Áñ÷éêÞ Óåëßäá ¸ñãïõ +group long_mail Ëßóôåò Óõíäñïìçôþí +group long_news Ôåëåõôáßá ÍÝá +group long_patch Äéá÷åéñéóôÞò ÅðéññáìÜôùí +group long_pm Äéá÷åéñéóôÞò Åñãáóéþí +group long_support Äéá÷åéñéóôÞò ÕðïóôÞñéîçò ÐñïãñÜììáôïò +group long_survey ¸ñåõíåò +group short_bugs ÓöÜëìáôá +group short_cvs CVS +group short_docman Ôåêìçñßùóç +group short_files Filesgroup short_forum ÂÞìáôá +group short_homepage Ðñþôç Óåëßäá +group short_mail Ëßóôåò +group short_main Êýñéï +group short_news ÍÝá +group short_patch ÅðéññÜìáôá +group short_pm Åñãáóßåò +group short_summary ÐåñéëÞøç +group short_support ÕðïóôÞñéîç +group short_survey ¸ñåõíåò +home highest_ranked_users ×ñÞóôåò Ìåãáëýôåñçò Áîéïëüãçóçò +home about_blurb Ôï SourceForge åßíáé ìéá åëåýèåñç õðçñåóßá ãéá Open Source ðñïãñáììáôéóôÝò ðïõ ðñïóöÝñåé åýêïëç ðñüóâáóç óôá êáëýôåñá ÷áñáêôçñéóôéêÜ ôïõ CVS, ôùí ëéóôþí óõíäñïìçôþí, ôçò ðáñáêïëïýèçóçò óöáëìÜôùí, ôùí âçìÜôùí óõæçôÞóåùí, ôçò äéá÷åßñçóçò åñãáóéþí, ôçò åîõðçñÝôçóçò äéêôõáêþí ôüðùí, ôçò ìüíéìçò áñ÷åéïèÝôçóçò áñ÷åßùí, ôçò äçìéïõñãßáò ðëÞñùí áíôéãñÜöùí áóöáëåßáò êáé ôçò ïëéêÞò äéá÷åßñéóçò ìÝóá áðü ôï WWW. [ more ] [ FAQ ]
       

      ÁíÜäñáóç Äéêôõáêïý Ôüðïõ êáé Óõììåôï÷Þ

      Ãéá íá åðùöåëçèåßôå ôá ìÝãéóôá áðü ôï SourceForge, èá ðñÝðåé íá åããñáöåßôå ùò ÷ñÞóôçò óõóôÞìáôïò. Áõôü èá óáò åðéôñÝøåé íá óõììåôÜó÷åôå ðëÞñùò óå üëá üóá Ý÷ïõìå íá ðñïóöÝñïõìå. ÖõóéêÜ, ìðïñåßôå íá ðåñéçãçèÞôå óå áõôü ôï äéêôõáêü ôüðï ÷ùñßò åããñáöÞ, ùóôüóï äå èá Ý÷åôå ðñüóâáóç íá óõììåôÜó÷åôå ðëÞñùò.

       
      Åêêßíçóç ôïõ Äéêïý óáò ¸ñãïõ

      Åããñáöåßôå ùò ÷ñÞóôçò óõóôÞìáôïò, Ýðåéôá Óýíäåèåßôå êáé ôÝëïò, ÅããñÜøåôå ôï ¸ñãï óáò.

      Åõ÷áñéóôïýìå... êáé íá ðåñÜóåôå êáëÜ óôï äéêôõáêü óáò ôüðï. +frs latest_file_releases Ôåëåõôáßåò Åêäüóåéò Áñ÷åßùí +menu login Óýíäåóç ìÝóù SSL +menu logout Áðïóýíäåóç +home most_active_this_week Ðåñéóóüôåñï Åíåñãü ãéá ÁõôÞí ôçí ÅâäïìÜäá +menu my_personal_page Ç ÐñïóùðéêÞ ìïõ Óåëßäá +menu new_project Êáôá÷þñéóç ÍÝïõ ¸ñãïõ +menu new_releases ÍÝåò Åêäüóåéò +menu new_user ÍÝïò ×ñÞóçò ìÝóù SSL +menu other_site_mirrors ¶ëëá ÓõóôÞìáôá Êáèåðôñéóìïý +menu project_admin Äéá÷åéñéóôÞò ¸ñãïõ +group project_admins Äéá÷åéñéóôÝò ¸ñãïõ +menu project_help_wanted Æçôåßôå ÂïÞèåéá ¸ñãïõ +menu project_summary Ðåñßëçøç ¸ñãïõ +group public_area Äçìüóéåò Ðåñéï÷Ýò +menu search ÁíáæÞôçóç +menu software_map ×Üñôçò Ëïãéóìéêïý +home sourceforge_statistics ÓôáôéóôéêÜ SourceForge +menu top_projects Êïñõöáßá ¸ñãá +home top_project_downloads Êïñõöáßåò Ìåôáöïñôþóåéò ¸ñãùí +conf content_encoding iso-8859-7 +conf default_font verdana,arial,helvetica,sans-serif +conf language_code el +conf language_id 19 diff --git a/gforge/www/include/languages/Hebrew.tab b/gforge/www/include/languages/Hebrew.tab new file mode 100644 index 0000000000..a55b6ab7e0 --- /dev/null +++ b/gforge/www/include/languages/Hebrew.tab @@ -0,0 +1,78 @@ +#/** +# * +# * Hebrew message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Sagi Bashari +# * +# */ +# +# ChangeLog: +# +# 2000-09-24 Sagi Bashari +# * Initial translation +# +menu account_maintenance ïåáùç ú÷åæçú +menu bookmark_page íéôãòåî +home breaking_down_barriers éùôåç ãå÷ çåúéôì íåñçîä úà íéøáåù +menu change_my_theme øúàä äàøî úà äðù +menu code_snippet_library ãå÷ éòè÷ úééøôñ +menu compile_farm äéöéìôîå÷ úååç +menu contact_us øù÷ øåö +group developers íéçúôî +group developer_info çúôîä éèøô +menu discussion_forums íéîåøåô +menu documentation íéðåù íéëîñî +frs file_download äãøåä +frs file_monitor çéâùî +frs file_notes úåøòä +frs file_package úåìéáç +frs file_version úåàñøâ +group long_bugs úåì÷ú øçà á÷òî +group long_cvs CVS øâàî +group long_docman íéëîñî ìäðî +group long_forum íéçåúô íéîåøåô +group long_ftp éîéðåðà éôéèôà úåøù +group long_homepage è÷éåøôä øúà +group long_mail øååéã úåîéùø +group long_news úåðåøçà úåùãç +group long_patch íéðå÷éú ìäðî +group long_pm úåîéùî ìäðî +group long_support úéðëè äëéîú ìäðî +group long_survey úåøé÷ñ +group short_bugs úåì÷ú +group short_cvs CVS +group short_docman íéëîñî +group short_files Filesgroup short_forum íéîåøåô +group short_homepage úéá øúà +group short_mail úåîéùø +group short_news úåùãç +group short_patch íéðå÷éú +group short_pm úåîéùî +group short_summary íéèøô +group short_support äëéîú +group short_survey úåøé÷ñ +home highest_ranked_users íéìéòô éëä íéùîúùîä +home about_blurb


      .éùôåç øå÷î ãå÷ éçúôîì úåøù àåä SourceForge
      ,íéîåøåô ,íéâàá øçà á÷òî ,øååéã úåîéùø ,CVS ì äèåùôå äáåè äùéâ íé÷ôñî åðçðà
      .áååäî ìåäéðì äùéâå ,íéàìî íééåáéâ ,òåá÷ íéöá÷ øâàî ,íéøúà úðñçà ,úåîéùî éìäðî
      [ úåáåùúå úåìàù ] [ ãåò ]

       

      úåôúúùäå áåùî

      êøúöú äúà SourceForge î øúåéá áåèä úà ìá÷ì ìéáùá
      .íéòéöî åðçðàù äî ìëì äàìî äùéâ êì àéáé äæ .øúàá ùîúùîë íùøäì
      .äàìî äùéâ êì äéäú àì ìáà ,íùøéäì éìá øúàá ùåìâì ïáåîë ìåëé äúà

       
      êìù è÷éåøôä úà íåùø

      .êìù è÷éåøôä úà íåùø óåñáìå ,ñðëú æàå øúàá ùîúùéîë íùøä

      .øúàä êúééäùî äðäúå ..äãåú

      +frs latest_file_releases úåðåøçà äðëåú úåàñøâ +menu login çèáåàî úøù êøã äñéðë +menu logout äàéöé +home most_active_this_week òåáùä íéìéòô éëä +menu my_personal_page éùéà ãåîò +menu new_project ùãç è÷éåøô íåùø +menu new_releases úåùãç úåàñøâ +menu project_admin è÷éåøô ìäðî +group project_admins íéè÷éåøô éìäðî +menu project_help_wanted íéè÷éåøôì íéùåøã +menu project_summary è÷éåøô úåöîú +menu search ùåôéç +menu software_map úåðëåú úôî +home sourceforge_statistics SourceForge úå÷éèñéèñ +home top_project_downloads íéìéòô éëä íéè÷éåøôä +conf content_encoding iso-8859-8 +conf default_font xxzx-random-font\" size=\"1 +conf language_id 3 diff --git a/gforge/www/include/languages/Indonesian.tab b/gforge/www/include/languages/Indonesian.tab new file mode 100644 index 0000000000..77f71ee195 --- /dev/null +++ b/gforge/www/include/languages/Indonesian.tab @@ -0,0 +1,84 @@ +#/** +# * +# * Indonesian message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Antonio Wawolangi +# * +# */ +# +# ChangeLog: +# +# 2000-10-17 Antonio Wawolangi +# * Initial translation +# +menu account_maintenance Pemeliharaan Account +menu bookmark_page Halaman Bookmark +home breaking_down_barriers Menumpas Halangan Dalam Pengembangan Open Source +menu change_my_theme Rubah Theme +menu code_snippet_library Pustaka Code Snippet +menu compile_farm Peternakan Kompilasi +menu contact_us Kontak Kami +group developers Developer +group developer_info Info Developer +menu discussion_forums Forum-forum Diskusi +menu documentation Dokumentasi Situs +frs file_download Download +frs file_monitor Monitor +frs file_notes Catatan +frs file_package Paket +frs file_version Versi +group long_bugs Bug Tracking +group long_cvs Gudang CVS +group long_docman DocManager: Dokumentasi Proyek +group long_forum Forum Publik +group long_ftp Tempat Anonymous FTP +group long_homepage Home Page Proyek +group long_mail Milis +group long_news Berita Terbaru +group long_patch Manajer Patch +group long_pm Manajer Tugas +group long_support Manajer Tech Support +group long_survey Survey +group short_bugs Bugs +group short_cvs CVS +group short_docman Dokumentasi +group short_files Filesgroup short_forum Forum +group short_homepage Home Page +group short_mail Daftar +group short_main Utama +group short_news Berita +group short_patch Patches +group short_pm Tugas +group short_summary Ringkasan +group short_support Support +group short_survey Survey +home highest_ranked_users Pengguna Peringkat Tertinggi +home about_blurb SourceForge adalah layanan gratis untuk developer Open Source yang menawarkan akses mudah ke gudang CVS terbaik, milis, pencarian bug, papan pesan/forum-forum, manajemen tugas, hosting situs, pengarsipan file permanen, backup lengkap, dan semua diatur lewat web. [ selengkapnya ] [ FAQ ]
       

      Site Feedback and Partisipasi

      Untuk dapat menggunakan SourceForge secara maksimal, anda perlu mendaftarkan diri sebagai pengguna situs. Ini berarti memperbolehkan anda untuk berpartisipasi penuh dalam semua yang kami tawarkan. Walaupun tanpa pendaftaran anda dapat menggunakan SourceForge, akan tetapi tanpa mendaftarkan diri anda tidak dapat berpartisipasi secara penuh.

       
      Mendirikan Proyek Pribadi Anda

      Pendaftaran sebagai pengguna situs, then Login dan terakhir, Mendaftarkan Proyek Anda.

      Terima Kasih... dan selamat bergabung dengan SourceForge. +frs latest_file_releases File Keluaran Terbaru +menu login Login lewat SSL +menu logout Logout +home most_active_this_week Paling Aktif Minggu Ini +menu my_personal_page Halaman Pribadi +menu new_project Pendaftaran Proyek Baru +menu new_releases Keluaran Baru +menu new_user Pengguna Baru dengan SSL +menu other_site_mirrors Mirror Situs +menu project_admin Administrasi Proyek +group project_admins Adminstrator Proyek +menu project_help_wanted Proyek-proyek Perlu Bantuan +menu project_summary Ringkasan Proyek +group public_area Area Publik +menu search Cari +menu software_map Peta Software +home sourceforge_statistics Statistik SourceForge +menu top_projects Proyek-proyek Top +home top_project_downloads Proyek Top Downloads +conf content_encoding iso-8859-1 +conf default_font verdana,arial,helvetica,sans-serif +conf language_code id +conf language_id 21 diff --git a/gforge/www/include/languages/Italian.tab b/gforge/www/include/languages/Italian.tab new file mode 100644 index 0000000000..337b3adfc5 --- /dev/null +++ b/gforge/www/include/languages/Italian.tab @@ -0,0 +1,82 @@ +#/** +# * +# * Italian message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Dakkar +# * +# */ +# +# ChangeLog: +# +# 2000-09-23 Dakkar +# * Initial translation +# +menu account_maintenance Gestione account +menu bookmark_page Segna pagina +home breaking_down_barriers Abbattere le barriere allo sviluppo Open Source +menu change_my_theme Cambia il tema +menu code_snippet_library Raccolta frammenti di codice +menu compile_farm Compile Farm +menu contact_us Contattaci +group developers Sviluppatori +group developer_info Informazioni sugli Sviluppatori +menu discussion_forums Aree di Discussione +menu documentation Documentazione +frs file_download Scarica +frs file_monitor Controlla +frs file_notes Note +frs file_package Pacchetto +frs file_version Versione +group long_bugs Gestione Bug +group long_cvs Repository CVS +group long_docman Gestione Documentazione +group long_forum Aree di Discussione pubbliche +group long_ftp Spazio FTP anonimo +group long_homepage Home Page del progetto +group long_mail Mailing List +group long_news Ultime notizie +group long_patch Gestione Patch +group long_pm Gestione attività +group long_support Gestione supporto tecnico +group long_survey Sondaggi +group short_bugs Bug +group short_cvs CVS +group short_docman Doc. +group short_files Filesgroup short_forum Discussioni +group short_homepage Home Page +group short_mail ML +group short_main Principale +group short_news Notizie +group short_patch Patch +group short_pm Attività +group short_summary Sommario +group short_support Supporto +group short_survey Sondaggi +home highest_ranked_users I Migliori +home about_blurb SourceForge è un servizio gratuito per gli sviluppatori Open Source che offre un facile accesso ai migliori strumenti per CVS, mailing list, gestione bug, aree di discussione, gestione attività, pubblicazione su web, archiviazione permanente dei file, backup completi, e amministrazione totalmente via web. [ per saperne di più ] [ FAQ ]
       

      Partecipate!

      Per ottenere il massimo da SourceForge, dovete registrarvi come utente . Questo vi permetterà di partecipare appieno a quello che abbiamo da offrirvi. Ovviamente potete visitare il sito senza registrarvi, ma non avrete la possibilità di partecipare.

       
      Avviate il vostro progetto

      Registratevi come utenti, quindi accedete e finalmente registrate il vostro progetto.

      Grazie... e divertitevi. +frs latest_file_releases Ultime Release +menu login Accesso via SSL +menu logout Fine sessione +home most_active_this_week I più attivi della settimana +menu my_personal_page La mia pagina personale +menu new_project Registra un nuovo progetto +menu new_releases Nuove Release +menu new_user Nuovo utente +menu other_site_mirrors Mirror di altri siti +menu project_admin Amministrazione Progetto +group project_admins Amministratori di Progetto +menu project_help_wanted Progetti in cerca di aiuto +menu project_summary Sommario del Progetto +group public_area Aree Pubbliche +menu search Ricerca +menu software_map Mappa Programmi +home sourceforge_statistics Statistiche SourceForge +menu top_projects Classifica Progetti +home top_project_downloads Progetti più scaricati +conf content_encoding iso-8859-1 +conf language_id 8 diff --git a/gforge/www/include/languages/Japanese.tab b/gforge/www/include/languages/Japanese.tab new file mode 100644 index 0000000000..a43e1530d6 --- /dev/null +++ b/gforge/www/include/languages/Japanese.tab @@ -0,0 +1,87 @@ +#/** +# * +# * Japanese message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Atsushi Kamoshida +# * +# */ +# +# ChangeLog: +# +# 2000-09-24 Atsushi Kamoshida +# * Initial translation +# 2000-10-28 Hirotaka Mizutani +# * Update +# +about_foundries about_blurb ¥Õ¥¡¥ó¥É¥ê¡¼¤Ë¤Ä¤¤¤Æ +menu about_sourceforge SourceForge¤Ë¤Ä¤¤¤Æ +menu account_maintenance ¥¢¥«¥¦¥ó¥È´ÉÍý +menu bookmark_page ¥Ö¥Ã¥¯¥Þ¡¼¥¯ +home breaking_down_barriers Breaking Down the Barriers to Open Source Development +menu change_my_theme ¥Æ¡¼¥Þ¤ÎÊѹ¹ +menu code_snippet_library Code Snippet Library +menu compile_farm ¥³¥ó¥Ñ¥¤¥ë´Ä¶­ +menu contact_us Ï¢ÍíÀè +group developers ³«È¯¼Ô +group developer_info ³«È¯¼Ô¾ðÊó +menu discussion_forums ¥Ç¥£¥¹¥«¥Ã¥·¥ç¥ó¥Õ¥©¡¼¥é¥à +menu documentation ¥µ¥¤¥È¥É¥­¥å¥á¥ó¥È +frs file_download ¥À¥¦¥ó¥í¡¼¥É +frs file_monitor ´Æ»ë +frs file_notes Ãí°Õ +frs file_package ¥Ñ¥Ã¥±¡¼¥¸ +frs file_version ¥Ð¡¼¥¸¥ç¥ó +group long_bugs ¥Ð¥°ÄÉÀ× +group long_cvs CVS¥ê¥Ý¥¸¥È¥ê +group long_docman ¥É¥­¥å¥á¥ó¥È¥Þ¥Í¡¼¥¸¥ã +group long_forum °ìÈ̸þ¤±¥Õ¥©¡¼¥é¥à +group long_ftp ƿ̾ FTP ¥¹¥Ú¡¼¥¹ +group long_homepage ¥×¥í¥¸¥§¥¯¥È¥Û¡¼¥à¥Ú¡¼¥¸ +group long_mail ¥á¡¼¥ê¥ó¥°¥ê¥¹¥È +group long_news ºÇ¿·¥Ë¥å¡¼¥¹ +group long_patch ¥Ñ¥Ã¥Á¥Þ¥Í¡¼¥¸¥ã +group long_pm ¥¿¥¹¥¯¥Þ¥Í¡¼¥¸¥ã +group long_support µ»½Ñ¥µ¥Ý¡¼¥È¥Þ¥Í¡¼¥¸¥ã +group long_survey Ä´ºº +group short_bugs ¥Ð¥° +group short_cvs CVS +group short_docman ¥É¥­¥å¥á¥ó¥È +group short_files Filesgroup short_forum ¥Õ¥©¡¼¥é¥à +group short_homepage ¥Û¡¼¥à¥Ú¡¼¥¸ +group short_mail ¥ê¥¹¥È +group short_main ¥á¥¤¥ó +group short_news ¥Ë¥å¡¼¥¹ +group short_patch ¥Ñ¥Ã¥Á +group short_pm ¥¿¥¹¥¯ +group short_summary ¥µ¥Þ¥ê +group short_support ¥µ¥Ý¡¼¥È +group short_survey Ä´ºº +home highest_ranked_users ¥æ¡¼¥¶ÊÌ¥é¥ó¥­¥ó¥° +home about_blurb SourceForge¤È¤Ï¥ª¡¼¥×¥ó¥½¡¼¥¹³« ȯ¼Ô¤ËCVS¡¢¥á¡¼¥ê¥ó¥°¥ê¥¹¥È¡¢¥Ð¥°ÄÉÀס¢·Ç¼¨ÈÄ¡¦¥Õ¥©¡¼¥é¥à¡¢¥¿¥¹¥¯´ÉÍý¡¢ ¥Û¥¹¥È¥Û¥¹¥Æ¥£¥ó¥°¡¢±Êµ×Ū¤Ê¥Õ¥¡¥¤¥ë¤ÎÊÝ´É¡¢´°Á´¤Ê¥Ð¥Ã¥¯¥¢¥Ã¥×¤µ¤é¤ËWeb¥Ù¡¼¥¹ ¤ÎÁí¹çŪ¤Ê´ÉÍý¤Ø¤ÎÍưפǺǹâ¤ÊÍøÍѤòÄ󶡤¹¤ë̵ÎÁ¤Î¥µ¡¼¥Ó¥¹¤Ç¤¹¡£ [ ¾ÜºÙ ] [ FAQ ]
       

      ¥µ¥¤¥È¤Ø¤Î°Õ¸«¤È»²²Ã

      SourceForge¤òºÇÂç¸Â³èÍѤ¹¤ë¤Ë¤Ï¥æ¡¼¥¶ÅÐÏ¿¤¹¤ëɬ Íפ¬¤¢¤ê¤Þ¤¹¡£¤½¤¦¤¹¤ë¤³¤È¤Ë¤è¤ê¤ï¤ì¤ï¤ì¤¬Ä󶡤¹¤ë¤¹¤Ù¤Æ¤Î¥µ¡¼¥Ó¥¹¤Ë»²²Ã ¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤â¤Á¤í¤óÅÐÏ¿¤·¤Ê¤¯¤È¤â¥µ¥¤¥È¤ò±ÜÍ÷¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤¹ ¤¬¡¢ÍøÍѤËÀ©¸Â¤¬¤¢¤ê¤Þ¤¹¡£

       
      ¼«Ê¬¤Î¥×¥í¥¸¥§¥¯¥È¤òºî¤ë

      ¤Þ¤º¥æ¡¼¥¶ÅÐÏ¿ ¤·¡¢¥í¥°¥¤¥ó ¤·¤Þ¤¹¡£¤½¤·¤Æ¥×¥í¥¸¥§¥¯ ¥È¤òÅÐÏ¿¤·¤Þ¤¹¡£

      ¤¢¤ê¤¬¤È¤¦¤´¤¶¤¤¤Þ¤¹¡£¤½¤·¤Æ¤³¤Î¥µ¥¤¥È¤Ç¤¼¤Ò³Ú¤·¤ó¤Ç¤¯¤À¤µ¤¤¡£ +frs latest_file_releases ºÇ¿·¤Î File ¥ê¥ê¡¼¥¹ +menu login SSL·Ðͳ¤Ç¥í¥°¥¤¥ó +menu logout ¥í¥°¥¢¥¦¥È +home most_active_this_week ºÇ¶á°ì½µ´Ö¤Ç³èȯ¤Ê¥×¥í¥¸¥§¥¯¥È +menu my_personal_page ¼«Ê¬¤Î¥Ú¡¼¥¸ +menu new_project ¿·µ¬¥×¥í¥¸¥§¥¯¥È¤ÎÅÐÏ¿ +menu new_releases ¿·µ¬¥ê¥ê¡¼¥¹ +menu new_user SSL·Ðͳ¤Ç¿·µ¬¥æ¡¼¥¶ºîÀ® +menu other_site_mirrors ¾¤Î¥ß¥é¡¼¥µ¥¤¥È +menu project_admin ¥×¥í¥¸¥§¥¯¥È´ÉÍý +group project_admins ¥×¥í¥¸¥§¥¯¥È´ÉÍý¼Ô +menu project_help_wanted ¥×¥í¥¸¥§¥¯¥È¶¨ÎϼÔÊ罸 +menu project_summary ¥×¥í¥¸¥§¥¯¥È¥µ¥Þ¥ê +group public_area ¸ø³«¥¨¥ê¥¢ +menu search ¸¡º÷ +menu software_map ¥½¥Õ¥È¥¦¥§¥¢¥Þ¥Ã¥× +home sourceforge_statistics SourceForgeÅý·× +menu top_projects ¥È¥Ã¥×¥×¥í¥¸¥§¥¯¥È +home top_project_downloads ¥×¥í¥¸¥§¥¯¥È¥À¥¦¥ó¥í¡¼¥É¿ô +conf content_encoding EUC-JP +conf language_code ja +conf language_id 2 diff --git a/gforge/www/include/languages/Korean.tab b/gforge/www/include/languages/Korean.tab new file mode 100644 index 0000000000..22e10d2dff --- /dev/null +++ b/gforge/www/include/languages/Korean.tab @@ -0,0 +1,89 @@ +#/** +# * +# * Korean message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Kim SeungBaeck +# * +# */ +# +# ChangeLog: +# +# 2001-01-15 Kim SeungBaeck +# * Initial translation +# +about_foundries about_blurb â¼³ÀÚ¿¡ ´ëÇÏ¿© +menu about_sourceforge SourceForge¿¡ ´ëÇÏ¿© +menu account_maintenance Á¢¼Ó À¯Áö +menu bookmark_page Ã¥°¥ÇÇ +home breaking_down_barriers ¿­¸°¼Ò½º °³¹ß·Î À庮À» Çã¹°¾ú½À´Ï´Ù. +menu change_my_theme Å׸¶ º¯°æ +menu code_snippet_library °£´ÜÇÑ ¶óÀ̺귯¸®ÄÚµåÈ­ +menu compile_farm ÆíÁýÀÚ ¾ç¼º +menu contact_us SourceForge¿Í ±³Á¦ +group developers °³¹ßÀÚ +group developer_info °³¹ßÀÚ Á¤º¸ +menu discussion_forums Åä·Ðȸ +menu documentation »çÀÌÆ® ¹®¼­ +frs file_download ¹Þ±â +frs file_monitor °¨½Ã +frs file_notes ÁÖ¼® +frs file_package ²Ù·¯¹Ì +frs file_rel_date ³¯Â¥ +frs file_version ÆǹøÈ£ +group long_bugs ¹ú·¹ÀâÀÌ +group long_cvs CVS ÀúÀå¼Ò +group long_docman ¹®¼­°ü¸®ÀÚ: ÀϰŸ® ¹®¼­È­ +group long_forum ¿­¸° Åä·ÐÀå +group long_foundries SourceForge °³¹ß °ø°£ +group long_ftp À͸í FTP °ø°£ +group long_homepage ȨÆäÀÌÁö +group long_mail ¸ÞÀϸµ ¸®½ºÆ® +group long_news ÃÖ±Ù ¼Ò½Ä +group long_patch ÆÐÄ¡ °ü¸®ÀÚ +group long_pm ÀÛ¾÷ °ü¸®ÀÚ +group long_support ±â¼úÁö¿ø °ü¸®ÀÚ +group long_survey ÅõÇ¥ +group short_bugs ¹ú·¹ +group short_cvs CVS +group short_docman ¹®¼­ +group short_files Filesgroup short_forum Åä·ÐÀå +group short_homepage ȨÆäÀÌÁö +group short_mail ¸ñ·Ï +group short_main ¸ÞÀÎ +group short_memberlist °³¹ßÀÚµé +group short_news »õ¼Ò½Ä +group short_patch ÆÐÄ¡ +group short_pm ÀÛ¾÷ +group short_summary ¿ä¾à +group short_support Áö¿ø +group short_survey ÅõÇ¥ +home highest_ranked_users °¡Àå ¸¹Àº Âü¿©ÀÚ ±×·ì +home about_blurb SourceForge ´Â ¿­¸° ¼Ò½º °³¹ßÀÚ¿¡°Ô ½±°Ô Á¢±ÙÇÒ¼ö ÀÖ´Â CVS, ¸ÞÀϸµ¸®½ºÆ®, ¹ú·¹ÀâÀÌ, °Ô½ÃÆÇ/Åä·ÐÀå, ÀÛ¾÷°ü¸®, È£½ºÆÃ,¿µ±¸ÀûÀÎ È­ÀÏ ÀúÀå, ¹é¾÷µî À¥±â¹Ý °ü¸®µîÀ» ¹«·á·Î Áö¿ø ÇÕ´Ï´Ù. [ ´õ ] [ ÀæÀºÁú´ä ]
       

      »çÀÌÆ®ÀÇ ÀÇ°ß¿Í Âü¿©

      SourceForgeÀÇ Áú¼­¸¦ À§Çؼ­, ´ç½ÅÀÌ ¿øÇÏÇÏ½Ã¸é ¸ÕÀú »ç¿ëÀÚ·Î µî·Ï ÇϽʽÿÀ. ÀÌ°ÍÀ¸·Î ´ç½ÅÀº ¿ì¸®¿Í ÇÔ²²ÇÏ°Ô µÉ°ÍÀ̸ç, ¿ì¸®°¡ ÇÒ ¼ö ÀÖ´Â ¸ðµç Áö¿ø ÇÒ°ÍÀÔ´Ï´Ù. ´ç½ÅÀº µî·ÏÇÏÁö¾Ê°íµµ º¼¼ö ÀÖÀ¸³ª, ¸ðµÎ »ç¿ë ÇÒ ¼ö´Â ¾ø½À´Ï´Ù.

       
      ´ç½Å¸¸ÀÇ ÇÁ·ÎÁ§Æ®¸¦ ¸¸µå¼¼¿ä

      »çÀÌÆ®ÀÇ »ç¿ëÀÚ·Î µî·ÏÇϽðí, Á¢¼ÓÇϽøé, ´ç½ÅÀÇ ÇÁ·ÎÁ§Æ®¸¦ µî·ÏÇÒ ¼ö ÀÖ½À´Ï´Ù. °¨»çÇÕ´Ï´Ù... Áñ°Å¿î ½Ã°£ µÇ½Ê½Ã¿À. +frs latest_file_releases ¸¶Áö¸· È­ÀÏ ¹ßÇ¥ +menu login SSLÀ» »ç¿ëÇÑ Á¢¼Ó +menu logout Á¢¼ÓÇØÁ¦ +home most_active_this_week ±ÝÁÖ °¡ÀåÈ°¹ßÇÑ ÇÁ·ÎÁ§Æ® +menu my_personal_page °³ÀÎ ÆäÀÌÁö +menu new_project »õ ÀϰŸ® µî·Ï +menu new_releases »õ·Î¿î ¹èÆ÷ÆÇ +menu new_user SSLÀ» »ç¿ëÇÑ »õ »ç¿ëÀÚ +menu other_site_mirrors ´Ù¸¥ ¹Ì·¯ »çÀÌÆ® +menu project_admin ÇÁ·ÎÁ§Æ® °ü¸®ÀÚ +group project_admins ÀϰŸ® °ü¸®ÀÚ +menu project_help_wanted µµ¿òÀ» ¿øÇÏ´Â ÇÁ·ÎÁ§Æ® +menu project_summary ÀϰŸ® ¿ä¾à +group public_area ¿­¸°°ø°£ +menu search °Ë»ö +menu software_map ÀÀ¿ëÇÁ·Î±×·¥ ¸ñ·Ï +home sourceforge_statistics SourceForge Åë°è +menu top_projects »óÀ§ ÇÁ·ÎÁ§Æ® +home top_project_downloads °¡Àå ¸¹ÀÌ ¹ÞÀº ±×·ì +conf content_encoding EUC-KR +conf default_font gulim,verdana,arial,helvetica,sans-serif +conf language_code ko +conf language_id 22 diff --git a/gforge/www/include/languages/Norwegian.tab b/gforge/www/include/languages/Norwegian.tab new file mode 100644 index 0000000000..f89fc15099 --- /dev/null +++ b/gforge/www/include/languages/Norwegian.tab @@ -0,0 +1,82 @@ +#/** +# * +# * Norwegian message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Ragnvald Larsen +# * +# */ +# +# ChangeLog: +# +# 2000-09-26 Ragnvald Larsen +# * Initial translation. Norsk bokmaal oversettelse. +# +menu account_maintenance Vedlikehold av brukerinformasjon +menu bookmark_page Bokmerke +home breaking_down_barriers Gjør det lettere å utvikle Open Source programvare +menu change_my_theme Nytt webtema +menu code_snippet_library Kodebibliotek +menu compile_farm Komplieringsverksted +menu contact_us Kontakt oss +group developers Utvikler +group developer_info Utviklerinformasjon +menu discussion_forums Diskusjonsfora +menu documentation Dokumentasjon +frs file_download Last ned +frs file_monitor Overvåk +frs file_notes Notater +frs file_package Pakke +frs file_version Versjon +group long_bugs Feilretting +group long_cvs CVS-repository +group long_docman Administrere prosjektdokumentsjon +group long_forum Åpne fora +group long_ftp Anonym FTP-tilgang +group long_homepage Prosjektside +group long_mail Epostlister +group long_news Siste nyheter +group long_patch Administrere retting +group long_pm Prosjektstyring +group long_support Administrere brukerstøtte +group long_survey Spørreundersøkelser +group short_bugs Feil +group short_cvs CVS +group short_docman Dokumentasjon +group short_files Filesgroup short_forum Fora +group short_homepage Hjemmeside +group short_mail Epostlister +group short_main Topp +group short_news Nyheter +group short_patch Rettinger +group short_pm Oppgaver +group short_summary Overblikk +group short_support Brukerstøtte +group short_survey Spørreundersøkelser +home highest_ranked_users Høyest rangerte brukere +home about_blurb SourceForge er en fri tjeneste som tilbys utviklere av Open Source-programvare. Her får du enkel tilgang til det beste innen CVS, epostlister, feilkontroll, meldingsforum, prosjektstyring, webhosting, filarkiver, backup-løsninger og web-basert administrering. [ mer ] [ FAQ ]
       

      Tilbakemelding og deltakelse

      For å få mest igjen fra Sourceforge må du registrere deg som bruker hos oss. Da kan du ta del i alt vi kan tilby. Du kan selvsagt bla deg gjennom sidene uten å være registrert, men du vil ikke kunne delta på linje med registrerte brukere.

       
      Sett opp dine egne prosjekter

      Registrer deg som bruker, then Login til slutt, Registrer ditt eget prosjekt.

      Takk... og velkommen som bruker +frs latest_file_releases Nyeste filutgivelser +menu login Logg inn via SSL +menu logout Logg av +home most_active_this_week Mest aktive denne uken +menu my_personal_page Min side +menu new_project Meld inn et nytt prosjekt +menu new_releases Nye utgaver +menu new_user Ny bruker via SSL +menu other_site_mirrors Speil +menu project_admin Prosjektadministrator +group project_admins Prosjektadministratorer +menu project_help_wanted Prosjekthjelp søkes +menu project_summary Prosjektoversikt +group public_area Fellesområde +menu search Søk +menu software_map Programvareoversikt +home sourceforge_statistics SourceForge statistikk +menu top_projects Topp-prosjekter +home top_project_downloads Flest nedlastinger +conf content_encoding iso-8859-1 +conf language_id 9 diff --git a/gforge/www/include/languages/Polish.tab b/gforge/www/include/languages/Polish.tab new file mode 100644 index 0000000000..a51d2efd70 --- /dev/null +++ b/gforge/www/include/languages/Polish.tab @@ -0,0 +1,87 @@ +#/** +# * +# * Polish message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Max Gilead +# * +# */ +# +# ChangeLog: +# +# 2000-10-06 Max Gilead +# * Initial translation +# 2000-10-16 Max Gilead +# * Better translation, added new strings +# +about_foundries about_blurb O dzia³ach +menu about_sourceforge About SourceForge +menu account_maintenance Zarz±dzanie kontem +menu bookmark_page Zrób zak³adkê +home breaking_down_barriers Prze³amujemy bariery w rozwoju oprogramowania Open Source +menu change_my_theme Zmieñ wygl±d +menu code_snippet_library Teczka wycinków kodu +menu compile_farm Kompilatory +menu contact_us Kontakt z nami +group developers Programi¶ci +group developer_info Informacja o programi¶cie +menu discussion_forums Forum dyskusyjne +menu documentation Dokumentacja serwera +frs file_download Download +frs file_monitor Monitor +frs file_notes Notatki +frs file_package Pakiet +frs file_version Wersja +group long_bugs ¶ledzenie pluskiew +group long_cvs Repozytorium CVS +group long_docman DocManager: dokumentacja projektu +group long_forum Forum publiczne +group long_ftp Anonimowy FTP +group long_homepage Strona domowa projektu +group long_mail Listy dyskusyjne +group long_news Naj¶wie¿sze wie¶ci +group long_patch Centrum ³at +group long_pm Centrum zadañ +group long_support Centrum pomocy technicznej +group long_survey Sonda¿e +group short_bugs Pluskwy +group short_cvs CVS +group short_docman Dokumentacja +group short_files Filesgroup short_forum Forum +group short_homepage Strona domowa +group short_mail Listy dyskusyjne +group short_main G³ówna +group short_news Nowo¶ci +group short_patch £aty +group short_pm Zadania +group short_summary Podsumowanie +group short_support Wsparcie +group short_survey Sonda¿e +home highest_ranked_users Najwy¿ej oceniani u¿ytkownicy +home about_blurb SourceForge to wolny serwis dla programistów Open Source oferuj±cy ³atwy dostêp to najlepszego CVS, list dyskusyjnych, ¶ledzenia b³êdów, grup i forum dyskusyjnych, zarz±dzania zadaniami, hostingu stron, sta³ego archiwizowania plików, pe³nego backupu; zarz±dzni ca³kowicie z poziomu WWW. [ wiêcej ] [ FAQ ]
       

      Opinie i wspó³praca nad serwisem

      Aby w pe³ni skorzystaæ z SourceForge, powiniene¶ zarejestrowaæ siê jako u¿ytkownik serwisu. Pozwoli Ci to korzystaæ ze wszystkiego, co mamy do zaoferowania. Oczywi¶cie mo¿esz korzystaæ z serwisu tak¿e bez rejestracji, jednak pewne opcje bêd± niedostêpne.

       
      Za³ó¿ Swój W³asny Projekt

      Zarejestruj siê jako u¿ytkownik serwisu, nastêpnie zaloguj siê i Za³ó¿ swój w³asny projekt.

      Dziêkujemy. Przyjemnego korzystania z serwisu. +frs latest_file_releases Najnowsze pliki +menu login Zaloguj przez SSL +menu logout Wyloguj +home most_active_this_week Najbardziej aktywny w tym tygodniu +menu my_personal_page Moja strona osobista +menu new_project Zarejestruj nowy projekt +menu new_releases Nowo¶ci +menu new_user Nowy u¿ytkownik przez SSL +menu other_site_mirrors Inne mirrory +menu project_admin Admin projektu +group project_admins Admini projektu +menu project_help_wanted Potrzeba pomoc do projektu +menu project_summary Podsumowanie projektu +group public_area Obszar publiczny +menu search Szukaj +menu software_map Mapa projektów +home sourceforge_statistics Statystyki SourceForge +menu top_projects Najlepsze projekty +home top_project_downloads Najczê¶ciej pobierane projekty +conf content_encoding iso-8859-2 +conf language_code pl +conf language_id 15 diff --git a/gforge/www/include/languages/Portuguese.tab b/gforge/www/include/languages/Portuguese.tab new file mode 100644 index 0000000000..e068d2aad5 --- /dev/null +++ b/gforge/www/include/languages/Portuguese.tab @@ -0,0 +1,90 @@ +#/** +# * +# * Portuguese message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Doomed +# * +# */ +# +# ChangeLog: +# +# 2001-02-25 Doomed +# * Initial translation +# 2001-02-25 Nuno Amaral +# * Contributed some strings +# +about_foundries about_blurb Sobre as Foundries +menu about_sourceforge Sobre a SourceForge +menu account_maintenance Manutenção da Conta +menu bookmark_page Página de Bookmarks +home breaking_down_barriers Quebrando as Barreiras contra o Desenvolvimento do Open Source +menu change_my_theme Mudar Tema +menu code_snippet_library Biblioteca de Código +menu compile_farm Colecção de Compiladores +menu contact_us Contacte a SourceForge +group developers Programadores +group developer_info Informação s/ Programador +menu discussion_forums Fóruns de Discussão +menu documentation Documentação do Site +frs file_download Download +frs file_monitor Monitor +frs file_notes Observações +frs file_package Pacotes +frs file_rel_date Data +frs file_version Versão +group long_bugs Procura de Bugs +group long_cvs Arquivo do CVS +group long_docman Gestor da Documentação do Projecto +group long_forum Fóruns Públicos +group long_foundries Foundries de Desenvolvimento da SourceForge +group long_ftp Espaço p/ FTP Anónimo +group long_homepage Home Page do Projecto +group long_mail Mailing Lists +group long_news Notícias Mais Recentes +group long_patch Gestor dos Patches +group long_pm Gestor de Tarefas +group long_support Gestor do Suporte Técnico +group long_survey Inquéritos +group short_bugs Bugs +group short_cvs CVS +group short_docman Documentação +group short_files Filesgroup short_forum Fóruns +group short_homepage Página de Entrada +group short_mail Listas +group short_main Principal +group short_memberlist Programadores +group short_news Notícias +group short_patch Patches +group short_pm Tarefas +group short_summary Resumo +group short_support Suporte +group short_survey Inquéritos +home highest_ranked_users Utilizadores mais Destacados +home about_blurb A SourceForge é um serviço gratuito para os programadores em Open Source que oferece fácil acesso ao que melhor se faz em CVS, Mailing Lists, Procura de bugs, Fóruns, Administração de Tarefas, Alojamento de Sites, Arquivo permanente de Ficheiros, Backups completos e ainda Administração dos Projectos totalmente baseada numa interface web. [ mais informação ] [ FAQ ]
       

      Contacto e Participação no Site

      De forma a obter o máximo da SourceForge, vai precisar de se registar como utilizador do site. Isto permitirá que participe em todos os serviços que temos disponíveis. Pode obviamente visitar o site sem se registar mas não terá acesso a uma participação completa.

       
      Crie o Seu Próprio Projecto

      Registe-se como utilizador do site, faça o respectivo Login e por fim, Registe o Seu Projecto.

      Obrigado... e tire bom partido do site. +frs latest_file_releases Lançamentos Mais Recentes +menu login Login por SSL +menu logout Logout +home most_active_this_week O Mais Activo nesta Semana +menu my_personal_page Página Pessoal +menu new_project Criar um Projecto Novo +menu new_releases Novos Lançamentos +menu new_user Utilizador Novo por SSL +menu other_site_mirrors Outros Mirrors +menu project_admin Administração do Projecto +group project_admins Administradores do Projecto +menu project_help_wanted Projectos que Precisam de Ajuda +menu project_summary Resumo do Projecto +group public_area Áreas Públicas +menu search Procurar +menu software_map Listagem do Software +home sourceforge_statistics Estatísticas da SourceForge +menu top_projects Projectos Principais +home top_project_downloads Projectos com mais Downloads +conf content_encoding iso-8859-1 +conf language_code pt +conf language_id 18 diff --git a/gforge/www/include/languages/PortugueseBrazillian.tab b/gforge/www/include/languages/PortugueseBrazillian.tab new file mode 100644 index 0000000000..e36bc7e21c --- /dev/null +++ b/gforge/www/include/languages/PortugueseBrazillian.tab @@ -0,0 +1,89 @@ +#/** +# * +# * Portuguese Brazillian message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id: PortugueseBrazillian.tab,v 1.2 2001/06/14 17:51:56 pfalcon Exp $ +# * @author Vilson Cristiano G¤rtner +# * +# */ +# +# ChangeLog: +# +# 2000-09-?? Vilson Cristiano G¤rtner +# * Initial translation +# 2001-03-26 Vilson Cristiano G¤rtner +# * Updates +# +about_foundries about_blurb Sobre as Foundries +menu about_sourceforge Sobre o SourceForge +menu account_maintenance Manutenção da Conta +menu bookmark_page Adicionar aos Favoritos +home breaking_down_barriers Quebrando as Barreiras para o Desenvolvimento em Código Aberto +menu change_my_theme Mudar Meu Tema +menu code_snippet_library Biblioteca de Código +menu compile_farm Compilação de Programas +menu contact_us Entre em Contato +group developers Desenvolvedores +group developer_info Info Desenvolvedor +menu discussion_forums Fórums de Discussão +menu documentation Documentação do Site +frs file_download Download +frs file_monitor Monitorar +frs file_notes Notas +frs file_package Pacote +frs file_rel_date Data +frs file_version Versão +group long_bugs Mapeamento de Bugs +group long_cvs Repositório CVS +group long_docman DocManager: Documentação do Projeto +group long_forum Fórums Públicos +group long_foundries Foundries de Desenvolvimento do SourceForge +group long_ftp Espaço de FTP Anônimo +group long_homepage Home Page do Projeto +group long_mail Mailing Lists +group long_news Últimas Notícias +group long_patch Gerenciador de Alterações +group long_pm Gerenciador de Tarefas +group long_support Gerenciador de Suporte +group long_survey Pesquisas +group short_bugs Bugs +group short_cvs CVS +group short_docman Documentação +group short_files Filesgroup short_forum Fórums +group short_homepage Home Page +group short_mail Listas +group short_main Principal +group short_memberlist Membros +group short_news Notícias +group short_patch Alterações +group short_pm Tarefas +group short_summary Sumário +group short_support Suporte +group short_survey Pesquisas +home highest_ranked_users Usuários Mais Pontuados +home about_blurb SourceForge é um serviço gratuido para desenvolvedores em Código Aberto oferecendo fácil acesso ao que há de melhor em CVS, listas, controle de bugs, quadro de mensagens/fórums, gerenciador de tarefas, hospedagem, arquivamento permanente de arquivos, backups completos, e administração totalmente baseado na web. [ mais ] [ FAQ ]
       

      Conteúdo do Site e Participação

      Para tirar o máximo proveito do SourceForge, você deve se registrar como um usuário do site. Isso permitirá que você participe plenamente em tudo o que temos a oferecer. É claro que você pode ver o conteúdo do site sem se registrar, mas não terá accesso para participar plenamente.

       
      Registre seu próprio Projeto

      Registre-se como um usuário do site, em seguida efetue Login e finalmente, Registre seu Projeto.

      Obrigado... e aproveite o site. +frs latest_file_releases Últimos Arquivos Enviados +menu login Login via SSL +menu logout Logout +home most_active_this_week Mais Ativo da Semana +menu my_personal_page Minha Página Pessoal +menu new_project Registrar Novo Projeto +menu new_releases Novas Atualizações +menu new_user Novo Usuário via SSL +menu other_site_mirrors Outros Mirrors +menu project_admin Administração do Projeto +group project_admins Administradores +menu project_help_wanted Projetos que Precisam de Ajuda +menu project_summary Sumário do Projeto +group public_area Áreas Públicas +menu search Procurar +menu software_map Mapa dos Softwares +home sourceforge_statistics Estatísticas do SourceForge +menu top_projects Principais Projetos +home top_project_downloads Projetos Mais Baixados +conf language_code pt +conf language_id 16 diff --git a/gforge/www/include/languages/Russian.tab b/gforge/www/include/languages/Russian.tab new file mode 100644 index 0000000000..eb0edab5b2 --- /dev/null +++ b/gforge/www/include/languages/Russian.tab @@ -0,0 +1,90 @@ +#/** +# * +# * Russian message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Paul Sokolovsky +# * +# */ +# +# ChangeLog: +# +# 2000-10-08 Paul Sokolovsky +# * Initial translation +# +about_foundries about_blurb Î öåõàõ SourceForge +menu about_sourceforge Î SourceForge +menu account_maintenance Ìîè íàñòðîéêè +menu bookmark_page Ïîìåòèòü òåê. ñòðàíèöó çàêëàäêîé +home breaking_down_barriers Ïðåîäîëåâàÿ áàðüåðû íà ïóòè ðàçðàáîòêè ñ îòêðûòûì èñõîäíûì êîäîì +menu change_my_theme Èçìåíèòü web-òåìó +menu code_snippet_library Áèáèîòåêà Code Snippet'îâ +menu compile_farm Ôàáðèêà êîìïèëÿöèè +menu contact_us Îáðàòíàÿ ñâÿçü +group developers Ðàçðàáîò÷èêè +group developer_info Ó÷àñòíèêè ïðîåêòà +menu discussion_forums Äèñêóññèîííûå ôîðóìû +menu documentation Äîêóìåíòàöèÿ ñàéòà +frs file_download Ñêà÷àòü +frs file_monitor Ñëåäèòü +frs file_notes Èíôîðìàöèÿ +frs file_package Ìîäóëü +frs file_version Âåðñèÿ +group long_bugs Ìåíåäæåð îøèáîê +group long_cvs CVS ðåïîçèòîðèé +group long_docman Ìåíåäæåð äîêóìåíòàöèè +group long_forum Îáùåäîñòóïíûå ôîðóìû +group long_ftp Àíîíèìíûé FTP ïðîåêòà +group long_homepage Äîìàøíÿÿ ñòðàíèöà ïðîåêòà +group long_mail Ñïèñêè ðàññûëêè +group long_news Íîâîñòè +group long_patch Ìåíåäæåð ïàò÷åé (èñïðàâëåíèé) +group long_pm Çàäà÷è ïðîåêòà +group long_support Ìåíåäæåð òåõ. ïîääåðæêè +group long_survey Îïðîñû +group short_admin Àäìèí +group short_bugs Îøèáêè +group short_cvs CVS +group short_docman Äîêóìåíòàöèÿ +group short_files Ôàéëû +group short_forum Ôîðóìû +group short_homepage Äîì.ñòðàíèöà +group short_mail Ñï.ðàññûëêè +group short_main Main +group short_memberlist Ðàçðàáîò÷èêè +group short_news Íîâîñòè +group short_patch Ïàò÷è +group short_pm Çàäà÷è +group short_summary Ðåçþìå +group short_support Ïîääåðæêà +group short_survey Îïðîñû +group short_tracker Óíèâ.Òðåêåð +home highest_ranked_users Ïîëüçîâàòåëè ñ âûñîêèì ðåéòèíãîì +home about_blurb SourceForge - ñâîáîäíûé è áåñïëàòíûé ñåðâèñ äëÿ ðàçðàáîò÷èêîâ, ðàáîòàþùèõ ïî ïðèíöèïó Îòêðûòîãî Èñõîäíîãî Êîäà/Íàïîëíåíèÿ (Open Source) è ïðåäëàãàþùèé áûñòðûé è ëåãêèé äîñòóï ê òàêèì ñåðâèñàì, êàê CVS (ñèñòåìà óïðàâëåíèÿ âåðñèÿìè ôàéëîâ), ñïècêè ðàññûëêè, ñèñòåìà ðåãèñòðàöèè îøèáîê, äîñêè ñîîáùåíèé è ôîðóìû, ìåíåäæåð ïðîåêòîâ, web-õîñòèíã, ïîñòîÿííîå ôàéëîâîå õðàíèëèùå, àâòîìàòè÷åñêîå ðåçåðâíîå êîïèðîâàíèå - âñå âìåñòå óïðàâëÿåìîå ÷åðåç Web.
      [ Ïîäðîáíåå (ïî-àíãëèéñêè) ] [ FAQ ]
       

      Èñïîëüçîâàíèå ñåðâèñîâ è ó÷àñòèå â ïðîåêòàõ

      Äëÿ òîãî, ÷òîáû ïîëó÷èòü äîñòóï êî âñåìó ìíîãîîáðàçèþ ñåðâèñîâ, ïðåäëàãàåìûõ íà SourceForge, âàì íóæíî çàðåãèñòðèðîâàòüñÿ â êà÷åñòâå ïîëüçîâàòåëÿ ñàéòà. Êîíå÷íî æå, âû ìîæåòå ïóòåøåñòâîâàòü ïî ñàéòó áåç ðåãèñòðàöèè, íî âû íå áóäåòå èìåòü äîñòóï êî ìíîãèì âîçìîæíîñòÿì.

       
      Ñîçäàíèå ñîáñòâåííîãî ïðîåêòà

      Çàðåãèñòðèðóéòåñü êàê ïîëüçîâàòåëü ñàéòà, âîéäèòå â ñèñòåìó è íàêîíåö, çàðåãèñòðèðóéòå âàø ïðîåêò.

      Ñïàñèáî çà âûáîð SourceForge... È ìû æåëàåì âàì ïðèÿòíîãî è ïîëåçíîãî âðåìÿïðîâîæäåíèÿ! +frs latest_file_releases Ïîñëåäíèå ôàéë-ðåëèçû +menu login Ëîãèí (÷/ç çàùèùåííîå ñîåäèíåíèå) +menu logout Âûõîä +home most_active_this_week Íàèáîëåå àêòèâíûå çà ýòó íåäåëþ +menu my_personal_page Ìîÿ ïåðñîíàëüíàÿ ñòðàíèöà +menu new_project Çàðåãèñòðèðîâàòü ïðîåêò +menu new_releases Ïîñëåäíèå ðåëèçû +menu new_user Íîâûé ïîëüçîâàòåëü +menu other_site_mirrors Çåðêàëà äðóãèõ ñàéòîâ +menu project_admin Àäìèíèñòðèðîâàíèå ïðîåêòà +group project_admins Àäìèíèñòðàòîðû +menu project_help_wanted Ïðîåêòû, íóæäàþùèåñÿ â ïîìîùè +menu project_summary Áàçà ïðîåêòà +group public_area Ñåðâèñû ïðîåêòà +menu search Ïîèñê +menu site_status Ñòàòóñ Ñàéòà +menu software_map Êàðòà ïðîåêòîâ +home sourceforge_statistics Ñòàòèñòèêà SourceForge +menu top_projects Òîï-ïðîåêòû +home top_project_downloads Íàèáîëåå çàãðóæàåìûå ïðîåêòû +conf content_encoding windows-1251 +conf language_code ru +conf language_id 17 diff --git a/gforge/www/include/languages/SimplifiedChinese.tab b/gforge/www/include/languages/SimplifiedChinese.tab new file mode 100644 index 0000000000..cd500fd2f2 --- /dev/null +++ b/gforge/www/include/languages/SimplifiedChinese.tab @@ -0,0 +1,95 @@ +#/** +# * +# * Simplified Chinese message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Hunte Swee +# * +# */ +# +# ChangeLog: +# +# 2000-11-11 Hunte Swee +# * Translated from the Chinese.class(Big5) +# 2001-02-20 Hunte Swee +# * Change the font to BaseLanguage default +# * Change the language code from zh-CN to zh-cn +# * Add some new variables that BaseLanguage added +# +about_foundries about_blurb ¹ØÓÚ Foundries +menu about_sourceforge ¹ØÓÚ SourceForge +menu account_maintenance ÕʺÅά»¤ +menu bookmark_page ÊéÇ© +home breaking_down_barriers Ϊ¿ª·ÅÔ´ÂëµÄ·¢Õ¹¿ª±ÙÒ»Ìõ̹; +menu change_my_theme ¸ü»»Íâ¹Û +menu code_snippet_library ´úÂëƬ¶Ï +menu compile_farm ±àÒ빤³§ +menu contact_us ÁªÏµÎÒÃÇ +group developers ¿ª·¢Õß +group developer_info ¿ª·¢ÕßÐÅÏ¢ +menu discussion_forums ÂÛ̳ +menu documentation Îĵµ +frs file_download ÏÂÔØ +frs file_monitor ¸ú×Ù +frs file_notes ±¸×¢ +frs file_package Èí¼þ°ü +frs file_rel_date ÈÕÆÚ +frs file_version °æ±¾ +group long_bugs BUG¸ú×Ù +group long_cvs CVS²Ö¿â +group long_docman ÏîÄ¿Îĵµ +group long_forum ¹«¹²ÂÛ̳ +group long_ftp ÄäÃûFTP +group long_homepage ÏîÄ¿Ê×Ò³ +group long_mail ÓʼþÁбí +group long_news ×îÐÂÏûÏ¢ +group long_patch ²¹¶¡¹ÜÀí +group long_pm ÈÎÎñ¹ÜÀí +group long_support ¼¼ÊõÖ§³Ö +group long_survey µ÷²é +group short_admin ¹ÜÀí +group short_bugs BUG +group short_cvs CVS +group short_docman Îĵµ +group short_files Filesgroup short_forum ÂÛ̳ +group short_homepage Ê×Ò³ +group short_mail µç×ÓÓʼþ +group short_main Ö÷Òª +group short_memberlist ¿ª·¢Õß +group short_news ÐÂÎÅ +group short_patch ²¹¶¡ +group short_pm ÈÎÎñ +group short_summary ÕªÒª +group short_support Ö§³Ö +group short_survey µ÷²é +group short_tracker ¸ú×Ù +home highest_ranked_users Óû§ÆÀ¼ÛÅÅÐаñ +home about_blurb SourceForgeΪ¿ª·ÅÔ´´úÂëÈí¼þ¿ª·¢ÕßÌṩȫ·½ÃæµÄÃâ·Ñ·þÎñ£¬°üÀ¨CVS²Ö¿â, ÓʼþÁбí, BUG¸ú×Ù, ÔÚÏßÂÛ̳, ÈÎÎñ¹ÜÀí, ÍøÕ¾¿Õ¼ä, ÏîÄ¿´æ´¢¼°ÍêÕûµÄ±¸·Ý, ²¢ÇÒÍêÈ«ÊÇͨ¹ýWEB·½Ê½À´¹ÜÀíµÄ¡£ [ ¸ü¶à ] [ ³£¼ûÎÊÌâ ]
       

      ÇëÁ¢¼´¼ÓÈ룬²¢Ìá³öÄúµÄ±¦¹óÒâ¼û

      ΪÁ˳ä·ÖÀûÓÃSourceForgeËùÌṩµÄ·þÎñ, ÇëÁ¢¼´×¢²á³ÉΪ ±¾Õ¾Óû§£¬ÕâÑùÄú¾Í¿ÉÒÔ²ÎÓë±¾Õ¾µÄ¸÷Ïî»î¶¯¡£ÈôÄúÉв»ÊÇ×¢²áÓû§, ÈÔÄÜä¯ÀÀ±¾Õ¾, µ«ÎÞȨ²ÎÓë±¾Õ¾µÄ»î¶¯¡£

       
      ¿ªÊ¼Äú×Ô¼ºµÄÏîÄ¿

      ÏÈ×¢²á³ÉΪ±¾Õ¾Óû§, È»ºóµÇ¼×îºó¿ªÊ¼ÄúµÄÏîÄ¿¡£

      лл²ÎÓ룬Çë³ä·ÖÏíÊܱ¾Õ¾ÌṩµÄ·þÎñ°É£¡ +frs latest_file_releases ×îз¢²¼ÏîÄ¿ +menu login ͨ¹ýSSLµÇ¼ +menu logout Í˳öµÇ¼ +home most_active_this_week ±¾ÖܻÁ¦×îÇ¿ÅÅÐаñ +menu my_personal_page ÎÒµÄÊ×Ò³ +menu new_project µÇ¼ÇÐÂÏîÄ¿ +menu new_releases з¢²¼Èí¼þ +menu new_user ÐÂÓû§Í¨¹ýSSL×¢²á +menu other_site_mirrors ÆäËüÍøÕ¾¾µÏñ +menu project_admin ÏîĿά»¤ +group project_admins ÏîÄ¿¹ÜÀíÔ± +menu project_help_wanted Ñ°ÇóЭÖú +menu project_summary ÏîÄ¿ÕªÒª +group public_area ¹«¹²ÇøÓò +menu search ²éÕÒ +menu site_status Õ¾µã״̬ +menu software_map Èí¼þ·ÖÀà±í +home sourceforge_statistics SourceForgeͳ¼Æ×ÊÁÏ +menu top_projects ÈȵãÏîÄ¿ +home top_project_downloads ÏîÄ¿ÏÂÔØÅÅÐаñ +conf content_encoding gb2312 +conf default_font verdana,arial,helvetica,sans-serif +conf language_code zh-cn +conf language_id 23 diff --git a/gforge/www/include/languages/Spanish.tab b/gforge/www/include/languages/Spanish.tab new file mode 100644 index 0000000000..86f972e6bf --- /dev/null +++ b/gforge/www/include/languages/Spanish.tab @@ -0,0 +1,80 @@ +#/** +# * +# * Spanish message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Enric Mart­nez +# * +# */ +# +# ChangeLog: +# +# 2000-09-23 Enric Mart­nez +# * Initial translation +# +menu account_maintenance Mantenimiento de Cuenta +menu bookmark_page Marcar Página +home breaking_down_barriers Derribando las Barreras al Desarrollo de Código Abierto +menu change_my_theme Cambiar Mi Tema +menu code_snippet_library Biblioteca de Recortes de Código +menu compile_farm Granja de Compilación +menu contact_us Contáctenos +group developers Desarrolladores +group developer_info Info sobre el Desarrollador +menu discussion_forums Foros de Discusión +menu documentation Documentación Local +frs file_download Descarga +frs file_monitor Monitor +frs file_notes Notas +frs file_package Paquete +frs file_version Versión +group long_bugs Seguimiento de Errores +group long_cvs Repositorio CVS +group long_docman Admin. de Documentación +group long_forum Foros Públicos +group long_ftp Espacio de FTP Anónimo +group long_homepage Página de Inicio de Proyecto +group long_mail Listas de Correo +group long_news Últimas Noticias +group long_patch Admin. de Parches +group long_pm Admin. de Tareas +group long_support Admin. de Soporte Técnico +group long_survey Servicios +group short_bugs Fallos +group short_cvs CVS +group short_docman Documentos +group short_files Filesgroup short_forum Foros +group short_homepage Página de Inicio +group short_mail Listas +group short_news Noticias +group short_patch Parches +group short_pm Tareas +group short_summary Resumen +group short_support Soporte Técnico +group short_survey Servicios +home highest_ranked_users Usuarios de Más Activos +home about_blurb SourceForge es un servicio gratuito para desarrolladores de Código Abierto ofreciendo fácil acceso a los mejores repositorios CVS, listas de discusión, seguimiento de errores, tablones de anuncios/foros, gestión de tarifas, hospedaje de sitios web, archivado permanente de ficheros, copias de seguridad completas y administración totalmente basada en web. [ más ] [ PF ]
       

      Retorno (feedback) al Sitio de Participación

      Para poder obtener el máximo de SourceForge, habrá de registrarse como usuario del sitio. Esto le permitirá participar plenamente en todo lo que tenemos para ofrecerle. Podrá, por supuesto, navegar por el sitio sin registrarse, pero no tendrá la opción de participar plenamente.

       
      Monte Su Propio Proyecto

      Regístrese como usuario del sitio, acceda, Acceso y finalmente, Registre Su Proyecto.

      Muchas Gracias... y disfrute del sitio. +frs latest_file_releases Últimas Versiones de Archivos +menu login Acceso vía SSL +menu logout Salir +home most_active_this_week El Más Activo esta Semana +menu my_personal_page Mi Página Personal +menu new_project Registrar Proyecto Nuevo +menu new_releases Nuevas Salidas +menu new_user Nuevo Usuario vía SSL +menu project_admin Admininstración de Proyectos +group project_admins Admins de Proyecto +menu project_help_wanted Petición de Ayuda para Proyecto +menu project_summary Sumario de Proyectos +group public_area Áreas Públicas +menu search Buscar +menu software_map Mapa de Software +home sourceforge_statistics Estadísticas de SourceForge +menu top_projects Proyectos Estrella +home top_project_downloads Proyectos más descargados +conf language_code es +conf language_id 4 diff --git a/gforge/www/include/languages/Swedish.tab b/gforge/www/include/languages/Swedish.tab new file mode 100644 index 0000000000..07c24a2161 --- /dev/null +++ b/gforge/www/include/languages/Swedish.tab @@ -0,0 +1,88 @@ +#/** +# * +# * Swedish message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Christian Rose +# * +# */ +# +# ChangeLog: +# +# 2000-10-17 Christian Rose +# * Initial translation +# 2001-03-23 Christian Rose +# * Updates +# +about_foundries about_blurb Om Foundries +menu about_sourceforge Om SourceForge +menu account_maintenance Kontounderhåll +menu bookmark_page Lägg till bokmärke +home breaking_down_barriers Bryter ner gränserna för open source-utveckling +menu change_my_theme Byt mitt tema +menu code_snippet_library Kodbibliotek +menu compile_farm Kompileringsverkstad +menu contact_us Kontakta oss +group developers Utvecklare +group developer_info Utvecklarinformation +menu discussion_forums Diskussionsforum +menu documentation Webbplatsdokumentation +frs file_download Hämta +frs file_monitor Bevaka +frs file_notes Anteckningar +frs file_package Paket +frs file_version Version +group long_bugs Felrättning +group long_cvs CVS-förvar +group long_docman DocManager: Projektdokumentation +group long_forum Öppna forum +group long_ftp Anonymt FTP-utrymme +group long_homepage Projekthemsida +group long_mail Sändlistor +group long_news Senaste nyheterna +group long_patch Administrera felrättelser +group long_pm Projektstyrning +group long_support Administrera användarsupport +group long_survey Undersökningar +group short_bugs Buggar +group short_cvs CVS +group short_docman Dokumentation +group short_files Filesgroup short_forum Forum +group short_homepage Hemsida +group short_mail Listor +group short_main Huvudsida +group short_news Nyheter +group short_patch Felrättningar +group short_pm Uppgifter +group short_summary Sammanfattning +group short_support Support +group short_survey Undersökningar +home highest_ranked_users Högst rankade användare +home about_blurb SourceForge är en fri tjänst för open source-utvecklare som erbjuder enkel tillgång till det bästa i CVS, sändlistor, felhantering, meddelandeforum, uppgiftshantering, webbplatsutrymme, permanent filarkivering, fullständiga backuper, och en helt webbaserad administration. [ mer ] [ frågor och svar ]
       

      Deltagande och synpunkter på webbplatsen

      För att få ut det mesta av SourceForge måste du registrera dig som en webbplatsanvändare. Det gör att du kan deltaga i allt vi har att erbjuda. Du kan naturligtvis surfa på webbplatsen utan att att registrera dig, men du kommer då inte att kunna deltaga i allt.

       
      Skapa ditt eget projekt

      Registrera dig som en webbplatsanvändare, logga sedan in och till sist registrerar du ditt projekt.

      Tack... och ha det så trevligt på webbplatsen. +frs latest_file_releases Senaste filutgåvorna +menu login Logga in via SSL +menu logout Logga ut +home most_active_this_week Mest aktiva denna vecka +menu my_personal_page Min personliga sida +menu new_project Registrera nytt projekt +menu new_releases Nya utgåvor +menu new_user Ny användare via SSL +menu other_site_mirrors Andra webbplatsspeglar +menu project_admin Projektadministratör +group project_admins Projektadministratörer +menu project_help_wanted Projekthjälp sökes +menu project_summary Projektsammanfattning +group public_area Öppet utrymme +menu search Sök +menu software_map Programvaruöversikt +home sourceforge_statistics SourceForge-statistik +menu top_projects Topprojekt +home top_project_downloads Projekt med flest hämtningar +conf content_encoding iso-8859-1 +conf default_font verdana,arial,helvetica,sans-serif +conf language_code sv +conf language_id 10 diff --git a/gforge/www/include/languages/Thai.tab b/gforge/www/include/languages/Thai.tab new file mode 100644 index 0000000000..dc1cf41e04 --- /dev/null +++ b/gforge/www/include/languages/Thai.tab @@ -0,0 +1,89 @@ +#/** +# * +# * Thai message catalog +# * +# * SourceForge: Breaking Down the Barriers to Open Source Development +# * Copyright 1999-2001 (c) VA Linux Systems +# * http://sourceforge.net +# * +# * @version $Id$ +# * @author Korakot Chaovavanich +# * +# */ +# +# ChangeLog: +# +# 2000-09-25 Korakot Chaovavanich +# * Initial translation: +# National Electronic and Computer Technology Center. +# ŸçŸR Á™ôúòúiæ™, 25 Ÿó¿÷ô÷¿ 2543 +# éý¿÷ÍÁž×¿×å÷èîæÁ埞çî¿æŸëÍÂåòîâ?æúÁÞîçÍÂìÉ™ôÞæ +# +# According to Information Technology Vocabulary version of Royal Acadamy +# îæÞôâ éó?žÍÁž×¿×å÷èëôçë¿Ážé c˜ó˜çô™˜ói+æÞ÷ëô¿ +# Sorry that I can't translate all of them... There seems no standard translation +# for Software Development Vocab. Some thai may even prefer English than translation. +# +menu account_maintenance ´ÙáźѭªÕ¼Ùéãªé +menu bookmark_page ãÊè·Õè¤Ñè¹Ë¹éÒ +home breaking_down_barriers ·ÐÅÒÂÍØ»ÊÃäÊÙè¡ÒþѲ¹ÒẺâÍà¾è¹«ÍÃìÊ +menu change_my_theme à»ÅÕè¹ Theme +menu code_snippet_library ¤Åѧâ»Ãá¡ÃÁàÅç¡ +menu contact_us µÔ´µè;ǡàÃÒ +group developers ¼Ùé¾Ñ²¹Ò +group developer_info ¢éÍÁÙżÙé¾Ñ²¹Ò +menu discussion_forums ¡Ãдҹʹ·¹Ò +menu documentation àÍ¡ÊÒäÙèÁ×Í䫵ì +frs file_download ´ÒÇâËÅ´ +frs file_monitor à½éÒÊѧࡵ +frs file_notes ºÑ¹·Ö¡¢éͤÇÒÁ +frs file_package á¾ç¡à¡¨ +frs file_version ÃØè¹ +group long_bugs µÔ´µÒÁºÑê¡ +group long_cvs ·ÕèÃÇÁ CVS +group long_docman ¨Ñ´¡ÒÃàÍ¡ÊÒÃ: ¤ÙèÁ×Íâ»Ãਡµì +group long_forum ¡ÃдҹÊÒ¸ÒóР+group long_ftp ¾×é¹·Õè FTP ¹ÔùÒÁ +group long_homepage âÎÁྨâ¤Ã§¡Òà +group long_mail ¨´ËÁÒ¡ÅØèÁ +group long_news ¢èÒÇÅèÒÊØ´ +group long_patch ¨Ñ´¡ÒÃá¾µªì +group long_pm ¨Ñ´¡ÒÃÀÒáԨ +group long_support ºÃÔ¡Ò÷ҧ෤¹Ô¡ +group long_survey ẺÊÓÃǨ +group short_bugs ºÑê¡ +group short_docman àÍ¡ÊÒà +group short_files Filesgroup short_forum ʹ·¹Ò +group short_homepage âÎÁྨ +group short_mail ¨´ËÁÒ +group short_news ¢èÒÇ +group short_patch á¾µªì +group short_pm ÀÒáԨ +group short_summary ÊÃØ» +group short_support ºÃÔ¡Òà +group short_survey ÊÓÃǨ +home highest_ranked_users ¤¹¤Ðá¹¹ÊÙ§ÊØ´ +home about_blurb SourceForge à»ç¹ ºÃÔ¡ÒÿÃÕá¡è¹Ñ¡¾Ñ²¹Ò âÍà¾è¹«ÍÃìÊ â´ÂÁÕºÃÔ¡Ò÷ÕèÊдǡáÅдշÕèÊØ´ ·Ñé§ Ãкº CVS, ¨´ËÁÒ¡ÅØèÁ, ÃкºµÔ´µÒÁºÑê¡, ¡Ãдҹʹ·¹Ò, Ãкº¨Ñ´¡ÒÃÀÒáԨ, ãËéà¹×éÍ·ÕèàÇçºä«µì, Ãкº¨Ñ´à¡çºä¿Åì¶ÒÇÃ, ÁÕ¡ÒÃÊÓÃͧä¿Åì·Ñé§ËÁ´, ÃÇÁ·Ñé§ãËéºÃÔËÒÃÃкºµèÒ§ æ ä´é¼èÒ¹àÇ纷Ñé§ËÁ´. [ more ] [ FAQ ]
       

      ¡ÒÃÁÕÊèǹÃèÇÁ áÅлé͹¡ÅѺ¡Ñºä«µì

      à¾×èÍãËéä´éÃѺ»ÃÐ⪹ì¨Ò¡ SourceForge ÊÙ§ÊØ´, ¤Ø³¨Óà»ç¹µéͧ ŧ·ÐàºÕ¹à»ç¹ÊÁҪԡ䫵ì. ¤Ø³¨Ðä´éÃѺ͹حҵãËéà¢éÒÁÕÊèǹÃèÇÁàµçÁ·Õèã¹·Ø¡ÊÔ觷ÕèàÃÒÁÕºÃÔ¡ÒÃ. ¤Ø³ÊÒÁÒöà¢éÒªÁ䫵ìä»àÃ×èÍ æ â´ÂäÁè¨Óà»ç¹µéͧŧ·ÐàºÕ¹ áµè¤Ø³ÍÒ¨äÁèÊÒÁÒöà¢éÒãªéºÃÔ¡ÒúҧÍÂèÒ§ä´é¤Ãº·Ñé§ËÁ´.

       
      µÑé§â»Ãਡµì¢Í§¤Ø³àͧ

      ŧ·ÐàºÕ¹à»ç¹ÊÁҪԡ䫵ì, áÅéÇ Å§ºÑ¹·Ö¡à¢éÒ áÅÐÊØ´·éÒÂ¡ç µÑé§â»ÃਡµìãËÁè¢Í§¤Ø³àͧ.

      ¢Íº¤Ø³¤ÃѺ... ¢ÍãËéʹء¡ÑººÃÔ¡ÒâͧàÃÒ. +frs latest_file_releases ä¿ÅìÍÍ¡ãËÁèÅèÒÊØ´ +menu login ŧºÑ¹·Ö¡à¢éÒ´éÇ SSL +menu logout ŧºÑ¹·Ö¡ÍÍ¡ +home most_active_this_week µ×è¹µÑÇÊÙ§ÊØ´ã¹ÊÑ»´ÒËì +menu my_personal_page ˹éÒÊèǹµÑÇ +menu new_project µÑé§â»ÃਡµìãËÁè +menu new_releases ªØ´ÍÍ¡ãËÁè +menu new_user ÊÁѤÃÊÁÒªÔ¡ãËÁè +menu other_site_mirrors Mirror ·ÕèÍ×è¹ æ +menu project_admin ºÃÔËÒÃâ»Ãਡµì +group project_admins ¼Ùé´ÙáÅâ»Ãਡµì +menu project_help_wanted µéͧ¡Ò乪èÇ +menu project_summary ÊÃØ»â»Ãਡµì +group public_area ¾×é¹·ÕèÊÒ¸ÒóР+menu search ¤é¹ËÒ +menu software_map á¼¹·Õè«Í¿µìáÇÃì +home sourceforge_statistics Ê¶ÔµÔ SourceForge +menu top_projects â»ÃਡµìÊØ´ÂÍ´ +home top_project_downloads â»Ãਡµì´ÒÇâËÅ´ÊÙ§ÊØ´ +conf content_encoding tis-620 +conf default_font MS Sans Serif,Thonburi,sans-serif +conf language_code th +conf language_id 5 diff --git a/gforge/www/kernel_traffic.php b/gforge/www/kernel_traffic.php new file mode 100644 index 0000000000..0b368aac65 --- /dev/null +++ b/gforge/www/kernel_traffic.php @@ -0,0 +1,83 @@ + + * + */ + + +require_once('pre.php'); +require_once('www/news/news_utils.php'); +require_once('features_boxes.php'); +require_once('cache.php'); + +/** + * getKernelTraffic() - Pull the downloaded contents of Kernel Traffic from the database + * + * This function mostly exists so we can cache the results. + */ +function getKernelTraffic() +{ + $sql = "SELECT kt_data FROM kernel_traffic"; + $res = db_query($sql); + return db_result($res,0,0); +} + +//set up the group_id +$group_id='18435'; + +//set up a foundry object for reference all over the place +$foundry=&group_get_object($group_id); + +$HTML->header(array('title'=>'Kernel Traffic','group'=>$group_id)); + +echo' + + + + + + ' + ; + } + + $title_arr=array(); + $title_arr[]='Date'; + $title_arr[]='Title'; + $title_arr[]='Project'; + + $result=db_query($sql_pending); + $rows=db_numrows($result); + + echo ''; + echo ''; + echo ''; + + if ($rows < 1) { + echo ' +

      No Queued Items Found

      '; + } else { + echo '

      These items need to be approved (total: '.$rows.')

      '; + echo html_build_list_table_top($title_arr); + for ($i=0; $i<$rows; $i++) { + show_news_item($result,$i,false,true); + } + echo '
      +'; + +echo '
      '; // Needed to make the formatting show properly + +echo cache_display('kerneltraffic','getKernelTraffic()',(24*3600)); +?> + +
      +Legal And Historical Notice
      +
      +All KT and KC issues are Copyright their respective authors and released under the GPL.
      +
      +Linux ® is a registered trademark of Linus Torvalds
      +
      +Kernel Traffic is copyright © Zack Brown
      +
      +Kernel Cousins are copyright © their respective authors.
      +
      +Kernel Traffic and the Cousins are distributed under the terms of the GNU General Public Licence, version 2, or (at your discretion) any later version.
      +
      +Kernel Traffic and the Cousins will always be indebted to Mark Constable, of http://www.renta.net/, who hosted all of the Kernel Traffic and Kernel Cousin pages at http://www.opensrc.org from January through September 1999. The Open Source movement never had a truer friend.
      +
      + +
      '; + +// Display the sponsor info if any +echo $foundry->getSponsorHTML1(); + +// Display the Stat's features boxes on the right +echo cache_display('foundry'.$group_id.'_features_boxes','foundry_features_boxes()',(24*3600)); + +echo '
      '; + +$HTML->footer(array()); +?> diff --git a/gforge/www/my/intelagreement.php b/gforge/www/my/intelagreement.php new file mode 100644 index 0000000000..19c7e2cd0d --- /dev/null +++ b/gforge/www/my/intelagreement.php @@ -0,0 +1,197 @@ +'Agreement')); + echo '

      +

      Received

      +

      + Your request has been received. You will + receive an email when it is accepted or rejected'; + site_user_footer(array()); + exit; + } + } else if ($REJECT) { + header ("Location: /my/"); + } + + site_user_header(array('title'=>'Agreement')); + html_feedback_top($feedback); + + echo '

      '; +?> +

      OPEN-SOURCE CLICKWRAP IPLA

      +

      +Intel would like to invite you to participate in Intel's efforts to prepare +software targeted for the Linux operating system running on the Intel(R) Itanium(tm) +processor by providing you access to software created by Intel and its licensors and +related documentation and materials (the "Intel Software") and Intel supplied +equipment ("Intel Equipment") under the following terms and conditions: +

      +1. To the extent that you are using software that is not supplied by Intel and/or +its licensors such as the Linux operating system and the GCC compiler, this Agreement +has no effect on your rights and your use of that software is subject to the applicable +license such as the Gnu General Public License or other applicable license. +

      +2. This license to use the Intel Software and Intel Equipment is being provided to you +royalty-free, in consideration of your adherence to the other terms and conditions of +this license. You may distribute software that you create ("Your Software") using this +equipment through any distribution scheme you wish to use, including distributing Your +Software under an open source license agreement such as the Gnu General Public License +or distributing binaries of Your Software for a fee and subject to a different license. +

      +3. You may modify portions of the Intel Software provided by Intel as sample source code +and incorporate such sample source or modified portions thereof into your programs and +may distribute Your Software incorporating sample source code or modifications thereof +under any license agreement of your choosing. You may not reverse engineer, decompile, +license or disassemble portions of any Intel Software provided in object code form. +

      +4. Since the Intel Equipment that you are using is pre-release hardware and incorporates +pre-release software and is configured to permit multiple people to test code on the +equipment, this equipment will not generate reliable benchmarking data. I understand +that no reliable benchmarking data can be generated on the Intel Equipment. Therefore, +you agree that you will not disclose publicly or share with any third party any +benchmarks generated using the Intel Equpment and/or Intel Software. +

      +5. The Intel Software provided in binary form contains confidential information of Intel +regarding technical aspects of the Itanium processor. You must use the same degree of +care to protect this confidential information of Intel that you use to protect your own +confidential information, but no less than a reasonable degree of care. You must +restrict access to the Intel Software provided in binary form to your employees who have +executed written agreements with you obligating them to protect confidential information +as required under this paragraph. The obligations of this paragraph do not apply to any +information that is or becomes published by Intel without restriction, or otherwise +becomes rightfully available to the public other than by breach of confidentiality +obligation to Intel. +

      +6. THE SOFTWARE AND EQUIPMENT IS PROVIDED BY INTEL AND ANY EXPRESS OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL INTEL BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +

      +7. You may provide to Intel additional feedback regarding the Intel Software and/or the +Intel Equipment, including suggested enhancements or modifications to the Software or +related materials. To the extent that you provide feedback to Intel, you agree that Intel +shall have no use or confidentiality restrictions on such feedback. +

      +8. Intel retains all ownership of the Intel Software. No other rights or licenses are given +to you, except as expressly provided in this license. Upon termination, you agree to destroy +all copies of the Intel Software in your possession other than Intel Software that you +incorporated into Your Software as permitted under paragraph 2. +

      +9. You shall comply with all US Export Regulations governing the Intel Software and Intel +Equipment. You shall not sell or otherwise transfer the Intel Software or any confidential +information of Intel to any person or any entity listed on a denial order published by the +US Government. You understand that this requirement is imposed for all transactions, +including sales, servicing, and training. You hereby certify that you are not involved in +nuclear, missile, chemical and/or biological weapons activities in violation of US Export +Regulations. +

      +10. U.S. GOVERNMENT RESTRICTED RIGHTS: The Materials are provided with "RESTRICTED RIGHTS." +Use, duplication, or disclosure by the Government is subject to restrictions as set forth in +FAR52.227-14 and DFAR252.227-7013 et seq. or its successor. Use of the Materials by the +Government constitutes acknowledgment of Intel's proprietary rights in them. +

      +11. USER SUBMISSIONS: Any material, information or other communication you transmit or post +to this Site will be considered non-confidential and non-proprietary ("Communications"). +Intel will have no obligations with respect to the Communications. Intel and its designees +will be free to copy, disclose, distribute, incorporate and otherwise use the Communications +and all data, images, sounds, text, and other things embodied therein for any and all commercial +or non-commercial purposes. You are prohibited from posting or transmitting to or from this +Site any unlawful, threatening, libelous, defamatory, obscene, pornographic, or other material +that would violate any law. +

      +12. USER CHAT ROOMS: Intel may, but is not obligated to, monitor or review any areas on the +Site where users transmit or post Communications or communicate solely with each other, +including but not limited to chat rooms, bulletin boards or other user forums, and the content +of any such Communications. Intel, however, will have no liability related to the content of +any such Communications, whether or not arising under the laws of copyright, libel, privacy, +obscenity, or otherwise. +

      +13. USE OF PERSONALLY IDENTIFIABLE INFORMATION: Information submitted to Intel through forms +on the website is governed according to Intel's Electronic Personal Information Privacy Policy +(http://www.intel.com/sites/corporate/privacy.htm.) +

      +14. LINKS TO OTHER MATERIALS: The linked sites are not under the control of Intel and Intel is +not responsible for the content of any linked site or any link contained in a linked site. +Intel reserves the right to terminate any link or linking program at any time. Intel does not +endorse companies or products to which it links and reserves the right to note as such on its +web pages. If you decide to access any of the third party sites linked to this Site, you do +this entirely at your own risk. +

      +15. APPLICABLE LAWS: This site is controlled by Intel from its offices within the United +States of America. Intel makes no representation that Materials in the site are appropriate or +available for use in other locations, and access to them from territories where their content +is illegal is prohibited. Those who choose to access this site from other locations do so on +their own initiative and are responsible for compliance with applicable local laws. You may not +use or export the Materials in violation of U.S. export laws and regulations. Any claim relating +to the Materials shall be governed by the internal substantive laws of the State of Delaware. +

      +16. GENERAL: Intel may revise these Terms at any time by updating this posting. You should +visit this page from time to time to review the then-current Terms because they are binding on +you. Certain provisions of these Terms may be superseded by expressly designated legal notices +or terms located on particular pages at this Site. +

      +17. This license forms the entire agreement between you and Intel with respect to the subject +matter hereof, and may only be amended in writing by authorized representatives of both parties. +The failure of either party to enforce any rights resulting from breach will not be deemed a +waiver. This license shall be governed by, subject to, and construed according to the laws of +the United States and the State of Delaware, excluding its conflicts of laws provisions. If the +Software is used outside the United States of America, you agree that all disputes regarding +this license and the Software shall be referred to the United States District Court for Delaware +or, if there is no federal jurisdiction, to the applicable state court in Delaware. +

      +18. You are not required to accept this agreement, since you have not signed it. However, nothing +else grants you permission to use the Intel Software or Intel Equipment. Therefore, by using the +Intel Equipment or Intel Software, you indicate your acceptance of this agreement to do so, and +all its terms and conditions for using the Intel Software and Intel Equipment. +

      + + Enter A Brief description of the work you would like to do on the Itanium(tm) processor prototype machines:
      + +

      +   + + '; + + site_user_footer(array()); + +} else { + + exit_not_logged_in(); + +} + +?> diff --git a/gforge/www/news/admin/news_admin_utils.php b/gforge/www/news/admin/news_admin_utils.php new file mode 100644 index 0000000000..1e738c5ca0 --- /dev/null +++ b/gforge/www/news/admin/news_admin_utils.php @@ -0,0 +1,114 @@ +

      '; + if ($selectable) { + echo ''; + } + echo date('Y-m-d', db_result($result,$i,'date')).''; + echo ' + '.db_result($result,$i,'summary').' + + ' + .db_result($result,$i,'group_name') + .' ('.db_result($result,$i,'unix_group_name').')' + .' +
      '; + echo '
      '; + } + echo ''; + + /* + Show list of rejected news items for this week + */ + + $result=db_query($sql_rejected); + $rows=db_numrows($result); + if ($rows < 1) { + echo ' +

      No rejected items found for this week

      '; + } else { + echo '

      These items were rejected this past week (total: '.$rows.')

      '; + echo html_build_list_table_top($title_arr); + for ($i=0; $i<$rows; $i++) { + show_news_item($result,$i,false,false); + } + echo ''; + } + + /* + Show list of approved news items for this week + */ + + $result=db_query($sql_approved); + $rows=db_numrows($result); + if ($rows < 1) { + echo ' +

      No approved items found for this week

      '; + } else { + echo '

      These items were approved this past week (total: '.$rows.')

      '; + echo html_build_list_table_top($title_arr); + for ($i=0; $i<$rows; $i++) { + show_news_item($result,$i,true,false); + } + echo ''; + } + +} + +?> diff --git a/gforge/www/project/admin/database.php b/gforge/www/project/admin/database.php new file mode 100644 index 0000000000..826d47d0d5 --- /dev/null +++ b/gforge/www/project/admin/database.php @@ -0,0 +1,241 @@ +$group_id,'admin_flags'=>'A')); + +$group =& group_get_object($group_id); +exit_assert_object($group, 'Group'); + +if ($createdb) { + + //mysql takes issue with database names that have dashes in them - so strip the dashes, replace with "" + //e.g. free-mysql becomes freemysql (it's a workaround) + //if there is a dash in the groupname + $dbname = str_replace("-", "", $group->getUnixName()); + + //check there is no name double up - if there is - add an incrementing to the number to the end + + $dbname = prdb_namespace_seek($dbname); + $randompw = random_pwgen(); + + $res = db_query(" + INSERT INTO prdb_dbs(group_id,dbname,dbusername,dbuserpass,requestdate,dbtype,created_by,state) + VALUES($group_id,'$dbname','$dbname','$randompw','".time()."',$newdbtypeid,".$LUSER->getID().",2) + "); + + if (!$res || db_affected_rows($res) < 1) { + $feedback .= 'Cannot add database entry: '.db_error(); + } else { + + $feedback .= "Database scheduled for creation."; + group_add_history('Created database '.$dbname.' type '.$row_db['dbsoftware'].' ','',$group_id); + + } + +} + +if ($updatedbrec) { + + if ($pw == $pwconfirm) { + + //sync new password, and flag it as 'pending (an) update' + + $res = db_query(" + UPDATE prdb_dbs + SET dbuserpass = '$pw', + state = '4' + WHERE dbid = '$dbid' + AND group_id = '$group_id' + "); + + if (!$res || db_affected_rows($res) < 1) { + $feedback .= "Update failure - ".db_error().""; + } else { + $res = db_query(" + SELECT * + FROM prdb_types + WHERE dbtypeid='$newdbtypeid' + "); + $row_db = db_fetch_array($res); + group_add_history('Updated database - (type: '.$row_db['dbsoftware'].')','',$group_id); + } + } else { + + $feedback .= "Operation failed. Password and Password Confirm are not the same"; + + } + +} + +if ($deletedbconfirm) { + + //schedule for deletion + + $res = db_query(" + UPDATE prdb_dbs + SET state=3 + WHERE dbid='$dbid' + AND group_id='$group_id' + "); + + if (!$res || db_affected_rows($res) < 1) { + $feedback .= 'Cannot delete database: '.db_error(); + } else { + $feedback .= "Database scheduled for deletion"; + } + +} + +project_admin_header(array('title'=>'Editing Database Info','group'=>$group_id,'pagename'=>'project_admin_database','sectionvals'=>array(group_getname($group_id)))); + +if ($deletedb == 1) { + + print "
      Click to confirm deletion [ CONFIRM DELETE ]

      "; + +} + +$res_db = db_query(" + SELECT * + FROM prdb_types + WHERE dbsoftware NOT IN ( + SELECT dbsoftware + FROM prdb_dbs,prdb_types + WHERE dbtypeid=dbtype + AND group_id='$group_id' + AND state IN (1,2,4) + ) +"); + +if (db_numrows($res_db) > 0) { + + print ' + +

      + + Add New Database +

      + Clicking on "create" will schedule the creation of the database, and email the + details to the project administrators. + +

      + Database Type: +

      + +

      + + + + + +   + +

      +
      + '; + +} else { +?> + +Documentation: Basic MySQL database access

      +Maximum number of databases of all types have been allocated.

      + + 0) { + + $title=array(); + $title[]='DB Type'; + $title[]='State'; + $title[]='New Password'; + $title[]='Confirm New'; + $title[]='Operations'; + + echo html_build_list_table_top($title); + + while ($row_db = db_fetch_array($res_db)) { + + print ' + + + '.$row_db['dbsoftware'].' + '.$row_db['statename'].' + '; + + //if database is active or pending update allow the record to be deleted or password changed + + if (($row_db['state'] == 1) || ($row_db['state'] == 4) || ($row_db['state'] == 2)) { + + print '

      + + + + + + + +
      + '; + + } else { + print ' +   +   +   + '; + } + + print ''; + + } + + + print ''; + +} else { + + print 'Current Databases

      There are no databases currently allocated to this group.'; + +} + +project_admin_footer(array()); + +?> diff --git a/gforge/www/project/admin/rmuser.php b/gforge/www/project/admin/rmuser.php new file mode 100644 index 0000000000..355ef3da8c --- /dev/null +++ b/gforge/www/project/admin/rmuser.php @@ -0,0 +1,87 @@ +$group_id)); + +$group =& group_get_object($group_id); +exit_assert_object($group, 'Group'); + +// Do some text substitutions below +if ($group->getType()==2) { + $type = 'foundry'; + // foundries hate explicit group_id + $passed_group_id = ''; +} else { + $type = 'project'; + $passed_group_id = ''; +} + +// Need to check if user being removed is admin +$rm_user =& user_get_object($rm_id); +exit_assert_object($rm_user, 'User'); +$perm = $group->getPermission($rm_user); + +if ($perm->isAdmin()) { + exit_error( + 'Operation Not Permitted', + 'You cannot remove '.$type.' admin.' + ); +} + + +project_admin_header(array('title'=>"Project Admin: ".group_getname($group_id),'group'=>$group_id)); + +?> + +

      Removing Developer from

      +

      +You are about to remove developer from the . Please +confirm your action: +

      + + + +
      + +
      + + + + +
      + +
      + +
      + + +
      + +
      + + diff --git a/gforge/www/project/admin/userpermedit.php b/gforge/www/project/admin/userpermedit.php new file mode 100644 index 0000000000..a8b7871b78 --- /dev/null +++ b/gforge/www/project/admin/userpermedit.php @@ -0,0 +1,369 @@ +$group_id,'admin_flags'=>'A')); + +// Builds role selection box with given selected item +function member_role_box($name, $checked) { + global $member_roles; + if (!$member_roles) { + $sql="SELECT category_id,name FROM people_job_category"; + $member_roles=db_query($sql); + } + return html_build_select_box($member_roles,$name,$checked,true,'Undefined'); +} + +// Since there're lot of permissions, and each of them has complex +// HTML rendition (SELECT boxes, etc.), this function is used to reduce +// the background noise. +function render_row($name, $val, $i) { + print ' + + '.$name.' + '.$val.' + '; +} + +$group =& group_get_object($group_id); +exit_assert_object($group, 'Group'); + +// ########################### form submission, make updates + +// Netscape allows to submit single-field form by pressing +// Return in the field. In this case, it won't set value for +// submit button +if ($submit || $form_unix_name) { + + + if ($GLOBALS['func']=='adduser') { + + /* + We came here from Add User page, need to add user + and fall thru to show permissions for one + */ + + $u =& user_get_object_by_name($form_unix_name); + if (!$u || !is_object($u)){ + exit_error( + 'Invalid user', + 'User does not exist.' + ); + } + + if (!$group->addUser($u->getUnixName())) { + exit_error('Error', $u->getErrorMessage()); + } else { + $feedback = ' User Added Successfully
      '; + } + + $user_id = $u->getID(); + + } elseif ($addtotracker) { + + $u =& user_get_object($user_id); + exit_assert_object($u, 'User'); + + // + // if "add all" option, get list of ArtifactTypes + // that this user is not already a member of + // + if ($add_all) { + $sql="SELECT group_artifact_id + FROM artifact_group_list + WHERE group_id='$group_id' + AND NOT EXISTS (SELECT user_id + FROM artifact_perm + WHERE artifact_perm.group_artifact_id=artifact_group_list.group_artifact_id + AND user_id='".$u->getID()."')"; + + $addtoids = util_result_column_to_array(db_query($sql)); + } + + // + // Now take the array of ids and add this user to them + // + $count = count($addtoids); + + for ($i=0; $i<$count; $i++) { + $ath = new ArtifactType($group,$addtoids[$i]); + + $ath->addUser($u->getID()); + if ($ath->isError()) { + $feedback .= $addtoids[$i] .': '. $ath->getErrorMessage(); + $was_error = true; + } + } + + } else { + + /* + Else, we are updating user's permissions + */ + + $u =& user_get_object($user_id); + exit_assert_object($u, 'User'); + + // XXX: remove when CVS roles will be activated! + $cvs_flags = 1; + + //call to control function in the $Group object + if ($group->updateUser($user_id, + $admin_flags, $bug_flags, $forum_flags, + $project_flags, $patch_flags, $support_flags, + $doc_flags, $cvs_flags, $release_flags, + $member_role, $artifact_flags)) { + + group_add_history ('Changed Permissions for',$u->getUnixName(),$group_id); + + + // + // Delete the checked ids + // + + // keep an assoc array of artifacts this user + // was removed from, so we don't then try to update + // those artifact type perms in the next step + $del_arr=array(); + + $count=count($deletefrom); + for ($i=0; $i<$count; $i++) { + $del_arr["$deletefrom[$i]"]=true; + $ath = new ArtifactType($group,$deletefrom[$i]); + $ath->deleteUser($user_id); + if ($ath->isError()) { + $feedback .= $deletefrom[$i] .': '. $ath->getErrorMessage(); + $was_error=true; + } + } + + // + // Handle the 2-D array of group_artifact_id/permission level + // + $count=count($updateperms); + + for ($i=0; $i<$count; $i++) { + // + // quick check of that assoc array to prevent + // updating of perms that don't exist anymore + // + if (!$del_arr["$updateperms[$i][0]"]) { + $ath = new ArtifactType($group,$updateperms[$i][0]); + $ath->updateUser($user_id,$updateperms[$i][1]); + if ($ath->isError()) { + $feedback .= $updateperms[$i][0] .': '. $ath->getErrorMessage(); + $was_error=true; + } + } + } + + //if no errors occurred, show just one feedback message + //instead of the coredump of messages; + if (!$was_error) { + $feedback = ' Permissions Updated
      '; + } + } else { + $feedback .= $group->getErrorMessage(); + } + + } + +} else { + // + // Set up this user's object + // + $u =& user_get_object($user_id); + if (!$u || !is_object($u)) { + exit_error('Error', 'Error creating user object'); + } else if ($u->isError()) { + exit_error('Error', $u->getErrorMessage()); + } +} + +project_admin_header(array('title'=>'Project Developer Permissions','group'=>$group_id,'pagename'=>'project_admin_userpermedit','sectionvals'=>array(group_getname($group_id)))); + +// Show description of roles/permissions +echo permissions_blurb(); + +$res_dev = db_query(" + SELECT * + FROM user_group + WHERE group_id='$group_id' + AND user_id='$user_id' +"); + +if (!$res_dev || db_numrows($res_dev) < 1) { + echo '

      Developer Not Found In This Group

      '; + echo db_error(); +} else { + echo ' +

      +

      '; + + $row_dev = db_fetch_array($res_dev); + + $arr=array(); + $arr[]='Property'; + $arr[]='Value'; + + echo html_build_list_table_top($arr); + + render_row( + 'Project role', + member_role_box('member_role',$row_dev['member_role']), + $i++ + ); + + render_row( + 'Project Admin', + html_build_checkbox('admin_flags', 'A', stristr($row_dev['admin_flags'],'A')), + $i++ + ); + + render_row( + 'Release Technician', + html_build_checkbox('release_flags', '1', $row_dev['release_flags']==1), + $i++ + ); + +/* + render_row( + 'CVS Access', + html_build_select_box_from_arrays( + array(0,1,2), + array('Read-only','Write','Admin'), + 'cvs_flags',$row_dev['cvs_flags'],false + ), + $i++ + ); +*/ + + render_row( + 'Tracker Manager', + html_build_select_box_from_arrays( + array(0,2), + array('-','Admin'), + 'artifact_flags',$row_dev['artifact_flags'],false + ), + $i++ + ); + + $tracker_ids = array(0,1,2,3); + $tracker_texts = array('-','Technician','Admin & Tech','Admin'); + + render_row( + 'Project/Task Manager', + html_build_select_box_from_arrays( + $tracker_ids, + $tracker_texts, + 'project_flags',$row_dev['project_flags'],false + ), + $i++ + ); + + render_row( + 'Forums', + html_build_select_box_from_arrays( + array(0,2), + array('-','Moderator'), + 'forum_flags',$row_dev['forum_flags'],false + ), + $i++ + ); + + render_row( + 'Documentation Manager', + html_build_select_box_from_arrays( + array(0,1), + array('-','Editor'), + 'doc_flags',$row_dev['doc_flags'],false + ), + $i++ + ); + + // + // Get the list of permissions that this user has + // for ArtifactTypes in this Group + // + $res = db_query("SELECT * FROM artifactperm_artgrouplist_vw + WHERE user_id='$user_id' + AND group_id='$group_id'"); + + $rows=db_numrows($res); + + // Iterate over all trackers of the group + for ($i=0; $i<$rows; $i++) { + print ' + + + + '. db_result($res,$i,'name') .' + + Remove + + '; + } + + ?> + +

      + + +

      + + + + +

      +

      Add User To These Trackers:

      +

      + You can pick and choose which trackers this user has any privileges in, + or simply add the user to all trackers by checking "Add To All". +

      +

      +
      + + +   Add To All +
      +
      '; + +} + +project_admin_footer(array()); + +?> diff --git a/gforge/www/project/admin/vhost.php b/gforge/www/project/admin/vhost.php new file mode 100644 index 0000000000..3d7f5d208c --- /dev/null +++ b/gforge/www/project/admin/vhost.php @@ -0,0 +1,149 @@ +$group_id,'admin_flags'=>'A')); + +$group = &group_get_object($group_id); + +if (!$group || !is_object($group)) { + exit_error('Error','Error creating group object'); +} else if ($group->isError()) { + exit_error('ERROR',$group->getErrorMessage()); +} + +if ($createvhost) { + + $homedir = account_group_homedir($group->getUnixName()); + $docdir = $homedir.'/htdocs/'; + $cgidir = $homedir.'/cgi-bin/'; + + if (valid_hostname($vhost_name)) { + + $res = db_query(" + INSERT INTO prweb_vhost(vhost_name, docdir, cgidir, group_id) + values ('$vhost_name','$docdir','$cgidir',".$group->getID().") + "); + + if (!$res || db_affected_rows($res) < 1) { + $feedback .= "Cannot insert VHOST entry: ".db_error(); + } else { + $feedback .= "Virtual Host scheduled for creation."; + $group->addHistory('Added vhost '.$vhost_name.' ',''); + } + + } else { + + $feedback .= "Not a valid hostname - $vhost_name"; + + } +} + + +if ($deletevhost) { + + //schedule for deletion + + $res = db_query(" + SELECT * + FROM prweb_vhost + WHERE vhostid='$vhostid' + "); + + $row_vh = db_fetch_array($res); + + $res = db_query(" + DELETE FROM prweb_vhost + WHERE vhostid='$vhostid' + AND group_id='$group_id' + "); + + if (!$res || db_affected_rows($res) < 1) { + $feedback .= "Could not delete VHOST entry:".db_error(); + } else { + $feedback .= "VHOST deleted"; + $group->addHistory('Virtual Host '.$row_vh['vhost_name'].' Removed',''); + + } + +} + +project_admin_header(array('title'=>'Editing Virtual Host Info','group'=>$group->getID(),'pagename'=>'project_admin_vhost','sectionvals'=>array(group_getname($group_id)))); + +?> + +

      + +Add New Virtual Host +

      +To add a new virtual host - simply point a CNAME for yourhost.org at +usw-pr-vhost.sourceforge.net. SourceForge does not currently host mail (i.e. cannot be an MX) +or DNS. +

      +Clicking on "create" will schedule the creation of the Virtual Host. This will be +synced to the project webservers - such that yourhost.org will display the +material at getUnixName(); ?>.sourceforge.net. + +

      + +

      + + + + + + +
      New Virtual Host (e.g. vhost.org)
      +
      + +getID()."' +"); + +if (db_numrows($res_db) > 0) { + + print ' + + + '; + + } + print '
      '; + + $title=array(); + $title[]='Virtual Host'; + $title[]='Operations'; + echo html_build_list_table_top($title); + + while ($row_db = db_fetch_array($res_db)) { + + print '
      '.$row_db['vhost_name'].'[ Delete ] +
      '; + + print ''; + +} else { + echo '

      No VHOSTs defined

      '; +} + +project_admin_footer(array()); + +?> diff --git a/gforge/www/register/projectinfo.php b/gforge/www/register/projectinfo.php new file mode 100644 index 0000000000..47977f9801 --- /dev/null +++ b/gforge/www/register/projectinfo.php @@ -0,0 +1,294 @@ +'1')); + +if ($submit) { + $full_name = trim($full_name); + $purpose = trim($purpose); + $license_other = trim($license_other); + $description = trim($description); + $unix_name = strtolower($unix_name); + + /* + Fierce validation + */ + + if (strlen($full_name)<3) { + $feedback .= "Invalid Full Name"; + } else if (!account_groupnamevalid($unix_name)) { + $feedback .= "Invalid Unix Name"; + } else if (db_numrows(db_query("SELECT group_id FROM groups WHERE unix_group_name='$unix_name'")) > 0) { + $feedback .= "Unix group name already taken"; + } else if (strlen($purpose)<20) { + $feedback .= "Please describe your + Registration Purpose in a more comprehensive manner"; + } else if (strlen($description)<10) { + $feedback .= "Please use more comprehensive Project Description"; + } else if (!$license) { + $feedback .= "You have not chosen a license"; + } else if ($license!="other" && $license_other) { + $feedback .= "Conflicting licenses choice"; + } else if ($license=="other" && strlen($license_other)<50) { + $feedback .= "Please give more comprehensive licensing description"; + } else { + $group = new Group(); + $u =& session_get_user(); + $res = $group->create( + $u, + $full_name, + $unix_name, + $description, + $license, + $license_other, + $purpose + ); + + if (!$res) { + $feedback .= $group->getErrorMessage(); + } else { + $HTML->header(array('title'=>'Registration Complete','pagename'=>'register_complete')); + + ?> + +

      Your project has been submitted to the SourceForge admininstrators. + Within 72 hours, you will receive decision notification and further + instructions. +

      +

      + Thank you for choosing SourceForge. +

      + + footer(array()); + exit(); + } + + } +} else if ($i_disagree) { + session_redirect("/"); +} + +site_header(array('title'=>'Project Information','pagename'=>'register_projectinfo')); +?> + +

      +To apply for project registration, you should fill in basic information +about it. Please read descriptions below carefully and provide complete +and comprehensive data. All fields below are mandatory. +

      + +
      + +

      1. Project Full Name

      + + +

      +You should start with specifying the name of your project. +The "Full Name" is descriptive, and has no arbitrary restrictions (except +a 40 character limit). +

      + + +Full Name: +
      + + +

      2. Project Purpose and Summarization

      +

      + +

      + +Please provide detailed, accurate description of your project and +what SourceForge resources and in which way you plan to use. This +description will be the basis for the approval or rejection of +your project's hosting on SourceForge, and later, to ensure that +you are using the services in the intended way. This description +will not be used as a public description of your project. It must +be written in English. + +

      + + + + +

      3. License

      + +

      If you are applying for a website-only project, please +select "website-only" from the choices below and proceed. + +

      SourceForge was created to advance Open Source software development. +To keep things simple, we are relying on the outstanding work +of the Open Source Initiative +for our licensing choices. + +

      We realize, however that there may be other licenses out there +that may better fit your needs. If you wish to use a license that is +not OSI Certified, please let us know why you wish to use another +license. + +

      Choosing a license is a serious decision. Please take some time +to read the text (and our explanations) of several licenses before +making a choice about your project. + +

      You may change the license for your project at a +later date, so long as you have a legal capability to do so, your file +release clearly relates this change, and your filemap categorization is +updated appropriately. Please note that license changes are not +retroactive (i.e. do not apply to products already released under +OpenSource license). + +

      SourceForge is not responsible for legal discrepencies regarding +your license. + +

      Licenses + +

      + +

      License for This Project + +Your License:
      +'; + echo '

      +If you selected "other", please provide an explanation along +with a description of your license. Realize that other licenses may +not be approved. Also, it may take additional time to make a decision +for such project, since we will need to check that license is compatible +with the OpenSource definition. +
      + +

      + + +

      4. Project Public Description

      +

      +This is the description of your project which will be shown on +the Project Summary page, in search results, etc. It should not +be as comprehensive and formal as Project Purpose description +(step 2), so feel free to use concise and catchy wording. Maximum +length is 255 chars. +

      + + + + +

      5. Project Unix Name

      +

      +In addition to full project name, you will need to choose short, +"Unix" name for your project. +

      + +

      The "Unix Name" has several restrictions because it is +used in so many places around the site. They are: + +

        +
      • Cannot match the unix name of any other project +
      • Must be between 3 and 15 characters in length +
      • Must be in lower case +
      • Can only contain characters, numbers, and dashes +
      • Must be a valid unix username +
      • Cannot match one of our reserved domains +
      • Unix name will never change for this project +
      + +

      Your unix name is important, however, because it will be used for +many things, including: + +

        +
      • A web site at unixname. +
      • A CVS Repository root of /cvsroot/unixname at cvs.unixname. +
      • Shell access to unixname. +
      • Search engines throughout the site +
      + +

      Unix Name: +
      + + +

      + +
      + +
      + + + diff --git a/gforge/www/stats/lastlogins.php b/gforge/www/stats/lastlogins.php new file mode 100644 index 0000000000..872045a233 --- /dev/null +++ b/gforge/www/stats/lastlogins.php @@ -0,0 +1,54 @@ +'1','admin_flags'=>'A')); + +$res_logins = db_query("SELECT session.user_id AS user_id," + . "session.ip_addr AS ip_addr," + . "session.time AS time," + . "users.user_name AS user_name FROM session,users " + . "WHERE session.user_id=users.user_id AND " + . "session.user_id>0 AND session.time>0 ORDER BY session.time DESC",50); + +if (!$res_logins || db_numrows($res_logins) < 1) { + exit_error("No records found","Database error: ".db_error()); +} + +$HTML->header(array('title'=>"Last Logins")); + +print '

      Most Recent Opened Sessions

      '; + +$title=array(); +$title[]='Date'; +$title[]='Username'; +$title[]='Source IP'; + +echo html_build_list_table_top($title); + +while ($row_logins = db_fetch_array($res_logins)) { + print ''; + print ''.date($sys_datefmt, $row_logins['time']).''; + print ''.$row_logins['user_name'].''; + print ''.$row_logins['ip_addr'].''; + print ''; +} + +print ''; + +$HTML->footer(array()); + +?> diff --git a/gforge/www/testsecurity.php b/gforge/www/testsecurity.php new file mode 100644 index 0000000000..e8317b94fd --- /dev/null +++ b/gforge/www/testsecurity.php @@ -0,0 +1,62 @@ +header(array('title'=>'Security Test')); + +$group_id=1; + +$grp =& group_get_object($group_id); +$perm =& $grp->getPermission( session_get_user() ); + +echo '
      Is admin: '.$perm->isAdmin(); +echo '
      Is DocEditor: '.$perm->isDocEditor(); +echo '
      Is ForumAdmin: '.$perm->isForumAdmin(); +echo '
      Is PMadmin: '.$perm->isPMAdmin(); +echo '
      Is ArtifactAdmin: '.$perm->isArtifactAdmin(); +echo '
      Is release: '.$perm->isReleaseTechnician(); + +echo '
      user_ismember(): '.user_ismember($group_id); +echo '
      user_ismember(A): '.user_ismember($group_id,'A'); +echo '
      user_ismember(B1): '.user_ismember($group_id,'B1'); +echo '
      user_ismember(B2): '.user_ismember($group_id,'B2'); +echo '
      user_ismember(S1): '.user_ismember($group_id,'S1'); +echo '
      user_ismember(S2): '.user_ismember($group_id,'S2'); +echo '
      user_ismember(C1): '.user_ismember($group_id,'C1'); +echo '
      user_ismember(C2): '.user_ismember($group_id,'C2'); +echo '
      user_ismember(P1): '.user_ismember($group_id,'P1'); +echo '
      user_ismember(P2): '.user_ismember($group_id,'P2'); +echo '
      user_ismember(F2): '.user_ismember($group_id,'F2'); +echo '
      user_ismember(D1): '.user_ismember($group_id,'D1'); + + +echo '

      Group2

      '; + +$group_id=2; + +$grp =& group_get_object($group_id); +$perm =& $grp->getPermission( session_get_user() ); + +echo '
      Is admin: '.$perm->isAdmin(); +echo '
      Is DocEditor: '.$perm->isDocEditor(); +echo '
      Is ForumAdmin: '.$perm->isForumAdmin(); +echo '
      Is PMadmin: '.$perm->isPMAdmin(); +echo '
      Is ArtifactAdmin: '.$perm->isArtifactAdmin(); +echo '
      Is release: '.$perm->isReleaseTechnician(); + +echo '
      user_ismember(): '.user_ismember($group_id); +echo '
      user_ismember(A): '.user_ismember($group_id,'A'); +echo '
      user_ismember(B1): '.user_ismember($group_id,'B1'); +echo '
      user_ismember(B2): '.user_ismember($group_id,'B2'); +echo '
      user_ismember(S1): '.user_ismember($group_id,'S1'); +echo '
      user_ismember(S2): '.user_ismember($group_id,'S2'); +echo '
      user_ismember(C1): '.user_ismember($group_id,'C1'); +echo '
      user_ismember(C2): '.user_ismember($group_id,'C2'); +echo '
      user_ismember(P1): '.user_ismember($group_id,'P1'); +echo '
      user_ismember(P2): '.user_ismember($group_id,'P2'); +echo '
      user_ismember(F2): '.user_ismember($group_id,'F2'); +echo '
      user_ismember(D1): '.user_ismember($group_id,'D1'); + +$HTML->footer(array()); + +?> diff --git a/gforge/www/themes/ultralite/Theme.class b/gforge/www/themes/ultralite/Theme.class new file mode 100644 index 0000000000..c370a02e53 --- /dev/null +++ b/gforge/www/themes/ultralite/Theme.class @@ -0,0 +1,309 @@ +Layout(); + + //Define deifferences from defaults for this theme + $this->COLOR_HTMLBOX_TITLE = '#6C7198'; //GRAY'; + $this->COLOR_HTMLBOX_BACK = '#EEEEEE'; + $this->COLOR_LTBACK1 = '#EEEEEE'; + $this->COLOR_CONTENT_BACK='WHITE'; + + $this->FONT_CONTENT = 'Lucida'; + $this->FONT_HTMLBOX_TITLE = 'Lucida'; + + $this->FONTCOLOR_HTMLBOX_TITLE = '#FFFFFF'; + $this->FONTCOLOR_CONTENT = '#000000'; + + } + + function box1_top($title,$echoout=1,$bgcolor='') { + if (!$bgcolor) { + $bgcolor=$this->COLOR_HTMLBOX_BACK; + } +// $return = ' +//
      '; + + $return .= ''. + ''. + ''. + ' + + + + + + + + +
      '.$title.'
      '; + if ($echoout) { + print $return; + } else { + return $return; + } + } + + function box1_middle($title,$bgcolor='') { + if (!$bgcolor) { + $bgcolor=$this->COLOR_HTMLBOX_BACK; + } + return ' +
      '.$title.'
      '; + } + + function box1_bottom($echoout=1) { + $return = ' +

      '; +//

      '; + if ($echoout) { + print $return; + } else { + return $return; + } + } + + // ############################ + + function header($params) { + global $Language; + + $this->generic_header_start($params); + + //themable someday? + $site_fonts='verdana,arial,helvetica,sans-serif'; + + ?> + + + generic_header_end($params); + echo ''; + osdn_print_navbar(); +?> + + + + + + + + + + + + + + + + + + + + + + +
      + '0','align'=>'left')); +//echo html_image($this->imgroot . "sflogo-hammer1.jpg","136","79",array()); + ?> + + [Login] | + [New User]'; + } else { + print '[Logout] + | [My Page] + | [Account Prefs]'; + } + +//vars needed for search functionality +global $forum_id,$group_id,$is_bug_page; + + print ' | [Software Map] + | [Docs]'; +// | [Search]'; + + if (!session_issecure()) { + print 'Counter'; + } else { + print 'Counter'; + } + + echo menu_show_search_box(true); + + ?> + +
      +   + + + getText($params['pagename'],'title',$params['titlevals']); + } else { + $title = $Language->getText($params['pagename'],'title'); + } + + if ($params['sectionvals']) { + $section = $Language->getText($params['pagename'],'section',$params['sectionvals']); + } else { + $section = $Language->getText($params['pagename'],'section'); + } + + if ($section) { + print "$section\n"; + } + + if ($title) { + print "

      $title

      \n"; + } + + } + + + + // ############################ + + function footer($params) { + + ?> +
      +   +
      + + + generic_footer($params); + } + + function menuhtml_top($title) { + /* + Use only for the top most menu + */ + ?> + + + + +
      +
      +
      + +
      +'; + } + + function menu_entry($link, $title) { + print "\t".''.$title.'
      '; + } +/* + function tab_entry($url='http://localhost/', $icon='/images/ic/home16b.png', $title='Home', $selected=0) { + print ' + '; + html_image($icon,'24','24',array('alt'=>"$title",'border'=>($selected?'1':'0'))); + print ''; + } + +*/ +} +?> diff --git a/gforge/www/top/topusers.php b/gforge/www/top/topusers.php new file mode 100644 index 0000000000..74b10500a2 --- /dev/null +++ b/gforge/www/top/topusers.php @@ -0,0 +1,101 @@ +header(array('title'=>'Highest Ranked Users')); + +print '

      Highest Ranked Users

      +
      (Updated Daily) + +

      [View Other Top Categories] + +

      + + + + + + + +'; + +while ($row_top = db_fetch_array($res_top)) { + $i++; + print '' + .'' + .'' + .' +'; +} + +print '
      RankUser Name
       
      Real Name
       
      RatingLast RankChange   
        '.$row_top['ranking'] + .'' + .$row_top['user_name'].''.$row_top['realname'].''.sprintf('%.2f', $row_top['metric']) + .'   '.$row_top['old_ranking'] + .'   '; + + // calculate change + $diff = $row_top["old_ranking"] - $row_top["ranking"]; + if (!$row_top["old_ranking"] || !$row_top["ranking"]) { + print "N/A"; + } + else if ($diff == 0) { + print "Same"; + } + else if ($diff > 0) { + print "Up $diff"; + } + else if ($diff < 0) { + print "Down ".(0-$diff).""; + } + + print '   
      '; + +print ' + + + +
      '.(($offset>=$LIMIT)?'<-- More':' ').'More -->
      +'; + +$HTML->footer(array()); +?> diff --git a/gforge/www/tos/privacy_generic.php b/gforge/www/tos/privacy_generic.php new file mode 100644 index 0000000000..6a1ccc3cd7 --- /dev/null +++ b/gforge/www/tos/privacy_generic.php @@ -0,0 +1,30 @@ +header(array(title=>'Privacy Policy')); +?> + +

      +

      Privacy Policy

      +

      + +

      +Insert privacy policy statement here. + +footer(array()); + +?> + diff --git a/gforge/www/tos/tos_generic.php b/gforge/www/tos/tos_generic.php new file mode 100644 index 0000000000..030b191cfe --- /dev/null +++ b/gforge/www/tos/tos_generic.php @@ -0,0 +1,25 @@ + + +

      +

      Terms of Service Agreement

      +

      + +

      +Insert terms of service statement here. + + diff --git a/gforge/www/tracker/add.php b/gforge/www/tracker/add.php new file mode 100644 index 0000000000..3b5aac8252 --- /dev/null +++ b/gforge/www/tracker/add.php @@ -0,0 +1,100 @@ +header(array ('title'=>'Submit','pagename'=>'tracker_add','sectionvals'=>array($ath->getName()))); + + echo ' +

      '; + /* + Show the free-form text submitted by the project admin + */ + echo $ath->getSubmitInstructions(); + + echo '

      +

      + + + + + userIsAdmin()) { + echo ''; + } + ?> + + + + + + + + + + +
      For Project:
      '.$group->getPublicName().'
      Category: (?)
      '; + + echo $ath->categoryBox('category_id'); + echo ' (admin)'; + ?> +
      Group: (?)
      + artifactGroupBox('artifact_group_id'); + echo ' (admin)'; + ?> +
      Assigned To: (?)
      '; + echo $ath->technicianBox ('assigned_to'); + echo ' (admin)'; + + echo '
      Priority: (?)
      '; + echo build_priority_select_box('priority'); + echo '
      Summary: (?)
      + +
      + Detailed Description: +

      + +

      + Please log in!
      + If you cannot login, then enter your email address here:

      + + '; + + } + ?> +

      +

      DO NOT enter passwords or other confidential information!

      +

      +

      + Check to Upload & Attach File: + (?)
      +

      + +

      + File Description:
      + +

      +

      + + +

      +

      + + footer(array()); + +?> diff --git a/gforge/www/tracker/admin/index.php b/gforge/www/tracker/admin/index.php new file mode 100644 index 0000000000..7811221cb3 --- /dev/null +++ b/gforge/www/tracker/admin/index.php @@ -0,0 +1,797 @@ +isError()) { + exit_no_group(); + } + + $perm =& $group->getPermission( session_get_user() ); + + if (!$perm || !is_object($perm) || !$perm->isArtifactAdmin()) { + exit_permission_denied(); + } + + // + // Create the ArtifactType object + // + $ath = new ArtifactTypeHtml($group,$atid); + if (!$ath || !is_object($ath)) { + exit_error('Error','ArtifactType could not be created'); + } + if ($ath->isError()) { + exit_error('Error',$ath->getErrorMessage()); + } + + if ($post_changes) { +// +// +// Update the database +// +// + if ($add_cat) { + + $ac = new ArtifactCategory($ath); + if (!$ac || !is_object($ac)) { + $feedback .= 'Unable to create ArtifactCategory Object'; +// } elseif ($ac->isError()) { +// $feedback .= $ac->getErrorMessage(); + } else { + if (!$ac->create($name,$assign_to)) { + $feedback .= ' Error inserting: '.$ac->getErrorMessage(); + $ac->clearError(); + } else { + $feedback .= ' Category Inserted '; + } + } + + } elseif ($add_group) { + + $ag = new ArtifactGroup($ath); + if (!$ag || !is_object($ag)) { + $feedback .= 'Unable to create ArtifactGroup Object'; +// } elseif ($ag->isError()) { +// $feedback .= $ag->getErrorMessage(); + } else { + if (!$ag->create($name)) { + $feedback .= ' Error inserting: '.$ag->getErrorMessage(); + $ag->clearError(); + } else { + $feedback .= ' Group Inserted '; + } + } + + } elseif ($add_canned) { + + $acr = new ArtifactCanned($ath); + if (!$acr || !is_object($acr)) { + $feedback .= 'Unable to create ArtifactCanned Object'; +// } elseif ($acr->isError()) { +// $feedback .= $acr->getErrorMessage(); + } else { + if (!$acr->create($title,$body)) { + $feedback .= ' Error inserting: '.$acr->getErrorMessage(); + $acr->clearError(); + } else { + $feedback .= ' Canned Response Inserted '; + } + } + + } elseif ($add_users) { + + // + // if "add all" option, get list of group members + // who are not already members of this ArtifactType + // + if ($add_all) { + $sql="SELECT u.user_id + FROM users u,user_group ug + WHERE u.user_id=ug.user_id + AND ug.group_id='$group_id' + AND NOT EXISTS (SELECT user_id FROM artifact_perm ap + WHERE ap.group_artifact_id='$atid' + AND ap.user_id=u.user_id);"; + $addids=util_result_column_to_array(db_query($sql)); + } + $count=count($addids); + for ($i=0; $i<$count; $i++) { + $ath->addUser($addids[$i]); + } + if ($ath->isError()) { + $feedback .= $ath->getErrorMessage(); + $ath->clearError(); + } else { + $feedback .= ' User(s) Added '; + } + //go to the perms page + $add_users=false; + $update_users=true; + + } elseif ($update_users) { + + // + // Handle the 2-D array of user_id/permission level + // + $count=count($updateids); + for ($i=0; $i<$count; $i++) { + $ath->updateUser($updateids[$i][0],$updateids[$i][1]); + } + if ($ath->isError()) { + $feedback .= $ath->getErrorMessage(); + $ath->clearError(); + } else { + $feedback .= ' User(s) Updated '; + } + + // + // Delete the checked ids + // + $count=count($deleteids); + for ($i=0; $i<$count; $i++) { + $ath->deleteUser($deleteids[$i]); + } + if ($ath->isError()) { + $feedback .= $ath->getErrorMessage(); + $ath->clearError(); + } else { + $feedback .= ' User(s) Deleted '; + } + + } elseif ($update_canned) { + + $acr = new ArtifactCanned($ath,$id); + if (!$acr || !is_object($acr)) { + $feedback .= 'Unable to create ArtifactCanned Object'; + } elseif ($acr->isError()) { + $feedback .= $acr->getErrorMessage(); + } else { + if (!$acr->update($title,$body)) { + $feedback .= ' Error updating: '.$acr->getErrorMessage(); + $acr->clearError(); + } else { + $feedback .= ' Canned Response Updated '; + $update_canned=false; + $add_canned=true; + } + } + + } elseif ($update_cat) { + + $ac = new ArtifactCategory($ath,$id); + if (!$ac || !is_object($ac)) { + $feedback .= 'Unable to create ArtifactCategory Object'; + } elseif ($ac->isError()) { + $feedback .= $ac->getErrorMessage(); + } else { + if (!$ac->update($name,$assign_to)) { + $feedback .= ' Error updating: '.$ac->getErrorMessage(); + $ac->clearError(); + } else { + $feedback .= ' Category Updated '; + $update_cat=false; + $add_cat=true; + } + } + + } elseif ($update_group) { + + $ag = new ArtifactGroup($ath,$id); + if (!$ag || !is_object($ag)) { + $feedback .= 'Unable to create ArtifactGroup Object'; + } elseif ($ag->isError()) { + $feedback .= $ag->getErrorMessage(); + } else { + if (!$ag->update($name)) { + $feedback .= ' Error updating: '.$ag->getErrorMessage(); + $ag->clearError(); + } else { + $feedback .= ' Group Updated '; + $update_group=false; + $add_group=true; + } + } + + } elseif ($update_type) { + + if (!$ath->update($name,$description,$is_public,$allow_anon,$email_all,$email_address, + $due_period,$status_timeout,$use_resolution,$submit_instructions,$browse_instructions)) { + $feedback .= ' Error updating: '.$ath->getErrorMessage(); + $ath->clearError(); + } else { + $feedback .= ' Tracker Updated '; + } + + } + + } +// +// +// +// FORMS TO ADD/UPDATE DATABASE +// +// +// + if ($add_cat) { +// +// FORM TO ADD CATEGORIES +// + $ath->adminHeader(array ('title'=>'Add Categories to: '.$ath->getName())); + + echo "

      Add Categories to: ". $ath->getName() ."

      "; + + /* + List of possible categories for this ArtifactType + */ + $result=$ath->getCategories(); + echo "

      "; + $rows=db_numrows($result); + if ($result && $rows > 0) { + $title_arr=array(); + $title_arr[]='ID'; + $title_arr[]='Title'; + + echo html_build_list_table_top ($title_arr); + + for ($i=0; $i < $rows; $i++) { + echo ''. + ''.db_result($result, $i, 'id').''. + ''. + db_result($result, $i, 'category_name').''; + } + echo ''; + } else { + echo "\n

      No categories defined

      "; + } + ?> +

      +

      + + New Category Name:
      +
      +

      + Auto-Assign To:
      + technicianBox('assign_to'); ?> +

      + Once you add a category, it cannot be deleted +

      + +

      + footer(array()); + + } elseif ($add_group) { +// +// FORM TO ADD GROUP +// + $ath->adminHeader(array ('title'=>'Add/Change Groups to: '.$ath->getName(),'pagename'=>'tracker_admin_add_group','titlevals'=>array($ath->getName()))); + + /* + List of possible groups for this ArtifactType + */ + $result=$ath->getGroups(); + echo "

      "; + $rows=db_numrows($result); + if ($result && $rows > 0) { + $title_arr=array(); + $title_arr[]='ID'; + $title_arr[]='Title'; + + echo html_build_list_table_top ($title_arr); + + for ($i=0; $i < $rows; $i++) { + echo ''. + ''.db_result($result, $i, 'id').''. + ''. + db_result($result, $i, 'group_name').''; + } + echo ''; + } else { + echo "\n

      No groups defined

      "; + } + ?> +

      +

      + + New group Name:
      +
      +

      + Once you add a group, it cannot be deleted +

      + +

      + footer(array()); + + } elseif ($add_canned) { +// +// FORM TO ADD CANNED RESPONSES +// + $ath->adminHeader(array ('title'=>'Add/Change Canned Responses to: '.$ath->getName())); + + echo "

      Add Canned Responses to: ". $ath->getName() ."

      "; + + /* + List of existing canned responses + */ + $result=$ath->getCannedResponses(); + $rows=db_numrows($result); + echo "

      "; + + if ($result && $rows > 0) { + //code to show existing responses and link to update page + echo ' +

      Existing Responses:

      +

      '; + $title_arr=array(); + $title_arr[]='ID'; + $title_arr[]='Title'; + + echo html_build_list_table_top ($title_arr); + + for ($i=0; $i < $rows; $i++) { + echo ''. + ''.db_result($result, $i, 'id').''. + ''. + db_result($result, $i, 'title').''; + } + echo ''; + + } else { + echo "\n

      No responses set up in this group

      "; + } + ?> +

      + Creating useful generic messages can save you a lot of time when + handling common artifact requests. +

      +

      + + Title:
      + +

      + Message Body:
      + +

      + +

      + footer(array()); + + } elseif ($update_users) { +// +// FORM TO ADD/UPDATE USERS +// + + $ath->adminHeader(array ('title'=>'Add/Update Users in: '.$ath->getName(),'pagename'=>'tracker_admin_update_users','titlevals'=>array($ath->getName()))); + + $sql="SELECT * FROM artifactperm_user_vw WHERE group_artifact_id='". $ath->getID() ."'"; + $res=db_query($sql); + + if (!$res || db_numrows($res) < 1) { + echo '

      No Developers Found

      '; + } else { + ?> +

      + Each tracker that you define has separate user lists and user permissions. +

      + Simply add developers to this tracker, then update their permissions. +

      +

      Technicians
      +
      can be assigned items
      + +
      Admins
      +
      can make changes to items
      + +
      + + + + Delete + + '.$row_dev['realname'].' ( '. $row_dev['user_name'] .' ) + + + + '; + $i++; + } + echo ' +
      '; + echo ''; + } + ?> +

      +

      Add These Users:

      +

      + You can pick and choose users for your tracker, or simply add them all by checking "Add All Users". +

      +

      +
      + + +   Add All Users +
      +
      '; + + $ath->footer(array()); + + } elseif ($update_canned) { +// +// FORM TO UPDATE CANNED MESSAGES +// + $ath->adminHeader(array ('title'=>'Update Canned Responses in: '.$ath->getName())); + + echo "

      Update Canned Responses ". $ath->getName() ."

      "; + + $acr = new ArtifactCanned($ath,$id); + if (!$acr || !is_object($acr)) { + $feedback .= 'Unable to create ArtifactCanned Object'; + } elseif ($acr->isError()) { + $feedback .= $acr->getErrorMessage(); + } else { + ?> +

      + Creating useful generic messages can save you a lot of time when + handling common requests. +

      +

      + + + Title:
      + +

      + Message Body:
      + +

      + +

      + footer(array()); + + } elseif ($update_cat) { +// +// FORM TO UPDATE CATEGORIES +// + /* + Allow modification of a artifact category + */ + $ath->adminHeader(array('title'=>'Change an Category in: '.$ath->getName())); + + echo ' +

      Modify an Category in: '. $ath->getName() .'

      '; + + $ac = new ArtifactCategory($ath,$id); + if (!$ac || !is_object($ac)) { + $feedback .= 'Unable to create ArtifactCategory Object'; + } elseif ($ac->isError()) { + $feedback .= $ac->getErrorMessage(); + } else { + ?> +

      +

      + + +

      + Category Name:
      + +

      + Auto-Assign To:
      + technicianBox('assign_to',$ac->getAssignee()); ?> +

      + It is not recommended that you change the artifact + category name because other things are dependent upon it. When you change + the category name, all related items will be changed to the new name. +

      + +

      + footer(array()); + + } elseif ($update_group) { +// +// FORM TO UPDATE GROUPS +// + /* + Allow modification of a artifact group + */ + $ath->adminHeader(array('title'=>'Change a Group in: '.$ath->getName(),'pagename'=>'tracker_admin_update_group','titlevals'=>array($ath->getName()))); + + $ag = new ArtifactGroup($ath,$id); + if (!$ag || !is_object($ag)) { + $feedback .= 'Unable to create ArtifactGroup Object'; + } elseif ($ag->isError()) { + $feedback .= $ag->getErrorMessage(); + } else { + ?> +

      +

      + + +

      + Group Name:
      + +

      + It is not recommended that you change the artifact + group name because other things are dependent upon it. When you change + the group name, all related items will be changed to the new name. +

      + +

      + footer(array()); + + } elseif ($update_type) { +// +// FORM TO UPDATE ARTIFACT TYPES +// + $ath->adminHeader(array ('title'=>'Tracker Administration: '.$ath->getName(),'pagename'=>'tracker_admin_update_type','titlevals'=>array($ath->getName()))); + + ?> +

      +

      + +

      + Name: (examples: meeting minutes, test results, RFP Docs)
      + getDataType()) { + echo $ath->getName(); + } else { + ?> + + +

      + Description:
      + getDataType()) { + echo $ath->getDescription(); + } else { + ?> + + +

      + isPublic())?'CHECKED':''); ?>> Publicly Available
      + allowsAnon())?'CHECKED':''); ?>> Allow non-logged-in postings
      + useResolution())?'CHECKED':''); ?>> Display the "Resolution" box +

      + Send email on new submission to address:
      + +

      + emailAll())?'CHECKED':''); ?>> Send email on all changes
      +

      + Days till considered overdue:
      + +

      + Days till pending tracker items time out:
      + +

      + Free form text for the "submit new item" page:
      + +

      + Free form text for the "browse items" page:
      + +

      + +

      + footer(array()); + + } else { +// +// SHOW LINKS TO FEATURES +// + + $ath->adminHeader(array ('title'=>'Tracker Administration: '.$ath->getName(),'pagename'=>'tracker_admin','titlevals'=>array($ath->getName()))); + + echo '

      + Add/Update Categories
      + Add categories like, \'mail module\',\'gant chart module\',\'cvs\', etc

      '; + echo '

      + Add/Update Groups
      + Add groups like, \'v1.2\',\'unsupported\',\'unverified\', etc

      '; + echo '

      + Add/Update Canned Responses
      + Create/Change generic response messages for the tracker.

      '; + echo '

      + Add/Update Users & Permissions
      + Add/remove users to/from this tracker.

      '; + echo '

      + Update preferences
      + Set up prefs like expiration times, email addresses, etc.

      '; + + $ath->footer(array()); + } + +} elseif ($group_id) { + + // + // get the Group object + // + $group =& group_get_object($group_id); + if (!$group || !is_object($group) || $group->isError()) { + exit_no_group(); + } + + $perm =& $group->getPermission( session_get_user() ); + + if (!$perm || !is_object($perm) || !$perm->isArtifactAdmin()) { + exit_permission_denied(); + } + + if ($post_changes) { + if ($add_at) { + $res=new ArtifactTypeHtml($group); + if (!$res->create($name,$description,$is_public,$allow_anon,$email_all,$email_address, + $due_period,$use_resolution,$submit_instructions,$browse_instructions)) { + $feedback .= $res->getErrorMessage(); + } else { + header ("Location: /tracker/admin/?group_id=$group_id&atid=".$res->getID()."&update_users=1"); + } + + } + } + + $sql="SELECT * FROM artifact_group_list WHERE group_id='$group_id' ORDER BY group_artifact_id"; + + //required params for site_project_header(); + $params['group']=$group_id; + $params['toptab']='tracker'; + $params['pagename']='tracker_admin_choose'; + + echo site_project_header($params); + echo 'Admin

      '; + + $result = db_query ($sql); + $rows = db_numrows($result); + if (!$result || $rows < 1) { + echo "

      No Trackers Found

      "; + echo "

      "; + } else { + + echo ' +

      + Choose a data type and you can set up prefs, categories, groups, users, and permissions. +

      '; + + /* + Put the result set (list of forums for this group) into a column with folders + */ + + for ($j = 0; $j < $rows; $j++) { + echo ' + ' . + html_image("images/ic/index.png","15","13",array("BORDER"=>"0")) . '  '. + db_result($result, $j, 'name').'
      '. + db_result($result, $j, 'description').'

      '; + } + } + + ?> +

      Create a new tracker

      +

      + You can use this system to track virtually any kind of data, with each + tracker having separate user, group, category, and permission lists. You + can also easily move items between trackers when needed. +

      + Trackers are referred to as "Artifact Types" and individual pieces of data + are "Artifacts". "Bugs" might be an Artifact Type, whiles a bug report would be + an Artifact. You can create as many Artifact Types as you want, but remember + you need to set up categories, groups, and permission for each type, which + can get time-consuming. +

      +

      + +

      + Name: (examples: meeting minutes, test results, RFP Docs)
      + +

      + Description:
      + +

      + Publicly Available
      + Allow non-logged-in postings
      + Display the "Resolution" box +

      + Send email on new submission to address:
      + +

      + Send email on all changes
      +

      + Days till considered overdue:
      + +

      + Days till pending tracker items time out:
      + +

      + Free form text for the "submit new item" page:
      + +

      + Free form text for the "browse items" page:
      + +

      + +

      + diff --git a/gforge/www/tracker/browse.php b/gforge/www/tracker/browse.php new file mode 100644 index 0000000000..3facb2ecd2 --- /dev/null +++ b/gforge/www/tracker/browse.php @@ -0,0 +1,244 @@ +userCanView()) { + exit_permission_denied(); +} + +if (user_isloggedin()) { + $u =& session_get_user(); +} + +if (!$offset || $offset < 0) { + $offset=0; +} + +if (!$set) { + /* + if no set is passed in, see if a preference was set + if no preference or not logged in, use open set + */ + if (user_isloggedin()) { + $custom_pref=$u->getPreference('art_cust'.$ath->getID()); + if ($custom_pref) { + $pref_arr=explode('|',$custom_pref); + $_assigned_to=$pref_arr[0]; + $_status=$pref_arr[1]; + $_category=$pref_arr[2]; + $_group=$pref_arr[3]; + $order=$pref_arr[4]; + $sort=$pref_arr[5]; + $set='custom'; + } else { + //default to open + $_assigned_to=0; + $_status=1; + } + } else { + //default to open + $_assigned_to=0; + $_status=1; + } +} + +// +// validate the column names and sort order passed in from user +// before saving it to prefs +// +if ($order=='artifact_id' || $order=='summary' || $order=='open_date' || $order=='close_date' || $order=='assigned_to' || $order=='submitted_by' || $order=='priority') { + $_sort_col=$order; + if (($sort == 'ASC') || ($sort == 'DESC')) { + $_sort_ord=$sort; + } else { + $_sort_ord='ASC'; + } +} else { + $_sort_col='artifact_id'; + $_sort_ord='ASC'; +} + +if ($set=='custom') { + if (user_isloggedin()) { + /* + if this custom set is different than the stored one, reset preference + */ + $pref_=$_assigned_to.'|'.$_status.'|'.$_category.'|'.$_group.'|'.$_sort_col.'|'.$_sort_ord; + if ($pref_ != $u->getPreference('art_cust'.$ath->getID())) { + $u->setPreference('art_cust'.$ath->getID(),$pref_); + } + } +} + +/* + Display items based on the form post - by user or status or both +*/ + +//if status selected, add more to where clause +if ($_status && ($_status != 100)) { + //for open tasks, add status=100 to make sure we show all + $status_str="AND artifact.status_id='$_status'"; +} else { + //no status was chosen, so don't add it to where clause + $status_str=''; +} + +//if assigned to selected, add to where clause +if ($_assigned_to) { + $assigned_str="AND artifact.assigned_to='$_assigned_to'"; +} else { + //no assigned to was chosen, so don't add it to where clause + $assigned_str=''; +} + +//if category selected, add to where clause +if ($_category && ($_category != 100)) { + $category_str="AND artifact.category_id='$_category'"; +} else { + //no assigned to was chosen, so don't add it to where clause + $category_str=''; +} + +//if artgroup selected, add to where clause +if ($_group && ($_group != 100)) { + $group_str="AND artifact.artifact_group_id='$_group'"; +} else { + //no artgroup to was chosen, so don't add it to where clause + $group_str=''; +} + +//build page title to make bookmarking easier +//if a user was selected, add the user_name to the title +//same for status +$ath->header(array('titlevals'=>array($ath->getName()),'pagename'=>'tracker_browse','atid'=>$ath->getID(),'sectionvals'=>array($group->getPublicName()))); + +/** + * + * Build the powerful browsing options pop-up boxes + * + */ + +// +// creating a custom technician box which includes "any" and "unassigned" +// +$res_tech= $ath->getTechnicians(); + +$tech_id_arr=util_result_column_to_array($res_tech,0); +$tech_id_arr[]='0'; //this will be the 'any' row + +$tech_name_arr=util_result_column_to_array($res_tech,1); +$tech_name_arr[]='Any'; + +$tech_box=html_build_select_box_from_arrays ($tech_id_arr,$tech_name_arr,'_assigned_to',$_assigned_to,true,'Unassigned'); + + +// +// custom order by arrays to build a pop-up box +// +$order_name_arr=array(); +$order_name_arr[]='ID'; +$order_name_arr[]='Priority'; +$order_name_arr[]='Summary'; +$order_name_arr[]='Open Date'; +$order_name_arr[]='Close Date'; +$order_name_arr[]='Submitter'; +$order_name_arr[]='Assignee'; + + +$order_arr=array(); +$order_arr[]='artifact_id'; +$order_arr[]='priority'; +$order_arr[]='summary'; +$order_arr[]='open_date'; +$order_arr[]='close_date'; +$order_arr[]='submitted_by'; +$order_arr[]='assigned_to'; + +// +// custom sort arrays to build pop-up box +// +$sort_name_arr=array(); +$sort_name_arr[]='Ascending'; +$sort_name_arr[]='Descending'; + +$sort_arr=array(); +$sort_arr[]='ASC'; +$sort_arr[]='DESC'; + +// +// Show the new pop-up boxes to select assigned to, status, etc +// + +echo ' + + + + + '. + ''. + ''. + ' + + + '. + ''. + ''. + ' + +
      Assignee: (?)
      '. $tech_box .'
      Status: (?)
      '. $ath->statusBox('_status',$_status,true,'Any') .'
      Category: (?)
      '. $ath->categoryBox ('_category',$_category,'Any') .'
      Group: (?)
      '. $ath->artifactGroupBox ('_group',$_group,'Any') .'
      Sort By: (?)'. + html_build_select_box_from_arrays($order_arr,$order_name_arr,'order',$_sort_col,false) .''.html_build_select_box_from_arrays($sort_arr,$sort_name_arr,'sort',$_sort_ord,false) .'
      '; + +/* + Show the free-form text submitted by the project admin +*/ +echo $ath->getBrowseInstructions(); + +// +// now run the query using the criteria chosen above +// +$sql="SELECT artifact.priority,artifact.group_artifact_id,artifact.artifact_id,artifact.summary, + artifact.open_date AS date,users.user_name AS submitted_by,user2.user_name AS assigned_to + FROM artifact,users,users user2 + WHERE users.user_id=artifact.submitted_by + $status_str $assigned_str $category_str $group_str + AND user2.user_id=artifact.assigned_to + AND group_artifact_id='". $ath->getID() ."' + ORDER BY group_artifact_id $_sort_ord, $_sort_col $_sort_ord"; + +$result=db_query($sql,51,$offset); + +if ($result && db_numrows($result) > 0) { + + if ($set=='custom') { + $set .= '&_assigned_to='.$_assigned_to.'&_status='.$_status.'&_category='.$_category.'&_group='.$_group.'&order='.$_sort_col.'&sort='.$_sort_ord; + } + + $ath->showBrowseList($result,$offset,$set); + + echo '* Denotes Requests > '. ($ath->getDuePeriod()/86400) .' Days Old'; + show_priority_colors_key(); + +} else { + + echo ' +

      No Items Match Your Criteria

      '; + echo db_error(); + //echo ""; + +} + +$ath->footer(array()); + +?> diff --git a/gforge/www/tracker/detail.php b/gforge/www/tracker/detail.php new file mode 100644 index 0000000000..de2d5ae43b --- /dev/null +++ b/gforge/www/tracker/detail.php @@ -0,0 +1,143 @@ +header(array ('title'=>'Detail: '.$ah->getID(). ' '.util_unconvert_htmlspecialchars($ah->getSummary()),'pagename'=>'tracker_detail','atid'=>$ath->getID(),'sectionvals'=>array($ath->getName()))); + +?> +

      [ #getID(); ?> ] getSummary()); ?>

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + '; + } + + } else { + echo ''; + } + + echo '
      + + Email:   + + +  (?) + +
      Date:
      getOpenDate() ); ?>
      Priority:
      getPriority(); ?>
      Submitted By:
      getSubmittedRealName(); ?> (getSubmittedUnixName(); ?>)
      Assigned To:
      getAssignedRealName(); ?> (getAssignedUnixName(); ?>)
      Category:
      getCategoryName(); ?>
      Status:
      getStatusName(); ?>
      Summary:
      getSummary()); ?>
      + getDetails() ); ?> + + +

      + Add A Comment:
      + +

      + +

      Please log in!


      + If you cannot login, then enter your email address here:

      + + +

      +

      DO NOT enter passwords or confidential information in your message!

      +

      + + +

      +

      Followups:

      +

      + showMessages(); + + ?> +

      +

      Attached Files:

      + getFiles(); + + $count=count($file_list); + + $title_arr=array(); + $title_arr[]='Name'; + $title_arr[]='Description'; + $title_arr[]='Download'; + echo html_build_list_table_top ($title_arr); + + if ($count > 0) { + + for ($i=0; $i<$count; $i++) { + echo '
      '. $file_list[$i]->getName() .''. $file_list[$i]->getDescription() .'Download
      No Files Currently Attached
      '; + ?> + + + + +

      Changes:

      +

      + showHistory(); + + ?> + + + +footer(array()); + +?> diff --git a/gforge/www/tracker/download.php b/gforge/www/tracker/download.php new file mode 100644 index 0000000000..1549cf25f0 --- /dev/null +++ b/gforge/www/tracker/download.php @@ -0,0 +1,65 @@ +isError()) { + exit_no_group(); +} + +// +// Create the ArtifactType object +// +$ath = new ArtifactType($group,$atid); +if (!$ath || !is_object($ath)) { + exit_error('Error','ArtifactType could not be created'); +} +if ($ath->isError()) { + exit_error('Error',$ath->getErrorMessage()); +} + +$ah=new Artifact($ath,$aid); +if (!$ah || !is_object($ah)) { + exit_error('ERROR','Artifact Could Not Be Created'); +} else if ($ah->isError()) { + exit_error('ERROR',$ah->getErrorMessage()); +} else { + $afh=new ArtifactFile($ah,$file_id); + if (!$afh || !is_object($afh)) { + exit_error('ERROR','ArtifactFile Could Not Be Created'); + } else if ($afh->isError()) { + exit_error('ERROR',$afh->getErrorMessage()); + } else { + Header ("Content-disposition: filename=".$afh->getName()); + Header ("Content-type: ".$afh->getType()); + echo $afh->getData(); + } +} + +?> diff --git a/gforge/www/tracker/include/ArtifactFileHtml.class b/gforge/www/tracker/include/ArtifactFileHtml.class new file mode 100644 index 0000000000..c5a94a1a3d --- /dev/null +++ b/gforge/www/tracker/include/ArtifactFileHtml.class @@ -0,0 +1,52 @@ +ArtifactFile($Artifact,$data); + } + + function upload($input_file,$input_file_name,$input_file_type,$description) { + if (!util_check_fileupload($input_file)) { + $this->setError('ArtifactFile: Invalid filename'); + return false; + } + $size = @filesize($input_file); + if (($size > 20) && ($size < 256000)) { + //size is fine + $input_data = fread(fopen($input_file, 'r'), $size); + //echo $input_data.'|'.$input_file_name.'|'.$input_file.'|'.$input_file_type.'|'.$description; + return $this->create($input_file_name,$input_file_type,$size,$input_data,$description); + } else { + //too big or small + $this->setError('ArtifactFile: File must be > 20 bytes and < 256000 bytes in length'); + return false; + } + } + +} + +?> diff --git a/gforge/www/tracker/include/ArtifactHtml.class b/gforge/www/tracker/include/ArtifactHtml.class new file mode 100644 index 0000000000..b62856c1a1 --- /dev/null +++ b/gforge/www/tracker/include/ArtifactHtml.class @@ -0,0 +1,136 @@ +Artifact($ArtifactType,$artifact_id); + } + + function showMessages() { + global $sys_datefmt; + $result= $this->getMessages(); + $rows=db_numrows($result); + + if ($rows > 0) { + $title_arr=array(); + $title_arr[]='Message'; + + echo html_build_list_table_top ($title_arr); + + for ($i=0; $i < $rows; $i++) { + echo '

      +Date: '. date($sys_datefmt,db_result($result, $i, 'adddate')) .'
      +Sender: '. db_result($result,$i,'user_name') . '
      +'. util_line_wrap ( db_result($result, $i, 'body'),65,"\n"). '
      '; + } + echo ''; + } else { + echo ' +

      No Followups Have Been Posted

      '; + } + } + + function showHistory() { + global $sys_datefmt,$artifact_cat_arr,$artifact_grp_arr,$artifact_res_arr; + $result=$this->getHistory(); + $rows= db_numrows($result); + + if ($rows > 0) { + + $title_arr=array(); + $title_arr[]='Field'; + $title_arr[]='Old Value'; + $title_arr[]='Date'; + $title_arr[]='By'; + + echo html_build_list_table_top ($title_arr); + + $artifactType =& $this->getArtifactType(); + + for ($i=0; $i < $rows; $i++) { + $field=db_result($result, $i, 'field_name'); + echo ' + '.$field.''; + + if ($field == 'status_id') { + + echo $artifactType->getStatusName(db_result($result, $i, 'old_value')); + + } else if ($field == 'resolution_id') { + + if (!$artifact_res_arr["_".db_result($result, $i, 'old_value')]) { + $artifact_res_arr["_".db_result($result, $i, 'old_value')] + = new ArtifactResolution($artifactType,db_result($result, $i, 'old_value')); + } + echo $artifact_res_arr["_".db_result($result, $i, 'old_value')]->getName(); + + } else if ($field == 'category_id') { + + if (!$artifact_cat_arr["_".db_result($result, $i, 'old_value')]) { + $artifact_cat_arr["_".db_result($result, $i, 'old_value')] + = new ArtifactCategory($artifactType,db_result($result, $i, 'old_value')); + } + echo $artifact_cat_arr["_".db_result($result, $i, 'old_value')]->getName(); + + } else if ($field == 'artifact_group_id') { + + if (!$artifact_grp_arr["_".db_result($result, $i, 'old_value')]) { + $artifact_grp_arr["_".db_result($result, $i, 'old_value')] + = new ArtifactGroup($artifactType,db_result($result, $i, 'old_value')); + } + echo $artifact_grp_arr["_".db_result($result, $i, 'old_value')]->getName(); + + } else if ($field == 'assigned_to') { + + echo user_getname(db_result($result, $i, 'old_value')); + + } else if ($field == 'close_date') { + + echo date($sys_datefmt,db_result($result, $i, 'old_value')); + + } else { + + echo db_result($result, $i, 'old_value'); + + } + echo ''. + ''. date($sys_datefmt,db_result($result, $i, 'entrydate')) .''. + ''. db_result($result, $i, 'user_name'). ''; + } + + echo ' + '; + + } else { + echo ' +

      No Changes Have Been Made to This Item

      '; + } + + } + +} + +?> diff --git a/gforge/www/tracker/include/ArtifactTypeHtml.class b/gforge/www/tracker/include/ArtifactTypeHtml.class new file mode 100644 index 0000000000..7329baaf42 --- /dev/null +++ b/gforge/www/tracker/include/ArtifactTypeHtml.class @@ -0,0 +1,219 @@ +ArtifactType($Group,$artifact_type_id); + } + + function header($params) { + global $DOCUMENT_ROOT; + + $group_id= $this->Group->getID(); + + //required by new site_project_header + $params['group']=$group_id; + $params['toptab']='tracker'; + $params['tabtext']=$this->getName(); + + site_project_header($params); + + echo 'Submit New'; + echo ' | Browse'; + if (user_isloggedin()) { + echo ' | Reporting'; + } + echo ' | Admin'; + + echo '

      '; + //echo '


      '; + } + + function footer($params) { + site_project_footer($params); + } + + function adminHeader($params) { + echo $this->header($params); + $group_id= $this->Group->getID(); + echo 'Admin Functions: Add/Browse Artifact Types'; + echo ' | Edit/Update Options in: '. $this->getName() .''; + } + + function categoryBox ($name='category_id',$checked='xzxz',$text_100='None') { + return html_build_select_box ($this->getCategories(),$name,$checked,true,$text_100); + } + + function artifactGroupBox ($name='artifact_group_id',$checked='xzxz',$text_100='None') { + return html_build_select_box ($this->getGroups(),$name,$checked,true,$text_100); + } + + function technicianBox ($name='assigned_to',$checked='xzxz',$show_100=true,$text_100='None') { + return html_build_select_box ($this->getTechnicians(),$name,$checked,$show_100,$text_100); + } + + function cannedResponseBox ($name='canned_response',$checked='xzxz') { + return html_build_select_box ($this->getCannedResponses(),$name,$checked); + } + + function statusBox ($name='status_id',$checked='xzxz',$show_100=false,$text_100='None') { + return html_build_select_box($this->getStatuses(),$name,$checked,$show_100,$text_100); + } + + function resolutionBox ($name='resolution_id',$checked='xzxz',$show_100=false,$text_100='None') { + return html_build_select_box($this->getResolutions(),$name,$checked,$show_100,$text_100); + } + + function showBrowseList ($result,$offset,$set='open') { + global $sys_datefmt,$PHP_SELF; + $group_id=$this->Group->getID(); + + $title_arr=array(); + $title_arr[]='Request ID'; + $title_arr[]='Summary'; + $title_arr[]='Date'; + $title_arr[]='Assigned To'; + $title_arr[]='Submitted By'; + + $IS_ADMIN=$this->userIsAdmin(); + + + if ($IS_ADMIN) { + echo ' +
      + '; + } + + echo html_build_list_table_top ($title_arr); + + $then=(time()-$this->getDuePeriod()); + $rows=db_numrows($result); + for ($i=0; $i < $rows; $i++) { + echo ' + '. + ''. + ($IS_ADMIN?' ':''). + db_result($result, $i, 'artifact_id') . + ''. + ''. + db_result($result, $i, 'summary'). + ''. + ''. (($set != 'closed' && db_result($result, $i, 'date') < $then)?'* ':'  ') . date($sys_datefmt,db_result($result, $i, 'date')) .''. + ''. make_user_link ( db_result($result, $i, 'assigned_to') ) .''. + ''. make_user_link ( db_result($result, $i, 'submitted_by') ) .''; + } + + /* + Show extra rows for <-- Prev / Next --> + */ + if (($offset > 0) || ($rows >= 50)) { + echo ' + '; + if ($offset > 0) { + echo '<-- Previous 50'; + } else { + echo ' '; + } + echo ' '; + + if ($rows >= 50) { + echo 'Next 50 -->'; + } else { + echo ' '; + } + echo ''; + } + + /* + Mass Update Code + */ + if ($IS_ADMIN) { + echo ' + + +Check All +- + Clear All + +

      + + Admin: If you wish to apply changes to all items selected above, use these controls to change their properties and click once on "Mass Update". + + + + + + + + + + + + + + + + + + + + +
      Category: (?)
      '. $this->categoryBox ('category_id','xzxz','No Change') .'
      Group: (?)
      '. $this->artifactGroupBox ('artifact_group_id','xzxz','No Change') .'
      Priority: (?)
      '; + echo build_priority_select_box ('priority', '5', true); + echo '
      '; + if ($this->useResolution()) { + echo ' + Resolution: (?)
      '; + echo $this->resolutionBox('resolution_id','xzxz',true,'No Change'); + } else { + echo '  + '; + } + + echo '
      Assigned To: (?)
      '. $this->technicianBox ('assigned_to','xzxz',true,'No Change') .'
      Status: (?)
      '. $this->statusBox ('status_id','xzxz',true,'No Change') .'
      Canned Response: (?)
      '. $this->cannedResponseBox ('canned_response') .'
      +

      + '; + } + echo ''; + } + +} + +?> diff --git a/gforge/www/tracker/index.php b/gforge/www/tracker/index.php new file mode 100644 index 0000000000..8c88c8667d --- /dev/null +++ b/gforge/www/tracker/index.php @@ -0,0 +1,345 @@ +isError()) { + exit_no_group(); + } + + // + // Create the ArtifactType object + // + $ath = new ArtifactTypeHtml($group,$atid); + if (!$ath || !is_object($ath)) { + exit_error('Error','ArtifactType could not be created'); + } + if ($ath->isError()) { + exit_error('Error',$ath->getErrorMessage()); + } + + switch ($func) { + + case 'add' : { + include '../tracker/add.php'; + break; + } + case 'postadd' : { + /* + + Create a new Artifact + + */ + $ah=new ArtifactHtml($ath); + if (!$ah || !is_object($ah)) { + exit_error('ERROR','Artifact Could Not Be Created'); + } else { + if (empty($user_email)) { + $user_email=false; + } else { + if (!validate_email($user_email)) { + exit_error('ERROR', 'Invalid email address'); + } + } + if (!$ah->create($category_id,$artifact_group_id,$summary,$details,$assigned_to,$priority, $user_email)) { + exit_error('ERROR',$ah->getErrorMessage()); + } else { + // + // Attach file to this Artifact. + // + if ($add_file) { + $afh=new ArtifactFileHtml($ah); + if (!$afh || !is_object($afh)) { + $feedback .= 'Could Not Create File Object'; +// } elseif ($afh->isError()) { +// $feedback .= $afh->getErrorMessage(); + } else { + if (!$afh->upload($input_file,$input_file_name,$input_file_type,$file_description)) { + $feedback .= ' Could Not Attach File to Item: '.$afh->getErrorMessage(); + } + } + } + $feedback .= ' Item Successfully Created '; + include '../tracker/browse.php'; + } + } + break; + } + case 'massupdate' : { + $count=count($artifact_id_list); + + $artifact_type_id=$ath->getID(); + + for ($i=0; $i < $count; $i++) { + $ah=new Artifact($ath,$artifact_id_list[$i]); + if (!$ah || !is_object($ah)) { + $feedback .= ' ID: '.$artifact_id_list[$i].'::Artifact Could Not Be Created'; + } else if ($ah->isError()) { + $feedback .= ' ID: '.$artifact_id_list[$i].'::'.$ah->getErrorMessage(); + } else { + + $_priority=(($priority != 100) ? $priority : $ah->getPriority()); + $_status_id=(($status_id != 100) ? $status_id : $ah->getStatusID()); + $_category_id=(($category_id != 100) ? $category_id : $ah->getCategoryID()); + $_artifact_group_id=(($artifact_group_id != 100) ? $artifact_group_id : $ah->getArtifactGroupID()); + $_resolution_id=(($resolution_id != 100) ? $resolution_id : $ah->getResolutionID()); + $_assigned_to=(($assigned_to != 100) ? $assigned_to : $ah->getAssignedTo()); + $_summary=addslashes($ah->getSummary()); + + if (!$ah->update($_priority,$_status_id,$_category_id,$_artifact_group_id,$_resolution_id,$_assigned_to,$_summary,$canned_response,'',$artifact_type_id)) { + $was_error=true; + $feedback .= ' ID: '.$artifact_id_list[$i].'::'.$ah->getErrorMessage(); + } + + } + unset($ah); + } + if (!$was_error) { + $feedback = 'Updated Successfully '; + } + include '../tracker/browse.php'; + break; + } + case 'postmod' : { + /* + Modify an Artifact + */ + $ah=new ArtifactHtml($ath,$artifact_id); + if (!$ah || !is_object($ah)) { + exit_error('ERROR','Artifact Could Not Be Created'); + } else if ($ah->isError()) { + exit_error('ERROR',$ah->getErrorMessage()); + } else { + if (!$ah->update($priority,$status_id,$category_id,$artifact_group_id,$resolution_id, + $assigned_to,$summary,$canned_response,$details,$new_artfact_type_id)) { + $feedback = 'Tracker Item: '.$ah->getErrorMessage(); + $ah->clearError(); + $was_error=true; + } + + // + // Attach file to this Artifact. + // + if ($add_file) { + $afh=new ArtifactFileHtml($ah); + if (!$afh || !is_object($afh)) { + $feedback .= 'Could Not Create File Object'; +// } elseif ($afh->isError()) { +// $feedback .= $afh->getErrorMessage(); + } else { + if (!util_check_fileupload($input_file)) { + exit_error("Error","Invalid filename"); + } + if (!$afh->upload($input_file,$input_file_name,$input_file_type,$file_description)) { + $feedback .= '
      File Upload: '.$afh->getErrorMessage(); + $was_error=true; + } else { + $feedback .= '
      File Upload: Successful '; + } + } + } + + // + // Delete list of files from this artifact + // + if ($delete_file) { + $count=count($delete_file); + for ($i=0; $i<$count; $i++) { + $afh=new ArtifactFileHtml($ah,$delete_file[$i]); + if (!$afh || !is_object($afh)) { + $feedback .= 'Could Not Create File Object::'.$delete_file[$i]; + } elseif ($afh->isError()) { + $feedback .= $afh->getErrorMessage().'::'.$delete_file[$i]; + } else { + if (!$afh->delete()) { + $feedback .= '
      File Delete: '.$afh->getErrorMessage(); + $was_error=true; + } else { + $feedback .= '
      File Delete: Successful '; + } + } + } + } + // + // Show just one feedback entry if no errors + // + if (!$was_error) { + $feedback = 'Successfully Updated'; + } + include '../tracker/browse.php'; + } + break; + } + case 'postaddcomment' : { + /* + Attach a comment to an artifact + + Used by non-admins + */ + $ah=new ArtifactHtml($ath,$artifact_id); + if (!$ah || !is_object($ah)) { + exit_error('ERROR','Artifact Could Not Be Created'); + } else if ($ah->isError()) { + exit_error('ERROR',$ah->getErrorMessage()); + } else { + if ($ah->addMessage($details,$user_email,true)) { + $feedback='Comment Added'; + include '../tracker/browse.php'; + } else { + //some kind of error in creation + exit_error('ERROR',$feedback); + } + } + break; + } + case 'monitor' : { + $ah=new ArtifactHtml($ath,$artifact_id); + if (!$ah || !is_object($ah)) { + exit_error('ERROR','Artifact Could Not Be Created'); + } else if ($ah->isError()) { + exit_error('ERROR',$ah->getErrorMessage()); + } else { + $ah->setMonitor($user_email); + $feedback=$ah->getErrorMessage(); + include '../tracker/browse.php'; + } + break; + } + case 'browse' : { + include '../tracker/browse.php'; + break; + } + case 'download' : { + $CACHE_ON=0; + Header("Redirect: /tracker/download.php?group_id=$group_id&atid=$atid&aid=$aid&file_id=$file_id"); + break; + } + case 'detail' : { + // + // users can modify their own tickets if they submitted them + // even if they are not artifact admins + // + $ah=new ArtifactHtml($ath,$aid); + if (!$ah || !is_object($ah)) { + exit_error('ERROR','Artifact Could Not Be Created'); + } else if ($ah->isError()) { + exit_error('ERROR',$ah->getErrorMessage()); + } else { + if ($ath->userIsAdmin() || (user_isloggedin() && ($ah->getSubmittedBy() == user_getid()))) { + include '../tracker/mod.php'; + } else { + include '../tracker/detail.php'; + } + } + break; + } + default : { + include '../tracker/browse.php'; + break; + } + } + +} elseif ($group_id) { + // + // get the Group object + // + $group =& group_get_object($group_id); + if (!$group || !is_object($group) || $group->isError()) { + exit_no_group(); + } + + $perm =& $group->getPermission( session_get_user() ); + + // + // get a list of artifact types they have defined + // + if (user_isloggedin() && $perm->isMember()) { + $public_flag='0,1'; + } else { + $public_flag='1'; + } + + $sql="SELECT agl.*,aca.count,aca.open_count + FROM artifact_group_list agl + LEFT JOIN artifact_counts_agg aca USING (group_artifact_id) + WHERE agl.group_id='$group_id' + AND agl.is_public IN ($public_flag) + ORDER BY group_artifact_id ASC"; + + //required params for site_project_header(); + $params['group']=$group_id; + $params['toptab']='tracker'; + $params['pagename']='tracker'; + $params['sectionvals']=array(group_getname($group_id)); + + echo site_project_header($params); + echo 'Reporting | ' + .'Admin' + .'

      '; + + $result = db_query ($sql); + $rows = db_numrows($result); + if (!$result || $rows < 1) { + echo "

      No Accessible Trackers Found

      "; + echo "

      + No trackers have been set up, or you cannot view them.

      The Admin for this project ". + "will have to set up data types using the admin page"; + } else { + + echo ' +

      + Choose a tracker and you can browse/edit/add items to it. +

      '; + + /* + Put the result set (list of forums for this group) into a column with folders + */ + + for ($j = 0; $j < $rows; $j++) { + echo ' + ' . + html_image("images/ic/index.png","15","13",array("BORDER"=>"0")) . '  '. + db_result($result, $j, 'name').' + ( '. db_result($result, $j, 'open_count') .' open / '. db_result($result, $j, 'count') .' total )
      '. + db_result($result, $j, 'description').'

      '; + + } + } + + echo site_project_footer(array()); + +} else { + + exit_no_group(); + +} + +?> diff --git a/gforge/www/tracker/mod.php b/gforge/www/tracker/mod.php new file mode 100644 index 0000000000..ab027e9f22 --- /dev/null +++ b/gforge/www/tracker/mod.php @@ -0,0 +1,227 @@ +header(array ('title'=>'Modify: '.$ah->getID(). ' - ' . $ah->getSummary(),'pagename'=>'tracker','atid'=>$ath->getID(),'sectionvals'=>array($group->getPublicName()) )); + +?> +

      [ #getID(); ?> ] getSummary(); ?>

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + '. + ' + + '; + } + + } else { + echo ''; + } + + ?> +
      +  (?) + +
      Submitted By:
      getSubmittedRealName(); ?> (getSubmittedUnixName(); ?>)
      Date Submitted:
      + getOpenDate() ); + + $close_date = $ah->getCloseDate(); + if ($ah->getStatusID()==2 && $close_date > 1) { + echo '
      Date Closed:
      ' + .date($sys_datefmt, $close_date); + } + ?> +
      Data Type: (?)
      + userIsAdmin()) { + $res=$group->getArtifactTypes(); + } else { + $sql="SELECT agl.group_artifact_id,agl.name + FROM artifact_group_list agl,artifact_perm ap + WHERE agl.group_artifact_id=ap.group_artifact_id + AND ap.user_id='". user_getid() ."' + AND ap.perm_level > 1 + AND agl.group_id='$group_id'"; + $res=db_query($sql); + } + echo html_build_select_box ($res,'new_artfact_type_id',$ath->getID(),false); + + ?> +
      + +
      Category: (?)
      + categoryBox('category_id', $ah->getCategoryID() ); + echo ' (admin)'; + + ?> +
      Group: (?)
      + artifactGroupBox('artifact_group_id', $ah->getArtifactGroupID() ); + echo ' (admin)'; + + ?> +
      Assigned To: (?)
      + technicianBox('assigned_to', $ah->getAssignedTo() ); + echo ' (admin)'; + ?> +
      + Priority: (?)
      + getPriority()); + ?> +
      + Status: (?)
      + statusBox ('status_id', $ah->getStatusID() ); + + ?> +
      + useResolution()) { + echo ' + Resolution: (?)
      '; + echo $ath->resolutionBox('resolution_id',$ah->getResolutionID()); + } else { + echo '  + '; + } + ?> +
      Summary: (?)
      + +
      + getDetails()); ?> +
      + Use Canned Response: (?)
      + cannedResponseBox('canned_response'); + echo ' (admin)'; + ?> +

      + OR Attach A Comment: (?)
      + +

      +

      Followups:

      +

      + showMessages(); + ?> +

      + Check to Upload & Attach File: + (?)
      +

      + +

      + File Description:
      + +

      +

      Existing Files:

      + getFiles(); + + $count=count($file_list); + + $title_arr=array(); + $title_arr[]='Delete'; + $title_arr[]='Name'; + $title_arr[]='Description'; + $title_arr[]='Download'; + echo html_build_list_table_top ($title_arr); + + if ($count > 0) { + + for ($i=0; $i<$count; $i++) { + echo '
      Delete'. $file_list[$i]->getName() .''. $file_list[$i]->getDescription() .'Download
      No Files Currently Attached
      + + + +

      Change Log:

      + showHistory(); + ?> + + + + + + + + + +footer(array()); + +?> diff --git a/gforge/www/tracker/reporting/index.php b/gforge/www/tracker/reporting/index.php new file mode 100644 index 0000000000..d963314f2f --- /dev/null +++ b/gforge/www/tracker/reporting/index.php @@ -0,0 +1,305 @@ +getPermission( session_get_user() ); +exit_assert_object($perm, 'Permission'); + +function reporting_header($group_id) { + global $atid; + + reports_header( + $group_id, + array('aging','tech','category','group','resolution'), + array('Aging Report','Distribution by Technician','Distribution by Category','Distribution by Group','Distribution by Resolution'), + 'Artifact Type: ' + .html_build_select_box($GLOBALS['group']->getArtifactTypes(),'atid',$atid,false) + .'

      ' + ); +} + +function quick_report($group_id,$title,$subtitle1,$sql1,$subtitle2,$sql2) { + global $bar_colors; + + echo site_project_header(array("title"=>$title,'group'=>$group_id,'pagename'=>'tracker_reporting')); + reporting_header($group_id); + echo "\n

      $title

      "; + + reports_quick_graph($subtitle1,$sql1,$sql2,$bar_colors); + + echo site_project_footer(array()); +} + + +if ($perm->isMember()) { + + include_once('www/include/HTML_Graphs.php'); + + if ($what) { + + $period_clause=period2sql($period,$span,"open_date"); + + if ($what=="aging") { + + site_project_header(array ("title"=>"Aging Report",'group'=>$group_id,'pagename'=>'tracker_reporting')); + reporting_header($group_id); + echo "\n

      Aging Report

      "; + + $time_now=time(); +// echo $time_now."

      "; + + if (!$period || $period=="lifespan") { + $period="month"; + $span=12; + } + + if (!$span) $span=1; + $sub_duration=period2seconds($period, 1); + + for ($counter=1; $counter<=$span; $counter++) { + + $start=($time_now-($counter*$sub_duration)); + $end=($time_now-(($counter-1)*$sub_duration)); + + $sql=" SELECT avg((close_date-open_date)/(24*60*60)) + FROM artifact + WHERE close_date > 0 + AND (open_date >= '$start' AND open_date <= '$end') + AND resolution_id <> '2' + AND group_artifact_id='$atid'"; + + $result = db_query($sql); + + $names[$counter-1]=date("Y-m-d",($start))." to ".date("Y-m-d",($end)); + $values[$counter-1]=((int)(db_result($result, 0,0)*1000))/1000; + } + + GraphIt( + $names, $values, + "Average Turnaround Time For Closed Items (days)" + ); + + echo "

      "; + + for ($counter=1; $counter<=$span; $counter++) { + + $start=($time_now-($counter*$sub_duration)); + $end=($time_now-(($counter-1)*$sub_duration)); + + $sql=" SELECT count(*) + FROM artifact + WHERE open_date >= '$start' + AND open_date <= '$end' + AND resolution_id <> '2' + AND group_artifact_id='$atid'"; + + $result = db_query($sql); + + $names[$counter-1]=date("Y-m-d",($start))." to ".date("Y-m-d",($end)); + $values[$counter-1]=db_result($result, 0,0); + } + + GraphIt($names, $values, "Number of Items Submitted"); + + echo "

      "; + + for ($counter=1; $counter<=$span; $counter++) { + + $start=($time_now-($counter*$sub_duration)); + $end=($time_now-(($counter-1)*$sub_duration)); + + $sql=" SELECT count(*) + FROM artifact + WHERE open_date <= '$end' + AND (close_date >= '$end' OR close_date < 1 OR close_date is null) + AND resolution_id <> '2' + AND group_artifact_id='$atid'"; + + $result = db_query($sql); + + $names[$counter-1]=date("Y-m-d",($end)); + $values[$counter-1]=db_result($result, 0,0); + } + + GraphIt($names, $values, "Number of Items Still Open"); + + echo "

      "; + + site_project_footer(array()); + + } else if ($what=="category") { + + // Open + $sql1=" + SELECT artifact_category.category_name AS Category, + count(*) AS Count + FROM artifact_category,artifact + WHERE artifact_category.id=artifact.category_id + AND artifact.status_id = '1' + AND artifact.resolution_id <> '2' + AND artifact.group_artifact_id='$atid' + $period_clause + GROUP BY Category"; + + // All + $sql2=" + SELECT artifact_category.category_name AS Category, + count(*) AS Count + FROM artifact_category,artifact + WHERE artifact_category.id=artifact.category_id + AND artifact.resolution_id <> '2' + AND artifact.group_artifact_id='$atid' + $period_clause + GROUP BY Category"; + + quick_report( + $group_id, + "Distribution By Category", + "Open Items By Category",$sql1, + "All Items By Category",$sql2 + ); + + } else if ($what=="tech") { + + // Open + $sql1=" + SELECT users.user_name AS Technician, count(*) AS Count + FROM users,artifact + WHERE users.user_id=artifact.assigned_to + AND artifact.status_id = '1' + AND artifact.resolution_id <> '2' + AND artifact.group_artifact_id='$atid' + $period_clause + GROUP BY Technician"; + + // All + $sql2=" + SELECT users.user_name AS Technician, count(*) AS Count + FROM users,artifact + WHERE users.user_id=artifact.assigned_to + AND artifact.resolution_id <> '2' + AND artifact.group_artifact_id='$atid' + $period_clause + GROUP BY Technician"; + + quick_report( + $group_id, + "Distribution By Technician", + "Open Items By Technician",$sql1, + "All Items By Technician",$sql2 + ); + + } else if ($what=="group") { + + // Open + $sql1=" + SELECT artifact_group.group_name AS Group_Name, + count(*) AS Count FROM artifact_group,artifact + WHERE artifact_group.id=artifact.artifact_group_id + AND artifact.status_id = '1' + AND artifact.resolution_id <> '2' + AND artifact.group_artifact_id='$atid' + $period_clause + GROUP BY Group_Name"; + + // All + $sql2=" + SELECT artifact_group.group_name AS Group_Name, + count(*) AS Count FROM artifact_group,artifact + WHERE artifact_group.id=artifact.artifact_group_id + AND artifact.resolution_id <> '2' + AND artifact.group_artifact_id='$atid' + $period_clause + GROUP BY Group_Name"; + + quick_report( + $group_id, + "Distribution By Artifact Group", + "Open By Artifact Group",$sql1, + "All Items By Artifact Group",$sql2 + ); + + } else if ($what=="resolution") { + + // Open + $sql1=" + SELECT artifact_resolution.resolution_name AS Resolution, + count(*) AS Count + FROM artifact_resolution,artifact + WHERE artifact_resolution.id=artifact.resolution_id + AND artifact.status_id = '1' + AND artifact.resolution_id <> '2' + AND artifact.group_artifact_id='$atid' + $period_clause + GROUP BY Resolution"; + + // All + $sql2=" + SELECT artifact_resolution.resolution_name AS Resolution, + count(*) AS Count + FROM artifact_resolution,artifact + WHERE artifact_resolution.id=artifact.resolution_id + AND artifact.resolution_id <> '2' + AND artifact.group_artifact_id='$atid' + $period_clause + GROUP BY Resolution"; + + quick_report( + $group_id, + "Distribution By Resolution", + "Open Items By Resolution",$sql1, + "All Items By Resolution",$sql2 + ); + + } else { + exit_missing_param(); + } + + } else { + /* + Show main page + */ + + //required params for site_project_header(); + $params['group'] = $group_id; + $params['toptab'] = 'tracker'; + $params['title'] = $page_title; + $params['pagename'] = 'tracker_reporting'; + + echo site_project_header($params); + + reporting_header($group_id); + + echo site_project_footer($params); + + } + +} else { + + // Cannot show reports + + exit_permission_denied(); + +} +?> diff --git a/gforge/www/tracker/tracker-er-diagram.sda b/gforge/www/tracker/tracker-er-diagram.sda new file mode 100644 index 0000000000000000000000000000000000000000..7371b73fa4c1c04e5326d31f23bb0a8344d6bdfb GIT binary patch literal 36352 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 literal 0 HcmV?d00001 -- 2.30.2