1 package org.apache.torque.oid;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import java.math.BigDecimal;
20 import java.sql.Connection;
21 import org.apache.torque.adapter.DB;
22 import org.apache.torque.util.SQLBuilder;
23 import com.workingdogs.village.QueryDataSet;
24 import com.workingdogs.village.Record;
25 import com.workingdogs.village.Value;
26
27 /***
28 * This generator works with databases that have an sql syntax that
29 * allows the retrieval of the last id used to insert a row for a
30 * Connection.
31 *
32 * @author <a href="mailto:jmcnally@collab.net">John D. McNally</a>
33 * @version $Id: AutoIncrementIdGenerator.java 239630 2005-08-24 12:25:32Z henning $
34 */
35 public class AutoIncrementIdGenerator implements IdGenerator
36 {
37 /*** the adapter that knows the correct sql syntax */
38 private DB dbAdapter;
39
40 /*** The internal name of the Database that this Generator is connected to */
41 private String name = null;
42
43 /***
44 * Creates an IdGenerator which will work with the specified database.
45 *
46 * @param dbAdapter the adapter that knows the correct sql syntax.
47 * @param name The name of the datasource to find the correct schema
48 */
49 public AutoIncrementIdGenerator(final DB dbAdapter, final String name)
50 {
51 this.dbAdapter = dbAdapter;
52 this.name = name;
53 }
54
55 /***
56 * Returns the last ID used by this connection.
57 *
58 * @param connection A Connection.
59 * @param keyInfo an Object that contains additional info.
60 * @return An int with the value for the id.
61 * @exception Exception Database error.
62 */
63 public int getIdAsInt(Connection connection, Object keyInfo)
64 throws Exception
65 {
66 return getIdAsVillageValue(connection, keyInfo).asInt();
67 }
68
69 /***
70 * Returns the last ID used by this connection.
71 *
72 * @param connection A Connection.
73 * @param keyInfo an Object that contains additional info.
74 * @return A long with the value for the id.
75 * @exception Exception Database error.
76 */
77 public long getIdAsLong(Connection connection, Object keyInfo)
78 throws Exception
79 {
80 return getIdAsVillageValue(connection, keyInfo).asLong();
81 }
82
83 /***
84 * Returns the last ID used by this connection.
85 *
86 * @param connection A Connection.
87 * @param keyInfo an Object that contains additional info.
88 * @return A BigDecimal with the last value auto-incremented as a
89 * result of an insert.
90 * @exception Exception Database error.
91 */
92 public BigDecimal getIdAsBigDecimal(Connection connection, Object keyInfo)
93 throws Exception
94 {
95 return getIdAsVillageValue(connection, keyInfo).asBigDecimal();
96 }
97
98
99 /***
100 * Returns the last ID used by this connection.
101 *
102 * @param connection A Connection.
103 * @param keyInfo an Object that contains additional info.
104 * @return A String with the last value auto-incremented as a
105 * result of an insert.
106 * @exception Exception Database error.
107 */
108 public String getIdAsString(Connection connection, Object keyInfo)
109 throws Exception
110 {
111 return getIdAsVillageValue(connection, keyInfo).asString();
112 }
113
114 /***
115 * A flag to determine the timing of the id generation
116 *
117 * @return a <code>boolean</code> value
118 */
119 public boolean isPriorToInsert()
120 {
121 return false;
122 }
123
124 /***
125 * A flag to determine the timing of the id generation
126 *
127 * @return a <code>boolean</code> value
128 */
129 public boolean isPostInsert()
130 {
131 return true;
132 }
133
134 /***
135 * A flag to determine whether a Connection is required to
136 * generate an id.
137 *
138 * @return a <code>boolean</code> value
139 */
140 public final boolean isConnectionRequired()
141 {
142 return true;
143 }
144
145 /***
146 * Returns the last ID used by this connection.
147 *
148 * @param connection A Connection.
149 * @param keyInfo an Object that contains additional info.
150 * @return A Village Value with the last value auto-incremented as a
151 * result of an insert.
152 * @exception Exception Database error.
153 */
154 private Value getIdAsVillageValue(Connection connection, Object keyInfo)
155 throws Exception
156 {
157 String tableName = SQLBuilder.getFullTableName(String.valueOf(keyInfo), name);
158 String idSQL = dbAdapter.getIDMethodSQL(tableName);
159 Value id = null;
160 QueryDataSet qds = null;
161 try
162 {
163 qds = new QueryDataSet(connection, idSQL);
164 qds.fetchRecords(1);
165 Record rec = qds.getRecord(0);
166 id = rec.getValue(1);
167 }
168 finally
169 {
170 if (qds != null)
171 {
172 qds.close();
173 }
174 }
175 return id;
176 }
177 }