KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sf > hajdbc > dialect > DefaultDialect


1 /*
2  * HA-JDBC: High-Availability JDBC
3  * Copyright (c) 2004-2006 Paul Ferraro
4  *
5  * This library is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU Lesser General Public License as published by the
7  * Free Software Foundation; either version 2.1 of the License, or (at your
8  * option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
13  * for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with this library; if not, write to the Free Software Foundation,
17  * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  *
19  * Contact: ferraro@users.sourceforge.net
20  */

21 package net.sf.hajdbc.dialect;
22
23 import java.sql.DatabaseMetaData JavaDoc;
24 import java.sql.ResultSet JavaDoc;
25 import java.sql.ResultSetMetaData JavaDoc;
26 import java.sql.SQLException JavaDoc;
27 import java.text.MessageFormat JavaDoc;
28 import java.util.Iterator JavaDoc;
29 import java.util.LinkedList JavaDoc;
30 import java.util.List JavaDoc;
31 import java.util.regex.Pattern JavaDoc;
32
33 import net.sf.hajdbc.Dialect;
34 import net.sf.hajdbc.ForeignKeyConstraint;
35 import net.sf.hajdbc.UniqueConstraint;
36
37 /**
38  * @author Paul Ferraro
39  * @since 1.1
40  */

41 public class DefaultDialect implements Dialect
42 {
43     private Pattern JavaDoc selectForUpdatePattern = Pattern.compile(this.selectForUpdatePattern(), Pattern.CASE_INSENSITIVE);
44
45     /**
46      * @see net.sf.hajdbc.Dialect#getSimpleSQL()
47      */

48     public String JavaDoc getSimpleSQL()
49     {
50         return "SELECT 1";
51     }
52
53     /**
54      * @see net.sf.hajdbc.Dialect#getLockTableSQL(java.sql.DatabaseMetaData, java.lang.String, java.lang.String)
55      */

56     public String JavaDoc getLockTableSQL(DatabaseMetaData JavaDoc metaData, String JavaDoc schema, String JavaDoc table) throws SQLException JavaDoc
57     {
58         StringBuilder JavaDoc builder = new StringBuilder JavaDoc("UPDATE ").append(this.qualifyTable(metaData, schema, table)).append(" SET ");
59         
60         List JavaDoc<String JavaDoc> columnList = new LinkedList JavaDoc<String JavaDoc>();
61         
62         ResultSet JavaDoc 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 table contains no primary keys, use all columns in table instead
72
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 JavaDoc<String JavaDoc> columns = columnList.iterator();
85         
86         while (columns.hasNext())
87         {
88             String JavaDoc 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     /**
102      * @see net.sf.hajdbc.Dialect#getTruncateTableSQL(java.sql.DatabaseMetaData, java.lang.String, java.lang.String)
103      */

104     public String JavaDoc getTruncateTableSQL(DatabaseMetaData JavaDoc metaData, String JavaDoc schema, String JavaDoc table) throws SQLException JavaDoc
105     {
106         return MessageFormat.format(this.truncateTablePattern(), this.qualifyTable(metaData, schema, table));
107     }
108     
109     /**
110      * @see net.sf.hajdbc.Dialect#qualifyTable(java.sql.DatabaseMetaData, java.lang.String, java.lang.String)
111      */

112     public String JavaDoc qualifyTable(DatabaseMetaData JavaDoc metaData, String JavaDoc schema, String JavaDoc table) throws SQLException JavaDoc
113     {
114         StringBuilder JavaDoc builder = new StringBuilder JavaDoc();
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     /**
125      * @see net.sf.hajdbc.Dialect#quote(java.sql.DatabaseMetaData, java.lang.String)
126      */

127     public String JavaDoc quote(DatabaseMetaData JavaDoc metaData, String JavaDoc identifier) throws SQLException JavaDoc
128     {
129         String JavaDoc quote = metaData.getIdentifierQuoteString();
130         
131         return identifier.startsWith(quote) ? identifier : quote + identifier + quote;
132     }
133     
134     /**
135      * @see net.sf.hajdbc.Dialect#getCreateForeignKeyConstraintSQL(java.sql.DatabaseMetaData, net.sf.hajdbc.ForeignKeyConstraint)
136      */

137     public String JavaDoc getCreateForeignKeyConstraintSQL(DatabaseMetaData JavaDoc metaData, ForeignKeyConstraint key) throws SQLException JavaDoc
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     /**
143      * @see net.sf.hajdbc.Dialect#getDropForeignKeyConstraintSQL(java.sql.DatabaseMetaData, net.sf.hajdbc.ForeignKeyConstraint)
144      */

145     public String JavaDoc getDropForeignKeyConstraintSQL(DatabaseMetaData JavaDoc metaData, ForeignKeyConstraint key) throws SQLException JavaDoc
146     {
147         return MessageFormat.format(this.dropForeignKeyPattern(), this.quote(metaData, key.getName()), this.qualifyTable(metaData, key.getSchema(), key.getTable()));
148     }
149     
150     /**
151      * @see net.sf.hajdbc.Dialect#getCreateUniqueConstraintSQL(java.sql.DatabaseMetaData, net.sf.hajdbc.UniqueConstraint)
152      */

153     public String JavaDoc getCreateUniqueConstraintSQL(DatabaseMetaData JavaDoc metaData, UniqueConstraint constraint) throws SQLException JavaDoc
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     /**
159      * @see net.sf.hajdbc.Dialect#getDropUniqueConstraintSQL(java.sql.DatabaseMetaData, net.sf.hajdbc.UniqueConstraint)
160      */

161     public String JavaDoc getDropUniqueConstraintSQL(DatabaseMetaData JavaDoc metaData, UniqueConstraint constraint) throws SQLException JavaDoc
162     {
163         return MessageFormat.format(this.dropUniqueKeyPattern(), this.quote(metaData, constraint.getName()), this.qualifyTable(metaData, constraint.getSchema(), constraint.getTable()));
164     }
165
166     /**
167      * @see net.sf.hajdbc.Dialect#isSelectForUpdate(java.sql.DatabaseMetaData, java.lang.String)
168      */

169     public boolean isSelectForUpdate(DatabaseMetaData JavaDoc metaData, String JavaDoc sql) throws SQLException JavaDoc
170     {
171         return metaData.supportsSelectForUpdate() ? this.selectForUpdatePattern.matcher(sql).find() : false;
172     }
173     
174     /**
175      * @see net.sf.hajdbc.Dialect#getColumnType(java.sql.ResultSetMetaData, int)
176      */

177     public int getColumnType(ResultSetMetaData JavaDoc metaData, int column) throws SQLException JavaDoc
178     {
179         return metaData.getColumnType(column);
180     }
181
182     protected String JavaDoc joinColumns(DatabaseMetaData JavaDoc metaData, List JavaDoc<String JavaDoc> columnList) throws SQLException JavaDoc
183     {
184         StringBuilder JavaDoc builder = new StringBuilder JavaDoc();
185
186         Iterator JavaDoc<String JavaDoc> 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     /**
202      * SQL-92 compatible DELETE statement
203      * @return a <code>java.text.MessageFormat</code> pattern.
204      */

205     protected String JavaDoc truncateTablePattern()
206     {
207         return "DELETE FROM {0}";
208     }
209     
210     /**
211      * Returns a SQL-92 compatible create foreign key constraint statement pattern.
212      * @return a <code>java.text.MessageFormat</code> pattern.
213      */

214     protected String JavaDoc 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     /**
220      * Returns a SQL-92 compatible create unique constraint statement pattern.
221      * @return a <code>java.text.MessageFormat</code> pattern.
222      */

223     protected String JavaDoc createUniqueKeyPattern()
224     {
225         return "ALTER TABLE {1} ADD CONSTRAINT {0} UNIQUE ({2})";
226     }
227     
228     /**
229      * Returns a SQL-92 compatible DROP CONSTRAINT statement pattern.
230      * @return a <code>java.text.MessageFormat</code> pattern.
231      */

232     protected String JavaDoc dropForeignKeyPattern()
233     {
234         return this.dropConstraintPattern();
235     }
236     
237     /**
238      * Returns a SQL-92 compatible DROP CONSTRAINT statement pattern.
239      * @return a <code>java.text.MessageFormat</code> pattern.
240      */

241     protected String JavaDoc dropUniqueKeyPattern()
242     {
243         return this.dropConstraintPattern();
244     }
245     
246     /**
247      * Returns a SQL-92 compatible DROP CONSTRAINT statement pattern.
248      * @return a <code>java.text.MessageFormat</code> pattern.
249      */

250     protected String JavaDoc dropConstraintPattern()
251     {
252         return "ALTER TABLE {1} DROP CONSTRAINT {0}";
253     }
254     
255     /**
256      * Returns a SQL-92 compatible SELECT...FOR UPDATE statement pattern.
257      * @return a regular expression pattern.
258      */

259     protected String JavaDoc selectForUpdatePattern()
260     {
261         return "SELECT\\s+.+\\s+FOR\\s+UPDATE";
262     }
263 }
264
Popular Tags