PageRenderTime 52ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/s3blazeds-src/modules/core/test/src/macromedia/qa/metrics/AbstractDatabase.java

http://s3blazeds.googlecode.com/
Java | 581 lines | 357 code | 100 blank | 124 comment | 112 complexity | 7b432d673f03bdb0b2551a5ddae6e5f6 MD5 | raw file
Possible License(s): Apache-2.0, LGPL-2.1
  1. /*************************************************************************
  2. *
  3. * ADOBE CONFIDENTIAL
  4. * __________________
  5. *
  6. * Copyright 2008 Adobe Systems Incorporated
  7. * All Rights Reserved.
  8. *
  9. * NOTICE: All information contained herein is, and remains
  10. * the property of Adobe Systems Incorporated and its suppliers,
  11. * if any. The intellectual and technical concepts contained
  12. * herein are proprietary to Adobe Systems Incorporated
  13. * and its suppliers and may be covered by U.S. and Foreign Patents,
  14. * patents in process, and are protected by trade secret or copyright law.
  15. * Dissemination of this information or reproduction of this material
  16. * is strictly forbidden unless prior written permission is obtained
  17. * from Adobe Systems Incorporated.
  18. **************************************************************************/
  19. package macromedia.qa.metrics;
  20. import java.sql.PreparedStatement;
  21. import java.sql.Connection;
  22. import java.sql.SQLException;
  23. import java.sql.ResultSet;
  24. import java.util.Set;
  25. import java.util.Iterator;
  26. import java.util.Map;
  27. import java.util.Calendar;
  28. /**
  29. * Utility class that abstracts common SQL statements, namely
  30. * SELECT, INSERT, UPDATE and DELETE.
  31. *
  32. * All statements are created as PreparedStatement instances
  33. * to allow for convenient parameterization in statement
  34. * creation.
  35. *
  36. * @author Peter Farland
  37. */
  38. public abstract class AbstractDatabase
  39. {
  40. protected AbstractDatabase()
  41. {
  42. }
  43. protected Connection connection;
  44. /**
  45. * Creates a <code>PreparedStatement</code> for a SQL SELECT.
  46. * <p/>
  47. * e.g.
  48. * <pre>
  49. * SELECT t1.name, t2.id AS id
  50. * FROM Table1 t1, Table2 t2
  51. * WHERE t1.id = t2.id
  52. * AND t1.name = "John"
  53. * </pre>
  54. * <p/>
  55. * Note that if multiple tables are used, then all column names must be
  56. * appropriately prefixed to match table aliases.
  57. *
  58. * @param columns A list of column names to select, with column aliases appropriately formatted
  59. * @param tables A list of tables to join across, with table aliases appropriately formatted
  60. * @param clauses A collection of key-value pairs for the WHERE clause; the key must be a string and the value can be any valid ODBC object
  61. * @return A PreparedStatement that can be subsequently executed.
  62. * @throws SQLException
  63. */
  64. public PreparedStatement select(String[] columns, String[] tables, Map clauses, String other) throws SQLException
  65. {
  66. StringBuffer sb = new StringBuffer(256);
  67. sb.append("SELECT ");
  68. //COLUMNS (can include aliases if correctly formatted)
  69. if (columns != null && columns.length > 0)
  70. {
  71. for (int i = 0; i < columns.length; i++)
  72. {
  73. sb.append(" ").append(columns[i]);
  74. if (i < columns.length - 1)
  75. sb.append(", ");
  76. }
  77. sb.append("\r\n");
  78. }
  79. else
  80. {
  81. sb.append(" * \r\n");
  82. }
  83. //TABLES
  84. if (tables != null && tables.length > 0)
  85. {
  86. sb.append("\tFROM ");
  87. for (int i = 0; i < tables.length; i++)
  88. {
  89. sb.append(" \"").append(tables[i]).append("\"");
  90. if (i < tables.length - 1)
  91. sb.append(", ");
  92. }
  93. sb.append("\r\n");
  94. }
  95. //WHERE (KEYS)
  96. if (clauses != null && clauses.size() > 0)
  97. {
  98. sb.append("\tWHERE \r\n");
  99. Set keys = clauses.keySet();
  100. Iterator kit = keys.iterator();
  101. int i = 0;
  102. while (kit.hasNext())
  103. {
  104. String key = (String)kit.next();
  105. if (i > 0)
  106. sb.append("\t\tAND ");
  107. else
  108. sb.append("\t\t");
  109. sb.append(" ").append(key).append(" = ? \r\n");
  110. i++;
  111. }
  112. }
  113. //ANY OTHER SQL COMMANDS TO ADD TO THE END OF THE STATEMENT
  114. if (other != null)
  115. sb.append(other);
  116. PreparedStatement statement = connection.prepareStatement(sb.toString(), ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
  117. //WHERE (VALUES)
  118. if (clauses != null && clauses.size() > 0)
  119. {
  120. Set keys = clauses.keySet();
  121. Iterator kit = keys.iterator();
  122. int i = 1;
  123. while (kit.hasNext())
  124. {
  125. String key = (String)kit.next();
  126. Object value = clauses.get(key);
  127. addParameter(statement, i, value);
  128. i++;
  129. }
  130. }
  131. return statement;
  132. }
  133. /**
  134. * Creates a <code>PreparedStatement</code> for a SQL INSERT.
  135. * <p/>
  136. * e.g.
  137. * <pre>
  138. * INSERT INTO myTable ( field1, field2 )
  139. * VALUES ( 'string1', 'string2' )
  140. * WHERE field3 = 'string3'
  141. * AND field4 = 'string4'
  142. * </pre>
  143. *
  144. * @param table The table name to insert
  145. * @param values A collection of key-value pairs to insert, with column aliases appropriately formatted
  146. * @param clauses A collection of key-value pairs for the WHERE clause; the key must be a string and the value can be any valid ODBC object
  147. * @return A PreparedStatement that can be subsequently executed.
  148. * @throws SQLException
  149. */
  150. public PreparedStatement insert(String table, Map values, Map clauses, String other) throws SQLException
  151. {
  152. StringBuffer sb = new StringBuffer(256);
  153. sb.append("INSERT INTO ");
  154. //TABLE
  155. sb.append(table).append(" ( ");
  156. //COLUMNS (can include aliases if correctly formatted)
  157. if (values != null && values.size() > 0)
  158. {
  159. Set keys = values.keySet();
  160. Iterator kit = keys.iterator();
  161. int i = 0;
  162. while (kit.hasNext())
  163. {
  164. sb.append(" ").append(kit.next());
  165. if (i < values.size() - 1)
  166. sb.append(", ");
  167. i++;
  168. }
  169. sb.append("\r\n");
  170. }
  171. sb.append(" ) \r\n");
  172. //VALUES
  173. if (values != null && values.size() > 0)
  174. {
  175. sb.append("\tVALUES ( ");
  176. Set keys = values.keySet();
  177. Iterator kit = keys.iterator();
  178. int i = 0;
  179. while (kit.hasNext())
  180. {
  181. kit.next();
  182. sb.append(" ? ");
  183. if (i < values.size() - 1)
  184. sb.append(", ");
  185. i++;
  186. }
  187. sb.append(" ) \r\n");
  188. }
  189. //WHERE (KEYS)
  190. if (clauses != null && clauses.size() > 0)
  191. {
  192. sb.append("\tWHERE \r\n");
  193. Set keys = clauses.keySet();
  194. Iterator kit = keys.iterator();
  195. int i = 0;
  196. while (kit.hasNext())
  197. {
  198. String key = (String)kit.next();
  199. if (i > 0)
  200. sb.append("\t\tAND ");
  201. else
  202. sb.append("\t\t");
  203. sb.append(" ").append(key).append(" = ? \r\n");
  204. i++;
  205. }
  206. }
  207. //ANY OTHER SQL COMMANDS TO ADD TO THE END OF THE STATEMENT
  208. if (other != null)
  209. sb.append(other);
  210. PreparedStatement statement = connection.prepareStatement(sb.toString());
  211. //VALUES (AS SQL PARAMETERS)
  212. if (values != null && values.size() > 0)
  213. {
  214. Set keys = values.keySet();
  215. Iterator kit = keys.iterator();
  216. int i = 1;
  217. while (kit.hasNext())
  218. {
  219. String key = (String)kit.next();
  220. Object value = values.get(key);
  221. addParameter(statement, i, value);
  222. i++;
  223. }
  224. }
  225. //WHERE (VALUES)
  226. if (clauses != null && clauses.size() > 0)
  227. {
  228. Set keys = clauses.keySet();
  229. Iterator kit = keys.iterator();
  230. int i = 1;
  231. while (kit.hasNext())
  232. {
  233. String key = (String)kit.next();
  234. Object value = clauses.get(key);
  235. addParameter(statement, i, value);
  236. i++;
  237. }
  238. }
  239. return statement;
  240. }
  241. /**
  242. * Creates a <code>PreparedStatement</code> for a SQL UPDATE.
  243. * <p/>
  244. * e.g.
  245. * <pre>
  246. * UPDATE Job
  247. * SET Position = 'Manager'
  248. * WHERE Employee_ID = 12345678
  249. * <p/>
  250. * </pre>
  251. *
  252. * @param table The table name to update
  253. * @param updates A list of column names to select, with column aliases appropriately formatted
  254. * @param clauses A collection of key-value pairs, the key must be a string and the value can be any valid ODBC object
  255. * @return A PreparedStatement that can be subsequently executed.
  256. * @throws SQLException
  257. */
  258. public PreparedStatement update(String table, Map updates, Map clauses, String other) throws SQLException
  259. {
  260. StringBuffer sb = new StringBuffer(256);
  261. sb.append("UPDATE ");
  262. //TABLE
  263. sb.append(table).append(" \r\n");
  264. //SET (KEYS)
  265. if (updates != null && updates.size() > 0)
  266. {
  267. sb.append("\tSET \r\n");
  268. Set keys = updates.keySet();
  269. Iterator kit = keys.iterator();
  270. int i = 0;
  271. while (kit.hasNext())
  272. {
  273. String key = (String)kit.next();
  274. if (i > 0)
  275. sb.append("\t\tAND ");
  276. else
  277. sb.append("\t\t");
  278. sb.append(" ").append(key).append(" = ? \r\n");
  279. i++;
  280. }
  281. }
  282. //WHERE (KEYS)
  283. if (clauses != null && clauses.size() > 0)
  284. {
  285. sb.append("\tWHERE \r\n");
  286. Set keys = clauses.keySet();
  287. Iterator kit = keys.iterator();
  288. int i = 0;
  289. while (kit.hasNext())
  290. {
  291. String key = (String)kit.next();
  292. if (i > 0)
  293. sb.append("\t\tAND ");
  294. else
  295. sb.append("\t\t");
  296. sb.append(" ").append(key).append(" = ? \r\n");
  297. i++;
  298. }
  299. }
  300. //ANY OTHER SQL COMMANDS TO ADD TO THE END OF THE STATEMENT
  301. if (other != null)
  302. sb.append(other);
  303. PreparedStatement statement = connection.prepareStatement(sb.toString());
  304. //SET (VALUES)
  305. if (updates != null && updates.size() > 0)
  306. {
  307. Set keys = updates.keySet();
  308. Iterator kit = keys.iterator();
  309. int i = 1;
  310. while (kit.hasNext())
  311. {
  312. String key = (String)kit.next();
  313. Object value = updates.get(key);
  314. addParameter(statement, i, value);
  315. i++;
  316. }
  317. }
  318. //WHERE (VALUES)
  319. if (clauses != null && clauses.size() > 0)
  320. {
  321. Set keys = clauses.keySet();
  322. Iterator kit = keys.iterator();
  323. int i = 1;
  324. while (kit.hasNext())
  325. {
  326. String key = (String)kit.next();
  327. Object value = clauses.get(key);
  328. addParameter(statement, i, value);
  329. i++;
  330. }
  331. }
  332. return statement;
  333. }
  334. /**
  335. * Creates a <code>PreparedStatement</code> for a SQL DELETE.
  336. * <p/>
  337. * e.g.
  338. * <pre>
  339. * DELETE FROM Employee
  340. * WHERE First_Name = 'John'
  341. * AND Last_Name = 'Smith'
  342. * </pre>
  343. *
  344. * @param table The name of the table from which to delete rows
  345. * @param clauses A collection of key-value pairs, the key must be a string and the value can be any valid ODBC object
  346. * @return A PreparedStatement that can be subsequently executed.
  347. * @throws SQLException
  348. */
  349. public PreparedStatement delete(String table, Map clauses, String other) throws SQLException
  350. {
  351. StringBuffer sb = new StringBuffer(256);
  352. sb.append("DELETE FROM ");
  353. //TABLE
  354. sb.append(table).append(" \r\n");
  355. //WHERE (KEYS)
  356. if (clauses != null && clauses.size() > 0)
  357. {
  358. sb.append("\tWHERE \r\n");
  359. Set keys = clauses.keySet();
  360. Iterator kit = keys.iterator();
  361. int i = 0;
  362. while (kit.hasNext())
  363. {
  364. String key = (String)kit.next();
  365. if (i > 0)
  366. sb.append("\t\tAND ");
  367. else
  368. sb.append("\t\t");
  369. sb.append(" ").append(key).append(" = ? \r\n");
  370. i++;
  371. }
  372. }
  373. //ANY OTHER SQL COMMANDS TO ADD TO THE END OF THE STATEMENT
  374. if (other != null)
  375. sb.append(other);
  376. PreparedStatement statement = connection.prepareStatement(sb.toString());
  377. //WHERE (VALUES)
  378. if (clauses != null && clauses.size() > 0)
  379. {
  380. Set keys = clauses.keySet();
  381. Iterator kit = keys.iterator();
  382. int i = 1;
  383. while (kit.hasNext())
  384. {
  385. String key = (String)kit.next();
  386. Object value = clauses.get(key);
  387. addParameter(statement, i, value);
  388. i++;
  389. }
  390. }
  391. return statement;
  392. }
  393. public static long getId(Object val)
  394. {
  395. long id = -1;
  396. if (val != null)
  397. {
  398. if (val instanceof Number)
  399. {
  400. id = ((Number)val).longValue();
  401. }
  402. else
  403. {
  404. id = Long.parseLong(val.toString());
  405. }
  406. }
  407. return id;
  408. }
  409. public static int countRecords(ResultSet resultSet)
  410. {
  411. int rowCount = 0;
  412. //Determine rs size
  413. if (resultSet != null)
  414. {
  415. try
  416. {
  417. int currentIndex = resultSet.getRow();
  418. //Go to the end and get that row number
  419. if (resultSet.last())
  420. {
  421. rowCount = resultSet.getRow();
  422. }
  423. //Put the cursor back
  424. if (currentIndex > 0)
  425. {
  426. resultSet.absolute(currentIndex);
  427. }
  428. else
  429. {
  430. resultSet.beforeFirst();
  431. }
  432. }
  433. catch (SQLException ex)
  434. {
  435. //TODO: Decide whether if absolute() not be supported, try first() as a last resort??
  436. try
  437. {
  438. resultSet.first();
  439. }
  440. catch (SQLException se)
  441. {
  442. //we won't try anymore.
  443. }
  444. }
  445. }
  446. return rowCount;
  447. }
  448. private void addParameter(PreparedStatement statement, int i, Object value) throws SQLException
  449. {
  450. if (value == null)
  451. statement.setObject(i, value);
  452. else if (value instanceof String)
  453. statement.setString(i, value.toString());
  454. else if (value instanceof Persistable)
  455. statement.setLong(i, ((Persistable)value).id);
  456. else if (value instanceof Boolean)
  457. statement.setBoolean(i, ((Boolean)value).booleanValue());
  458. else if (value instanceof Integer)
  459. statement.setInt(i, ((Integer)value).intValue());
  460. else if (value instanceof Double)
  461. statement.setDouble(i, ((Double)value).doubleValue());
  462. else if (value instanceof Float)
  463. statement.setFloat(i, ((Float)value).floatValue());
  464. else if (value instanceof Short)
  465. statement.setShort(i, ((Short)value).shortValue());
  466. else if (value instanceof Long)
  467. statement.setLong(i, ((Long)value).longValue());
  468. else if (value instanceof Calendar)
  469. statement.setDate(i, new java.sql.Date(((Calendar)value).getTime().getTime()));
  470. else if (value instanceof java.util.Date)
  471. statement.setDate(i, new java.sql.Date(((java.util.Date)value).getTime()));
  472. else if (value instanceof java.sql.Date)
  473. statement.setDate(i, ((java.sql.Date)value));
  474. else if (value instanceof java.sql.Timestamp)
  475. statement.setTimestamp(i, ((java.sql.Timestamp)value));
  476. else if (value instanceof java.sql.Time)
  477. statement.setTime(i, ((java.sql.Time)value));
  478. else
  479. statement.setObject(i, value);
  480. }
  481. }