1 21 package net.sf.hajdbc.dialect; 22 23 import java.sql.DatabaseMetaData ; 24 import java.sql.ResultSet ; 25 import java.sql.ResultSetMetaData ; 26 import java.sql.SQLException ; 27 import java.text.MessageFormat ; 28 import java.util.Iterator ; 29 import java.util.LinkedList ; 30 import java.util.List ; 31 import java.util.regex.Pattern ; 32 33 import net.sf.hajdbc.Dialect; 34 import net.sf.hajdbc.ForeignKeyConstraint; 35 import net.sf.hajdbc.UniqueConstraint; 36 37 41 public class DefaultDialect implements Dialect 42 { 43 private Pattern selectForUpdatePattern = Pattern.compile(this.selectForUpdatePattern(), Pattern.CASE_INSENSITIVE); 44 45 48 public String getSimpleSQL() 49 { 50 return "SELECT 1"; 51 } 52 53 56 public String getLockTableSQL(DatabaseMetaData metaData, String schema, String table) throws SQLException 57 { 58 StringBuilder builder = new StringBuilder ("UPDATE ").append(this.qualifyTable(metaData, schema, table)).append(" SET "); 59 60 List <String > columnList = new LinkedList <String >(); 61 62 ResultSet resultSet = metaData.getPrimaryKeys(null, schema, table); 63 64 while (resultSet.next()) 65 { 66 columnList.add(resultSet.getString("COLUMN_NAME")); 67 } 68 69 resultSet.close(); 70 71 if (columnList.isEmpty()) 73 { 74 resultSet = metaData.getColumns(null, schema, table, "%"); 75 76 while (resultSet.next()) 77 { 78 columnList.add(resultSet.getString("COLUMN_NAME")); 79 } 80 81 resultSet.close(); 82 } 83 84 Iterator <String > columns = columnList.iterator(); 85 86 while (columns.hasNext()) 87 { 88 String column = this.quote(metaData, columns.next()); 89 90 builder.append(column).append('=').append(column); 91 92 if (columns.hasNext()) 93 { 94 builder.append(','); 95 } 96 } 97 98 return builder.toString(); 99 } 100 101 104 public String getTruncateTableSQL(DatabaseMetaData metaData, String schema, String table) throws SQLException 105 { 106 return MessageFormat.format(this.truncateTablePattern(), this.qualifyTable(metaData, schema, table)); 107 } 108 109 112 public String qualifyTable(DatabaseMetaData metaData, String schema, String table) throws SQLException 113 { 114 StringBuilder builder = new StringBuilder (); 115 116 if ((schema != null) && metaData.supportsSchemasInDataManipulation()) 117 { 118 builder.append(this.quote(metaData, schema)).append('.'); 119 } 120 121 return builder.append(this.quote(metaData, table)).toString(); 122 } 123 124 127 public String quote(DatabaseMetaData metaData, String identifier) throws SQLException 128 { 129 String quote = metaData.getIdentifierQuoteString(); 130 131 return identifier.startsWith(quote) ? identifier : quote + identifier + quote; 132 } 133 134 137 public String getCreateForeignKeyConstraintSQL(DatabaseMetaData metaData, ForeignKeyConstraint key) throws SQLException 138 { 139 return MessageFormat.format(this.createForeignKeyPattern(), this.quote(metaData, key.getName()), this.qualifyTable(metaData, key.getSchema(), key.getTable()), this.joinColumns(metaData, key.getColumnList()), this.qualifyTable(metaData, key.getForeignSchema(), key.getForeignTable()), this.joinColumns(metaData, key.getForeignColumnList()), key.getDeleteRule(), key.getUpdateRule(), key.getDeferrability()); 140 } 141 142 145 public String getDropForeignKeyConstraintSQL(DatabaseMetaData metaData, ForeignKeyConstraint key) throws SQLException 146 { 147 return MessageFormat.format(this.dropForeignKeyPattern(), this.quote(metaData, key.getName()), this.qualifyTable(metaData, key.getSchema(), key.getTable())); 148 } 149 150 153 public String getCreateUniqueConstraintSQL(DatabaseMetaData metaData, UniqueConstraint constraint) throws SQLException 154 { 155 return MessageFormat.format(this.createUniqueKeyPattern(), this.quote(metaData, constraint.getName()), this.qualifyTable(metaData, constraint.getSchema(), constraint.getTable()), this.joinColumns(metaData, constraint.getColumnList())); 156 } 157 158 161 public String getDropUniqueConstraintSQL(DatabaseMetaData metaData, UniqueConstraint constraint) throws SQLException 162 { 163 return MessageFormat.format(this.dropUniqueKeyPattern(), this.quote(metaData, constraint.getName()), this.qualifyTable(metaData, constraint.getSchema(), constraint.getTable())); 164 } 165 166 169 public boolean isSelectForUpdate(DatabaseMetaData metaData, String sql) throws SQLException 170 { 171 return metaData.supportsSelectForUpdate() ? this.selectForUpdatePattern.matcher(sql).find() : false; 172 } 173 174 177 public int getColumnType(ResultSetMetaData metaData, int column) throws SQLException 178 { 179 return metaData.getColumnType(column); 180 } 181 182 protected String joinColumns(DatabaseMetaData metaData, List <String > columnList) throws SQLException 183 { 184 StringBuilder builder = new StringBuilder (); 185 186 Iterator <String > columns = columnList.iterator(); 187 188 while (columns.hasNext()) 189 { 190 builder.append(this.quote(metaData, columns.next())); 191 192 if (columns.hasNext()) 193 { 194 builder.append(','); 195 } 196 } 197 198 return builder.toString(); 199 } 200 201 205 protected String truncateTablePattern() 206 { 207 return "DELETE FROM {0}"; 208 } 209 210 214 protected String createForeignKeyPattern() 215 { 216 return "ALTER TABLE {1} ADD CONSTRAINT {0} FOREIGN KEY ({2}) REFERENCES {3} ({4}) ON DELETE {5,choice,0#CASCADE|1#RESTRICT|2#SET NULL|3#NO ACTION|4#SET DEFAULT} ON UPDATE {6,choice,0#CASCADE|1#RESTRICT|2#SET NULL|3#NO ACTION|4#SET DEFAULT} {7,choice,5#DEFERRABLE INITIALLY DEFERRED|6#DEFERRABLE INITIALLY IMMEDIATE|7#NOT DEFERRABLE}"; 217 } 218 219 223 protected String createUniqueKeyPattern() 224 { 225 return "ALTER TABLE {1} ADD CONSTRAINT {0} UNIQUE ({2})"; 226 } 227 228 232 protected String dropForeignKeyPattern() 233 { 234 return this.dropConstraintPattern(); 235 } 236 237 241 protected String dropUniqueKeyPattern() 242 { 243 return this.dropConstraintPattern(); 244 } 245 246 250 protected String dropConstraintPattern() 251 { 252 return "ALTER TABLE {1} DROP CONSTRAINT {0}"; 253 } 254 255 259 protected String selectForUpdatePattern() 260 { 261 return "SELECT\\s+.+\\s+FOR\\s+UPDATE"; 262 } 263 } 264 | Popular Tags |