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