Class DBInterfacePostgreSQL

    • Field Detail

      • postgresqlHostnameProperty

        public static final java.lang.String postgresqlHostnameProperty
        PostgreSQL host name property
        See Also:
        Constant Field Values
      • postgresqlPortProperty

        public static final java.lang.String postgresqlPortProperty
        PostgreSQL port property
        See Also:
        Constant Field Values
      • postgresqlSslProperty

        public static final java.lang.String postgresqlSslProperty
        PostgreSQL ssl property
        See Also:
        Constant Field Values
      • lockManager

        protected final ILockManager lockManager
        A lock manager handle.
      • cacheKey

        protected final java.lang.String cacheKey
      • serializableDepth

        protected int serializableDepth
      • tablesToAnalyze

        protected java.util.List<java.lang.String> tablesToAnalyze
      • tablesToReindex

        protected java.util.List<java.lang.String> tablesToReindex
      • currentReindexStatistics

        protected static java.util.Map<java.lang.String,​DBInterfacePostgreSQL.TableStatistics> currentReindexStatistics
        Accumulated reindex statistics. This map is keyed by the table name, and contains TableStatistics values.
      • reindexThresholds

        protected static java.util.Map<java.lang.String,​java.lang.Integer> reindexThresholds
        Table reindex thresholds, as read from configuration information. Keyed by table name, contains Integer values.
      • currentAnalyzeStatistics

        protected static java.util.Map<java.lang.String,​DBInterfacePostgreSQL.TableStatistics> currentAnalyzeStatistics
        Accumulated analyze statistics. This map is keyed by the table name, and contains TableStatistics values.
      • analyzeThresholds

        protected static java.util.Map<java.lang.String,​java.lang.Integer> analyzeThresholds
        Table analyze thresholds, as read from configuration information. Keyed by table name, contains Integer values.
      • commitThreshold

        protected static final int commitThreshold
        The number of inserts, deletes, etc. before we update the shared area.
        See Also:
        Constant Field Values
      • statslockReindexPrefix

        protected static final java.lang.String statslockReindexPrefix
        See Also:
        Constant Field Values
      • statsReindexPrefix

        protected static final java.lang.String statsReindexPrefix
        See Also:
        Constant Field Values
      • statslockAnalyzePrefix

        protected static final java.lang.String statslockAnalyzePrefix
        See Also:
        Constant Field Values
      • statsAnalyzePrefix

        protected static final java.lang.String statsAnalyzePrefix
        See Also:
        Constant Field Values
    • Method Detail

      • getDatabaseCacheKey

        public java.lang.String getDatabaseCacheKey()
        Get the database general cache key.
        Specified by:
        getDatabaseCacheKey in interface IDBInterface
        Returns:
        the general cache key for the database.
      • performInsert

        public void performInsert​(java.lang.String tableName,
                                  java.util.Map<java.lang.String,​java.lang.Object> parameterMap,
                                  StringSet invalidateKeys)
                           throws ManifoldCFException
        Perform an insert operation.
        Specified by:
        performInsert in interface IDBInterface
        Parameters:
        tableName - is the name of the table.
        invalidateKeys - are the cache keys that should be invalidated.
        parameterMap - is the map of column name/values to write.
        Throws:
        ManifoldCFException
      • performUpdate

        public void performUpdate​(java.lang.String tableName,
                                  java.util.Map<java.lang.String,​java.lang.Object> parameterMap,
                                  java.lang.String whereClause,
                                  java.util.List whereParameters,
                                  StringSet invalidateKeys)
                           throws ManifoldCFException
        Perform an update operation.
        Specified by:
        performUpdate in interface IDBInterface
        Parameters:
        tableName - is the name of the table.
        invalidateKeys - are the cache keys that should be invalidated.
        parameterMap - is the map of column name/values to write.
        whereClause - is the where clause describing the match (including the WHERE), or null if none.
        whereParameters - are the parameters that come with the where clause, if any.
        Throws:
        ManifoldCFException
      • performDelete

        public void performDelete​(java.lang.String tableName,
                                  java.lang.String whereClause,
                                  java.util.List whereParameters,
                                  StringSet invalidateKeys)
                           throws ManifoldCFException
        Perform a delete operation.
        Specified by:
        performDelete in interface IDBInterface
        Parameters:
        tableName - is the name of the table to delete from.
        invalidateKeys - are the cache keys that should be invalidated.
        whereClause - is the where clause describing the match (including the WHERE), or null if none.
        whereParameters - are the parameters that come with the where clause, if any.
        Throws:
        ManifoldCFException
      • performCreate

        public void performCreate​(java.lang.String tableName,
                                  java.util.Map<java.lang.String,​ColumnDescription> columnMap,
                                  StringSet invalidateKeys)
                           throws ManifoldCFException
        Perform a table creation operation.
        Specified by:
        performCreate in interface IDBInterface
        Parameters:
        tableName - is the name of the table to create.
        columnMap - is the map describing the columns and types. NOTE that these are abstract types, which will be mapped to the proper types for the actual database inside this layer.
        invalidateKeys - are the cache keys that should be invalidated, if any.
        Throws:
        ManifoldCFException
      • appendDescription

        protected static void appendDescription​(java.lang.StringBuilder queryBuffer,
                                                java.lang.String columnName,
                                                ColumnDescription cd,
                                                boolean forceNull)
      • performAlter

        public void performAlter​(java.lang.String tableName,
                                 java.util.Map<java.lang.String,​ColumnDescription> columnMap,
                                 java.util.Map<java.lang.String,​ColumnDescription> columnModifyMap,
                                 java.util.List<java.lang.String> columnDeleteList,
                                 StringSet invalidateKeys)
                          throws ManifoldCFException
        Perform a table alter operation.
        Specified by:
        performAlter in interface IDBInterface
        Parameters:
        tableName - is the name of the table to alter.
        columnMap - is the map describing the columns and types to add. These are in the same form as for performCreate.
        columnModifyMap - is the map describing the columns to be changed. The key is the existing column name, and the value is the new type of the column. Data will be copied from the old column to the new.
        columnDeleteList - is the list of column names to delete.
        invalidateKeys - are the cache keys that should be invalidated, if any.
        Throws:
        ManifoldCFException
      • mapType

        protected static java.lang.String mapType​(java.lang.String inputType)
        Map a standard type into a postgresql type.
        Parameters:
        inputType - is the input type.
        Returns:
        the output type.
      • addTableIndex

        public void addTableIndex​(java.lang.String tableName,
                                  boolean unique,
                                  java.util.List<java.lang.String> columnList)
                           throws ManifoldCFException
        Add an index to a table.
        Specified by:
        addTableIndex in interface IDBInterface
        Parameters:
        tableName - is the name of the table to add the index for.
        unique - is a boolean that if true describes a unique index.
        columnList - is the list of columns that need to be included in the index, in order.
        Throws:
        ManifoldCFException
      • performAddIndex

        public void performAddIndex​(java.lang.String indexName,
                                    java.lang.String tableName,
                                    IndexDescription description)
                             throws ManifoldCFException
        Add an index to a table.
        Specified by:
        performAddIndex in interface IDBInterface
        Parameters:
        tableName - is the name of the table to add the index for.
        indexName - is the optional name of the table index. If null, a name will be chosen automatically.
        description - is the index description.
        Throws:
        ManifoldCFException
      • performRemoveIndex

        public void performRemoveIndex​(java.lang.String indexName,
                                       java.lang.String tableName)
                                throws ManifoldCFException
        Remove an index.
        Specified by:
        performRemoveIndex in interface IDBInterface
        Parameters:
        indexName - is the name of the index to remove.
        tableName - is the table the index belongs to.
        Throws:
        ManifoldCFException
      • performDrop

        public void performDrop​(java.lang.String tableName,
                                StringSet invalidateKeys)
                         throws ManifoldCFException
        Perform a table drop operation.
        Specified by:
        performDrop in interface IDBInterface
        Parameters:
        tableName - is the name of the table to drop.
        invalidateKeys - are the cache keys that should be invalidated, if any.
        Throws:
        ManifoldCFException
      • createUserAndDatabase

        public void createUserAndDatabase​(java.lang.String adminUserName,
                                          java.lang.String adminPassword,
                                          StringSet invalidateKeys)
                                   throws ManifoldCFException
        Create user and database.
        Specified by:
        createUserAndDatabase in interface IDBInterface
        Parameters:
        adminUserName - is the admin user name.
        adminPassword - is the admin password.
        invalidateKeys - are the cache keys that should be invalidated, if any.
        Throws:
        ManifoldCFException
      • dropUserAndDatabase

        public void dropUserAndDatabase​(java.lang.String adminUserName,
                                        java.lang.String adminPassword,
                                        StringSet invalidateKeys)
                                 throws ManifoldCFException
        Drop user and database.
        Specified by:
        dropUserAndDatabase in interface IDBInterface
        Parameters:
        adminUserName - is the admin user name.
        adminPassword - is the admin password.
        invalidateKeys - are the cache keys that should be invalidated, if any.
        Throws:
        ManifoldCFException
      • reinterpretException

        protected ManifoldCFException reinterpretException​(ManifoldCFException theException)
        Reinterpret an exception tossed by the database layer. We need to disambiguate the various kinds of exception that should be thrown.
        Parameters:
        theException - is the exception to reinterpret
        Returns:
        the reinterpreted exception to throw.
      • performModification

        public void performModification​(java.lang.String query,
                                        java.util.List params,
                                        StringSet invalidateKeys)
                                 throws ManifoldCFException
        Perform a general database modification query.
        Specified by:
        performModification in interface IDBInterface
        Parameters:
        query - is the query string.
        params - are the parameterized values, if needed.
        invalidateKeys - are the cache keys to invalidate.
        Throws:
        ManifoldCFException
      • getTableSchema

        public java.util.Map<java.lang.String,​ColumnDescription> getTableSchema​(java.lang.String tableName,
                                                                                      StringSet cacheKeys,
                                                                                      java.lang.String queryClass)
                                                                               throws ManifoldCFException
        Get a table's schema.
        Specified by:
        getTableSchema in interface IDBInterface
        Parameters:
        tableName - is the name of the table.
        cacheKeys - are the keys against which to cache the query, or null.
        queryClass - is the name of the query class, or null.
        Returns:
        a map of column names and ColumnDescription objects, describing the schema, or null if the table doesn't exist.
        Throws:
        ManifoldCFException
      • getTableIndexes

        public java.util.Map<java.lang.String,​IndexDescription> getTableIndexes​(java.lang.String tableName,
                                                                                      StringSet cacheKeys,
                                                                                      java.lang.String queryClass)
                                                                               throws ManifoldCFException
        Get a table's indexes.
        Specified by:
        getTableIndexes in interface IDBInterface
        Parameters:
        tableName - is the name of the table.
        cacheKeys - are the keys against which to cache the query, or null.
        queryClass - is the name of the query class, or null.
        Returns:
        a map of index names and IndexDescription objects, describing the indexes.
        Throws:
        ManifoldCFException
      • performQuery

        public IResultSet performQuery​(java.lang.String query,
                                       java.util.List params,
                                       StringSet cacheKeys,
                                       java.lang.String queryClass)
                                throws ManifoldCFException
        Perform a general "data fetch" query.
        Specified by:
        performQuery in interface IDBInterface
        Parameters:
        query - is the query string.
        params - are the parameterized values, if needed.
        cacheKeys - are the cache keys, if needed (null if no cache desired).
        queryClass - is the LRU class name against which this query would be cached, or null if no LRU behavior desired.
        Returns:
        a resultset.
        Throws:
        ManifoldCFException
      • performQuery

        public IResultSet performQuery​(java.lang.String query,
                                       java.util.List params,
                                       StringSet cacheKeys,
                                       java.lang.String queryClass,
                                       int maxResults,
                                       ILimitChecker returnLimit)
                                throws ManifoldCFException
        Perform a general "data fetch" query.
        Specified by:
        performQuery in interface IDBInterface
        Parameters:
        query - is the query string.
        params - are the parameterized values, if needed.
        cacheKeys - are the cache keys, if needed (null if no cache desired).
        queryClass - is the LRU class name against which this query would be cached, or null if no LRU behavior desired.
        maxResults - is the maximum number of results returned (-1 for all).
        returnLimit - is a description of how to limit the return result, or null if no limit.
        Returns:
        a resultset.
        Throws:
        ManifoldCFException
      • performQuery

        public IResultSet performQuery​(java.lang.String query,
                                       java.util.List params,
                                       StringSet cacheKeys,
                                       java.lang.String queryClass,
                                       int maxResults,
                                       ResultSpecification resultSpec,
                                       ILimitChecker returnLimit)
                                throws ManifoldCFException
        Perform a general "data fetch" query.
        Specified by:
        performQuery in interface IDBInterface
        Parameters:
        query - is the query string.
        params - are the parameterized values, if needed.
        cacheKeys - are the cache keys, if needed (null if no cache desired).
        queryClass - is the LRU class name against which this query would be cached, or null if no LRU behavior desired.
        maxResults - is the maximum number of results returned (-1 for all).
        resultSpec - is a result specification, or null for the standard treatment.
        returnLimit - is a description of how to limit the return result, or null if no limit.
        Returns:
        a resultset.
        Throws:
        ManifoldCFException
      • constructDoubleCastClause

        public java.lang.String constructDoubleCastClause​(java.lang.String value)
        Construct a cast to a double value. On most databases this cast needs to be explicit, but on some it is implicit (and cannot be in fact specified).
        Specified by:
        constructDoubleCastClause in interface IDBInterface
        Parameters:
        value - is the value to be cast.
        Returns:
        the query chunk needed.
      • constructCountClause

        public java.lang.String constructCountClause​(java.lang.String column)
        Construct a count clause. On most databases this will be COUNT(col), but on some the count needs to be cast to a BIGINT, so CAST(COUNT(col) AS BIGINT) will be emitted instead.
        Specified by:
        constructCountClause in interface IDBInterface
        Parameters:
        column - is the column string to be counted.
        Returns:
        the query chunk needed.
      • constructRegexpClause

        public java.lang.String constructRegexpClause​(java.lang.String column,
                                                      java.lang.String regularExpression,
                                                      boolean caseInsensitive)
        Construct a regular-expression match clause. This method builds both the text part of a regular-expression match.
        Specified by:
        constructRegexpClause in interface IDBInterface
        Parameters:
        column - is the column specifier string.
        regularExpression - is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.
        caseInsensitive - is true of the regular expression match is to be case insensitive.
        Returns:
        the query chunk needed, not padded with spaces on either side.
      • constructSubstringClause

        public java.lang.String constructSubstringClause​(java.lang.String column,
                                                         java.lang.String regularExpression,
                                                         boolean caseInsensitive)
        Construct a regular-expression substring clause. This method builds an expression that extracts a specified string section from a field, based on a regular expression.
        Specified by:
        constructSubstringClause in interface IDBInterface
        Parameters:
        column - is the column specifier string.
        regularExpression - is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.
        caseInsensitive - is true if the regular expression match is to be case insensitive.
        Returns:
        the expression chunk needed, not padded with spaces on either side.
      • constructOffsetLimitClause

        public java.lang.String constructOffsetLimitClause​(int offset,
                                                           int limit,
                                                           boolean afterOrderBy)
        Construct an offset/limit clause. This method constructs an offset/limit clause in the proper manner for the database in question.
        Specified by:
        constructOffsetLimitClause in interface IDBInterface
        Specified by:
        constructOffsetLimitClause in class Database
        Parameters:
        offset - is the starting offset number.
        limit - is the limit of result rows to return.
        afterOrderBy - is true if this offset/limit comes after an ORDER BY.
        Returns:
        the proper clause, with no padding spaces on either side.
      • constructDistinctOnClause

        public java.lang.String constructDistinctOnClause​(java.util.List outputParameters,
                                                          java.lang.String baseQuery,
                                                          java.util.List baseParameters,
                                                          java.lang.String[] distinctFields,
                                                          java.lang.String[] orderFields,
                                                          boolean[] orderFieldsAscending,
                                                          java.util.Map<java.lang.String,​java.lang.String> otherFields)
        Construct a 'distinct on (x)' filter. This filter wraps a query and returns a new query whose results are similar to POSTGRESQL's DISTINCT-ON feature. Specifically, for each combination of the specified distinct fields in the result, only the first such row is included in the final result.
        Specified by:
        constructDistinctOnClause in interface IDBInterface
        Parameters:
        outputParameters - is a blank list into which to put parameters. Null may be used if the baseParameters parameter is null.
        baseQuery - is the base query, which is another SELECT statement, without parens, e.g. "SELECT ..."
        baseParameters - are the parameters corresponding to the baseQuery.
        distinctFields - are the fields to consider to be distinct. These should all be keys in otherFields below.
        orderFields - are the otherfield keys that determine the ordering.
        orderFieldsAscending - are true for orderFields that are ordered as ASC, false for DESC.
        otherFields - are the rest of the fields to return, keyed by the AS name, value being the base query column value, e.g. "value AS key"
        Returns:
        a revised query that performs the necessary DISTINCT ON operation. The list outputParameters will also be appropriately filled in.
      • getMaxInClause

        public int getMaxInClause()
        Obtain the maximum number of individual items that should be present in an IN clause. Exceeding this amount will potentially cause the query performance to drop.
        Specified by:
        getMaxInClause in interface IDBInterface
        Specified by:
        getMaxInClause in class Database
        Returns:
        the maximum number of IN clause members.
      • getMaxOrClause

        public int getMaxOrClause()
        Obtain the maximum number of individual clauses that should be present in a sequence of OR clauses. Exceeding this amount will potentially cause the query performance to drop.
        Specified by:
        getMaxOrClause in interface IDBInterface
        Returns:
        the maximum number of OR clause members.
      • getWindowedReportMaxRows

        public int getWindowedReportMaxRows()
        For windowed report queries, e.g. maxActivity or maxBandwidth, obtain the maximum number of rows that can reasonably be expected to complete in an acceptable time.
        Specified by:
        getWindowedReportMaxRows in interface IDBInterface
        Returns:
        the maximum number of rows.
      • beginTransaction

        public void beginTransaction()
                              throws ManifoldCFException
        Begin a database transaction. This method call MUST be paired with an endTransaction() call, or database handles will be lost. If the transaction should be rolled back, then signalRollback() should be called before the transaction is ended. It is strongly recommended that the code that uses transactions be structured so that a try block starts immediately after this method call. The body of the try block will contain all direct or indirect calls to executeQuery(). After this should be a catch for every exception type, including Error, which should call the signalRollback() method, and rethrow the exception. Then, after that a finally{} block which calls endTransaction().
        Specified by:
        beginTransaction in interface IDBInterface
        Throws:
        ManifoldCFException
      • beginTransaction

        public void beginTransaction​(int transactionType)
                              throws ManifoldCFException
        Begin a database transaction. This method call MUST be paired with an endTransaction() call, or database handles will be lost. If the transaction should be rolled back, then signalRollback() should be called before the transaction is ended. It is strongly recommended that the code that uses transactions be structured so that a try block starts immediately after this method call. The body of the try block will contain all direct or indirect calls to executeQuery(). After this should be a catch for every exception type, including Error, which should call the signalRollback() method, and rethrow the exception. Then, after that a finally{} block which calls endTransaction().
        Specified by:
        beginTransaction in interface IDBInterface
        Overrides:
        beginTransaction in class Database
        Parameters:
        transactionType - is the kind of transaction desired.
        Throws:
        ManifoldCFException
      • writeDatum

        protected void writeDatum​(java.lang.String datumName,
                                  int value)
                           throws ManifoldCFException
        Write a datum, presuming zero if the datum does not exist.
        Throws:
        ManifoldCFException
      • noteModificationsNoTransactions

        protected void noteModificationsNoTransactions​(java.lang.String tableName,
                                                       int insertCount,
                                                       int modifyCount,
                                                       int deleteCount)
                                                throws ManifoldCFException
        Note a number of inserts, modifications, or deletions to a specific table. This is so we can decide when to do appropriate maintenance.
        Overrides:
        noteModificationsNoTransactions in class Database
        Parameters:
        tableName - is the name of the table being modified.
        insertCount - is the number of inserts.
        modifyCount - is the number of updates.
        deleteCount - is the number of deletions.
        Throws:
        ManifoldCFException