Skip to content
This repository was archived by the owner on Aug 17, 2020. It is now read-only.

Commit daa96e2

Browse files
committed
Check for enclosing transaction on actual subscribe, not initial emission.
This ensures that even with backpressure enabled to suppress initial emission an error is still thrown.
1 parent 1eccc98 commit daa96e2

2 files changed

Lines changed: 20 additions & 5 deletions

File tree

sqlbrite/src/androidTest/java/com/squareup/sqlbrite/BriteDatabaseTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,16 @@ public final class BriteDatabaseTest {
546546
o.assertErrorContains("Cannot subscribe to observable query in a transaction.");
547547
}
548548

549+
@Test public void querySubscribedToDuringTransactionThrowsWithBackpressure() {
550+
o.doRequest(0);
551+
552+
Observable<Query> query = db.createQuery(TABLE_EMPLOYEE, SELECT_EMPLOYEES);
553+
554+
db.newTransaction();
555+
query.subscribe(o);
556+
o.assertErrorContains("Cannot subscribe to observable query in a transaction.");
557+
}
558+
549559
@Test public void callingEndMultipleTimesThrows() {
550560
Transaction transaction = db.newTransaction();
551561
transaction.end();

sqlbrite/src/main/java/com/squareup/sqlbrite/BriteDatabase.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import java.util.Set;
3434
import java.util.concurrent.TimeUnit;
3535
import rx.Observable;
36+
import rx.functions.Action0;
3637
import rx.functions.Func1;
3738
import rx.subjects.PublishSubject;
3839

@@ -297,18 +298,22 @@ private QueryObservable createQuery(final Func1<Set<String>, Boolean> tableFilte
297298
.startWith(INITIAL_TRIGGER) // Immediately execute the query for initial value.
298299
.map(new Func1<Set<String>, Query>() {
299300
@Override public Query call(Set<String> trigger) {
300-
if (transactions.get() != null) {
301-
throw new IllegalStateException(
302-
"Cannot subscribe to observable query in a transaction.");
303-
}
304301
if (logging) {
305302
log("QUERY\n trigger: %s\n tables: %s\n sql: %s\n args: %s", trigger, tableFilter,
306303
sql, Arrays.toString(args));
307304
}
308305
return query;
309306
}
310307
}) //
311-
.onBackpressureLatest();
308+
.onBackpressureLatest() //
309+
.doOnSubscribe(new Action0() {
310+
@Override public void call() {
311+
if (transactions.get() != null) {
312+
throw new IllegalStateException(
313+
"Cannot subscribe to observable query in a transaction.");
314+
}
315+
}
316+
});
312317
return new QueryObservable(queryObservable);
313318
}
314319

0 commit comments

Comments
 (0)