13c5114b8SDamjan Jovanovic /**************************************************************
23c5114b8SDamjan Jovanovic  *
33c5114b8SDamjan Jovanovic  * Licensed to the Apache Software Foundation (ASF) under one
43c5114b8SDamjan Jovanovic  * or more contributor license agreements.  See the NOTICE file
53c5114b8SDamjan Jovanovic  * distributed with this work for additional information
63c5114b8SDamjan Jovanovic  * regarding copyright ownership.  The ASF licenses this file
73c5114b8SDamjan Jovanovic  * to you under the Apache License, Version 2.0 (the
83c5114b8SDamjan Jovanovic  * "License"); you may not use this file except in compliance
93c5114b8SDamjan Jovanovic  * with the License.  You may obtain a copy of the License at
103c5114b8SDamjan Jovanovic  *
113c5114b8SDamjan Jovanovic  *   http://www.apache.org/licenses/LICENSE-2.0
123c5114b8SDamjan Jovanovic  *
133c5114b8SDamjan Jovanovic  * Unless required by applicable law or agreed to in writing,
143c5114b8SDamjan Jovanovic  * software distributed under the License is distributed on an
153c5114b8SDamjan Jovanovic  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
163c5114b8SDamjan Jovanovic  * KIND, either express or implied.  See the License for the
173c5114b8SDamjan Jovanovic  * specific language governing permissions and limitations
183c5114b8SDamjan Jovanovic  * under the License.
193c5114b8SDamjan Jovanovic  *
203c5114b8SDamjan Jovanovic  *************************************************************/
213c5114b8SDamjan Jovanovic 
223c5114b8SDamjan Jovanovic package com.sun.star.sdbcx.comp.postgresql;
233c5114b8SDamjan Jovanovic 
243c5114b8SDamjan Jovanovic import java.util.List;
253c5114b8SDamjan Jovanovic 
26*60ba3965SDamjan Jovanovic import org.apache.openoffice.comp.sdbc.dbtools.comphelper.CompHelper;
27*60ba3965SDamjan Jovanovic import org.apache.openoffice.comp.sdbc.dbtools.sdbcx.OContainer;
28*60ba3965SDamjan Jovanovic import org.apache.openoffice.comp.sdbc.dbtools.sdbcx.descriptors.SdbcxTableDescriptor;
29*60ba3965SDamjan Jovanovic import org.apache.openoffice.comp.sdbc.dbtools.util.ComposeRule;
30*60ba3965SDamjan Jovanovic import org.apache.openoffice.comp.sdbc.dbtools.util.DbTools;
31*60ba3965SDamjan Jovanovic import org.apache.openoffice.comp.sdbc.dbtools.util.DbTools.NameComponents;
32*60ba3965SDamjan Jovanovic import org.apache.openoffice.comp.sdbc.dbtools.util.PropertyIds;
33*60ba3965SDamjan Jovanovic import org.apache.openoffice.comp.sdbc.dbtools.util.StandardSQLState;
34*60ba3965SDamjan Jovanovic 
353c5114b8SDamjan Jovanovic import com.sun.star.beans.UnknownPropertyException;
363c5114b8SDamjan Jovanovic import com.sun.star.beans.XPropertySet;
3740ca8078SDamjan Jovanovic import com.sun.star.container.ElementExistException;
38bc7637c3SDamjan Jovanovic import com.sun.star.container.NoSuchElementException;
393c5114b8SDamjan Jovanovic import com.sun.star.lang.IllegalArgumentException;
403c5114b8SDamjan Jovanovic import com.sun.star.lang.WrappedTargetException;
413c5114b8SDamjan Jovanovic import com.sun.star.sdbc.SQLException;
423c5114b8SDamjan Jovanovic import com.sun.star.sdbc.XDatabaseMetaData;
433c5114b8SDamjan Jovanovic import com.sun.star.sdbc.XResultSet;
443c5114b8SDamjan Jovanovic import com.sun.star.sdbc.XRow;
453c5114b8SDamjan Jovanovic import com.sun.star.sdbc.XStatement;
46bc7637c3SDamjan Jovanovic import com.sun.star.sdbcx.XDrop;
471f8a0be0SDamjan Jovanovic import com.sun.star.uno.Any;
483c5114b8SDamjan Jovanovic import com.sun.star.uno.AnyConverter;
493c5114b8SDamjan Jovanovic import com.sun.star.uno.UnoRuntime;
503c5114b8SDamjan Jovanovic 
513c5114b8SDamjan Jovanovic public class PostgresqlTables extends OContainer {
523c5114b8SDamjan Jovanovic     private XDatabaseMetaData metadata;
533c5114b8SDamjan Jovanovic     private PostgresqlCatalog catalog;
543c5114b8SDamjan Jovanovic 
PostgresqlTables(Object lock, XDatabaseMetaData metadata, PostgresqlCatalog catalog, List<String> names)5540ca8078SDamjan Jovanovic     public PostgresqlTables(Object lock, XDatabaseMetaData metadata, PostgresqlCatalog catalog, List<String> names) throws ElementExistException {
563c5114b8SDamjan Jovanovic         super(lock, true, names);
573c5114b8SDamjan Jovanovic         this.metadata = metadata;
583c5114b8SDamjan Jovanovic         this.catalog = catalog;
593c5114b8SDamjan Jovanovic     }
603c5114b8SDamjan Jovanovic 
613c5114b8SDamjan Jovanovic     @Override
createObject(String name)623c5114b8SDamjan Jovanovic     public XPropertySet createObject(String name) throws SQLException {
633c5114b8SDamjan Jovanovic         NameComponents nameComponents = DbTools.qualifiedNameComponents(metadata, name, ComposeRule.InDataManipulation);
641f8a0be0SDamjan Jovanovic         Object queryCatalog = nameComponents.getCatalog().isEmpty() ? Any.VOID : nameComponents.getCatalog();
653c5114b8SDamjan Jovanovic         XPropertySet ret = null;
663c5114b8SDamjan Jovanovic         XResultSet results = null;
673c5114b8SDamjan Jovanovic         try {
683c5114b8SDamjan Jovanovic             results = metadata.getTables(
693c5114b8SDamjan Jovanovic                     queryCatalog, nameComponents.getSchema(), nameComponents.getTable(), new String[] { "VIEW", "TABLE", "%" });
703c5114b8SDamjan Jovanovic             if (results != null) {
713c5114b8SDamjan Jovanovic                 XRow row = UnoRuntime.queryInterface(XRow.class, results);
723c5114b8SDamjan Jovanovic                 if (results.next()) {
733c5114b8SDamjan Jovanovic                     String type = row.getString(4);
743c5114b8SDamjan Jovanovic                     String remarks = row.getString(5);
7568b6fe01SDamjan Jovanovic                     ret = new PostgresqlTable(metadata.getConnection(), this, nameComponents.getTable(),
763c5114b8SDamjan Jovanovic                             nameComponents.getCatalog(), nameComponents.getSchema(), remarks, type);
773c5114b8SDamjan Jovanovic                 }
783c5114b8SDamjan Jovanovic             }
793c5114b8SDamjan Jovanovic         } finally {
803c5114b8SDamjan Jovanovic             CompHelper.disposeComponent(results);
813c5114b8SDamjan Jovanovic         }
823c5114b8SDamjan Jovanovic         return ret;
833c5114b8SDamjan Jovanovic 
843c5114b8SDamjan Jovanovic     }
853c5114b8SDamjan Jovanovic 
863c5114b8SDamjan Jovanovic     @Override
dropObject(int index, String name)873c5114b8SDamjan Jovanovic     public void dropObject(int index, String name) throws SQLException {
883c5114b8SDamjan Jovanovic         try {
893c5114b8SDamjan Jovanovic             Object object = getObject(index);
903c5114b8SDamjan Jovanovic 
913c5114b8SDamjan Jovanovic             NameComponents nameComponents = DbTools.qualifiedNameComponents(metadata, name, ComposeRule.InDataManipulation);
923c5114b8SDamjan Jovanovic 
933c5114b8SDamjan Jovanovic             boolean isView = false;
943c5114b8SDamjan Jovanovic             XPropertySet propertySet = UnoRuntime.queryInterface(XPropertySet.class, object);
953c5114b8SDamjan Jovanovic             if (propertySet != null) {
963c5114b8SDamjan Jovanovic                 isView = AnyConverter.toString(propertySet.getPropertyValue(PropertyIds.TYPE.name)).equals("VIEW");
973c5114b8SDamjan Jovanovic             }
983c5114b8SDamjan Jovanovic 
993c5114b8SDamjan Jovanovic             String composedName = DbTools.composeTableName(metadata, nameComponents.getCatalog(), nameComponents.getSchema(), nameComponents.getTable(),
1003c5114b8SDamjan Jovanovic                     true, ComposeRule.InDataManipulation);
101bc7637c3SDamjan Jovanovic             if (isView) {
102bc7637c3SDamjan Jovanovic                 XDrop dropView = UnoRuntime.queryInterface(XDrop.class, catalog.getViews());
103bc7637c3SDamjan Jovanovic                 String unquotedName = DbTools.composeTableName(metadata, nameComponents.getCatalog(), nameComponents.getSchema(), nameComponents.getTable(),
104bc7637c3SDamjan Jovanovic                         false, ComposeRule.InDataManipulation);
105bc7637c3SDamjan Jovanovic                 dropView.dropByName(unquotedName);
106bc7637c3SDamjan Jovanovic                 return;
107bc7637c3SDamjan Jovanovic             }
108bc7637c3SDamjan Jovanovic 
109bc7637c3SDamjan Jovanovic             String sql = "DROP TABLE " + composedName;
1103c5114b8SDamjan Jovanovic 
1113c5114b8SDamjan Jovanovic             XStatement statement = null;
1123c5114b8SDamjan Jovanovic             try {
1133c5114b8SDamjan Jovanovic                 statement = metadata.getConnection().createStatement();
1143c5114b8SDamjan Jovanovic                 statement.execute(sql);
1153c5114b8SDamjan Jovanovic             } finally {
1163c5114b8SDamjan Jovanovic                 CompHelper.disposeComponent(statement);
1173c5114b8SDamjan Jovanovic             }
118bc7637c3SDamjan Jovanovic         } catch (IllegalArgumentException | UnknownPropertyException | WrappedTargetException | NoSuchElementException wrappedTargetException) {
1193c5114b8SDamjan Jovanovic             throw new SQLException("Error", this, StandardSQLState.SQL_GENERAL_ERROR.text(), 0, wrappedTargetException);
1203c5114b8SDamjan Jovanovic         }
1213c5114b8SDamjan Jovanovic     }
1223c5114b8SDamjan Jovanovic 
1233c5114b8SDamjan Jovanovic     @Override
impl_refresh()1243c5114b8SDamjan Jovanovic     public void impl_refresh() {
1251f8a0be0SDamjan Jovanovic         catalog.refreshObjects();
1263c5114b8SDamjan Jovanovic     }
1273c5114b8SDamjan Jovanovic 
1283c5114b8SDamjan Jovanovic     @Override
createDescriptor()1293c5114b8SDamjan Jovanovic     public XPropertySet createDescriptor() {
13068b6fe01SDamjan Jovanovic         return new SdbcxTableDescriptor(true);
1313c5114b8SDamjan Jovanovic     }
1323c5114b8SDamjan Jovanovic 
1333c5114b8SDamjan Jovanovic     @Override
appendObject(String name, XPropertySet descriptor)1343c5114b8SDamjan Jovanovic     public XPropertySet appendObject(String name, XPropertySet descriptor) throws SQLException {
1353c5114b8SDamjan Jovanovic         createTable(descriptor);
1363c5114b8SDamjan Jovanovic         return createObject(name);
1373c5114b8SDamjan Jovanovic     }
1383c5114b8SDamjan Jovanovic 
createTable(XPropertySet descriptor)1393c5114b8SDamjan Jovanovic     void createTable(XPropertySet descriptor) throws SQLException {
1403c5114b8SDamjan Jovanovic         XStatement statement = null;
1413c5114b8SDamjan Jovanovic         try {
1423c5114b8SDamjan Jovanovic             String sql = DbTools.createSqlCreateTableStatement(descriptor, metadata.getConnection(), null, "(M,D)");
1433c5114b8SDamjan Jovanovic             statement = metadata.getConnection().createStatement();
1443c5114b8SDamjan Jovanovic             statement.execute(sql);
1453c5114b8SDamjan Jovanovic         } finally {
1463c5114b8SDamjan Jovanovic             CompHelper.disposeComponent(statement);
1473c5114b8SDamjan Jovanovic         }
1483c5114b8SDamjan Jovanovic     }
1493c5114b8SDamjan Jovanovic }
150