00001
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
00051 public class VirtualDatabaseMetaData
00052 {
00053
00055 public static final int NULL_VALUE = -999;
00056
00057 private String
vdbName;
00058 private RequestManager
requestManager;
00059
00061 private Trace
logger = null;
00062
00069 public VirtualDatabaseMetaData(
VirtualDatabase database)
00070 {
00071
this.vdbName = database.
getName();
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
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
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
if (columnNamePattern == null)
00169 columnNamePattern =
"%";
00170
00171
00172 ArrayList tables = dbs.
getTables();
00173
int size = tables.size();
00174 ArrayList data =
new ArrayList();
00175
00176
for (
int i = 0; i < size; i++)
00177 {
00178
DatabaseTable t = (
DatabaseTable) tables.get(i);
00179
00180
if (tableNamePattern.equals(
"%") || tableNamePattern.equals(t.
getName()))
00181 {
00182
if (
logger.isDebugEnabled())
00183
logger.debug(
"Found table " + t.
getName());
00184 ArrayList columns = t.
getColumns();
00185
for (
int j = 0; j < columns.size(); j++)
00186 {
00187
DatabaseColumn c = (
DatabaseColumn) columns.get(j);
00188
if (columnNamePattern.equals(
"%")
00189 || columnNamePattern.equals(c.
getName()))
00190 {
00191
if (
logger.isDebugEnabled())
00192
logger.debug(
"Found column " + c.
getName());
00193 Object[] row =
new Object[18];
00194 row[0] =
vdbName;
00195 row[1] = null;
00196 row[2] = t.
getName();
00197 row[3] = c.
getName();
00198 row[4] =
new Integer(c.
getType());
00199 row[5] = null;
00200 row[6] = null;
00201 row[7] = null;
00202 row[8] = null;
00203 row[9] = null;
00204 row[10] = null;
00205 row[11] = null;
00206 row[12] = null;
00207 row[13] = null;
00208 row[14] = null;
00209 row[15] = null;
00210 row[16] = null;
00211 row[17] =
"";
00212 data.add(row);
00213 }
00214 }
00215 }
00216 }
00217
DriverResultSet rs =
new DriverResultSet(
getColumnsFields, data);
00218
return rs;
00219 }
00220
00227 public Object
getSchemas()
00228 {
00229 ArrayList data =
new ArrayList();
00230
DriverResultSet rs =
new DriverResultSet(
getSchemasFields, data);
00231
return rs;
00232 }
00233
00238 public DriverResultSet getTables(String catalog, String schemaPattern,
00239 String tableNamePattern, String[] types)
00240 {
00241
DatabaseSchema dbs =
this.getDatabaseSchema();
00242
if (dbs == null)
00243
return null;
00244
00245
if (tableNamePattern == null)
00246
00247 tableNamePattern =
"%";
00248
00249
00250 ArrayList tables = dbs.
getTables();
00251
int size = tables.size();
00252 ArrayList data =
new ArrayList();
00253
for (
int i = 0; i < size; i++)
00254 {
00255
DatabaseTable t = (
DatabaseTable) tables.get(i);
00256
if (tableNamePattern.equals(
"%") || t.
getName().indexOf(tableNamePattern)!=-1)
00257 {
00258
if (
logger.isDebugEnabled())
00259
logger.debug(
"Found table " + t.
getName());
00260 Object[] row =
new Object[10];
00261 row[0] =
vdbName;
00262 row[1] = null;
00263 row[2] = t.
getName();
00264 row[3] =
"TABLE";
00265 row[4] = null;
00266 row[5] = null;
00267 row[6] = null;
00268 row[7] = null;
00269 row[8] = null;
00270 row[9] =
"SYSTEM";
00271 data.add(row);
00272 }
00273 }
00274
DriverResultSet rs =
new DriverResultSet(
getTablesFields, data);
00275
return rs;
00276 }
00277
00281 public DriverResultSet getProcedures(String catalog, String schemaPattern,
00282 String procedureNamePattern)
00283 {
00284
DatabaseSchema dbs =
this.getDatabaseSchema();
00285
if (dbs == null)
00286
return null;
00287
00288
if (procedureNamePattern == null)
00289 procedureNamePattern =
"%";
00290
00291
00292
00293 ArrayList procedures = dbs.
getProcedures();
00294
int size = procedures.size();
00295 ArrayList data =
new ArrayList();
00296
for (
int i = 0; i < size; i++)
00297 {
00298
DatabaseProcedure t = (
DatabaseProcedure) procedures.get(i);
00299
if (procedureNamePattern.equals(
"%")
00300 || procedureNamePattern.equals(t.
getName()))
00301 {
00302
if (
logger.isDebugEnabled())
00303
logger.debug(
"Found procedure " + t.
getName());
00304 Object[] row =
new Object[8];
00305 row[0] =
vdbName;
00306 row[1] = null;
00307 row[2] = t.
getName();
00308 row[3] = null;
00309 row[4] = null;
00310 row[5] = null;
00311 row[6] = t.
getRemarks();
00312 row[7] =
new Integer(t.
getProcedureType());
00313 data.add(row);
00314 }
00315 }
00316
DriverResultSet rs =
new DriverResultSet(
getProceduresFields, data);
00317
return rs;
00318 }
00319
00326 public DriverResultSet getCatalogs(ArrayList list)
00327 {
00328
int size = list.size();
00329 ArrayList data =
new ArrayList(size);
00330
for (
int i = 0; i < size; i++)
00331 {
00332 Object[] row =
new Object[1];
00333 row[0] = (String) list.get(i);
00334 data.add(row);
00335 }
00336
DriverResultSet rs =
new DriverResultSet(
getCatalogsFields, data);
00337
return rs;
00338 }
00339
00343 public DriverResultSet getTableTypes()
00344 {
00345 ArrayList list =
new ArrayList(1);
00346 Object[] row =
new Object[1];
00347 row[0] =
"TABLE";
00348 list.add(row);
00349
DriverResultSet rs =
new DriverResultSet(
getTableTypesFields, list);
00350
return rs;
00351 }
00352
00356 public DriverResultSet getTablePrivileges(String catalog,
00357 String schemaPattern, String tableNamePattern)
00358 {
00359
AuthenticationManager manager =
requestManager.getVirtualDatabase()
00360 .getAuthenticationManager();
00361
DatabaseSchema dbs =
this.getDatabaseSchema();
00362
if (dbs == null)
00363
return null;
00364
00365
if (tableNamePattern == null)
00366
00367 tableNamePattern =
"%";
00368
00369 ArrayList tables = dbs.
getTables();
00370
int size = tables.size();
00371 ArrayList data =
new ArrayList();
00372
00373 ArrayList virtualLogins = manager.
getVirtualLogins();
00374
int vsize = virtualLogins.size();
00375
VirtualDatabaseUser vu;
00376
00377
for (
int i = 0; i < size; i++)
00378 {
00379
DatabaseTable t = (
DatabaseTable) tables.get(i);
00380
if (tableNamePattern.equals(
"%") || tableNamePattern.equals(t.
getName()))
00381 {
00382
for (
int j = 0; j < vsize; j++)
00383 {
00384 vu = (
VirtualDatabaseUser) virtualLogins.get(0);
00385
00386
if (
logger.isDebugEnabled())
00387
logger.debug(
"Found privilege for user:" + vu.
getLogin()
00388 +
" on table:" + t.
getName());
00389 Object[] row =
new Object[7];
00390 row[0] =
vdbName;
00391 row[1] = null;
00392 row[2] = t.
getName();
00393 row[3] = null;
00394 row[4] = vu.
getLogin();
00395 row[5] =
"UPDATE";
00396 row[6] =
"NO";
00397 data.add(row);
00398 }
00399 }
00400 }
00401
00402
DriverResultSet rs =
new DriverResultSet(
getTablePrivilegesFields, data);
00403
return rs;
00404 }
00405
00409 public DriverResultSet getProcedureColumns(String catalog,
00410 String schemaPattern, String procedureNamePattern,
00411 String columnNamePattern)
00412 {
00413
DatabaseSchema dbs =
this.getDatabaseSchema();
00414
if (dbs == null)
00415
return null;
00416
00417
if (procedureNamePattern == null)
00418 procedureNamePattern =
"%";
00419
00420
if (columnNamePattern == null)
00421 columnNamePattern =
"%";
00422
00423
00424 ArrayList procedures = dbs.
getProcedures();
00425
int size = procedures.size();
00426 ArrayList data =
new ArrayList();
00427
for (
int i = 0; i < size; i++)
00428 {
00429
DatabaseProcedure t = (
DatabaseProcedure) procedures.get(i);
00430
if (procedureNamePattern.equals(
"%")
00431 || procedureNamePattern.equals(t.
getName()))
00432 {
00433
if (
logger.isDebugEnabled())
00434
logger.debug(
"Found matching procedure " + t.
getName());
00435
00436 ArrayList params = t.
getParameters();
00437
int sizep = params.size();
00438
DatabaseProcedureParameter param;
00439
for (
int k = 0; k < sizep; k++)
00440 {
00441 param = (
DatabaseProcedureParameter) params.get(k);
00442
if (columnNamePattern.equals(
"%")
00443 || columnNamePattern.equals(t.
getName()))
00444 {
00445
if (
logger.isDebugEnabled())
00446
logger.debug(
"Found matching procedure parameter"
00447 + param.
getName());
00448
00449 Object[] row =
new Object[13];
00450 row[0] =
vdbName;
00451 row[1] = null;
00452 row[2] = t.
getName();
00453 row[3] = param.
getName();
00454 row[4] =
new Integer(param.
getColumnType());
00455 row[5] =
new Integer(param.
getDataType());
00456 row[6] = param.
getTypeName();
00457 row[7] =
new Float(param.
getPrecision());
00458 row[8] =
new Integer(param.
getLength());
00459 row[9] =
new Integer(param.
getScale());
00460 row[10] =
new Integer(param.
getRadix());
00461 row[11] =
new Integer(param.
getNullable());
00462 row[12] = param.
getRemarks();
00463
00464 data.add(row);
00465 }
00466 }
00467 }
00468 }
00469
DriverResultSet rs =
new DriverResultSet(
getProcedureColumnsFields, data);
00470
return rs;
00471 }
00472
00473 private static Field[]
getSchemasFields =
new Field[]{
new Field(
00474
"TABLE_SCHEM",
00475
"TABLE_SCHEM", 9,
00476 Types.VARCHAR,
00477
"VARCHAR",
"String")};
00478
00479 private static Field[]
getProcedureColumnsFields =
new Field[]{
00480
new Field(
"PROCEDURE_CAT",
"PROCEDURE_CAT", 9, Types.VARCHAR,
"VARCHAR",
00481
"String"),
00482
new Field(
"PROCEDURE_SCHEM",
"PROCEDURE_SCHEM", 10, Types.VARCHAR,
00483
"VARCHAR",
"String"),
00484
new Field(
"PROCEDURE_NAME",
"PROCEDURE_NAME", 10, Types.VARCHAR,
00485
"VARCHAR",
"String"),
00486
new Field(
"COLUMN_NAME",
"COLUMN_NAME", 10, Types.VARCHAR,
"VARCHAR",
00487
"String"),
00488
new Field(
"COLUMN_TYPE",
"COLUMN_TYPE", 10, Types.SMALLINT,
"SMALLINT",
00489
"Short"),
00490
new Field(
"DATA_TYPE",
"DATA_TYPE", 10, Types.SMALLINT,
"SMALLINT",
00491
"Short"),
00492
new Field(
"TYPE_NAME",
"TYPE_NAME", 10, Types.VARCHAR,
"VARCHAR",
00493
"String"),
00494
new Field(
"PRECISION",
"PRECISION", 10, Types.FLOAT,
"FLOAT",
"Float"),
00495
new Field(
"LENGTH",
"LENGTH", 10, Types.INTEGER,
"INTEGER",
"Integer"),
00496
new Field(
"SCALE",
"SCALE", 10, Types.SMALLINT,
"SMALLINT",
"Short"),
00497
new Field(
"RADIX",
"RADIX", 10, Types.SMALLINT,
"SMALLINT",
"Short"),
00498
new Field(
"NULLABLE",
"NULLABLE", 10, Types.SMALLINT,
"SMALLINT",
"Short"),
00499
new Field(
"REMARKS",
"REMARKS", 10, Types.VARCHAR,
"VARCHAR",
"String")};
00500
00501 private static Field[]
getCatalogsFields =
new Field[]{
new Field(
00502
"TABLE_CAT",
00503
"TABLE_CAT", 9,
00504 Types.VARCHAR,
00505
"VARCHAR",
"String")};
00506
00507 private static Field[]
getTableTypesFields =
new Field[]{
new Field(
00508
"TABLE_TYPE",
00509
"TABLE_TYPE", 9,
00510 Types.VARCHAR,
00511
"VARCHAR",
"String")};
00512
00513 private static Field[]
getTablePrivilegesFields =
new Field[]{
00514
new Field(
"TABLE_CAT",
"TABLE_CAT", 9, Types.VARCHAR,
"VARCHAR",
"String"),
00515
new Field(
"TABLE_SCHEM",
"TABLE_SCHEM", 10, Types.VARCHAR,
"VARCHAR",
00516
"String"),
00517
new Field(
"TABLE_NAME",
"TABLE_NAME", 10, Types.VARCHAR,
"VARCHAR",
00518
"String"),
00519
new Field(
"GRANTOR",
"GRANTOR", 10, Types.VARCHAR,
"VARCHAR",
"String"),
00520
new Field(
"GRANTEE",
"GRANTEE", 10, Types.VARCHAR,
"VARCHAR",
"String"),
00521
new Field(
"PRIVILEGE",
"PRIVILEGE", 10, Types.VARCHAR,
"VARCHAR",
00522
"String"),
00523
new Field(
"IS_GRANTABLE",
"IS_GRANTABLE", 10, Types.VARCHAR,
"VARCHAR",
00524
"String"), };
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535 private static Field[]
getProceduresFields =
new Field[]{
00536
new Field(
"PROCEDURE_CAT",
"PROCEDURE_CAT", 9, Types.VARCHAR,
"VARCHAR",
00537
"String"),
00538
new Field(
"PROCEDURE_SCHEM",
"PROCEDURE_SCHEM", 10, Types.VARCHAR,
00539
"VARCHAR",
"String"),
00540
new Field(
"PROCEDURE_NAME",
"PROCEDURE_NAME", 10, Types.VARCHAR,
00541
"VARCHAR",
"String"),
00542
new Field(
"",
"", 0, Types.VARCHAR,
"VARCHAR",
"String"),
00543
new Field(
"",
"", 0, Types.VARCHAR,
"VARCHAR",
"String"),
00544
new Field(
"",
"", 0, Types.VARCHAR,
"VARCHAR",
"String"),
00545
new Field(
"REMARKS",
"REMARKS", 10, Types.VARCHAR,
"VARCHAR",
"String"),
00546
new Field(
"PROCEDURE_TYPE",
"PROCEDURE_TYPE", 10, Types.SMALLINT,
00547
"SMALLINT",
"Short") };
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558 private static Field[]
getPrimaryKeysFields =
new Field[]{
00559
new Field(
"TABLE_CAT",
"TABLE_CAT", 9, Types.VARCHAR,
"VARCHAR",
"String"),
00560
new Field(
"TABLE_SCHEM",
"TABLE_SCHEM", 10, Types.VARCHAR,
"VARCHAR",
00561
"String"),
00562
new Field(
"TABLE_NAME",
"TABLE_NAME", 10, Types.VARCHAR,
"VARCHAR",
00563
"String"),
00564
new Field(
"COLUMN_NAME",
"COLUMN_NAME", 10, Types.VARCHAR,
"VARCHAR",
00565
"String"),
00566
new Field(
"KEY_SEQ",
"KEY_SEQ", 10, Types.SMALLINT,
"SMALLINT",
"Short"),
00567
new Field(
"PK_NAME",
"PK_NAME", 10, Types.VARCHAR,
"VARCHAR",
"String")};
00568
00570 private static Field[]
getColumnsFields =
new Field[]{
00571
new Field(
"TABLE_CAT",
"TABLE_CAT", 9, Types.VARCHAR,
"VARCHAR",
"String"),
00572
new Field(
"TABLE_SCHEM",
"TABLE_SCHEM", 10, Types.VARCHAR,
"VARCHAR",
00573
"String"),
00574
new Field(
"TABLE_NAME",
"TABLE_NAME", 10, Types.VARCHAR,
"VARCHAR",
00575
"String"),
00576
new Field(
"COLUMN_NAME",
"COLUMN_NAME", 10, Types.VARCHAR,
"VARCHAR",
00577
"String"),
00578
new Field(
"DATA_TYPE",
"DATA_TYPE", 10, Types.SMALLINT,
"SMALLINT",
00579
"Short"),
00580
new Field(
"TYPE_NAME",
"TYPE_NAME", 10, Types.VARCHAR,
"VARCHAR",
00581
"String"),
00582
new Field(
"COLUMN_SIZE",
"COLUMN_SIZE", 10, Types.INTEGER,
"INTEGER",
00583
"Integer"),
00584
new Field(
"BUFFER_LENGTH",
"BUFFER_LENGTH", 10, Types.INTEGER,
"INTEGER",
00585
"Integer"),
00586
new Field(
"DECIMAL_DIGITS",
"DECIMAL_DIGITS", 10, Types.INTEGER,
00587
"INTEGER",
"Integer"),
00588
new Field(
"NUM_PREC_RADIX",
"NUM_PREC_RADIX", 10, Types.INTEGER,
00589
"INTEGER",
"Integer"),
00590
new Field(
"NULLABLE",
"NULLABLE", 10, Types.INTEGER,
"INTEGER",
"Integer"),
00591
new Field(
"REMARKS",
"REMARKS", 10, Types.VARCHAR,
"VARCHAR",
"String"),
00592
new Field(
"COLUMN_DEF",
"COLUMN_DEF", 10, Types.VARCHAR,
"VARCHAR",
00593
"String"),
00594
new Field(
"SQL_DATA_TYPE",
"SQL_DATA_TYPE", 10, Types.INTEGER,
"INTEGER",
00595
"Integer"),
00596
new Field(
"SQL_DATETIME_SUB",
"SQL_DATETIME_SUB", 10, Types.INTEGER,
00597
"INTEGER",
"Integer"),
00598
new Field(
"CHAR_OCTET_LENGTH",
"CHAR_OCTET_LENGTH", 10, Types.INTEGER,
00599
"INTEGER",
"Integer"),
00600
new Field(
"ORDINAL_POSITION",
"ORDINAL_POSITION", 10, Types.INTEGER,
00601
"INTEGER",
"Integer"),
00602
new Field(
"IS_NULLABLE",
"IS_NULLABLE", 10, Types.VARCHAR,
"VARCHAR",
00603
"String") };
00604
00606 private static Field[]
getTablesFields =
new Field[]{
00607
new Field(
"TABLE_CAT",
"TABLE_CAT", 9, Types.VARCHAR,
"VARCHAR",
"String"),
00608
new Field(
"TABLE_SCHEM",
"TABLE_SCHEM", 10, Types.VARCHAR,
"VARCHAR",
00609
"String"),
00610
new Field(
"TABLE_NAME",
"TABLE_NAME", 10, Types.VARCHAR,
"VARCHAR",
00611
"String"),
00612
new Field(
"TABLE_TYPE",
"TABLE_TYPE", 10, Types.VARCHAR,
"VARCHAR",
00613
"String"),
00614
new Field(
"REMARKS",
"REMARKS", 10, Types.VARCHAR,
"VARCHAR",
"String"),
00615
new Field(
"TYPE_CAT",
"TYPE_CAT", 10, Types.VARCHAR,
"VARCHAR",
"String"),
00616
new Field(
"TYPE_SCHEM",
"TYPE_SCHEM", 10, Types.VARCHAR,
"VARCHAR",
00617
"String"),
00618
new Field(
"TYPE_NAME",
"TYPE_NAME", 10, Types.VARCHAR,
"VARCHAR",
00619
"String"),
00620
new Field(
"SELF_REFERENCING_COL_NAME",
"SELF_REFERENCING_COL_NAME", 25,
00621 Types.VARCHAR,
"VARCHAR",
"String"),
00622
new Field(
"REF_GENERATION",
"REF_GENERATION", 15, Types.VARCHAR,
00623
"VARCHAR",
"String") };
00624
00625 }