diff --git a/Documentation/database-setup.txt b/Documentation/database-setup.txt index c559b0ed90..b1561cb571 100644 --- a/Documentation/database-setup.txt +++ b/Documentation/database-setup.txt @@ -63,3 +63,48 @@ rights on it: Visit MySQL's link:http://dev.mysql.com/doc/[documentation] for further information regarding using MySQL. + +[[createdb_oracle]] +Oracle +~~~~~~ + +PostgreSQL or H2 is the recommended database for Gerrit Code Review. +Oracle is supported for environments where running on an existing Oracle +installation simplifies administrative overheads, such as database backups. + +Create a user for the web application within sqlplus, assign it a +password, and grant the user full rights on the newly created database: + +---- + SQL> create user gerrit2 identified by secret_password default tablespace users; + SQL> grant connect, resources to gerrit2; +---- + +JDBC driver ojdbc6.jar must be obtained from your Oracle distribution. Gerrit +initialization process tries to copy it from a known location: + +---- +/u01/app/oracle/product/11.2.0/xe/jdbc/lib/ojdbc6.jar +---- + +If this file can not be located at this place, then the alternative location +can be provided. + +Instance name is the Oracle SID. Sample database section in +$site_path/etc/gerrit.config: + +---- +[database] + type = oracle + instance = xe + hostname = localhost + username = gerrit2 + port = 1521 +---- + +Sample database section in $site_path/etc/secure.config: + +---- +[database] + password = secret_pasword +---- diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DatabaseConfigModule.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DatabaseConfigModule.java index 32f8c2e7a8..55419c28da 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DatabaseConfigModule.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DatabaseConfigModule.java @@ -35,6 +35,8 @@ public class DatabaseConfigModule extends AbstractModule { Names.named("jdbc")).to(JDBCInitializer.class); bind(DatabaseConfigInitializer.class).annotatedWith( Names.named("mysql")).to(MySqlInitializer.class); + bind(DatabaseConfigInitializer.class).annotatedWith( + Names.named("oracle")).to(OracleInitializer.class); bind(DatabaseConfigInitializer.class).annotatedWith( Names.named("postgresql")).to(PostgreSQLInitializer.class); } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDatabase.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDatabase.java index aa413d649c..2120a73acc 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDatabase.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDatabase.java @@ -78,7 +78,9 @@ class InitDatabase implements InitStep { Names.named(dbType.toLowerCase()))); if (dci instanceof MySqlInitializer) { - libraries.mysqlDriver.downloadRequired(); + libraries.mysqlDriver.downloadRequired(); + } else if (dci instanceof OracleInitializer) { + libraries.oracleDriver.downloadRequired(); } dci.initConfig(database); diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Libraries.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Libraries.java index b1fa0c3cb1..a03144bac8 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Libraries.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Libraries.java @@ -39,6 +39,7 @@ class Libraries { /* final */LibraryDownloader bouncyCastle; /* final */LibraryDownloader mysqlDriver; + /* final */LibraryDownloader oracleDriver; @Inject Libraries(final Provider downloadProvider) { diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/OracleInitializer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/OracleInitializer.java new file mode 100644 index 0000000000..180beb0a07 --- /dev/null +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/OracleInitializer.java @@ -0,0 +1,31 @@ +// Copyright (C) 2013 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.pgm.init; + +import static com.google.gerrit.pgm.init.InitUtil.username; + + +public class OracleInitializer implements DatabaseConfigInitializer { + + @Override + public void initConfig(Section databaseSection) { + final String defPort = "1521"; + databaseSection.string("Server hostname", "hostname", "localhost"); + databaseSection.string("Server port", "port", defPort, false); + databaseSection.string("Instance name", "instance", "xe"); + databaseSection.string("Database username", "username", username()); + databaseSection.password("username", "password"); + } +} diff --git a/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/libraries.config b/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/libraries.config index a5150e67d7..6f80364e6a 100644 --- a/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/libraries.config +++ b/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/libraries.config @@ -25,3 +25,9 @@ url = http://repo2.maven.org/maven2/mysql/mysql-connector-java/5.1.21/mysql-connector-java-5.1.21.jar sha1 = 7abbd19fc2e2d5b92c0895af8520f7fa30266be9 remove = mysql-connector-java-.*[.]jar + +[library "oracleDriver"] + name = Oracle JDBC driver 11g Release 2 (11.2.0) + url = file:///u01/app/oracle/product/11.2.0/xe/jdbc/lib/ojdbc6.jar + sha1 = 2f89cd9176772c3a6c261ce6a8e3d0d4425f5679 + remove = ojdbc6.jar diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceModule.java index 4066ad3216..9aeda09575 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceModule.java @@ -24,6 +24,7 @@ public class DataSourceModule extends AbstractModule { bind(DataSourceType.class).annotatedWith(Names.named("h2")).to(H2.class); bind(DataSourceType.class).annotatedWith(Names.named("jdbc")).to(JDBC.class); bind(DataSourceType.class).annotatedWith(Names.named("mysql")).to(MySql.class); + bind(DataSourceType.class).annotatedWith(Names.named("oracle")).to(Oracle.class); bind(DataSourceType.class).annotatedWith(Names.named("postgresql")).to(PostgreSQL.class); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Oracle.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Oracle.java new file mode 100644 index 0000000000..bb4c477009 --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Oracle.java @@ -0,0 +1,46 @@ +// Copyright (C) 2013 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.server.schema; + +import static com.google.gerrit.server.schema.JdbcUtil.hostname; +import static com.google.gerrit.server.schema.JdbcUtil.port; + +import com.google.gerrit.server.config.ConfigSection; +import com.google.gerrit.server.config.GerritServerConfig; +import com.google.inject.Inject; + +import org.eclipse.jgit.lib.Config; + +public class Oracle extends BaseDataSourceType { + private Config cfg; + + @Inject + public Oracle(@GerritServerConfig final Config cfg) { + super("oracle.jdbc.driver.OracleDriver"); + this.cfg = cfg; + } + + @Override + public String getUrl() { + final StringBuilder b = new StringBuilder(); + final ConfigSection dbc = new ConfigSection(cfg, "database"); + b.append("jdbc:oracle:thin:@"); + b.append(hostname(dbc.optional("hostname"))); + b.append(port(dbc.optional("port"))); + b.append(":"); + b.append(dbc.required("instance")); + return b.toString(); + } +}