@@ -531,6 +531,14 @@ _psyco_conn_parse_onoff(PyObject *pyval)
531531 return rv ;
532532}
533533
534+ #define _set_session_checks (self ,what ) \
535+ do { \
536+ EXC_IF_CONN_CLOSED(self); \
537+ EXC_IF_CONN_ASYNC(self, what); \
538+ EXC_IF_IN_TRANSACTION(self, what); \
539+ EXC_IF_TPC_PREPARED(self, what); \
540+ } while(0)
541+
534542/* set_session - set default transaction characteristics */
535543
536544#define psyco_conn_set_session_doc \
@@ -553,9 +561,7 @@ psyco_conn_set_session(connectionObject *self, PyObject *args, PyObject *kwargs)
553561 static char * kwlist [] =
554562 {"isolation_level" , "readonly" , "deferrable" , "autocommit" , NULL };
555563
556- EXC_IF_CONN_CLOSED (self );
557- EXC_IF_CONN_ASYNC (self , set_session );
558- EXC_IF_IN_TRANSACTION (self , set_session );
564+ _set_session_checks (self , set_session );
559565
560566 if (!PyArg_ParseTupleAndKeywords (args , kwargs , "|OOOO" , kwlist ,
561567 & isolevel , & readonly , & deferrable , & autocommit )) {
@@ -615,9 +621,7 @@ _psyco_conn_autocommit_set_checks(connectionObject *self)
615621{
616622 /* wrapper to use the EXC_IF macros.
617623 * return NULL in case of error, else whatever */
618- EXC_IF_CONN_CLOSED (self );
619- EXC_IF_CONN_ASYNC (self , autocommit );
620- EXC_IF_IN_TRANSACTION (self , autocommit );
624+ _set_session_checks (self , autocommit );
621625 return Py_None ; /* borrowed */
622626}
623627
@@ -628,7 +632,10 @@ psyco_conn_autocommit_set(connectionObject *self, PyObject *pyvalue)
628632
629633 if (!_psyco_conn_autocommit_set_checks (self )) { return -1 ; }
630634 if (-1 == (value = PyObject_IsTrue (pyvalue ))) { return -1 ; }
631- if (0 != conn_set_autocommit (self , value )) { return -1 ; }
635+ if (0 > conn_set_session (self , value ,
636+ self -> isolevel , self -> readonly , self -> deferrable )) {
637+ return -1 ;
638+ }
632639
633640 return 0 ;
634641}
@@ -660,9 +667,7 @@ psyco_conn_set_isolation_level(connectionObject *self, PyObject *args)
660667{
661668 int level = 1 ;
662669
663- EXC_IF_CONN_CLOSED (self );
664- EXC_IF_CONN_ASYNC (self , set_isolation_level );
665- EXC_IF_TPC_PREPARED (self , set_isolation_level );
670+ _set_session_checks (self , set_isolation_level );
666671
667672 if (!PyArg_ParseTuple (args , "i" , & level )) return NULL ;
668673
@@ -672,8 +677,17 @@ psyco_conn_set_isolation_level(connectionObject *self, PyObject *args)
672677 return NULL ;
673678 }
674679
675- if (conn_switch_isolation_level (self , level ) < 0 ) {
676- return NULL ;
680+ if (level == 0 ) {
681+ if (0 > conn_set_session (self , 1 ,
682+ ISOLATION_LEVEL_DEFAULT , self -> readonly , self -> deferrable )) {
683+ return NULL ;
684+ }
685+ }
686+ else {
687+ if (0 > conn_set_session (self , 0 ,
688+ level , self -> readonly , self -> deferrable )) {
689+ return NULL ;
690+ }
677691 }
678692
679693 Py_RETURN_NONE ;
0 commit comments