1 33 package smallsql.database; 34 35 import java.io.*; 36 import java.sql.*; 37 38 39 class Column implements Cloneable { 40 41 private Expression defaultValue = Expression.NULL; private String defaultDefinition; private String name; 45 private boolean identity; 46 private boolean caseSensitive; 47 private boolean nullable = true; 48 private int scale; 49 private int precision; 50 private int dataType; 51 private Identity counter; 53 54 void setName( String name ){ 55 this.name = name; 56 } 57 58 59 void setDefaultValue(Expression defaultValue, String defaultDefinition){ 60 this.defaultValue = defaultValue; 61 this.defaultDefinition = defaultDefinition; 62 } 63 64 68 Expression getDefaultValue(SSConnection con) throws SQLException{ 69 if(identity) 70 counter.createNextValue(con); 71 return defaultValue; 72 } 73 74 String getDefaultDefinition(){ 75 return defaultDefinition; 76 } 77 78 String getName(){ 79 return name; 80 } 81 82 boolean isAutoIncrement(){ 83 return identity; 84 } 85 86 void setAutoIncrement(boolean identity){ 87 this.identity = identity; 88 } 89 90 int initAutoIncrement( Table table, RandomAccessFile raFile, long filePos) throws IOException{ 91 if(identity){ 92 counter = new Identity( table, raFile, filePos); 93 defaultValue = new ExpressionValue( counter, SQLTokenizer.BIGINT ); 94 } 95 return 8; 96 } 97 98 void setNewAutoIncrementValue(Expression obj) throws Exception { 99 if(identity){ 100 counter.setNextValue(obj); 101 } 102 } 103 104 boolean isCaseSensitive(){ 105 return caseSensitive; 106 } 107 108 void setNullable(boolean nullable){ 109 this.nullable = nullable; 110 } 111 112 boolean isNullable(){ 113 return nullable; 114 } 115 116 void setDataType(int dataType){ 117 this.dataType = dataType; 118 } 119 120 int getDataType(){ 121 return dataType; 122 } 123 124 125 int getDisplaySize(){ 126 return SSResultSetMetaData.getDisplaySize( dataType, precision, scale); 127 } 128 129 void setScale(int scale){ 130 this.scale = scale; 131 } 132 133 int getScale(){ 134 switch(dataType){ 135 case SQLTokenizer.DECIMAL: 136 case SQLTokenizer.NUMERIC: 137 return scale; 138 default: 139 return Expression.getScale(dataType); 140 } 141 } 142 143 void setPrecision(int precision) throws SQLException{ 144 if(precision<0) throw Utils.createSQLException("Invalid column size " + precision + " for column '"+name+"'"); 145 this.precision = precision; 146 } 147 148 int getPrecision(){ 149 return SSResultSetMetaData.getDataTypePrecision( dataType, precision ); 150 } 151 152 int getColumnSize(){ 153 if(SSResultSetMetaData.isNumberDataType(dataType)) 154 return getPrecision(); 155 else return getDisplaySize(); 156 } 157 158 159 int getFlag(){ 160 return (identity ? 1 : 0) | 161 (caseSensitive ? 2 : 0) | 162 (nullable ? 4 : 0); 163 } 164 165 166 void setFlag(int flag){ 167 identity = (flag & 1) > 0; 168 caseSensitive = (flag & 2) > 0; 169 nullable = (flag & 4) > 0; 170 } 171 172 173 Column copy(){ 174 try{ 175 return (Column)clone(); 176 }catch(Exception e){return null;} 177 178 } 179 } | Popular Tags |