00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 package org.objectweb.cjdbc.controller.virtualdatabase;
00026
00027 import java.sql.SQLException;
00028 import java.sql.Types;
00029 import java.util.ArrayList;
00030
00031 import org.objectweb.cjdbc.common.log.Trace;
00032 import org.objectweb.cjdbc.common.sql.schema.DatabaseColumn;
00033 import org.objectweb.cjdbc.common.sql.schema.DatabaseProcedure;
00034 import org.objectweb.cjdbc.common.sql.schema.DatabaseProcedureParameter;
00035 import org.objectweb.cjdbc.common.sql.schema.DatabaseSchema;
00036 import org.objectweb.cjdbc.common.sql.schema.DatabaseTable;
00037 import org.objectweb.cjdbc.common.users.VirtualDatabaseUser;
00038 import org.objectweb.cjdbc.controller.authentication.AuthenticationManager;
00039 import org.objectweb.cjdbc.controller.requestmanager.RequestManager;
00040 import org.objectweb.cjdbc.driver.DriverResultSet;
00041 import org.objectweb.cjdbc.driver.Field;
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 public class VirtualDatabaseDynamicMetaData
00052 {
00053
00054
00055 public static final int NULL_VALUE = -999;
00056
00057 private String vdbName;
00058 private RequestManager requestManager;
00059
00060
00061 private Trace logger = null;
00062
00063
00064
00065
00066
00067
00068
00069 public VirtualDatabaseDynamicMetaData(VirtualDatabase database)
00070 {
00071 this.vdbName = database.getVirtualDatabaseName();
00072 requestManager = database.getRequestManager();
00073 if (requestManager == null)
00074 throw new RuntimeException(
00075 "Null request manager in VirtualDatabaseMetaData");
00076
00077 this.logger = Trace
00078 .getLogger("org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabaseWorkerThread."
00079 + vdbName + ".metadata");
00080 }
00081
00082 private DatabaseSchema getDatabaseSchema()
00083 {
00084 try
00085 {
00086 return requestManager.getVirtualDatabase()
00087 .getDatabaseSchemaFromActiveBackendsAndRefreshDatabaseProductNames();
00088 }
00089 catch (SQLException e)
00090 {
00091 return requestManager.getDatabaseSchema();
00092 }
00093 }
00094
00095
00096
00097
00098
00099
00100
00101 public java.sql.ResultSet getPrimaryKeys(String catalog, String schema,
00102 String table)
00103 {
00104 if (logger.isDebugEnabled())
00105 logger.debug("Getting getPrimaryKeys for " + vdbName);
00106 DatabaseSchema dbs = this.getDatabaseSchema();
00107 if (dbs == null)
00108 return null;
00109
00110 if (table == null)
00111 table = "%";
00112
00113
00114
00115 ArrayList tables = dbs.getTables();
00116 int size = tables.size();
00117 ArrayList data = new ArrayList();
00118
00119 for (int i = 0; i < size; i++)
00120 {
00121 DatabaseTable t = (DatabaseTable) tables.get(i);
00122 if (table.equals("%") || table.equals(t.getName()))
00123 {
00124 ArrayList columns = t.getColumns();
00125 for (int j = 0; j < columns.size(); j++)
00126 {
00127 DatabaseColumn c = (DatabaseColumn) columns.get(j);
00128 if (c.isUnique())
00129 {
00130 if (logger.isDebugEnabled())
00131 logger.debug("Found primary key" + c.getName());
00132 Object[] row = new Object[6];
00133 row[0] = vdbName;
00134 row[1] = null;
00135 row[2] = t.getName();
00136 row[3] = c.getName();
00137 row[4] = new Integer(c.getType());
00138 row[5] = c.getName();
00139 data.add(row);
00140 }
00141 else
00142 {
00143 if (logger.isDebugEnabled())
00144 logger.debug("Key " + c.getName() + " is not unique");
00145 }
00146 }
00147 }
00148 }
00149 DriverResultSet rs = new DriverResultSet(getPrimaryKeysFields, data);
00150 return rs;
00151 }
00152
00153
00154
00155
00156 public DriverResultSet getColumns(String catalog, String schemaPattern,
00157 String tableNamePattern, String columnNamePattern)
00158 {
00159 if (logger.isDebugEnabled())
00160 logger.debug("Getting columns for " + vdbName);
00161 DatabaseSchema dbs = this.getDatabaseSchema();
00162 if (dbs == null)
00163 return null;
00164
00165 if (tableNamePattern == null)
00166 tableNamePattern = "%";
00167
00168
00169 if (columnNamePattern == null)
00170 columnNamePattern = "%";
00171
00172
00173 ArrayList tables = dbs.getTables();
00174 int size = tables.size();
00175 ArrayList data = new ArrayList();
00176
00177 for (int i = 0; i < size; i++)
00178 {
00179 DatabaseTable t = (DatabaseTable) tables.get(i);
00180
00181 if (tableNamePattern.equals("%") || tableNamePattern.equals(t.getName()))
00182 {
00183 if (logger.isDebugEnabled())
00184 logger.debug("Found table " + t.getName());
00185 ArrayList columns = t.getColumns();
00186 for (int j = 0; j < columns.size(); j++)
00187 {
00188 DatabaseColumn c = (DatabaseColumn) columns.get(j);
00189 if (columnNamePattern.equals("%")
00190 || columnNamePattern.equals(c.getName()))
00191 {
00192 if (logger.isDebugEnabled())
00193 logger.debug("Found column " + c.getName());
00194 Object[] row = new Object[18];
00195 row[0] = vdbName;
00196 row[1] = null;
00197 row[2] = t.getName();
00198 row[3] = c.getName();
00199 row[4] = new Integer(c.getType());
00200 row[5] = null;
00201 row[6] = null;
00202 row[7] = null;
00203 row[8] = null;
00204 row[9] = null;
00205 row[10] = null;
00206 row[11] = null;
00207 row[12] = null;
00208 row[13] = null;
00209 row[14] = null;
00210 row[15] = null;
00211 row[16] = null;
00212 row[17] = "";
00213 data.add(row);
00214 }
00215 }
00216 }
00217 }
00218 DriverResultSet rs = new DriverResultSet(getColumnsFields, data);
00219 return rs;
00220 }
00221
00222
00223
00224
00225
00226
00227
00228 public Object getSchemas()
00229 {
00230 ArrayList data = new ArrayList();
00231 DriverResultSet rs = new DriverResultSet(getSchemasFields, data);
00232 return rs;
00233 }
00234
00235
00236
00237
00238
00239 public DriverResultSet getTables(String catalog, String schemaPattern,
00240 String tableNamePattern, String[] types)
00241 {
00242 DatabaseSchema dbs = this.getDatabaseSchema();
00243 if (dbs == null)
00244 return null;
00245
00246 if (tableNamePattern == null)
00247
00248 tableNamePattern = "%";
00249
00250
00251 ArrayList tables = dbs.getTables();
00252 int size = tables.size();
00253 ArrayList data = new ArrayList();
00254 for (int i = 0; i < size; i++)
00255 {
00256 DatabaseTable t = (DatabaseTable) tables.get(i);
00257 if (tableNamePattern.equals("%")
00258 || t.getName().indexOf(tableNamePattern) != -1)
00259 {
00260 if (logger.isDebugEnabled())
00261 logger.debug("Found table " + t.getName());
00262 Object[] row = new Object[10];
00263 row[0] = vdbName;
00264 row[1] = null;
00265 row[2] = t.getName();
00266 row[3] = "TABLE";
00267 row[4] = null;
00268 row[5] = null;
00269 row[6] = null;
00270 row[7] = null;
00271 row[8] = null;
00272 row[9] = "SYSTEM";
00273 data.add(row);
00274 }
00275 }
00276 DriverResultSet rs = new DriverResultSet(getTablesFields, data);
00277 return rs;
00278 }
00279
00280
00281
00282
00283 public DriverResultSet getProcedures(String catalog, String schemaPattern,
00284 String procedureNamePattern)
00285 {
00286 DatabaseSchema dbs = this.getDatabaseSchema();
00287 if (dbs == null)
00288 return null;
00289
00290 if (procedureNamePattern == null)
00291 procedureNamePattern = "%";
00292
00293
00294
00295 ArrayList procedures = dbs.getProcedures();
00296 int size = procedures.size();
00297 ArrayList data = new ArrayList();
00298 for (int i = 0; i < size; i++)
00299 {
00300 DatabaseProcedure t = (DatabaseProcedure) procedures.get(i);
00301 if (procedureNamePattern.equals("%")
00302 || procedureNamePattern.equals(t.getName()))
00303 {
00304 if (logger.isDebugEnabled())
00305 logger.debug("Found procedure " + t.getName());
00306 Object[] row = new Object[8];
00307 row[0] = vdbName;
00308 row[1] = null;
00309 row[2] = t.getName();
00310 row[3] = null;
00311 row[4] = null;
00312 row[5] = null;
00313 row[6] = t.getRemarks();
00314 row[7] = new Integer(t.getProcedureType());
00315 data.add(row);
00316 }
00317 }
00318 DriverResultSet rs = new DriverResultSet(getProceduresFields, data);
00319 return rs;
00320 }
00321
00322
00323
00324
00325
00326
00327
00328 public DriverResultSet getCatalogs(ArrayList list)
00329 {
00330 int size = list.size();
00331 ArrayList data = new ArrayList(size);
00332 for (int i = 0; i < size; i++)
00333 {
00334 Object[] row = new Object[1];
00335 row[0] = (String) list.get(i);
00336 data.add(row);
00337 }
00338 DriverResultSet rs = new DriverResultSet(getCatalogsFields, data);
00339 return rs;
00340 }
00341
00342
00343
00344
00345 public DriverResultSet getTableTypes()
00346 {
00347 ArrayList list = new ArrayList(1);
00348 Object[] row = new Object[1];
00349 row[0] = "TABLE";
00350 list.add(row);
00351 DriverResultSet rs = new DriverResultSet(getTableTypesFields, list);
00352 return rs;
00353 }
00354
00355
00356
00357
00358 public DriverResultSet getTablePrivileges(String catalog,
00359 String schemaPattern, String tableNamePattern)
00360 {
00361 AuthenticationManager manager = requestManager.getVirtualDatabase()
00362 .getAuthenticationManager();
00363 DatabaseSchema dbs = this.getDatabaseSchema();
00364 if (dbs == null)
00365 return null;
00366
00367 if (tableNamePattern == null)
00368
00369 tableNamePattern = "%";
00370
00371 ArrayList tables = dbs.getTables();
00372 int size = tables.size();
00373 ArrayList data = new ArrayList();
00374
00375 ArrayList virtualLogins = manager.getVirtualLogins();
00376 int vsize = virtualLogins.size();
00377 VirtualDatabaseUser vu;
00378
00379 for (int i = 0; i < size; i++)
00380 {
00381 DatabaseTable t = (DatabaseTable) tables.get(i);
00382 if (tableNamePattern.equals("%") || tableNamePattern.equals(t.getName()))
00383 {
00384 for (int j = 0; j < vsize; j++)
00385 {
00386 vu = (VirtualDatabaseUser) virtualLogins.get(0);
00387
00388 if (logger.isDebugEnabled())
00389 logger.debug("Found privilege for user:" + vu.getLogin()
00390 + " on table:" + t.getName());
00391 Object[] row = new Object[7];
00392 row[0] = vdbName;
00393 row[1] = null;
00394 row[2] = t.getName();
00395 row[3] = null;
00396 row[4] = vu.getLogin();
00397 row[5] = "UPDATE";
00398 row[6] = "NO";
00399 data.add(row);
00400 }
00401 }
00402 }
00403
00404 DriverResultSet rs = new DriverResultSet(getTablePrivilegesFields, data);
00405 return rs;
00406 }
00407
00408
00409
00410
00411 public DriverResultSet getProcedureColumns(String catalog,
00412 String schemaPattern, String procedureNamePattern,
00413 String columnNamePattern)
00414 {
00415 DatabaseSchema dbs = this.getDatabaseSchema();
00416 if (dbs == null)
00417 return null;
00418
00419 if (procedureNamePattern == null)
00420 procedureNamePattern = "%";
00421
00422 if (columnNamePattern == null)
00423 columnNamePattern = "%";
00424
00425
00426 ArrayList procedures = dbs.getProcedures();
00427 int size = procedures.size();
00428 ArrayList data = new ArrayList();
00429 for (int i = 0; i < size; i++)
00430 {
00431 DatabaseProcedure t = (DatabaseProcedure) procedures.get(i);
00432 if (procedureNamePattern.equals("%")
00433 || procedureNamePattern.equals(t.getName()))
00434 {
00435 if (logger.isDebugEnabled())
00436 logger.debug("Found matching procedure " + t.getName());
00437
00438 ArrayList params = t.getParameters();
00439 int sizep = params.size();
00440 DatabaseProcedureParameter param;
00441 for (int k = 0; k < sizep; k++)
00442 {
00443 param = (DatabaseProcedureParameter) params.get(k);
00444 if (columnNamePattern.equals("%")
00445 || columnNamePattern.equals(t.getName()))
00446 {
00447 if (logger.isDebugEnabled())
00448 logger.debug("Found matching procedure parameter"
00449 + param.getName());
00450
00451 Object[] row = new Object[13];
00452 row[0] = vdbName;
00453 row[1] = null;
00454 row[2] = t.getName();
00455 row[3] = param.getName();
00456 row[4] = new Integer(param.getColumnType());
00457 row[5] = new Integer(param.getDataType());
00458 row[6] = param.getTypeName();
00459 row[7] = new Float(param.getPrecision());
00460 row[8] = new Integer(param.getLength());
00461 row[9] = new Integer(param.getScale());
00462 row[10] = new Integer(param.getRadix());
00463 row[11] = new Integer(param.getNullable());
00464 row[12] = param.getRemarks();
00465
00466 data.add(row);
00467 }
00468 }
00469 }
00470 }
00471 DriverResultSet rs = new DriverResultSet(getProcedureColumnsFields, data);
00472 return rs;
00473 }
00474
00475 private static Field[] getSchemasFields = new Field[]{new Field(
00476 "TABLE_SCHEM",
00477 "TABLE_SCHEM", 9,
00478 Types.VARCHAR,
00479 "VARCHAR", "String")};
00480
00481 private static Field[] getProcedureColumnsFields = new Field[]{
00482 new Field("PROCEDURE_CAT", "PROCEDURE_CAT", 9, Types.VARCHAR, "VARCHAR",
00483 "String"),
00484 new Field("PROCEDURE_SCHEM", "PROCEDURE_SCHEM", 10, Types.VARCHAR,
00485 "VARCHAR", "String"),
00486 new Field("PROCEDURE_NAME", "PROCEDURE_NAME", 10, Types.VARCHAR,
00487 "VARCHAR", "String"),
00488 new Field("COLUMN_NAME", "COLUMN_NAME", 10, Types.VARCHAR, "VARCHAR",
00489 "String"),
00490 new Field("COLUMN_TYPE", "COLUMN_TYPE", 10, Types.SMALLINT, "SMALLINT",
00491 "Short"),
00492 new Field("DATA_TYPE", "DATA_TYPE", 10, Types.SMALLINT, "SMALLINT",
00493 "Short"),
00494 new Field("TYPE_NAME", "TYPE_NAME", 10, Types.VARCHAR, "VARCHAR",
00495 "String"),
00496 new Field("PRECISION", "PRECISION", 10, Types.FLOAT, "FLOAT", "Float"),
00497 new Field("LENGTH", "LENGTH", 10, Types.INTEGER, "INTEGER", "Integer"),
00498 new Field("SCALE", "SCALE", 10, Types.SMALLINT, "SMALLINT", "Short"),
00499 new Field("RADIX", "RADIX", 10, Types.SMALLINT, "SMALLINT", "Short"),
00500 new Field("NULLABLE", "NULLABLE", 10, Types.SMALLINT, "SMALLINT", "Short"),
00501 new Field("REMARKS", "REMARKS", 10, Types.VARCHAR, "VARCHAR", "String")};
00502
00503 private static Field[] getCatalogsFields = new Field[]{new Field(
00504 "TABLE_CAT",
00505 "TABLE_CAT", 9,
00506 Types.VARCHAR,
00507 "VARCHAR", "String")};
00508
00509 private static Field[] getTableTypesFields = new Field[]{new Field(
00510 "TABLE_TYPE",
00511 "TABLE_TYPE", 9,
00512 Types.VARCHAR,
00513 "VARCHAR", "String")};
00514
00515 private static Field[] getTablePrivilegesFields = new Field[]{
00516 new Field("TABLE_CAT", "TABLE_CAT", 9, Types.VARCHAR, "VARCHAR", "String"),
00517 new Field("TABLE_SCHEM", "TABLE_SCHEM", 10, Types.VARCHAR, "VARCHAR",
00518 "String"),
00519 new Field("TABLE_NAME", "TABLE_NAME", 10, Types.VARCHAR, "VARCHAR",
00520 "String"),
00521 new Field("GRANTOR", "GRANTOR", 10, Types.VARCHAR, "VARCHAR", "String"),
00522 new Field("GRANTEE", "GRANTEE", 10, Types.VARCHAR, "VARCHAR", "String"),
00523 new Field("PRIVILEGE", "PRIVILEGE", 10, Types.VARCHAR, "VARCHAR",
00524 "String"),
00525 new Field("IS_GRANTABLE", "IS_GRANTABLE", 10, Types.VARCHAR, "VARCHAR",
00526 "String"), };
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537 private static Field[] getProceduresFields = new Field[]{
00538 new Field("PROCEDURE_CAT", "PROCEDURE_CAT", 9, Types.VARCHAR, "VARCHAR",
00539 "String"),
00540 new Field("PROCEDURE_SCHEM", "PROCEDURE_SCHEM", 10, Types.VARCHAR,
00541 "VARCHAR", "String"),
00542 new Field("PROCEDURE_NAME", "PROCEDURE_NAME", 10, Types.VARCHAR,
00543 "VARCHAR", "String"),
00544 new Field("", "", 0, Types.VARCHAR, "VARCHAR", "String"),
00545 new Field("", "", 0, Types.VARCHAR, "VARCHAR", "String"),
00546 new Field("", "", 0, Types.VARCHAR, "VARCHAR", "String"),
00547 new Field("REMARKS", "REMARKS", 10, Types.VARCHAR, "VARCHAR", "String"),
00548 new Field("PROCEDURE_TYPE", "PROCEDURE_TYPE", 10, Types.SMALLINT,
00549 "SMALLINT", "Short") };
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560 private static Field[] getPrimaryKeysFields = new Field[]{
00561 new Field("TABLE_CAT", "TABLE_CAT", 9, Types.VARCHAR, "VARCHAR", "String"),
00562 new Field("TABLE_SCHEM", "TABLE_SCHEM", 10, Types.VARCHAR, "VARCHAR",
00563 "String"),
00564 new Field("TABLE_NAME", "TABLE_NAME", 10, Types.VARCHAR, "VARCHAR",
00565 "String"),
00566 new Field("COLUMN_NAME", "COLUMN_NAME", 10, Types.VARCHAR, "VARCHAR",
00567 "String"),
00568 new Field("KEY_SEQ", "KEY_SEQ", 10, Types.SMALLINT, "SMALLINT", "Short"),
00569 new Field("PK_NAME", "PK_NAME", 10, Types.VARCHAR, "VARCHAR", "String")};
00570
00571
00572 private static Field[] getColumnsFields = new Field[]{
00573 new Field("TABLE_CAT", "TABLE_CAT", 9, Types.VARCHAR, "VARCHAR", "String"),
00574 new Field("TABLE_SCHEM", "TABLE_SCHEM", 10, Types.VARCHAR, "VARCHAR",
00575 "String"),
00576 new Field("TABLE_NAME", "TABLE_NAME", 10, Types.VARCHAR, "VARCHAR",
00577 "String"),
00578 new Field("COLUMN_NAME", "COLUMN_NAME", 10, Types.VARCHAR, "VARCHAR",
00579 "String"),
00580 new Field("DATA_TYPE", "DATA_TYPE", 10, Types.SMALLINT, "SMALLINT",
00581 "Short"),
00582 new Field("TYPE_NAME", "TYPE_NAME", 10, Types.VARCHAR, "VARCHAR",
00583 "String"),
00584 new Field("COLUMN_SIZE", "COLUMN_SIZE", 10, Types.INTEGER, "INTEGER",
00585 "Integer"),
00586 new Field("BUFFER_LENGTH", "BUFFER_LENGTH", 10, Types.INTEGER, "INTEGER",
00587 "Integer"),
00588 new Field("DECIMAL_DIGITS", "DECIMAL_DIGITS", 10, Types.INTEGER,
00589 "INTEGER", "Integer"),
00590 new Field("NUM_PREC_RADIX", "NUM_PREC_RADIX", 10, Types.INTEGER,
00591 "INTEGER", "Integer"),
00592 new Field("NULLABLE", "NULLABLE", 10, Types.INTEGER, "INTEGER", "Integer"),
00593 new Field("REMARKS", "REMARKS", 10, Types.VARCHAR, "VARCHAR", "String"),
00594 new Field("COLUMN_DEF", "COLUMN_DEF", 10, Types.VARCHAR, "VARCHAR",
00595 "String"),
00596 new Field("SQL_DATA_TYPE", "SQL_DATA_TYPE", 10, Types.INTEGER, "INTEGER",
00597 "Integer"),
00598 new Field("SQL_DATETIME_SUB", "SQL_DATETIME_SUB", 10, Types.INTEGER,
00599 "INTEGER", "Integer"),
00600 new Field("CHAR_OCTET_LENGTH", "CHAR_OCTET_LENGTH", 10, Types.INTEGER,
00601 "INTEGER", "Integer"),
00602 new Field("ORDINAL_POSITION", "ORDINAL_POSITION", 10, Types.INTEGER,
00603 "INTEGER", "Integer"),
00604 new Field("IS_NULLABLE", "IS_NULLABLE", 10, Types.VARCHAR, "VARCHAR",
00605 "String") };
00606
00607
00608 private static Field[] getTablesFields = new Field[]{
00609 new Field("TABLE_CAT", "TABLE_CAT", 9, Types.VARCHAR, "VARCHAR", "String"),
00610 new Field("TABLE_SCHEM", "TABLE_SCHEM", 10, Types.VARCHAR, "VARCHAR",
00611 "String"),
00612 new Field("TABLE_NAME", "TABLE_NAME", 10, Types.VARCHAR, "VARCHAR",
00613 "String"),
00614 new Field("TABLE_TYPE", "TABLE_TYPE", 10, Types.VARCHAR, "VARCHAR",
00615 "String"),
00616 new Field("REMARKS", "REMARKS", 10, Types.VARCHAR, "VARCHAR", "String"),
00617 new Field("TYPE_CAT", "TYPE_CAT", 10, Types.VARCHAR, "VARCHAR", "String"),
00618 new Field("TYPE_SCHEM", "TYPE_SCHEM", 10, Types.VARCHAR, "VARCHAR",
00619 "String"),
00620 new Field("TYPE_NAME", "TYPE_NAME", 10, Types.VARCHAR, "VARCHAR",
00621 "String"),
00622 new Field("SELF_REFERENCING_COL_NAME", "SELF_REFERENCING_COL_NAME", 25,
00623 Types.VARCHAR, "VARCHAR", "String"),
00624 new Field("REF_GENERATION", "REF_GENERATION", 15, Types.VARCHAR,
00625 "VARCHAR", "String") };
00626
00627 }