001: /*-------------------------------------------------------------------------
002: *
003: * Copyright (c) 2004-2005, PostgreSQL Global Development Group
004: *
005: * IDENTIFICATION
006: * $PostgreSQL: pgjdbc/org/postgresql/test/jdbc3/Jdbc3SavepointTest.java,v 1.7 2005/11/24 02:31:44 oliver Exp $
007: *
008: *-------------------------------------------------------------------------
009: */
010: package org.postgresql.test.jdbc3;
011:
012: import java.sql.*;
013: import junit.framework.TestCase;
014: import org.postgresql.test.TestUtil;
015:
016: public class Jdbc3SavepointTest extends TestCase {
017:
018: private Connection _conn;
019:
020: public Jdbc3SavepointTest(String name) {
021: super (name);
022: }
023:
024: protected void setUp() throws Exception {
025: _conn = TestUtil.openDB();
026: TestUtil.createTable(_conn, "savepointtable",
027: "id int primary key");
028: _conn.setAutoCommit(false);
029: }
030:
031: protected void tearDown() throws SQLException {
032: _conn.setAutoCommit(true);
033: TestUtil.dropTable(_conn, "savepointtable");
034: TestUtil.closeDB(_conn);
035: }
036:
037: private boolean hasSavepoints() throws SQLException {
038: return TestUtil.haveMinimumServerVersion(_conn, "8.0");
039: }
040:
041: private void addRow(int id) throws SQLException {
042: PreparedStatement pstmt = _conn
043: .prepareStatement("INSERT INTO savepointtable VALUES (?)");
044: pstmt.setInt(1, id);
045: pstmt.executeUpdate();
046: pstmt.close();
047: }
048:
049: private int countRows() throws SQLException {
050: Statement stmt = _conn.createStatement();
051: ResultSet rs = stmt
052: .executeQuery("SELECT COUNT(*) FROM savepointtable");
053: rs.next();
054: int count = rs.getInt(1);
055: rs.close();
056: return count;
057: }
058:
059: public void testAutoCommitFails() throws SQLException {
060: if (!hasSavepoints())
061: return;
062:
063: _conn.setAutoCommit(true);
064:
065: try {
066: _conn.setSavepoint();
067: fail("Can't create a savepoint with autocommit.");
068: } catch (SQLException sqle) {
069: }
070:
071: try {
072: _conn.setSavepoint("spname");
073: fail("Can't create a savepoint with autocommit.");
074: } catch (SQLException sqle) {
075: }
076: }
077:
078: public void testCantMixSavepointTypes() throws SQLException {
079: if (!hasSavepoints())
080: return;
081:
082: Savepoint namedSavepoint = _conn.setSavepoint("named");
083: Savepoint unNamedSavepoint = _conn.setSavepoint();
084:
085: try {
086: namedSavepoint.getSavepointId();
087: fail("Can't get id from named savepoint.");
088: } catch (SQLException sqle) {
089: }
090:
091: try {
092: unNamedSavepoint.getSavepointName();
093: fail("Can't get name from unnamed savepoint.");
094: } catch (SQLException sqle) {
095: }
096:
097: }
098:
099: public void testRollingBackToSavepoints() throws SQLException {
100: if (!hasSavepoints())
101: return;
102:
103: Savepoint empty = _conn.setSavepoint();
104: addRow(1);
105: Savepoint onerow = _conn.setSavepoint("onerow");
106: addRow(2);
107:
108: assertEquals(2, countRows());
109: _conn.rollback(onerow);
110: assertEquals(1, countRows());
111: _conn.rollback(empty);
112: assertEquals(0, countRows());
113: }
114:
115: public void testGlobalRollbackWorks() throws SQLException {
116: if (!hasSavepoints())
117: return;
118:
119: _conn.setSavepoint();
120: addRow(1);
121: _conn.setSavepoint("onerow");
122: addRow(2);
123:
124: assertEquals(2, countRows());
125: _conn.rollback();
126: assertEquals(0, countRows());
127: }
128:
129: public void testContinueAfterError() throws SQLException {
130: if (!hasSavepoints())
131: return;
132:
133: addRow(1);
134: Savepoint savepoint = _conn.setSavepoint();
135: try {
136: addRow(1);
137: fail("Should have thrown duplicate key exception");
138: } catch (SQLException sqle) {
139: _conn.rollback(savepoint);
140: }
141:
142: assertEquals(1, countRows());
143: addRow(2);
144: assertEquals(2, countRows());
145: }
146:
147: public void testReleaseSavepoint() throws SQLException {
148: if (!hasSavepoints())
149: return;
150:
151: Savepoint savepoint = _conn.setSavepoint("mysavepoint");
152: _conn.releaseSavepoint(savepoint);
153: try {
154: savepoint.getSavepointName();
155: fail("Can't use savepoint after release.");
156: } catch (SQLException sqle) {
157: }
158:
159: savepoint = _conn.setSavepoint();
160: _conn.releaseSavepoint(savepoint);
161: try {
162: savepoint.getSavepointId();
163: fail("Can't use savepoint after release.");
164: } catch (SQLException sqle) {
165: }
166: }
167:
168: public void testComplicatedSavepointName() throws SQLException {
169: if (!hasSavepoints())
170: return;
171:
172: Savepoint savepoint = _conn
173: .setSavepoint("name with spaces + \"quotes\"");
174: _conn.rollback(savepoint);
175: _conn.releaseSavepoint(savepoint);
176: }
177:
178: public void testRollingBackToInvalidSavepointFails()
179: throws SQLException {
180: if (!hasSavepoints())
181: return;
182:
183: Savepoint sp1 = _conn.setSavepoint();
184: Savepoint sp2 = _conn.setSavepoint();
185:
186: _conn.rollback(sp1);
187: try {
188: _conn.rollback(sp2);
189: fail("Can't rollback to a savepoint that's invalid.");
190: } catch (SQLException sqle) {
191: }
192: }
193:
194: public void testRollbackMultipleTimes() throws SQLException {
195: if (!hasSavepoints())
196: return;
197:
198: addRow(1);
199: Savepoint savepoint = _conn.setSavepoint();
200:
201: addRow(2);
202: _conn.rollback(savepoint);
203: assertEquals(1, countRows());
204:
205: _conn.rollback(savepoint);
206: assertEquals(1, countRows());
207:
208: addRow(2);
209: _conn.rollback(savepoint);
210: assertEquals(1, countRows());
211:
212: _conn.releaseSavepoint(savepoint);
213: assertEquals(1, countRows());
214: }
215:
216: }
|