Merge pull request #1719 from querydsl/i1710

Fix context end calls
This commit is contained in:
John Tims 2015-12-24 12:38:29 -07:00
commit d2e32dde80
5 changed files with 65 additions and 7 deletions

View File

@ -15,10 +15,11 @@ package com.querydsl.sql;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.Nullable;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.querydsl.core.QueryMetadata;
import com.querydsl.core.types.Expression;
import com.querydsl.core.types.Path;
@ -38,7 +39,7 @@ public class SQLListeners implements SQLDetailedListener {
@Nullable
private final SQLDetailedListener parent;
private final List<SQLDetailedListener> listeners = Lists.newArrayList();
private final Set<SQLDetailedListener> listeners = Sets.newLinkedHashSet();
public SQLListeners(SQLListener parent) {
this.parent = new SQLListenerAdapter(parent);
@ -49,7 +50,15 @@ public class SQLListeners implements SQLDetailedListener {
}
public void add(SQLListener listener) {
listeners.add(new SQLListenerAdapter(listener));
if (listener instanceof SQLListeners) {
for (SQLListener l : ((SQLListeners) listener).listeners) {
add(l);
}
} else if (listener instanceof SQLDetailedListener) {
listeners.add((SQLDetailedListener) listener);
} else {
listeners.add(new SQLListenerAdapter(listener));
}
}
@Override

View File

@ -356,15 +356,16 @@ public class SQLInsertClause extends AbstractSQLClause<SQLInsertClause> implemen
super.close();
} finally {
stmt2.close();
reset();
endContext(context);
}
}
};
} catch (SQLException e) {
onException(context, e);
throw configuration.translate(queryString, constants, e);
} finally {
reset();
endContext(context);
throw configuration.translate(queryString, constants, e);
}
}

View File

@ -248,6 +248,8 @@ public class SQLMergeClause extends AbstractSQLClause<SQLMergeClause> implements
super.close();
} finally {
stmt2.close();
reset();
endContext(context);
}
}
};
@ -255,22 +257,25 @@ public class SQLMergeClause extends AbstractSQLClause<SQLMergeClause> implements
if (hasRow()) {
// update
SQLUpdateClause update = new SQLUpdateClause(connection, configuration, entity);
update.addListener(listeners);
populate(update);
addKeyConditions(update);
reset();
endContext(context);
return EmptyResultSet.DEFAULT;
} else {
// insert
SQLInsertClause insert = new SQLInsertClause(connection, configuration, entity);
insert.addListener(listeners);
populate(insert);
return insert.executeWithKeys();
}
}
} catch (SQLException e) {
onException(context,e);
throw configuration.translate(queryString, constants, e);
} finally {
reset();
endContext(context);
throw configuration.translate(queryString, constants, e);
}
}

View File

@ -22,6 +22,7 @@ import static org.junit.Assert.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
@ -239,6 +240,26 @@ public class InsertBase extends AbstractBaseTest {
rs.close();
}
@Test
@ExcludeIn({CUBRID, SQLSERVER})
public void insert_with_keys_listener() throws SQLException {
final AtomicBoolean result = new AtomicBoolean();
SQLListener listener = new SQLBaseListener() {
@Override
public void end(SQLListenerContext context) {
result.set(true);
}
};
SQLInsertClause clause = insert(survey).set(survey.name, "Hello World");
clause.addListener(listener);
ResultSet rs = clause.executeWithKeys();
assertFalse(result.get());
assertTrue(rs.next());
assertTrue(rs.getObject(1) != null);
rs.close();
assertTrue(result.get());
}
@Test
@ExcludeIn({CUBRID, SQLSERVER})
public void insert_with_keys_Projected() throws SQLException {

View File

@ -20,6 +20,7 @@ import static org.junit.Assert.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.concurrent.atomic.AtomicBoolean;
import org.junit.After;
import org.junit.Before;
@ -61,6 +62,27 @@ public class MergeBase extends AbstractBaseTest {
rs.close();
}
@Test
@ExcludeIn({H2, CUBRID, SQLSERVER})
public void merge_with_keys_listener() throws SQLException {
final AtomicBoolean result = new AtomicBoolean();
SQLListener listener = new SQLBaseListener() {
@Override
public void end(SQLListenerContext context) {
result.set(true);
}
};
SQLMergeClause clause = merge(survey).keys(survey.id)
.set(survey.id, 7)
.set(survey.name, "Hello World");
clause.addListener(listener);
ResultSet rs = clause.executeWithKeys();
assertTrue(rs.next());
assertTrue(rs.getObject(1) != null);
rs.close();
assertTrue(result.get());
}
@Test
@IncludeIn(H2)
public void merge_with_keys_and_subQuery() {