1 package com.quadcap.sql.meta; 2 3 40 41 import java.io.IOException ; 42 43 import java.util.Iterator ; 44 45 import java.sql.DatabaseMetaData ; 46 import java.sql.ResultSetMetaData ; 47 import java.sql.SQLException ; 48 49 import com.quadcap.sql.Column; 50 import com.quadcap.sql.Constraint; 51 import com.quadcap.sql.Database; 52 import com.quadcap.sql.Expression; 53 import com.quadcap.sql.IndexConstraint; 54 import com.quadcap.sql.Relation; 55 import com.quadcap.sql.Row; 56 import com.quadcap.sql.Session; 57 import com.quadcap.sql.StaticCursor; 58 import com.quadcap.sql.Table; 59 60 import com.quadcap.sql.index.BCursor; 61 import com.quadcap.sql.index.Btree; 62 63 import com.quadcap.sql.types.*; 64 65 import com.quadcap.util.Debug; 66 67 72 public class MetaIndexInfo extends MetaCursor { 73 static Column[] cols = { 74 new Column("TABLE_CAT", typeString), new Column("TABLE_SCHEM", typeString), new Column("TABLE_NAME", typeString), new Column("NON_UNIQUE", typeBinary), new Column("INDEX_QUALIFIER", typeString), new Column("INDEX_NAME", typeString), new Column("TYPE", typeShort), new Column("ORDINAL_POSITION", typeInt), new Column("COLUMN_NAME", typeString), new Column("ASC_OR_DESC", typeString), new Column("CARDINALITY", typeInt), new Column("PAGES", typeInt), new Column("FILTER_CONDITION", typeString) }; 88 89 static int[] sortColumns = { 4, 7, 6, 8 }; 90 91 public MetaIndexInfo(Session session, Expression predicate) 92 throws SQLException 93 { 94 super(session, predicate); 95 try { 96 addColumns(cols); 97 Database db = session.getDatabase(); 98 session.getTableWriteLock("#Schema"); 99 synchronized (db.getFile().getLock()) { 100 Iterator iter = db.getRelationNameIterator(); 101 while (iter.hasNext()) { 102 String name = (String )iter.next(); 103 Relation r = db.getRelation(name); 104 if (r instanceof Table) { 105 Table t = (Table)r; 106 int num = t.getNumConstraints(); 107 for (int i = 0; i < num; i++) { 108 Constraint c = t.getConstraint(i); 109 if (c instanceof IndexConstraint) { 110 doConstraint(t, (IndexConstraint)c); 111 } 112 } 113 } 114 } 115 } 116 sort(); 117 } catch (ValueException e) { 118 Debug.print(e); 119 SQLException te = new SQLException (e.toString(), "Q000N"); 120 te.setNextException(e); 121 throw te; 122 } catch (IOException e) { 123 Debug.print(e); 124 throw new SQLException (e.toString(), "Q000O"); 125 } 126 } 127 128 public int[] getSortColumns() { 129 return sortColumns; 130 } 131 132 void doConstraint(Table t, IndexConstraint c) throws SQLException { 133 int[] colIndices = c.getColumns(); 134 for (int i = 0; i < colIndices.length; i++) { 135 Column col = t.getColumn(colIndices[i]); 136 Row row = doColumn(t, c, i, col); 137 if (rowMatch(row)) { 138 addRow(row); 139 } 140 } 141 } 142 143 Row doColumn(Table t, IndexConstraint c, int pos, Column col) 144 throws SQLException 145 { 146 Type type = col.getType(); 147 Row row = new Row(18); 148 row.set(1, ValueNull.valueNull); 149 doTableName(2, row, t.getName()); 150 row.set(4, (c.isUnique() ? 151 ValueBoolean.falseBoolean : 152 ValueBoolean.trueBoolean)); 153 if (c.isGlobal()) { 154 row.set(5, new ValueString("global")); 155 } else { 156 row.set(5, ValueNull.valueNull); 157 } 158 String iname = c.getName(); 159 if (iname == null) iname = ""; 160 row.set(6, new ValueString(iname)); 161 row.set(7, new ValueShort(DatabaseMetaData.tableIndexOther)); 162 row.set(8, new ValueShort(pos+1)); 163 row.set(9, new ValueString(col.getShortName())); 164 row.set(10, new ValueString("A")); 165 row.set(11, ValueNull.valueNull); 166 row.set(12, ValueNull.valueNull); 167 row.set(13, ValueNull.valueNull); 168 return row; 169 } 170 171 } 172 | Popular Tags |