From e6c17842a8a599756b85e196b7e0a77c244ec33d Mon Sep 17 00:00:00 2001 From: Eike Stepper Date: Thu, 11 Jun 2009 17:25:08 +0000 Subject: [276845] Develop A CDORevisionCache that uses the file system https://bugs.eclipse.org/bugs/show_bug.cgi?id=276845 --- plugins/org.eclipse.emf.cdo.common.db/.classpath | 7 + plugins/org.eclipse.emf.cdo.common.db/.cvsignore | 2 + plugins/org.eclipse.emf.cdo.common.db/.options | 3 + plugins/org.eclipse.emf.cdo.common.db/.project | 34 + .../META-INF/MANIFEST.MF | 19 + plugins/org.eclipse.emf.cdo.common.db/about.html | 28 + .../org.eclipse.emf.cdo.common.db/build.properties | 21 + .../org.eclipse.emf.cdo.common.db/copyright.txt | 8 + plugins/org.eclipse.emf.cdo.common.db/epl-v10.html | 319 +++++++++ plugins/org.eclipse.emf.cdo.common.db/license.html | 319 +++++++++ .../plugin.properties | 25 + .../org.eclipse.emf.cdo.common.db/scrapbook.sql | 37 ++ .../eclipse/emf/cdo/common/db/CDOCommonDBUtil.java | 34 + .../db/AbstractPreparedStatementFactory.java | 72 +++ .../common/internal/db/DBRevisionCacheUtils.java | 115 ++++ .../internal/db/IPreparedStatementFactory.java | 26 + .../emf/cdo/common/internal/db/bundle/OM.java | 42 ++ .../common/internal/db/cache/DBRevisionCache.java | 718 +++++++++++++++++++++ .../internal/db/cache/DBRevisionCacheSchema.java | 65 ++ 19 files changed, 1894 insertions(+) create mode 100644 plugins/org.eclipse.emf.cdo.common.db/.classpath create mode 100644 plugins/org.eclipse.emf.cdo.common.db/.cvsignore create mode 100644 plugins/org.eclipse.emf.cdo.common.db/.options create mode 100644 plugins/org.eclipse.emf.cdo.common.db/.project create mode 100644 plugins/org.eclipse.emf.cdo.common.db/META-INF/MANIFEST.MF create mode 100644 plugins/org.eclipse.emf.cdo.common.db/about.html create mode 100644 plugins/org.eclipse.emf.cdo.common.db/build.properties create mode 100644 plugins/org.eclipse.emf.cdo.common.db/copyright.txt create mode 100644 plugins/org.eclipse.emf.cdo.common.db/epl-v10.html create mode 100644 plugins/org.eclipse.emf.cdo.common.db/license.html create mode 100644 plugins/org.eclipse.emf.cdo.common.db/plugin.properties create mode 100644 plugins/org.eclipse.emf.cdo.common.db/scrapbook.sql create mode 100644 plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/db/CDOCommonDBUtil.java create mode 100644 plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/AbstractPreparedStatementFactory.java create mode 100644 plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/DBRevisionCacheUtils.java create mode 100644 plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/IPreparedStatementFactory.java create mode 100644 plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/bundle/OM.java create mode 100644 plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/cache/DBRevisionCache.java create mode 100644 plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/cache/DBRevisionCacheSchema.java diff --git a/plugins/org.eclipse.emf.cdo.common.db/.classpath b/plugins/org.eclipse.emf.cdo.common.db/.classpath new file mode 100644 index 0000000000..64c5e31b7a --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common.db/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/plugins/org.eclipse.emf.cdo.common.db/.cvsignore b/plugins/org.eclipse.emf.cdo.common.db/.cvsignore new file mode 100644 index 0000000000..693869726d --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common.db/.cvsignore @@ -0,0 +1,2 @@ +bin +doc diff --git a/plugins/org.eclipse.emf.cdo.common.db/.options b/plugins/org.eclipse.emf.cdo.common.db/.options new file mode 100644 index 0000000000..4dbdd62d97 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common.db/.options @@ -0,0 +1,3 @@ +# Debugging and tracing options + +org.eclipse.emf.cdo.common.db/debug = true diff --git a/plugins/org.eclipse.emf.cdo.common.db/.project b/plugins/org.eclipse.emf.cdo.common.db/.project new file mode 100644 index 0000000000..7fbb427c4d --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common.db/.project @@ -0,0 +1,34 @@ + + + org.eclipse.emf.cdo.common.db + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + org.eclipse.pde.api.tools.apiAnalysisBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + org.eclipse.pde.api.tools.apiAnalysisNature + + diff --git a/plugins/org.eclipse.emf.cdo.common.db/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.common.db/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..7d56691ee9 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common.db/META-INF/MANIFEST.MF @@ -0,0 +1,19 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-SymbolicName: org.eclipse.emf.cdo.common.db;singleton:=true +Bundle-Version: 2.0.0.qualifier +Bundle-Name: %pluginName +Bundle-Vendor: %providerName +Bundle-Localization: plugin +Bundle-ActivationPolicy: lazy +Bundle-Activator: org.eclipse.emf.cdo.internal.common.bundle.OM$Activator +Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-ClassPath: . +Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)";resolution:=optional, + org.eclipse.emf.cdo.common;bundle-version="[2.0.0,3.0.0)";visibility:=reexport, + org.eclipse.net4j.db;bundle-version="[2.0.0,3.0.0)" +Import-Package: org.osgi.framework;version="1.3.0";resolution:=optional +Export-Package: org.eclipse.emf.cdo.common.db;version="2.0.0", + org.eclipse.emf.cdo.common.internal.db;version="2.0.0";x-friends:="org.eclipse.emf.cdo.tests", + org.eclipse.emf.cdo.common.internal.db.bundle;version="2.0.0";x-internal:=true, + org.eclipse.emf.cdo.common.internal.db.cache;version="2.0.0";x-friends:="org.eclipse.emf.cdo.tests" diff --git a/plugins/org.eclipse.emf.cdo.common.db/about.html b/plugins/org.eclipse.emf.cdo.common.db/about.html new file mode 100644 index 0000000000..d35d5aed64 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common.db/about.html @@ -0,0 +1,28 @@ + + + + +About + + +

About This Content

+ +

June 5, 2007

+

License

+ +

The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise +indicated below, the Content is provided to you under the terms and conditions of the +Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available +at http://www.eclipse.org/legal/epl-v10.html. +For purposes of the EPL, "Program" will mean the Content.

+ +

If you did not receive this Content directly from the Eclipse Foundation, the Content is +being redistributed by another party ("Redistributor") and different terms and conditions may +apply to your use of any object code in the Content. Check the Redistributor's license that was +provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise +indicated below, the terms and conditions of the EPL still apply to any source code in the Content +and such source code may be obtained at http://www.eclipse.org.

+ + + diff --git a/plugins/org.eclipse.emf.cdo.common.db/build.properties b/plugins/org.eclipse.emf.cdo.common.db/build.properties new file mode 100644 index 0000000000..e33181ec2a --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common.db/build.properties @@ -0,0 +1,21 @@ +# Copyright (c) 2004 - 2009 Eike Stepper (Berlin, Germany) and others. +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html +# +# Contributors: +# Eike Stepper - initial API and implementation + +# NLS_MESSAGEFORMAT_VAR + +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + about.html,\ + copyright.txt,\ + epl-v10.html,\ + license.html,\ + plugin.properties,\ + .options diff --git a/plugins/org.eclipse.emf.cdo.common.db/copyright.txt b/plugins/org.eclipse.emf.cdo.common.db/copyright.txt new file mode 100644 index 0000000000..043f4a4f88 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common.db/copyright.txt @@ -0,0 +1,8 @@ +Copyright (c) 2004 - 2009 Eike Stepper (Berlin, Germany) and others. +All rights reserved. This program and the accompanying materials +are made available under the terms of the Eclipse Public License v1.0 +which accompanies this distribution, and is available at +http://www.eclipse.org/legal/epl-v10.html + +Contributors: + Eike Stepper - initial API and implementation \ No newline at end of file diff --git a/plugins/org.eclipse.emf.cdo.common.db/epl-v10.html b/plugins/org.eclipse.emf.cdo.common.db/epl-v10.html new file mode 100644 index 0000000000..d7b88e9416 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common.db/epl-v10.html @@ -0,0 +1,319 @@ + + + + + +Eclipse Public License - Version 1.0 + + + + + + +
+ +

Eclipse Public License - v 1.0 +

+ +

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER +THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, +REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE +OF THIS AGREEMENT.

+ +

1. DEFINITIONS

+ +

"Contribution" means:

+ +

a) +in the case of the initial Contributor, the initial code and documentation +distributed under this Agreement, and
+b) in the case of each subsequent Contributor:

+ +

i) +changes to the Program, and

+ +

ii) +additions to the Program;

+ +

where +such changes and/or additions to the Program originate from and are distributed +by that particular Contributor. A Contribution 'originates' from a Contributor +if it was added to the Program by such Contributor itself or anyone acting on +such Contributor's behalf. Contributions do not include additions to the +Program which: (i) are separate modules of software distributed in conjunction +with the Program under their own license agreement, and (ii) are not derivative +works of the Program.

+ +

"Contributor" means any person or +entity that distributes the Program.

+ +

"Licensed Patents " mean patent +claims licensable by a Contributor which are necessarily infringed by the use +or sale of its Contribution alone or when combined with the Program.

+ +

"Program" means the Contributions +distributed in accordance with this Agreement.

+ +

"Recipient" means anyone who +receives the Program under this Agreement, including all Contributors.

+ +

2. GRANT OF RIGHTS

+ +

a) +Subject to the terms of this Agreement, each Contributor hereby grants Recipient +a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly +display, publicly perform, distribute and sublicense the Contribution of such +Contributor, if any, and such derivative works, in source code and object code +form.

+ +

b) +Subject to the terms of this Agreement, each Contributor hereby grants +Recipient a non-exclusive, worldwide, royalty-free +patent license under Licensed Patents to make, use, sell, offer to sell, import +and otherwise transfer the Contribution of such Contributor, if any, in source +code and object code form. This patent license shall apply to the combination +of the Contribution and the Program if, at the time the Contribution is added +by the Contributor, such addition of the Contribution causes such combination +to be covered by the Licensed Patents. The patent license shall not apply to +any other combinations which include the Contribution. No hardware per se is +licensed hereunder.

+ +

c) +Recipient understands that although each Contributor grants the licenses to its +Contributions set forth herein, no assurances are provided by any Contributor +that the Program does not infringe the patent or other intellectual property +rights of any other entity. Each Contributor disclaims any liability to Recipient +for claims brought by any other entity based on infringement of intellectual +property rights or otherwise. As a condition to exercising the rights and +licenses granted hereunder, each Recipient hereby assumes sole responsibility +to secure any other intellectual property rights needed, if any. For example, +if a third party patent license is required to allow Recipient to distribute +the Program, it is Recipient's responsibility to acquire that license before +distributing the Program.

+ +

d) +Each Contributor represents that to its knowledge it has sufficient copyright +rights in its Contribution, if any, to grant the copyright license set forth in +this Agreement.

+ +

3. REQUIREMENTS

+ +

A Contributor may choose to distribute the +Program in object code form under its own license agreement, provided that: +

+ +

a) +it complies with the terms and conditions of this Agreement; and

+ +

b) +its license agreement:

+ +

i) +effectively disclaims on behalf of all Contributors all warranties and +conditions, express and implied, including warranties or conditions of title +and non-infringement, and implied warranties or conditions of merchantability +and fitness for a particular purpose;

+ +

ii) +effectively excludes on behalf of all Contributors all liability for damages, +including direct, indirect, special, incidental and consequential damages, such +as lost profits;

+ +

iii) +states that any provisions which differ from this Agreement are offered by that +Contributor alone and not by any other party; and

+ +

iv) +states that source code for the Program is available from such Contributor, and +informs licensees how to obtain it in a reasonable manner on or through a +medium customarily used for software exchange.

+ +

When the Program is made available in source +code form:

+ +

a) +it must be made available under this Agreement; and

+ +

b) a +copy of this Agreement must be included with each copy of the Program.

+ +

Contributors may not remove or alter any +copyright notices contained within the Program.

+ +

Each Contributor must identify itself as the +originator of its Contribution, if any, in a manner that reasonably allows +subsequent Recipients to identify the originator of the Contribution.

+ +

4. COMMERCIAL DISTRIBUTION

+ +

Commercial distributors of software may +accept certain responsibilities with respect to end users, business partners +and the like. While this license is intended to facilitate the commercial use +of the Program, the Contributor who includes the Program in a commercial +product offering should do so in a manner which does not create potential +liability for other Contributors. Therefore, if a Contributor includes the +Program in a commercial product offering, such Contributor ("Commercial +Contributor") hereby agrees to defend and indemnify every other +Contributor ("Indemnified Contributor") against any losses, damages and +costs (collectively "Losses") arising from claims, lawsuits and other +legal actions brought by a third party against the Indemnified Contributor to +the extent caused by the acts or omissions of such Commercial Contributor in +connection with its distribution of the Program in a commercial product +offering. The obligations in this section do not apply to any claims or Losses +relating to any actual or alleged intellectual property infringement. In order +to qualify, an Indemnified Contributor must: a) promptly notify the Commercial +Contributor in writing of such claim, and b) allow the Commercial Contributor +to control, and cooperate with the Commercial Contributor in, the defense and +any related settlement negotiations. The Indemnified Contributor may participate +in any such claim at its own expense.

+ +

For example, a Contributor might include the +Program in a commercial product offering, Product X. That Contributor is then a +Commercial Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance claims and +warranties are such Commercial Contributor's responsibility alone. Under this +section, the Commercial Contributor would have to defend claims against the +other Contributors related to those performance claims and warranties, and if a +court requires any other Contributor to pay any damages as a result, the +Commercial Contributor must pay those damages.

+ +

5. NO WARRANTY

+ +

EXCEPT AS EXPRESSLY SET FORTH IN THIS +AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, +WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, +MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely +responsible for determining the appropriateness of using and distributing the +Program and assumes all risks associated with its exercise of rights under this +Agreement , including but not limited to the risks and costs of program errors, +compliance with applicable laws, damage to or loss of data, programs or +equipment, and unavailability or interruption of operations.

+ +

6. DISCLAIMER OF LIABILITY

+ +

EXCEPT AS EXPRESSLY SET FORTH IN THIS +AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF +THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGES.

+ +

7. GENERAL

+ +

If any provision of this Agreement is invalid +or unenforceable under applicable law, it shall not affect the validity or +enforceability of the remainder of the terms of this Agreement, and without +further action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable.

+ +

If Recipient institutes patent litigation +against any entity (including a cross-claim or counterclaim in a lawsuit) +alleging that the Program itself (excluding combinations of the Program with +other software or hardware) infringes such Recipient's patent(s), then such +Recipient's rights granted under Section 2(b) shall terminate as of the date +such litigation is filed.

+ +

All Recipient's rights under this Agreement +shall terminate if it fails to comply with any of the material terms or +conditions of this Agreement and does not cure such failure in a reasonable +period of time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use and +distribution of the Program as soon as reasonably practicable. However, +Recipient's obligations under this Agreement and any licenses granted by +Recipient relating to the Program shall continue and survive.

+ +

Everyone is permitted to copy and distribute +copies of this Agreement, but in order to avoid inconsistency the Agreement is +copyrighted and may only be modified in the following manner. The Agreement +Steward reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement Steward has +the right to modify this Agreement. The Eclipse Foundation is the initial +Agreement Steward. The Eclipse Foundation may assign the responsibility to +serve as the Agreement Steward to a suitable separate entity. Each new version +of the Agreement will be given a distinguishing version number. The Program +(including Contributions) may always be distributed subject to the version of +the Agreement under which it was received. In addition, after a new version of +the Agreement is published, Contributor may elect to distribute the Program +(including its Contributions) under the new version. Except as expressly stated +in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to +the intellectual property of any Contributor under this Agreement, whether +expressly, by implication, estoppel or otherwise. All rights in the Program not +expressly granted under this Agreement are reserved.

+ +

This Agreement is governed by the laws of the +State of New York and the intellectual property laws of the United States of +America. No party to this Agreement will bring a legal action under this +Agreement more than one year after the cause of action arose. Each party waives +its rights to a jury trial in any resulting litigation.

+ +

 

+ +
+ + \ No newline at end of file diff --git a/plugins/org.eclipse.emf.cdo.common.db/license.html b/plugins/org.eclipse.emf.cdo.common.db/license.html new file mode 100644 index 0000000000..d7b88e9416 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common.db/license.html @@ -0,0 +1,319 @@ + + + + + +Eclipse Public License - Version 1.0 + + + + + + +
+ +

Eclipse Public License - v 1.0 +

+ +

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER +THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, +REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE +OF THIS AGREEMENT.

+ +

1. DEFINITIONS

+ +

"Contribution" means:

+ +

a) +in the case of the initial Contributor, the initial code and documentation +distributed under this Agreement, and
+b) in the case of each subsequent Contributor:

+ +

i) +changes to the Program, and

+ +

ii) +additions to the Program;

+ +

where +such changes and/or additions to the Program originate from and are distributed +by that particular Contributor. A Contribution 'originates' from a Contributor +if it was added to the Program by such Contributor itself or anyone acting on +such Contributor's behalf. Contributions do not include additions to the +Program which: (i) are separate modules of software distributed in conjunction +with the Program under their own license agreement, and (ii) are not derivative +works of the Program.

+ +

"Contributor" means any person or +entity that distributes the Program.

+ +

"Licensed Patents " mean patent +claims licensable by a Contributor which are necessarily infringed by the use +or sale of its Contribution alone or when combined with the Program.

+ +

"Program" means the Contributions +distributed in accordance with this Agreement.

+ +

"Recipient" means anyone who +receives the Program under this Agreement, including all Contributors.

+ +

2. GRANT OF RIGHTS

+ +

a) +Subject to the terms of this Agreement, each Contributor hereby grants Recipient +a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly +display, publicly perform, distribute and sublicense the Contribution of such +Contributor, if any, and such derivative works, in source code and object code +form.

+ +

b) +Subject to the terms of this Agreement, each Contributor hereby grants +Recipient a non-exclusive, worldwide, royalty-free +patent license under Licensed Patents to make, use, sell, offer to sell, import +and otherwise transfer the Contribution of such Contributor, if any, in source +code and object code form. This patent license shall apply to the combination +of the Contribution and the Program if, at the time the Contribution is added +by the Contributor, such addition of the Contribution causes such combination +to be covered by the Licensed Patents. The patent license shall not apply to +any other combinations which include the Contribution. No hardware per se is +licensed hereunder.

+ +

c) +Recipient understands that although each Contributor grants the licenses to its +Contributions set forth herein, no assurances are provided by any Contributor +that the Program does not infringe the patent or other intellectual property +rights of any other entity. Each Contributor disclaims any liability to Recipient +for claims brought by any other entity based on infringement of intellectual +property rights or otherwise. As a condition to exercising the rights and +licenses granted hereunder, each Recipient hereby assumes sole responsibility +to secure any other intellectual property rights needed, if any. For example, +if a third party patent license is required to allow Recipient to distribute +the Program, it is Recipient's responsibility to acquire that license before +distributing the Program.

+ +

d) +Each Contributor represents that to its knowledge it has sufficient copyright +rights in its Contribution, if any, to grant the copyright license set forth in +this Agreement.

+ +

3. REQUIREMENTS

+ +

A Contributor may choose to distribute the +Program in object code form under its own license agreement, provided that: +

+ +

a) +it complies with the terms and conditions of this Agreement; and

+ +

b) +its license agreement:

+ +

i) +effectively disclaims on behalf of all Contributors all warranties and +conditions, express and implied, including warranties or conditions of title +and non-infringement, and implied warranties or conditions of merchantability +and fitness for a particular purpose;

+ +

ii) +effectively excludes on behalf of all Contributors all liability for damages, +including direct, indirect, special, incidental and consequential damages, such +as lost profits;

+ +

iii) +states that any provisions which differ from this Agreement are offered by that +Contributor alone and not by any other party; and

+ +

iv) +states that source code for the Program is available from such Contributor, and +informs licensees how to obtain it in a reasonable manner on or through a +medium customarily used for software exchange.

+ +

When the Program is made available in source +code form:

+ +

a) +it must be made available under this Agreement; and

+ +

b) a +copy of this Agreement must be included with each copy of the Program.

+ +

Contributors may not remove or alter any +copyright notices contained within the Program.

+ +

Each Contributor must identify itself as the +originator of its Contribution, if any, in a manner that reasonably allows +subsequent Recipients to identify the originator of the Contribution.

+ +

4. COMMERCIAL DISTRIBUTION

+ +

Commercial distributors of software may +accept certain responsibilities with respect to end users, business partners +and the like. While this license is intended to facilitate the commercial use +of the Program, the Contributor who includes the Program in a commercial +product offering should do so in a manner which does not create potential +liability for other Contributors. Therefore, if a Contributor includes the +Program in a commercial product offering, such Contributor ("Commercial +Contributor") hereby agrees to defend and indemnify every other +Contributor ("Indemnified Contributor") against any losses, damages and +costs (collectively "Losses") arising from claims, lawsuits and other +legal actions brought by a third party against the Indemnified Contributor to +the extent caused by the acts or omissions of such Commercial Contributor in +connection with its distribution of the Program in a commercial product +offering. The obligations in this section do not apply to any claims or Losses +relating to any actual or alleged intellectual property infringement. In order +to qualify, an Indemnified Contributor must: a) promptly notify the Commercial +Contributor in writing of such claim, and b) allow the Commercial Contributor +to control, and cooperate with the Commercial Contributor in, the defense and +any related settlement negotiations. The Indemnified Contributor may participate +in any such claim at its own expense.

+ +

For example, a Contributor might include the +Program in a commercial product offering, Product X. That Contributor is then a +Commercial Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance claims and +warranties are such Commercial Contributor's responsibility alone. Under this +section, the Commercial Contributor would have to defend claims against the +other Contributors related to those performance claims and warranties, and if a +court requires any other Contributor to pay any damages as a result, the +Commercial Contributor must pay those damages.

+ +

5. NO WARRANTY

+ +

EXCEPT AS EXPRESSLY SET FORTH IN THIS +AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, +WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, +MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely +responsible for determining the appropriateness of using and distributing the +Program and assumes all risks associated with its exercise of rights under this +Agreement , including but not limited to the risks and costs of program errors, +compliance with applicable laws, damage to or loss of data, programs or +equipment, and unavailability or interruption of operations.

+ +

6. DISCLAIMER OF LIABILITY

+ +

EXCEPT AS EXPRESSLY SET FORTH IN THIS +AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF +THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGES.

+ +

7. GENERAL

+ +

If any provision of this Agreement is invalid +or unenforceable under applicable law, it shall not affect the validity or +enforceability of the remainder of the terms of this Agreement, and without +further action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable.

+ +

If Recipient institutes patent litigation +against any entity (including a cross-claim or counterclaim in a lawsuit) +alleging that the Program itself (excluding combinations of the Program with +other software or hardware) infringes such Recipient's patent(s), then such +Recipient's rights granted under Section 2(b) shall terminate as of the date +such litigation is filed.

+ +

All Recipient's rights under this Agreement +shall terminate if it fails to comply with any of the material terms or +conditions of this Agreement and does not cure such failure in a reasonable +period of time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use and +distribution of the Program as soon as reasonably practicable. However, +Recipient's obligations under this Agreement and any licenses granted by +Recipient relating to the Program shall continue and survive.

+ +

Everyone is permitted to copy and distribute +copies of this Agreement, but in order to avoid inconsistency the Agreement is +copyrighted and may only be modified in the following manner. The Agreement +Steward reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement Steward has +the right to modify this Agreement. The Eclipse Foundation is the initial +Agreement Steward. The Eclipse Foundation may assign the responsibility to +serve as the Agreement Steward to a suitable separate entity. Each new version +of the Agreement will be given a distinguishing version number. The Program +(including Contributions) may always be distributed subject to the version of +the Agreement under which it was received. In addition, after a new version of +the Agreement is published, Contributor may elect to distribute the Program +(including its Contributions) under the new version. Except as expressly stated +in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to +the intellectual property of any Contributor under this Agreement, whether +expressly, by implication, estoppel or otherwise. All rights in the Program not +expressly granted under this Agreement are reserved.

+ +

This Agreement is governed by the laws of the +State of New York and the intellectual property laws of the United States of +America. No party to this Agreement will bring a legal action under this +Agreement more than one year after the cause of action arose. Each party waives +its rights to a jury trial in any resulting litigation.

+ +

 

+ +
+ + \ No newline at end of file diff --git a/plugins/org.eclipse.emf.cdo.common.db/plugin.properties b/plugins/org.eclipse.emf.cdo.common.db/plugin.properties new file mode 100644 index 0000000000..f3ba6fb247 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common.db/plugin.properties @@ -0,0 +1,25 @@ +# Copyright (c) 2004 - 2009 Eike Stepper (Berlin, Germany) and others. +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html +# +# Contributors: +# Eike Stepper - initial API and implementation + +# NLS_MESSAGEFORMAT_VAR + +# ============================================================================== +# Do not change the properties between this line and the last line containing: +# %%% END OF TRANSLATED PROPERTIES %%% +# Instead, either redefine an existing property, or create a new property, +# append it to the end of the file, and change the code to use the new name. +# ============================================================================== + +pluginName = CDO Model Repository Common DB Cache +providerName = Eclipse Modeling Project + +# ============================================================================== +# %%% END OF TRANSLATED PROPERTIES %%% +# The above properties have been shipped for translation. +# ============================================================================== diff --git a/plugins/org.eclipse.emf.cdo.common.db/scrapbook.sql b/plugins/org.eclipse.emf.cdo.common.db/scrapbook.sql new file mode 100644 index 0000000000..e72ea60533 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common.db/scrapbook.sql @@ -0,0 +1,37 @@ +select * from DBREVISIONCACHE_REVISIONS where VERSION = (select MAX( VERSION ) from DBREVISIONCACHE_REVISIONS) + +select id from DBREVISIONCACHE_REVISIONS group by id, version, created, revised; + +drop table DBREVISIONCACHE_REVISIONS; + +select MAX( VERSION ) from DBREVISIONCACHE_REVISIONS where id = 4 + +select ID, VERSION, CDOREVISION from DBREVISIONCACHE_REVISIONS where id IN (select distinct id from DBREVISIONCACHE_REVISIONS) GROUP BY ID + +select CDOREVISION from DBREVISIONCACHE_REVISIONS where (select ID, MAX(VERSION) as version from DBREVISIONCACHE_REVISIONS GROUP by ID) + +select * from DBREVISIONCACHE_REVISIONS where (ID, VERSION) IN (select ID, MAX(VERSION) as version from DBREVISIONCACHE_REVISIONS GROUP by ID) + + +select ID, MAX(VERSION), CDOREVISION as version from DBREVISIONCACHE_REVISIONS GROUP by ID + +select VERSION from DBREVISIONCACHE_REVISIONS WHERE version = max(version) + +select * from DBREVISIONCACHE_REVISIONS where version = (select max(version) from DBREVISIONCACHE_REVISIONS where DBREVISIONCACHE_REVISIONS.id = DBREVISIONCACHE_REVISIONS.id) + +select * from DBREVISIONCACHE_REVISIONS where version = (select max(version) from DBREVISIONCACHE_REVISIONS where DBREVISIONCACHE_REVISIONS.id = DBREVISIONCACHE_REVISIONS.id) + +select * from DBREVISIONCACHE_REVISIONS a where version = (select max(version) from DBREVISIONCACHE_REVISIONS b where a.id = b.id) + +select * from DBREVISIONCACHE_REVISIONS where id = 3 AND created >= 1244048304119 AND revised <= 1244048304119; + +UPDATE DBREVISIONCACHE_REVISIONS SET REVISED = 2222 WHERE ID = 3 AND VERSION = 1 + +select ID, VERSION, CREATED, REVISED from DBREVISIONCACHE_REVISIONS + +select ID, VERSION, CREATED, REVISED from DBREVISIONCACHE_REVISIONS WHERE ID = 3 AND VERSION = 1 + +SELECT id, version, created, revised FROM dbrevisioncache_revisions WHERE id = 3 AND created <= 1244129540039 AND (revised >= 1244129540039 OR revised = 0 ) + +SELECT * FROM DBREVISIONCACHE_REVISIONS + diff --git a/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/db/CDOCommonDBUtil.java b/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/db/CDOCommonDBUtil.java new file mode 100644 index 0000000000..657189bff7 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/db/CDOCommonDBUtil.java @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2004 - 2009 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.emf.cdo.common.db; + +import org.eclipse.emf.cdo.common.internal.db.cache.DBRevisionCache; +import org.eclipse.emf.cdo.common.revision.cache.CDORevisionCache; + +/** + * @author Eike Stepper + * @since 2.0 + */ +public final class CDOCommonDBUtil +{ + private CDOCommonDBUtil() + { + } + + /** + * Creates and returns a new JDBC-based revision cache. + */ + public static CDORevisionCache createDBCache() + { + DBRevisionCache cache = new DBRevisionCache(); + return cache; + } +} diff --git a/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/AbstractPreparedStatementFactory.java b/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/AbstractPreparedStatementFactory.java new file mode 100644 index 0000000000..ccbc722c69 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/AbstractPreparedStatementFactory.java @@ -0,0 +1,72 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2009 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andre Dietisheim - initial API and implementation + * Eike Stepper - maintenance + **************************************************************************/ +package org.eclipse.emf.cdo.common.internal.db; + +import org.eclipse.emf.cdo.common.internal.db.bundle.OM; + +import org.eclipse.net4j.util.om.trace.ContextTracer; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +/** + * @author Andre Dietisheim + */ +public abstract class AbstractPreparedStatementFactory implements IPreparedStatementFactory +{ + private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, AbstractPreparedStatementFactory.class); + + private PreparedStatement preparedStatement; + + protected PreparedStatement getPreparedStatement(Connection connection) throws SQLException + { + if (preparedStatement == null || preparedStatement.getConnection() == null + || preparedStatement.getConnection().isClosed() || !preparedStatement.getConnection().equals(connection)) + { + preparedStatement = createPreparedStatement(getSqlStatement(), connection); + } + return preparedStatement; + } + + public void close() + { + if (preparedStatement != null) + { + try + { + preparedStatement.close(); + } + catch (SQLException ex) + { + TRACER.format("Exception occured while closing preparedStatement \"{0}\"", preparedStatement); + } + } + } + + private PreparedStatement createPreparedStatement(String sql, Connection connection) throws SQLException + { + return connection.prepareStatement(sql); + } + + public PreparedStatement getPreparedStatement(T t, Connection connection) throws Exception + { + PreparedStatement preparedStatement = getPreparedStatement(connection); + doSetParameters(t, preparedStatement); + TRACER.trace(getSqlStatement()); + return preparedStatement; + } + + protected abstract String getSqlStatement(); + + protected abstract void doSetParameters(T t, PreparedStatement preparedStatement) throws Exception; +} diff --git a/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/DBRevisionCacheUtils.java b/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/DBRevisionCacheUtils.java new file mode 100644 index 0000000000..285075e797 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/DBRevisionCacheUtils.java @@ -0,0 +1,115 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2009 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andre Dietisheim - initial API and implementation + * Eike Stepper - maintenance + **************************************************************************/ +package org.eclipse.emf.cdo.common.internal.db; + +import org.eclipse.emf.cdo.common.revision.CDORevision; + +import org.eclipse.net4j.db.DBException; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.MessageFormat; + +/** + * @author Andre Dietisheim + */ +public class DBRevisionCacheUtils +{ + + /** + * Throws the given {@link Exception} if it's not null. + * + * @param exception + * the exception + * @throws Exception + * the exception + */ + public static void throwExceptionIfPresent(Exception exception) throws Exception + { + if (exception != null) + { + throw exception; + } + } + + public static void mandatoryInsertUpdate(PreparedStatement preparedStatement) throws SQLException + { + insertUpdate(preparedStatement); + if (preparedStatement.getUpdateCount() == 0) + { + rollback(preparedStatement.getConnection()); + throw new DBException(MessageFormat.format("No row inserted by statement \"{0}\"", preparedStatement)); + } + } + + public static void insertUpdate(PreparedStatement preparedStatement) throws SQLException + { + if (preparedStatement.execute()) + { + throw new DBException("No result set expected"); + } + commit(preparedStatement.getConnection()); + } + + public static void rollback(Connection connection) throws SQLException + { + assertIsNotNull(connection); + connection.rollback(); + } + + public static void commit(Connection connection) throws SQLException + { + assertIsNotNull(connection); + connection.commit(); + } + + /** + * Asserts the given {@link CDORevision} is null. + * + * @param cdoRevision + * the cdo revision + * @param message + * the message to use when throwing the {@link DBException} + * @throws DBException + * if the given CDORevision's not null + */ + public static void assertIsNull(CDORevision cdoRevision, String message) + { + if (cdoRevision != null) + { + throw new DBException(message); + } + } + + /** + * Asserts the given {@link Connection} is not null. + * + * @param connection + * the connection to check + * @return the connection + * @throws DBException + * if the given connection's null + */ + public static Connection assertIsNotNull(Connection connection) + { + if (connection == null) + { + throw new DBException("connection is null!"); + } + else + { + return connection; + } + + } +} diff --git a/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/IPreparedStatementFactory.java b/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/IPreparedStatementFactory.java new file mode 100644 index 0000000000..e9d995912c --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/IPreparedStatementFactory.java @@ -0,0 +1,26 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2009 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andre Dietisheim - initial API and implementation + * Eike Stepper - maintenance + **************************************************************************/ +package org.eclipse.emf.cdo.common.internal.db; + +import java.sql.Connection; +import java.sql.PreparedStatement; + +/** + * @author Andre Dietisheim + */ +public interface IPreparedStatementFactory +{ + PreparedStatement getPreparedStatement(T t, Connection connection) throws Exception; + + void close(); + +} diff --git a/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/bundle/OM.java b/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/bundle/OM.java new file mode 100644 index 0000000000..5bbcd441da --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/bundle/OM.java @@ -0,0 +1,42 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2009 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andre Dietisheim - initial API and implementation + * Eike Stepper - maintenance + **************************************************************************/ +package org.eclipse.emf.cdo.common.internal.db.bundle; + +import org.eclipse.net4j.util.om.OMBundle; +import org.eclipse.net4j.util.om.OMPlatform; +import org.eclipse.net4j.util.om.OSGiActivator; +import org.eclipse.net4j.util.om.log.OMLogger; +import org.eclipse.net4j.util.om.trace.OMTracer; + +/** + * The Operations & Maintenance class of this bundle. + * + * @author Andre Dietisheim + */ +public abstract class OM +{ + public static final String BUNDLE_ID = "org.eclipse.emf.cdo.common.db"; //$NON-NLS-1$ + + public static final OMBundle BUNDLE = OMPlatform.INSTANCE.bundle(BUNDLE_ID, OM.class); + + public static final OMTracer DEBUG = BUNDLE.tracer("debug"); //$NON-NLS-1$ + + public static final OMLogger LOG = BUNDLE.logger(); + + public static final class Activator extends OSGiActivator + { + public Activator() + { + super(BUNDLE); + } + } +} diff --git a/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/cache/DBRevisionCache.java b/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/cache/DBRevisionCache.java new file mode 100644 index 0000000000..170f60fdbc --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/cache/DBRevisionCache.java @@ -0,0 +1,718 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2009 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andre Dietisheim - initial API and implementation + * Eike Stepper - maintenance + **************************************************************************/ +package org.eclipse.emf.cdo.common.internal.db.cache; + +import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.id.CDOIDObjectFactory; +import org.eclipse.emf.cdo.common.id.CDOIDProvider; +import org.eclipse.emf.cdo.common.internal.db.AbstractPreparedStatementFactory; +import org.eclipse.emf.cdo.common.internal.db.DBRevisionCacheUtils; +import org.eclipse.emf.cdo.common.internal.db.IPreparedStatementFactory; +import org.eclipse.emf.cdo.common.internal.db.bundle.OM; +import org.eclipse.emf.cdo.common.io.CDODataInput; +import org.eclipse.emf.cdo.common.io.CDODataOutput; +import org.eclipse.emf.cdo.common.model.CDOPackageRegistry; +import org.eclipse.emf.cdo.common.revision.CDOListFactory; +import org.eclipse.emf.cdo.common.revision.CDORevision; +import org.eclipse.emf.cdo.common.revision.CDORevisionResolver; +import org.eclipse.emf.cdo.common.revision.cache.CDORevisionCache; +import org.eclipse.emf.cdo.internal.common.io.CDODataInputImpl; +import org.eclipse.emf.cdo.internal.common.io.CDODataOutputImpl; +import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; + +import org.eclipse.net4j.db.DBException; +import org.eclipse.net4j.db.DBUtil; +import org.eclipse.net4j.db.IDBAdapter; +import org.eclipse.net4j.db.IDBConnectionProvider; +import org.eclipse.net4j.db.IDBRowHandler; +import org.eclipse.net4j.util.CheckUtil; +import org.eclipse.net4j.util.io.ExtendedDataInputStream; +import org.eclipse.net4j.util.io.ExtendedDataOutputStream; +import org.eclipse.net4j.util.lifecycle.Lifecycle; +import org.eclipse.net4j.util.om.trace.ContextTracer; + +import org.eclipse.emf.ecore.EClass; + +import javax.sql.DataSource; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +/** + * A JDBC-based {@link CDORevisionCache}. + * + * @author Andre Dietisheim + */ +public class DBRevisionCache extends Lifecycle implements CDORevisionCache +{ + + /** The Constant DB_REVISIONCACHE_NAME. */ + private static final String DB_REVISIONCACHE_NAME = "org.eclipse.emf.cdo.common.db.DBRevisionCache"; + + private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, DBRevisionCache.class); + + /** The data source. */ + private DataSource dataSource; + + /** The db adapter. */ + private IDBAdapter dbAdapter; + + /** The db connection provider. */ + private IDBConnectionProvider dbConnectionProvider; + + /** The cdo id provider. */ + private CDOIDProvider cdoIdProvider; + + /** The prepared statement used to fetch all revisions. */ + private IPreparedStatementFactory insertRevisionStatementFactory; + + private IPreparedStatementFactory updateRevisedStatementFactory; + + private IPreparedStatementFactory deleteRevisionStatementFactory; + + private IPreparedStatementFactory clearStatementFactory; + + private Connection connection; + + protected CDOIDObjectFactory cdoIdObjectFactory; + + private CDOListFactory cdoListFactory; + + private CDOPackageRegistry cdoPackageRegistry; + + private CDORevisionResolver cdoRevisionResolver; + + private class InsertRevisionStatementFactory extends AbstractPreparedStatementFactory + { + @Override + protected void doSetParameters(CDORevision cdoRevision, PreparedStatement preparedStatement) throws Exception + { + preparedStatement.setString(1, cdoRevision.getID().toURIFragment()); + preparedStatement.setInt(2, cdoRevision.getVersion()); + preparedStatement.setLong(3, cdoRevision.getCreated()); + preparedStatement.setLong(4, cdoRevision.getRevised()); + preparedStatement.setBytes(5, toBytes(cdoRevision)); + + // possible approach: + // Blob blob = preparedStatement.getBlob(5); + // ExtendedDataOutputStream out = new ExtendedDataOutputStream(blob.setBinaryStream(0L)); + // out.writeCDORevision(revision, CDORevision.UNCHUNKED); + } + + @Override + protected String getSqlStatement() + { + return "INSERT INTO " + DBRevisionCacheSchema.REVISIONS // + + " (" // + + DBRevisionCacheSchema.REVISIONS_ID // + + ", " + DBRevisionCacheSchema.REVISIONS_VERSION // + + ", " + DBRevisionCacheSchema.REVISIONS_CREATED // + + ", " + DBRevisionCacheSchema.REVISIONS_REVISED // + + ", " + DBRevisionCacheSchema.REVISIONS_CDOREVISION // + + ") " // + + " VALUES (?, ?, ?, ?, ?)"; + } + } + + private class UpdateRevisedStatementFactory extends AbstractPreparedStatementFactory + { + + @Override + protected String getSqlStatement() + { + + return "UPDATE " + DBRevisionCacheSchema.REVISIONS // + + " SET " + DBRevisionCacheSchema.REVISIONS_REVISED + " = ?" // + + " WHERE " + DBRevisionCacheSchema.REVISIONS_ID + " = ?" // + + " AND " + DBRevisionCacheSchema.REVISIONS_VERSION + " = ?"; + } + + @Override + protected void doSetParameters(CDORevision cdoRevision, PreparedStatement preparedStatement) throws Exception + { + preparedStatement.setLong(1, cdoRevision.getCreated() - 1); // TODO: ?is this the correct revised timestamp? + preparedStatement.setString(2, cdoRevision.getID().toURIFragment()); + preparedStatement.setInt(3, cdoRevision.getVersion() - 1); + } + } + + private class DeleteRevisionStatementFactory extends AbstractPreparedStatementFactory + { + @Override + protected void doSetParameters(CDORevision cdoRevision, PreparedStatement preparedStatement) throws Exception + { + preparedStatement.setString(1, cdoRevision.getID().toURIFragment()); + preparedStatement.setInt(2, cdoRevision.getVersion()); + } + + @Override + protected String getSqlStatement() + { + return "DELETE FROM " + DBRevisionCacheSchema.REVISIONS // + + " WHERE " // + + " ID = ?" // + + " AND VERSION = ?"; + } + } + + private class ClearStatementFactory extends AbstractPreparedStatementFactory + { + @Override + protected String getSqlStatement() + { + return "DELETE FROM " + DBRevisionCacheSchema.REVISIONS; // + } + + @Override + protected void doSetParameters(CDORevision t, PreparedStatement preparedStatement) throws Exception + { + } + } + + /** + * Do before activate. + * + * @throws Exception + * the exception + */ + @Override + protected void doBeforeActivate() throws Exception + { + super.doBeforeActivate(); + checkState(dataSource, "dataSource is null!"); //$NON-NLS-1$ + checkState(dbAdapter, "dbAdapter is null!"); //$NON-NLS-1$ + checkState(cdoIdProvider, "cdoIDProvider is null!"); //$NON-NLS-1$ + checkState(cdoIdObjectFactory, "cdoIdObjectFactory is null!"); //$NON-NLS-1$ + checkState(cdoListFactory, "cdoListFactory is null!"); //$NON-NLS-1$ + checkState(cdoPackageRegistry, "cdoPackageRegistry is null!"); //$NON-NLS-1$ + checkState(cdoRevisionResolver, "cdoRevisionResolver is null!"); //$NON-NLS-1$ + } + + /** + * Do activate. + * + * @throws Exception + * the exception + */ + @Override + protected void doActivate() throws Exception + { + super.doActivate(); + + insertRevisionStatementFactory = new InsertRevisionStatementFactory(); + updateRevisedStatementFactory = new UpdateRevisedStatementFactory(); + deleteRevisionStatementFactory = new DeleteRevisionStatementFactory(); + clearStatementFactory = new ClearStatementFactory(); + + dbConnectionProvider = createDBConnectionProvider(); + createTables(); + } + + /** + * Do deactivate. + * + * @throws Exception + * the exception + */ + @Override + protected void doDeactivate() throws Exception + { + updateRevisedStatementFactory.close(); + updateRevisedStatementFactory = null; + insertRevisionStatementFactory.close(); + insertRevisionStatementFactory = null; + deleteRevisionStatementFactory.close(); + deleteRevisionStatementFactory = null; + DBRevisionCacheUtils.throwExceptionIfPresent(DBUtil.close(connection)); + connection = null; + + super.doDeactivate(); + } + + /** + * Creates the tables. + * + * @throws SQLException + * the SQL exception + */ + private void createTables() throws SQLException + { + Connection connection = getConnection(); + DBRevisionCacheSchema.INSTANCE.create(dbAdapter, connection); + connection.commit(); + } + + /** + * Adds a given revision to this cache. It furthermore updates the revised timestamp of the latest (before inserting + * the new one) revision + * + * @param revision + * the revision to add to this cache + * @return true, if successful + */ + public boolean addRevision(InternalCDORevision revision) + { + try + { + DBRevisionCacheUtils.mandatoryInsertUpdate(insertRevisionStatementFactory.getPreparedStatement(revision, + getConnection())); + if (revision.getVersion() > 1) + { + // update former latest revision + DBRevisionCacheUtils + .insertUpdate(updateRevisedStatementFactory.getPreparedStatement(revision, getConnection())); + } + return true; + } + catch (Exception ex) + { + throw new DBException(ex); + } + } + + /** + * Clear. + */ + public void clear() + { + try + { + DBRevisionCacheUtils.insertUpdate(clearStatementFactory.getPreparedStatement(null, getConnection())); + } + catch (Exception ex) + { + throw new DBException(ex); + } + } + + /** + * Gets the object type. + * + * @param id + * the id + * @return the object type + */ + public EClass getObjectType(CDOID id) + { + return null; + } + + /** + * Gets the resource id. + * + * @param folderID + * the folder id + * @param name + * the name + * @param timeStamp + * the time stamp + * @return the resource id + */ + public CDOID getResourceID(CDOID folderID, String name, long timeStamp) + { + return null; + } + + /** + * Gets the revision with the highest version for a given {@link CDOID}. + * + * @param id + * the id + * @return the revision + */ + public InternalCDORevision getRevision(CDOID id) + { + try + { + final InternalCDORevision[] cdoRevisionArray = new InternalCDORevision[1]; + Connection connection = getConnection(); + IDBRowHandler rowHandler = new IDBRowHandler() + { + public boolean handle(int row, final Object... values) + { + try + { + DBRevisionCacheUtils.assertIsNull(cdoRevisionArray[0], + "database inconsistent: there's more than 1 revision with the same version!"); + cdoRevisionArray[0] = getCDORevision(values[0], values[1]); + } + catch (IOException ex) + { + TRACER.format("error reading CDORevision from database \"{0}\"!", ex); + } + return true; + } + }; + + String uriFragment = id.toURIFragment(); + DBUtil.select(connection // + , rowHandler // + , "id = " + uriFragment + " AND " + DBRevisionCacheSchema.REVISIONS_REVISED + " = 0" // + , DBRevisionCacheSchema.REVISIONS_CDOREVISION // + , DBRevisionCacheSchema.REVISIONS_REVISED); + return cdoRevisionArray[0]; + } + catch (Exception ex) + { + throw new DBException(ex); + } + } + + /** + * Gets the revision by time. + * + * @param id + * the id + * @param timeStamp + * the time stamp + * @return the revision by time + */ + public InternalCDORevision getRevisionByTime(CDOID id, long timeStamp) + { + try + { + final InternalCDORevision[] cdoRevisionArray = new InternalCDORevision[1]; + IDBRowHandler rowHandler = new IDBRowHandler() + { + public boolean handle(int row, final Object... values) + { + try + { + DBRevisionCacheUtils.assertIsNull(cdoRevisionArray[0], + "database inconsistent: there's more than 1 revision with the same id and timestamp!"); + cdoRevisionArray[0] = getCDORevision(values[0], values[1]); + } + catch (IOException ex) + { + TRACER.format("error reading CDORevision from database \"{0}\"!", ex); + } + return true; + } + }; + + String uriFragment = id.toURIFragment(); + DBUtil.select(getConnection() // + , rowHandler // + , "id = " + uriFragment // + + " AND " + DBRevisionCacheSchema.REVISIONS_CREATED + " <= " + timeStamp // + + " AND" // + + " ( " // + + DBRevisionCacheSchema.REVISIONS_REVISED + " >= " + timeStamp // + + " OR " + DBRevisionCacheSchema.REVISIONS_REVISED + " = 0" // + + " )" + // + , DBRevisionCacheSchema.REVISIONS_CDOREVISION // + , DBRevisionCacheSchema.REVISIONS_REVISED); + return cdoRevisionArray[0]; + } + catch (Exception ex) + { + throw new DBException(ex); + } + } + + /** + * Gets the revision by version. + * + * @param id + * the id + * @param version + * the version + * @return the revision by version + */ + public InternalCDORevision getRevisionByVersion(CDOID id, int version) + { + try + { + final InternalCDORevision[] cdoRevisionArray = new InternalCDORevision[1]; + IDBRowHandler rowHandler = new IDBRowHandler() + { + public boolean handle(int row, final Object... values) + { + try + { + DBRevisionCacheUtils.assertIsNull(cdoRevisionArray[0], + "database inconsistent: there's more than 1 revision with the same version!"); + cdoRevisionArray[0] = getCDORevision(values[0], values[1]); + } + catch (IOException ex) + { + TRACER.format("error reading CDORevision from database \"{0}\"!", ex); + } + return true; + } + }; + + String uriFragment = id.toURIFragment(); + DBUtil.select(getConnection() // + , rowHandler // + , "id = " + uriFragment + " AND VERSION = " + version // + , DBRevisionCacheSchema.REVISIONS_CDOREVISION // + , DBRevisionCacheSchema.REVISIONS_REVISED); + return cdoRevisionArray[0]; + } + catch (Exception ex) + { + throw new DBException(ex); + } + } + + /** + * Gets the latest revisions of all persisted model versions. + * + * @return the revisions + */ + public List getRevisions() + { + try + { + final List cdoRevisionList = new ArrayList(); + IDBRowHandler rowHandler = new IDBRowHandler() + { + public boolean handle(int row, final Object... values) + { + try + { + cdoRevisionList.add(toCDORevision((byte[])values[0])); + } + catch (IOException ex) + { + TRACER.format("error reading CDORevision from database \"{0}\"!", ex); + } + return true; + } + }; + + DBUtil.select(getConnection() // + , rowHandler // + , DBRevisionCacheSchema.REVISIONS_REVISED + " = 0" // + , DBRevisionCacheSchema.REVISIONS_CDOREVISION); + return cdoRevisionList; + } + catch (Exception ex) + { + throw new DBException(ex); + } + } + + /** + * Removes a revision by its Id and version. If the given revision does not exist null is returned. Otherwise + * the {@link InternalCDORevision}, that was removed is returned + * + * @param id + * the id of the revision to remove + * @param version + * the version of the revision to remove + * @return the {@link InternalCDORevision} that was remove, null otherwise + */ + public InternalCDORevision removeRevision(CDOID id, int version) + { + try + { + InternalCDORevision cdoRevision = getRevisionByVersion(id, version); + if (cdoRevision != null) + { + DBRevisionCacheUtils.mandatoryInsertUpdate(deleteRevisionStatementFactory.getPreparedStatement(cdoRevision, + getConnection())); + } + return cdoRevision; + } + catch (Exception ex) + { + throw new DBException(ex); + } + } + + /** + * Creates a {@link IDBConnectionProvider} + * + * @return the {@link IDBConnectionProvider} + */ + private IDBConnectionProvider createDBConnectionProvider() + { + return DBUtil.createConnectionProvider(dataSource); + } + + /** + * Gets the {@link Connection}. If a connection was already created in a earlyer call, this connection is reused, + * Otherwise a new one is created + * + * @return the connection + * @throws DBException + * if an error occured while trying to create a connection + */ + protected Connection getConnection() + { + try + { + if (connection == null || connection.isClosed()) + { + connection = DBRevisionCacheUtils.assertIsNotNull(dbConnectionProvider.getConnection()); + connection.setAutoCommit(false); + } + return connection; + + } + catch (SQLException ex) + { + throw new DBException(ex); + } + } + + /** + * Converts a given {@link CDORevision} to an array of bytes + * + * @param revision + * the revision + * @return the bytes + * @throws IOException + * Signals that an I/O exception has occurred. + */ + private byte[] toBytes(CDORevision revision) throws IOException + { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + CDODataOutput cdoDataOutput = new CDODataOutputImpl(ExtendedDataOutputStream.wrap(byteArrayOutputStream)) + { + public CDOIDProvider getIDProvider() + { + return cdoIdProvider; + } + }; + + cdoDataOutput.writeCDORevision(revision, CDORevision.UNCHUNKED); + return byteArrayOutputStream.toByteArray(); + } + + /** + * Converts the given Objects to an {@link InternalCDORevision}. The object is deserialized to an instance of the + * correct type and the revised timestamp is set separatley. Whe you insert a new revision into this cache, the former + * latest revision gets a new revised timestamp. This timestamp's only updated in the database column 'revised', not + * in the blob that holds the serialized instance. The revised timestamp therefore has to be set separately + * + * @param revisedTimestampObject + * the value + * @param cdoInstanceData + * the cdo instance data + * @return the internal cdo revision + * @throws IOException + * Signals that an I/O exception has occurred. + */ + private InternalCDORevision getCDORevision(Object cdoInstanceData, Object revisedTimestampObject) throws IOException + { + CheckUtil.checkArg(cdoInstanceData instanceof byte[], "cdoInstanceDataArray is not of type byte[]"); + InternalCDORevision cdoRevision = toCDORevision((byte[])cdoInstanceData); + CheckUtil.checkArg(revisedTimestampObject instanceof Long, "revisedTimestampObject ins not of type Long"); + // revised timestamp's updated in the column only (not in the blob) + cdoRevision.setRevised((Long)revisedTimestampObject); + return cdoRevision; + } + + /** + * Converts a given byteArray to a CDORevision + * + * @param byteArray + * the byte array + * @return the cDO revision + * @throws IOException + * Signals that an I/O exception has occurred. + */ + private InternalCDORevision toCDORevision(byte[] byteArray) throws IOException + { + CDODataInput cdoDataInput = new CDODataInputImpl(ExtendedDataInputStream.wrap(new ByteArrayInputStream(byteArray))) + { + @Override + protected CDOIDObjectFactory getIDFactory() + { + return cdoIdObjectFactory; + } + + @Override + protected CDOListFactory getListFactory() + { + return cdoListFactory; + } + + @Override + protected CDOPackageRegistry getPackageRegistry() + { + return cdoPackageRegistry; + } + + @Override + protected CDORevisionResolver getRevisionResolver() + { + return cdoRevisionResolver; + } + }; + return (InternalCDORevision)cdoDataInput.readCDORevision(); + } + + /** + * Sets the cDOID provider. + * + * @param cdoIDProvider + * the new cDOID provider + */ + public void setCDOIDProvider(CDOIDProvider cdoIDProvider) + { + cdoIdProvider = cdoIDProvider; + } + + public void setCdoIdObjectFactory(CDOIDObjectFactory cdoIdObjectFactory) + { + this.cdoIdObjectFactory = cdoIdObjectFactory; + } + + public void setCdoListFactory(CDOListFactory cdoListFactory) + { + this.cdoListFactory = cdoListFactory; + } + + public void setCdoPackageRegistry(CDOPackageRegistry cdoPackageRegistry) + { + this.cdoPackageRegistry = cdoPackageRegistry; + } + + public void setCdoRevisionResolver(CDORevisionResolver cdoRevisionResolver) + { + this.cdoRevisionResolver = cdoRevisionResolver; + } + + /** + * Sets the data source. + * + * @param dataSource + * the new data source + */ + public void setDataSource(DataSource dataSource) + { + this.dataSource = dataSource; + } + + /** + * Sets the dB adapter. + * + * @param dbAdapter + * the new dB adapter + */ + public void setDBAdapter(IDBAdapter dbAdapter) + { + this.dbAdapter = dbAdapter; + } + +} diff --git a/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/cache/DBRevisionCacheSchema.java b/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/cache/DBRevisionCacheSchema.java new file mode 100644 index 0000000000..5d3504bd19 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common.db/src/org/eclipse/emf/cdo/common/internal/db/cache/DBRevisionCacheSchema.java @@ -0,0 +1,65 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2009 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andre Dietisheim - initial API and implementation + * Eike Stepper - maintenance + **************************************************************************/ +package org.eclipse.emf.cdo.common.internal.db.cache; + +import org.eclipse.net4j.db.DBType; +import org.eclipse.net4j.db.ddl.IDBField; +import org.eclipse.net4j.db.ddl.IDBIndex; +import org.eclipse.net4j.db.ddl.IDBTable; +import org.eclipse.net4j.spi.db.DBSchema; + +/** + * @author Andre Dietisheim + */ +public class DBRevisionCacheSchema extends DBSchema +{ + public static final DBRevisionCacheSchema INSTANCE = new DBRevisionCacheSchema(); + + /** + * DBTable dbrevisioncache_revisions + */ + public static final IDBTable REVISIONS = INSTANCE.addTable("dbrevisioncache_revisions"); + + public static final IDBField REVISIONS_ID = // + REVISIONS.addField("id", DBType.BIGINT); + + public static final IDBIndex INDEX_REVISIONS_ID = // + REVISIONS.addIndex(IDBIndex.Type.NON_UNIQUE, REVISIONS_ID); + + public static final IDBField REVISIONS_VERSION = // + REVISIONS.addField("version", DBType.BIGINT); + + public static final IDBIndex INDEX_REVISIONS_VERSION = // + REVISIONS.addIndex(IDBIndex.Type.NON_UNIQUE, REVISIONS_VERSION); + + public static final IDBIndex INDEX_REVISIONS_PK = // + REVISIONS.addIndex(IDBIndex.Type.PRIMARY_KEY, REVISIONS_ID, REVISIONS_VERSION); + + public static final IDBField REVISIONS_CREATED = // + REVISIONS.addField("created", DBType.BIGINT); + + public static final IDBField REVISIONS_REVISED = // + REVISIONS.addField("revised", DBType.BIGINT); + + public static final IDBField REVISIONS_CDOREVISION = // + REVISIONS.addField("cdorevision", DBType.BLOB); + + private DBRevisionCacheSchema() + { + super("DBRevisionCache"); + } + + static + { + INSTANCE.lock(); + } +} -- cgit v1.2.3