Package net.sourceforge.squirrel_sql.fw.sql

Examples of net.sourceforge.squirrel_sql.fw.sql.ISQLDatabaseMetaData


    */
   protected IDataSet createDataSet() throws DataSetException
   {
      final ISession session = getSession();
      final ISQLConnection conn = session.getSQLConnection();
      ISQLDatabaseMetaData md = session.getMetaData();

     
      try
      {
         final Statement stmt = conn.createStatement();
         try
         {
            final SessionProperties props = session.getProperties();
            if (props.getContentsLimitRows())
            {
               try
               {
                  stmt.setMaxRows(props.getContentsNbrRowsToShow());
               }
               catch (Exception ex)
               {
                  s_log.error("Error on Statement.setMaxRows()", ex);
               }
            }
            final ITableInfo ti = getTableInfo();

            /**
             * When the SessionProperties are set to read-only (either table or text)
             * but the user has selected "Make Editable" on the Popup menu, we want
             * to limit the edit capability to only that table, and only for as long
             * as the user is looking at that one table.  When the user switches away
             * to another table, that new table should not be editable.
             */
            final String currentTableName = ti.getQualifiedName();
            if (!currentTableName.equals(previousTableName))
            {
               previousTableName = currentTableName;  // needed to prevent an infinite loop
               _dataSetUpdateableTableModel.setEditModeForced(false);

               /**
                * Tell the GUI to rebuild itself.
                * Unfortunately, this has the side effect of calling this same function
                * another time.  The second call does not seem to be a problem,
                * but we need to have reset the previousTableName before makeing
                * this call or we will be in an infinite loop.
                */
               //props.forceTableContentsOutputClassNameChange();
            }

            /**
             * If the table has a pseudo-column that is the best unique
             * identifier for the rows (like Oracle's rowid), then we
             * want to include that field in the query so that it will
             * be available if the user wants to edit the data later.
             */
            String pseudoColumn = "";

            try
            {
               BestRowIdentifier[] rowIDs = md.getBestRowIdentifier(ti);
               for (int i = 0; i < rowIDs.length; ++i)
               {
                  short pseudo = rowIDs[i].getPseudoColumn();
                  if (pseudo == DatabaseMetaData.bestRowPseudo)
                  {
                     pseudoColumn = " ," + rowIDs[i].getColumnName();
                     break;
                  }
               }
            }

            // Some DBMS's (EG Think SQL) throw an exception on a call to
            // getBestRowIdentifier.
            catch (Throwable th)
            {
              if (s_log.isDebugEnabled()) {
                 s_log.debug("getBestRowIdentifier not supported for table "+ currentTableName, th);
              }
            }

            // TODO: - Col - Add method to Databasemetadata that returns array
            // of objects for getBestRowIdentifier. For PostgreSQL put this kludge in
            // the new function. THis way all the kludges are kept in one place.
            //
            // KLUDGE!!!!!!
            //
            // For some DBs (e.g. PostgreSQL) there is actually a pseudo-column
            // providing the rowId, but the getBestRowIdentifier function is not
            // implemented.  This kludge hardcodes the knowledge that specific
            // DBs use a specific pseudo-column.  Additionally, as of pg 8.1,
            // you must create the table using "WITH OID" appended to the create
            // statement.  Otherwise, OID column is not available by default.
            //
            if (pseudoColumn.length() == 0)
            {
                if (DialectFactory.isPostgreSQL(md)) {
                    pseudoColumn = ", oid";
                }
                if (DialectFactory.isOracle(md)) {
                    pseudoColumn = ", ROWID";
                }
            }

            ResultSet rs = null;
            try
            {
               // Note. Some DBMSs such as Oracle do not allow:
               // "select *, rowid from table"
               // You cannot have any column name in the columns clause
               // if you have * in there. Aliasing the table name seems to
               // be the best way to get around the problem.
               final StringBuffer buf = new StringBuffer();
               buf.append("select tbl.*")
                  .append(pseudoColumn)
                  .append(" from ")
                  .append(ti.getQualifiedName())
                  .append(" tbl");

               String clause = _sqlFilterClauses.get(WhereClausePanel.getClauseIdentifier(), ti.getQualifiedName());
               if ((clause != null) && (clause.length() > 0))
               {
                 buf.append(" where ").append(clause);
               }
               clause = _sqlFilterClauses.get(OrderByClausePanel.getClauseIdentifier(), ti.getQualifiedName());
               if ((clause != null) && (clause.length() > 0))
               {
                 buf.append(" order by ").append(clause);
               }

               if (s_log.isDebugEnabled()) {
                   s_log.debug("createDataSet running SQL: "+buf.toString());
               }
                          
               showWaitDialog(stmt);              

               rs = stmt.executeQuery(buf.toString());

            }
            catch (SQLException ex)
            {
                if (s_log.isDebugEnabled()) {
                        s_log.debug(
                            "createDataSet: exception from pseudocolumn query - "
                                    + ex, ex);
                    }
                // We assume here that if the pseudoColumn was used in the query,
                // then it was likely to have caused the SQLException.  If not,
                // (length == 0), then retrying the query won't help - just throw
                // the exception.
               if (pseudoColumn.length() == 0)
               {
                  throw ex;
               }
               // pseudocolumn query failed, so reset it.  Otherwise, we'll
               // mistake the last column for a pseudocolumn and make it
               // uneditable
               pseudoColumn = "";

               // Some tables have pseudo column primary keys and others
               // do not.  JDBC on some DBMSs does not handle pseudo
               // columns 'correctly'.  Also, getTables returns 'views' as
               // well as tables, so the thing we are looking at might not
               // be a table. (JDBC does not give a simple way to
               // determine what we are looking at since the type of
               // object is described in a DBMS-specific encoding.)  For
               // these reasons, rather than testing for all these
               // conditions, we just try using the pseudo column info to
               // get the table data, and if that fails, we try to get the
               // table data without using the pseudo column.
               // TODO: Should we change the mode from editable to
               // non-editable?
               final StringBuffer buf = new StringBuffer();
               buf.append("select *")
                  .append(" from ")
                  .append(ti.getQualifiedName())
                  .append(" tbl");

               String clause = _sqlFilterClauses.get(WhereClausePanel.getClauseIdentifier(), ti.getQualifiedName());
               if ((clause != null) && (clause.length() > 0))
               {
                 buf.append(" where ").append(clause);
               }
               clause = _sqlFilterClauses.get(OrderByClausePanel.getClauseIdentifier(), ti.getQualifiedName());
               if ((clause != null) && (clause.length() > 0))
               {
                 buf.append(" order by ").append(clause);
               }

               rs = stmt.executeQuery(buf.toString());
            }

            final ResultSetDataSet rsds = new ResultSetDataSet();

            // to allow the fw to save and reload user options related to
            // specific columns, we construct a unique name for the table
            // so the column can be associcated with only that table.
            // Some drivers do not provide the catalog or schema info, so
            // those parts of the name will end up as null.  That's ok since
            // this string is never viewed by the user and is just used to
            // distinguish this table from other tables in the DB.
            // We also include the URL used to connect to the DB so that
            // the same table/DB on different machines is treated differently.
            rsds.setContentsTabResultSet(rs,
                                         _dataSetUpdateableTableModel.getFullTableName(),
                                         DialectFactory.getDialectType(md));
            if (rs != null) {
                try { rs.close(); } catch (SQLException e) {}
            }
            // KLUDGE:
            // We want some info about the columns to be available for validating the
            // user input during cell editing operations.  Ideally we would get that
            // info inside the ResultSetDataSet class during the creation of the
            // columnDefinition objects by using various functions in ResultSetMetaData
            // such as isNullable(idx).  Unfortunately, in at least some DBMSs (e.g.
            // Postgres, HSDB) the results of those calls are not the same (and are less accurate
            // than) the SQLMetaData.getColumns() call used in ColumnsTab to get the column info.
            // Even more unfortunate is the fact that the set of attributes reported on by the two
            // calls is not the same, with the ResultSetMetadata listing things not provided by
            // getColumns.  Most of the data provided by the ResultSetMetaData calls is correct.
            // However, the nullable/not-nullable property is not set correctly in at least two
            // DBMSs, while it is correct for those DBMSs in the getColumns() info.  Therefore,
            // we collect the collumn nullability information from getColumns() and pass that
            // info to the ResultSet to override what it got from the ResultSetMetaData.
            TableColumnInfo[] columnInfos = md.getColumnInfo(getTableInfo());
            final ColumnDisplayDefinition[] colDefs =
                rsds.getDataSetDefinition().getColumnDefinitions();

            // get the nullability information and pass it into the ResultSet
            // Unfortunately, not all DBMSs provide the column number in object 17 as stated in the
View Full Code Here


 
  @Test
  public void testIsPluginSession() throws Exception {
    ISession mockSession = mockHelper.createMock(ISession.class);
    ISQLDatabaseMetaData mockSQLDatabaseMetaData = mockHelper.createMock(ISQLDatabaseMetaData.class);
    expect(mockSession.getMetaData()).andStubReturn(mockSQLDatabaseMetaData);
    expect(mockSQLDatabaseMetaData.getDatabaseProductName()).andStubReturn(getDatabaseProductName());
    expect(mockSQLDatabaseMetaData.getDatabaseProductVersion()).andStubReturn(getDatabaseProductVersion());
   
    mockHelper.replayAll();
    if (classUnderTest instanceof DefaultSessionPlugin) {
      DefaultSessionPlugin plugin = (DefaultSessionPlugin)classUnderTest;
      Assert.assertTrue(plugin.isPluginSession(mockSession));
View Full Code Here

            // convert user representation of null into an actual null
            if (value != null && value.toString().equals("<null>"))
               value = null;

            // do different things depending on data type
            ISQLDatabaseMetaData md = _session.getMetaData();
            String clause = CellComponentFactory.getWhereClauseValue(colDefs[i], value, md);

            if (clause != null && clause.length() > 0)
               if (whereClause.length() == 0)
               {
View Full Code Here

    return AppTestUtil.getEasyMockSession(dbName, true);
  }

  public static ISession getEasyMockSession(String dbName, boolean replay) throws SQLException
  {
    ISQLDatabaseMetaData md = FwTestUtil.getEasyMockSQLMetaData(dbName, "jdbc:oracle");
    ISession session = AppTestUtil.getEasyMockSession(md, replay);
    return session;
  }
View Full Code Here

            FwTestUtil.getEasyMockTableColumns(catalog, schema, table, columnNames, dataTypes);

        TableColumnInfo[] parentColInfos =
            FwTestUtil.getEasyMockTableColumns(catalog, schema, table, parentColumnNames, parentDataTypes);
       
        ISQLDatabaseMetaData tableMockMetaData =
            FwTestUtil.getEasyMockSQLMetaData("oracle",
                                            "jdbc:oracle:thin",
                                            false,
                                            true);
       
View Full Code Here

      return md;     
   }
  
   public static ISQLDatabaseMetaData getEasyMockSQLMetaData(String dbName,
         String dbURL, DatabaseMetaData md) throws SQLException {
      ISQLDatabaseMetaData result = getEasyMockSQLMetaData(dbName,
                                                           dbURL,
                                                           false,
                                                           false);
      expect(result.getJDBCMetaData()).andReturn(md);
      replay(result);
      return result;
   }
View Full Code Here

      return result;
   }

   public static ISQLDatabaseMetaData getEasyMockSQLMetaData(String dbName,
         String dbURL, boolean nice, boolean replay) throws SQLException {
      ISQLDatabaseMetaData md = null;
      if (nice) {
         md = createNiceMock(ISQLDatabaseMetaData.class);
      } else {
         md = createMock(ISQLDatabaseMetaData.class);
      }

      expect(md.getDatabaseProductName()).andReturn(dbName).anyTimes();
      expect(md.getDatabaseProductVersion()).andReturn("1.0").anyTimes();
      expect(md.supportsSchemasInDataManipulation()).andReturn(true).anyTimes();
      expect(md.supportsCatalogsInDataManipulation()).andReturn(true)
                                                     .anyTimes();
      expect(md.supportsSchemasInTableDefinitions()).andStubReturn(true);
      expect(md.getCatalogSeparator()).andReturn("").anyTimes();
      expect(md.getIdentifierQuoteString()).andReturn("\"").anyTimes();
      expect(md.getURL()).andReturn(dbURL).anyTimes();
      DatabaseMetaData dbmd = createMock(DatabaseMetaData.class);
      expect(md.getJDBCMetaData()).andReturn(dbmd).anyTimes();
      if (replay) {
         replay(md);
      }
      return md;
   }
View Full Code Here

   * @return
   * @throws SQLException
   */
  private TableColumnInfo[] getLiveColumnInfo(ISession session, String tableName) throws SQLException
  {
    final ISQLDatabaseMetaData md = session.getMetaData();
    final String catalog = getDefaultCatalog(session);
    final String schema = getDefaultSchema(session);
    return md.getColumnInfo(catalog, schema, tableName);
  }
View Full Code Here

      return sqlCon;
   }

   public static ISQLDatabaseMetaData getEasyMockH2SQLMetaData()
         throws SQLException {
      ISQLDatabaseMetaData md = createMock(ISQLDatabaseMetaData.class);
      expect(md.getDatabaseProductName()).andReturn("H2").anyTimes();
      expect(md.getDatabaseProductVersion()).andReturn("1.0 (2007-04-29)")
                                            .anyTimes();
      expect(md.supportsSchemasInDataManipulation()).andReturn(true).anyTimes();
      expect(md.supportsSchemasInTableDefinitions()).andStubReturn(true);
      expect(md.supportsCatalogsInDataManipulation()).andReturn(false)
                                                     .anyTimes();
      expect(md.getCatalogSeparator()).andReturn(".").anyTimes();
      expect(md.getIdentifierQuoteString()).andReturn("\"").anyTimes();
      expect(md.getURL()).andReturn("jdbc:h2:tcp://localhost:9094/testDatabase")
                         .anyTimes();
      replay(md);
      return md;
   }
View Full Code Here

   }

   public static ISQLDatabaseMetaData getEasyMockSybase15SQLMetaData()
         throws SQLException
   {
      ISQLDatabaseMetaData md = getSybaseSQLMetaData();
      String version =
         "Adaptive Server Enterprise/15.0/EBF 13194 EC " +
         "ESD/P/Linux Intel/Linux 2.4.21-20.ELsmp " +
         "i686/ase150/2179/32-bit/FBO/Mon Feb  6 04:14:19 2006";
      expect(md.getDatabaseProductVersion()).andReturn(version).anyTimes();
      expect(md.supportsSchemasInTableDefinitions()).andStubReturn(true);
      replay(md);
      return md;
   }
View Full Code Here

TOP

Related Classes of net.sourceforge.squirrel_sql.fw.sql.ISQLDatabaseMetaData

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.