001: /*
002: * Copyright 2004-2008 H2 Group. Licensed under the H2 License, Version 1.0
003: * (http://h2database.com/html/license.html).
004: * Initial Developer: H2 Group
005: */
006: package org.h2.server.web;
007:
008: import java.sql.DatabaseMetaData;
009: import java.sql.ResultSet;
010: import java.sql.SQLException;
011: import java.util.ArrayList;
012:
013: import org.h2.command.Parser;
014: import org.h2.util.StringUtils;
015:
016: /**
017: * Keeps meta data information about a database.
018: * This class is used by the H2 Console.
019: */
020: public class DbContents {
021: DbSchema[] schemas;
022: DbSchema defaultSchema;
023: boolean isOracle, isH2, isPostgreSQL, isMySQL, isDerby, isFirebird,
024: isSQLite;
025:
026: void readContents(DatabaseMetaData meta) throws SQLException {
027: String prod = StringUtils.toLowerEnglish(meta
028: .getDatabaseProductName());
029: isSQLite = prod.indexOf("sqlite") >= 0;
030: String url = meta.getURL();
031: if (url != null) {
032: isH2 = url.startsWith("jdbc:h2:");
033: isOracle = url.startsWith("jdbc:oracle:");
034: isPostgreSQL = url.startsWith("jdbc:postgresql:");
035: // isHSQLDB = url.startsWith("jdbc:hsqldb:");
036: isMySQL = url.startsWith("jdbc:mysql:");
037: isDerby = url.startsWith("jdbc:derby:");
038: isFirebird = url.startsWith("jdbc:firebirdsql:");
039: }
040: String defaultSchemaName = getDefaultSchemaName(meta);
041: String[] schemaNames = getSchemaNames(meta);
042: schemas = new DbSchema[schemaNames.length];
043: for (int i = 0; i < schemaNames.length; i++) {
044: String schemaName = schemaNames[i];
045: boolean isDefault = defaultSchemaName == null
046: || defaultSchemaName.equals(schemaName);
047: DbSchema schema = new DbSchema(this , schemaName, isDefault);
048: if (schema.isDefault) {
049: defaultSchema = schema;
050: }
051: schemas[i] = schema;
052: String[] tableTypes = new String[] { "TABLE",
053: "SYSTEM TABLE", "VIEW", "SYSTEM VIEW",
054: "TABLE LINK", "SYNONYM" };
055: schema.readTables(meta, tableTypes);
056: }
057: if (defaultSchema == null) {
058: String best = null;
059: for (int i = 0; i < schemas.length; i++) {
060: if ("dbo".equals(schemas[i].name)) {
061: // MS SQL Server
062: defaultSchema = schemas[i];
063: break;
064: }
065: if (defaultSchema == null || best == null
066: || schemas[i].name.length() < best.length()) {
067: best = schemas[i].name;
068: defaultSchema = schemas[i];
069: }
070: }
071: }
072: }
073:
074: private String[] getSchemaNames(DatabaseMetaData meta)
075: throws SQLException {
076: if (isMySQL) {
077: return new String[] { "" };
078: } else if (isFirebird) {
079: return new String[] { null };
080: }
081: ResultSet rs = meta.getSchemas();
082: ArrayList schemas = new ArrayList();
083: while (rs.next()) {
084: String schema = rs.getString("TABLE_SCHEM");
085: if (schema == null) {
086: continue;
087: }
088: schemas.add(schema);
089: }
090: rs.close();
091: String[] list = new String[schemas.size()];
092: schemas.toArray(list);
093: return list;
094: }
095:
096: private String getDefaultSchemaName(DatabaseMetaData meta)
097: throws SQLException {
098: String defaultSchemaName = "";
099: try {
100: if (isOracle) {
101: return meta.getUserName();
102: } else if (isPostgreSQL) {
103: return "public";
104: } else if (isMySQL) {
105: return "";
106: } else if (isDerby) {
107: return StringUtils.toUpperEnglish(meta.getUserName());
108: } else if (isFirebird) {
109: return null;
110: }
111: ResultSet rs = meta.getSchemas();
112: int index = rs.findColumn("IS_DEFAULT");
113: while (rs.next()) {
114: if (rs.getBoolean(index)) {
115: defaultSchemaName = rs.getString("TABLE_SCHEM");
116: }
117: }
118: } catch (SQLException e) {
119: // IS_DEFAULT not found
120: }
121: return defaultSchemaName;
122: }
123:
124: String quoteIdentifier(String identifier) {
125: if (identifier == null) {
126: return null;
127: }
128: if (isH2) {
129: return Parser.quoteIdentifier(identifier);
130: } else {
131: return StringUtils.toUpperEnglish(identifier);
132: }
133: }
134:
135: }
|