org.hsqldb.dbinfo.DITableInfo Maven / Gradle / Ivy
Show all versions of sqltool Show documentation
/* Copyright (c) 2001-2019, The HSQL Development Group
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of the HSQL Development Group nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.hsqldb.dbinfo;
import java.util.Locale;
import org.hsqldb.Table;
import org.hsqldb.TableBase;
import org.hsqldb.map.ValuePool;
import org.hsqldb.resources.ResourceBundleHandler;
/**
* Provides extended information about HSQLDB tables and their
* columns/indices.
*
* Current version has been reduced in scope.
*
* @author Campbell Burnet (campbell-burnet@users dot sourceforge.net)
* @version 2.2.7
* @since 1.7.2
*/
final class DITableInfo {
// related to DatabaseMetaData
int bestRowTemporary = 0;
int bestRowTransaction = 1;
int bestRowSession = 2;
int bestRowUnknown = 0;
int bestRowNotPseudo = 1;
static final short tableIndexOther = 3;
/** Used in buffer size and character octet length determinations. */
private static final int HALF_MAX_INT = Integer.MAX_VALUE >>> 1;
/** BundleHandler id for column remarks resource bundle. */
private int hnd_column_remarks = -1;
/** BundleHandler id for table remarks resource bundle. */
private int hnd_table_remarks = -1;
/** The Table object upon which this object is reporting. */
private Table table;
/**
* Creates a new DITableInfo object with the default Locale and reporting
* on no table. It is absolutely essential the a valid Table object is
* assigned to this object, using the setTable method, before any Table,
* Column or Index oriented value retrieval methods are called; this class
* contains no assertions or exception handling related to a null or
* invalid table member attribute.
*/
DITableInfo() {
setupBundles();
}
/**
* Sets the Locale for table and column remarks.
*/
void setupBundles() {
Locale oldLocale;
synchronized (ResourceBundleHandler.class) {
oldLocale = ResourceBundleHandler.getLocale();
ResourceBundleHandler.setLocale(Locale.getDefault());
hnd_column_remarks =
ResourceBundleHandler.getBundleHandle("info-column-remarks",
null);
hnd_table_remarks =
ResourceBundleHandler.getBundleHandle("info-table-remarks",
null);
ResourceBundleHandler.setLocale(oldLocale);
}
}
/**
* Retrieves whether the best row identifier column is
* a pseudo column, like an Oracle ROWID.
*
* Currently, this always returns an Integer whose value is
* DatabaseMetaData.bestRowNotPseudo, as HSQLDB does not support
* pseudo columns such as ROWID.
*
* @return whether the best row identifier column is
* a pseudo column
*/
Integer getBRIPseudo() {
return ValuePool.getInt(bestRowNotPseudo);
}
/**
* Retrieves the scope of the best row identifier.
*
* This implements the rules described in
* DatabaseInformationMain.SYSTEM_BESTROWIDENTIFIER.
*
* @return the scope of the best row identifier
*/
Integer getBRIScope() {
return (table.isWritable()) ? ValuePool.getInt(bestRowTemporary)
: ValuePool.getInt(bestRowSession);
}
/**
* Retrieves the simple name of the specified column.
*
* @param i zero-based column index
* @return the simple name of the specified column.
*/
String getColName(int i) {
return table.getColumn(i).getName().name;
}
/**
* Retrieves the remarks, if any, recorded against the specified
* column.
*
* @param i zero-based column index
* @return the remarks recorded against the specified column.
*/
String getColRemarks(int i) {
String key;
if (table.getTableType() != TableBase.INFO_SCHEMA_TABLE) {
return table.getColumn(i).getName().comment;
}
key = getName() + "_" + getColName(i);
return ResourceBundleHandler.getString(hnd_column_remarks, key);
}
/**
* Retrieves the HSQLDB-specific type of the table.
*
* @return the HSQLDB-specific type of the table
*/
String getHsqlType() {
switch (table.getTableType()) {
case TableBase.MEMORY_TABLE :
case TableBase.TEMP_TABLE :
case TableBase.INFO_SCHEMA_TABLE :
return "MEMORY";
case TableBase.CACHED_TABLE :
return "CACHED";
case TableBase.TEMP_TEXT_TABLE :
case TableBase.TEXT_TABLE :
return "TEXT";
case TableBase.VIEW_TABLE :
default :
return null;
}
}
/**
* Retrieves the simple name of the table.
*
* @return the simple name of the table
*/
String getName() {
return table.getName().name;
}
/**
* Retrieves the remarks (if any) recorded against the Table.
*
* @return the remarks recorded against the Table
*/
String getRemark() {
return (table.getTableType() == TableBase.INFO_SCHEMA_TABLE)
? ResourceBundleHandler.getString(hnd_table_remarks, getName())
: table.getName().comment;
}
/**
* Retrieves the standard JDBC type of the table.
*
* "TABLE" for user-defined tables, "VIEW" for user-defined views,
* and so on.
*
* @return the standard JDBC type of the table
*/
String getJDBCStandardType() {
switch (table.getTableType()) {
case TableBase.VIEW_TABLE :
return "VIEW";
case TableBase.TEMP_TABLE :
case TableBase.TEMP_TEXT_TABLE :
return "GLOBAL TEMPORARY";
case TableBase.INFO_SCHEMA_TABLE :
return "SYSTEM TABLE";
default :
if (table.getOwner().isSystem()) {
return "SYSTEM TABLE";
}
return "TABLE";
}
}
/**
* Retrieves the Table object on which this object is currently
* reporting.
*
* @return the Table object on which this object
* is currently reporting
*/
Table getTable() {
return this.table;
}
/**
* Assigns the Table object on which this object is to report.
*
* @param table the Table object on which this object is to report
*/
void setTable(Table table) {
this.table = table;
}
}