Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 204568 Details for
Bug 241557
PostgreSQL sequences not supported
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
Patch in EGit default format
basic-support-for-PostgreSQL-sequences.patch (text/plain), 13.41 KB, created by
Pierre Queinnec
on 2011-10-05 03:48:02 EDT
(
hide
)
Description:
Patch in EGit default format
Filename:
MIME Type:
Creator:
Pierre Queinnec
Created:
2011-10-05 03:48:02 EDT
Size:
13.41 KB
patch
obsolete
>diff --git runtime/vendors/postgresql/postgresql_8.x.xmi runtime/vendors/postgresql/postgresql_8.x.xmi >index f9d3d7c..68a06c4 100644 >--- runtime/vendors/postgresql/postgresql_8.x.xmi >+++ runtime/vendors/postgresql/postgresql_8.x.xmi >@@ -4,7 +4,7 @@ > xmlns:DBDefinition="http:///org/eclipse/datatools/modelbase/dbdefinition/dbdefinition.ecore" > vendor="postgres" version="8.x" maximumIdentifierLength="64" > joinSupported="true" tablespacesSupported="false" maximumCommentLength="60" >- schemaSupported="true" aliasSupported="true" SQLStatementSupported="true"> >+ schemaSupported="true" aliasSupported="true" sequenceSupported="true" SQLStatementSupported="true"> > > <!-- Label for unresolved data types --> > <predefinedDataTypeDefinitions xmi:id="UNRESOLVED_DATA_TYPE" >@@ -1160,4 +1160,4 @@ > <operators>BINARY</operators> > <operators>COLLATE</operators> > </SQLSyntaxDefinition> >-</DBDefinition:DatabaseVendorDefinition> >\ No newline at end of file >+</DBDefinition:DatabaseVendorDefinition> >diff --git META-INF/MANIFEST.MF META-INF/MANIFEST.MF >index a0e28e3..e7b009d 100644 >--- META-INF/MANIFEST.MF >+++ META-INF/MANIFEST.MF >@@ -7,8 +7,11 @@ > Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)", > org.eclipse.datatools.connectivity;bundle-version="[0.9.1,1.5.0)", > org.eclipse.datatools.connectivity.db.generic;bundle-version="[0.9.1,1.5.0)", >- org.eclipse.datatools.connectivity.sqm.core;bundle-version="[0.9.1,1.5.0)" >+ org.eclipse.datatools.connectivity.sqm.core;bundle-version="[0.9.1,1.5.0)", >+ org.eclipse.datatools.modelbase.sql;bundle-version="[0.9.0,1.5.0)" > Eclipse-LazyStart: true > Bundle-ActivationPolicy: lazy > Bundle-Vendor: %providerName > Bundle-RequiredExecutionEnvironment: J2SE-1.5 >+Export-Package: org.eclipse.datatools.enablement.postgresql.catalog, >+ org.eclipse.datatools.enablement.postgresql.catalog.loaders >diff --git plugin.xml plugin.xml >index f0441c6..8780676 100644 >--- plugin.xml >+++ plugin.xml >@@ -88,5 +88,14 @@ > providerID="org.eclipse.datatools.enablement.postgresql.connectionProfile"> > </providerIDtoDriverCategoryID> > </extension> >+ <extension >+ point="org.eclipse.datatools.connectivity.sqm.core.catalog"> >+ <overrideLoader >+ eclass="org.eclipse.datatools.modelbase.sql.schema.Schema" >+ product="postgres" >+ provider="org.eclipse.datatools.enablement.postgresql.catalog.loaders.PostgresSchemaLoader" >+ version="8.x"> >+ </overrideLoader> >+ </extension> > > </plugin> >diff --git src/org/eclipse/datatools/enablement/postgresql/catalog/PostgresCatalogSchema.java src/org/eclipse/datatools/enablement/postgresql/catalog/PostgresCatalogSchema.java >new file mode 0 >index 0000000..f710ee9 0 >--- /dev/null >+++ src/org/eclipse/datatools/enablement/postgresql/catalog/PostgresCatalogSchema.java >@@ -0,0 +1,126 @@ >+/******************************************************************************* >+ * Copyright (c) 2011 Zenika >+ * >+ * 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: queinnec - initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.datatools.enablement.postgresql.catalog; >+ >+import java.lang.ref.SoftReference; >+import java.util.ArrayList; >+import java.util.List; >+ >+import org.eclipse.datatools.connectivity.sqm.core.definition.DatabaseDefinition; >+import org.eclipse.datatools.connectivity.sqm.core.rte.jdbc.JDBCSchema; >+import org.eclipse.datatools.connectivity.sqm.core.util.CatalogLoaderOverrideManager; >+import org.eclipse.datatools.connectivity.sqm.internal.core.RDBCorePlugin; >+import org.eclipse.datatools.connectivity.sqm.loader.JDBCBaseLoader; >+import org.eclipse.datatools.enablement.postgresql.catalog.loaders.PostgresSequenceLoader; >+import org.eclipse.datatools.modelbase.sql.schema.SQLSchemaPackage; >+import org.eclipse.emf.common.util.EList; >+ >+/** >+ * PostgreSQL Schema. >+ * >+ * Enhances the original implementation of <code>JDBCSchema</code> to support >+ * the following features: >+ * <ul> >+ * <li>Sequence loading</li> >+ * </ul> >+ * >+ * @author pierre.queinnec@zenika.com >+ */ >+public class PostgresCatalogSchema extends JDBCSchema { >+ >+ private final Object SEQUENCE_LOCK = new Object(); >+ >+ private Boolean sequencesLoaded = Boolean.FALSE; >+ >+ private transient SoftReference sequenceLoaderRef; >+ >+ public void refresh() { >+ synchronized (SEQUENCE_LOCK) { >+ if (sequencesLoaded.booleanValue()) { >+ sequencesLoaded = Boolean.FALSE; >+ } >+ } >+ >+ super.refresh(); >+ } >+ >+ public EList getSequences() { >+ synchronized (SEQUENCE_LOCK) { >+ if (!sequencesLoaded.booleanValue()) >+ this.loadSequences(); >+ } >+ >+ return super.getSequences(); >+ } >+ >+ protected final PostgresSequenceLoader getSequenceLoader() { >+ // cache the SequenceLoader for better performance >+ if (sequenceLoaderRef == null || sequenceLoaderRef.get() == null) { >+ sequenceLoaderRef = new SoftReference(createSequenceLoader()); >+ } >+ >+ return (PostgresSequenceLoader) sequenceLoaderRef.get(); >+ } >+ >+ private void loadSequences() { >+ synchronized (SEQUENCE_LOCK) { >+ boolean deliver = eDeliver(); >+ try { >+ List container = super.getSequences(); >+ List existingSequences = new ArrayList(container); >+ >+ eSetDeliver(false); >+ >+ container.clear(); >+ getSequenceLoader().loadSequences(container, existingSequences); >+ getSequenceLoader().clearSequences(existingSequences); >+ >+ sequencesLoaded = Boolean.TRUE; >+ >+ } catch (Exception e) { >+ e.printStackTrace(); >+ >+ } finally { >+ eSetDeliver(deliver); >+ } >+ } >+ } >+ >+ /** >+ * Creates and returns an instance of the SequenceLoader. By default an >+ * instance of the <code>PostgresSequenceLoader</code> is returned. This >+ * behavior can be changed by providing an <code>overrideLoader</code> using >+ * the eclass org.eclipse.datatools.modelbase.sql.schema.Sequence. >+ * >+ * @return An instance of PostgresSequenceLoader. >+ */ >+ private PostgresSequenceLoader createSequenceLoader() { >+ // get the database definiton for the actual database >+ DatabaseDefinition databaseDefinition = RDBCorePlugin.getDefault() >+ .getDatabaseDefinitionRegistry() >+ .getDefinition(this.getCatalogDatabase()); >+ >+ // see if someone is interested in providing an own sequence loader >+ JDBCBaseLoader loader = CatalogLoaderOverrideManager.INSTANCE >+ .getLoaderForDatabase(databaseDefinition, >+ SQLSchemaPackage.eINSTANCE.getSequence() >+ .getInstanceClassName()); >+ >+ if (loader != null) { >+ PostgresSequenceLoader sequenceLoader = (PostgresSequenceLoader) loader; >+ sequenceLoader.setCatalogObject(this); >+ return sequenceLoader; >+ } >+ >+ return new PostgresSequenceLoader(this); >+ } >+ >+} >diff --git src/org/eclipse/datatools/enablement/postgresql/catalog/loaders/PostgresSchemaLoader.java src/org/eclipse/datatools/enablement/postgresql/catalog/loaders/PostgresSchemaLoader.java >new file mode 0 >index 0000000..056e1fd 0 >--- /dev/null >+++ src/org/eclipse/datatools/enablement/postgresql/catalog/loaders/PostgresSchemaLoader.java >@@ -0,0 +1,40 @@ >+/******************************************************************************* >+ * Copyright (c) 2011 Zenika >+ * >+ * 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: queinnec - initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.datatools.enablement.postgresql.catalog.loaders; >+ >+import org.eclipse.datatools.connectivity.sqm.loader.JDBCSchemaLoader; >+import org.eclipse.datatools.enablement.postgresql.catalog.PostgresCatalogSchema; >+import org.eclipse.datatools.modelbase.sql.schema.Schema; >+ >+/** >+ * Class for loading schemas from a PostgreSQL database. >+ * >+ * @author pierre.queinnec@zenika.com >+ */ >+public class PostgresSchemaLoader extends JDBCSchemaLoader { >+ >+ public PostgresSchemaLoader() { >+ super(null); >+ } >+ >+ /** >+ * Returns a new Schema object. This method overrides the default behavior >+ * and returns a new PostgreSQLCatalogSchema. >+ * >+ * @return a new Schema object. >+ * >+ * @see org.eclipse.datatools.connectivity.sqm.loader.JDBCSchemaLoader#createSchema() >+ */ >+ protected Schema createSchema() { >+ return new PostgresCatalogSchema(); >+ } >+ >+} >diff --git src/org/eclipse/datatools/enablement/postgresql/catalog/loaders/PostgresSequenceLoader.java src/org/eclipse/datatools/enablement/postgresql/catalog/loaders/PostgresSequenceLoader.java >new file mode 0 >index 0000000..ab80305 0 >--- /dev/null >+++ src/org/eclipse/datatools/enablement/postgresql/catalog/loaders/PostgresSequenceLoader.java >@@ -0,0 +1,151 @@ >+/******************************************************************************* >+ * Copyright (c) 2011 Zenika >+ * >+ * 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: queinnec - initial API and implementation >+ ******************************************************************************/ >+package org.eclipse.datatools.enablement.postgresql.catalog.loaders; >+ >+import java.sql.PreparedStatement; >+import java.sql.ResultSet; >+import java.sql.SQLException; >+import java.util.Collection; >+import java.util.List; >+ >+import org.eclipse.datatools.connectivity.sqm.core.connection.ConnectionFilter; >+import org.eclipse.datatools.connectivity.sqm.core.rte.ICatalogObject; >+import org.eclipse.datatools.connectivity.sqm.loader.IConnectionFilterProvider; >+import org.eclipse.datatools.connectivity.sqm.loader.JDBCBaseLoader; >+import org.eclipse.datatools.connectivity.sqm.loader.SchemaObjectFilterProvider; >+import org.eclipse.datatools.modelbase.sql.schema.SQLSchemaFactory; >+import org.eclipse.datatools.modelbase.sql.schema.Sequence; >+ >+/** >+ * This class adds the ability to retrieve a list of sequences from a PostgreSQL >+ * database. >+ * >+ * @author pierre.queinnec@zenika.com >+ */ >+public class PostgresSequenceLoader extends JDBCBaseLoader { >+ >+ private static final String SEQUENCE_QUERY = "SELECT c.relname FROM pg_class c WHERE c.relkind = 'S' ORDER BY c.relname"; //$NON-NLS-1$ >+ private static final String SEQUENCE_NAME = "relname"; >+ >+ public PostgresSequenceLoader() { >+ this(null); >+ } >+ >+ public PostgresSequenceLoader(ICatalogObject catalogObject) { >+ this(catalogObject, new SchemaObjectFilterProvider( >+ ConnectionFilter.SEQUENCE_FILTER)); >+ } >+ >+ public PostgresSequenceLoader(ICatalogObject catalogObject, >+ IConnectionFilterProvider connectionFilterProvider) { >+ >+ super(catalogObject, connectionFilterProvider); >+ } >+ >+ public void clearSequences(List sequences) { >+ sequences.clear(); >+ } >+ >+ /** >+ * This method loads and fills the containmentList with the sequences. In >+ * addition every reference (to an found sequence) is removed from >+ * existingSequences. Considered are only those sequences, that are owned by >+ * the schema denoted by CatalogObject (should be an Schema). >+ * >+ * @param containmentList >+ * List of new Sequences >+ * @param existingSequences >+ * List of old Sequences >+ * @throws SQLException >+ * In case of an database error >+ */ >+ public void loadSequences(List containmentList, Collection existingSequences) >+ throws SQLException { >+ >+ ResultSet rs = null; >+ PreparedStatement stmt = null; >+ try { >+ initActiveFilter(); >+ >+ stmt = getCatalogObject().getConnection().prepareStatement( >+ SEQUENCE_QUERY); >+ rs = createResultSet(stmt); >+ >+ while (rs.next()) { >+ String sequenceName = rs.getString(SEQUENCE_NAME); >+ >+ if (sequenceName == null || isFiltered(sequenceName)) { >+ continue; >+ } >+ >+ Sequence sequence = (Sequence) getAndRemoveSQLObject( >+ existingSequences, sequenceName); >+ >+ if (sequence == null) { >+ sequence = processRow(rs); >+ if (sequence != null) { >+ containmentList.add(sequence); >+ } >+ } else { >+ containmentList.add(sequence); >+ if (sequence instanceof ICatalogObject) { >+ ((ICatalogObject) sequence).refresh(); >+ } >+ } >+ } >+ } finally { >+ try { >+ if (rs != null) { >+ rs.close(); >+ } >+ >+ } catch (SQLException e) { >+ // ignored >+ >+ } finally { >+ try { >+ if (stmt != null) { >+ stmt.close(); >+ } >+ } catch (SQLException e) { >+ // ignored >+ } >+ } >+ } >+ } >+ >+ protected Sequence processRow(ResultSet rs) throws SQLException { >+ Sequence sequence = SQLSchemaFactory.eINSTANCE.createSequence(); >+ sequence.setName(rs.getString(SEQUENCE_NAME).trim()); >+ return sequence; >+ } >+ >+ protected ResultSet createResultSet(PreparedStatement stmt) >+ throws SQLException { >+ try { >+ // TODO decide wether to filter on the schema (temp sequences are >+ // generated on a special schema, so decide wether to list them or >+ // not) >+ >+ // it's expected that catalog object is an Schema >+ // String schema = ((Schema) getCatalogObject()).getName(); >+ // stmt.setString(1, schema); >+ return stmt.executeQuery(); >+ >+ } catch (RuntimeException e) { >+ SQLException error = new SQLException( >+ "Error while retrieving catalog information (sequences)"); >+ error.initCause(e); >+ throw error; >+ } >+ } >+ >+}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
bpayton
:
iplog+
Actions:
View
|
Diff
Attachments on
bug 241557
:
201049
| 204568