mirror of
				https://github.com/psycopg/psycopg2.git
				synced 2025-11-04 09:47:30 +03:00 
			
		
		
		
	New 'withhold' parameter for connection.cursor()
This commit is contained in:
		
							parent
							
								
									30a046c602
								
							
						
					
					
						commit
						479bdf7458
					
				| 
						 | 
					@ -53,15 +53,28 @@ static PyObject *
 | 
				
			||||||
psyco_conn_cursor(connectionObject *self, PyObject *args, PyObject *keywds)
 | 
					psyco_conn_cursor(connectionObject *self, PyObject *args, PyObject *keywds)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    const char *name = NULL;
 | 
					    const char *name = NULL;
 | 
				
			||||||
    PyObject *obj, *factory = NULL;
 | 
					    PyObject *obj, *factory = NULL, *withhold = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static char *kwlist[] = {"name", "cursor_factory", NULL};
 | 
					    static char *kwlist[] = {"name", "cursor_factory", "withhold", NULL};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!PyArg_ParseTupleAndKeywords(args, keywds, "|sO", kwlist,
 | 
					    if (!PyArg_ParseTupleAndKeywords(args, keywds, "|sOO", kwlist,
 | 
				
			||||||
                                     &name, &factory)) {
 | 
					                                     &name, &factory, &withhold)) {
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (withhold != NULL) {
 | 
				
			||||||
 | 
					        if (withhold == Py_True && name == NULL) {
 | 
				
			||||||
 | 
					            PyErr_SetString(ProgrammingError,
 | 
				
			||||||
 | 
					                "'withhold=True can be specified only for named cursors");
 | 
				
			||||||
 | 
					            return NULL;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (withhold != NULL && withhold != Py_True && withhold != Py_False) {
 | 
				
			||||||
 | 
					            PyErr_SetString(ProgrammingError,
 | 
				
			||||||
 | 
					                "'withhold should be True or False");
 | 
				
			||||||
 | 
					            return NULL;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    EXC_IF_CONN_CLOSED(self);
 | 
					    EXC_IF_CONN_CLOSED(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (self->status != CONN_STATUS_READY &&
 | 
					    if (self->status != CONN_STATUS_READY &&
 | 
				
			||||||
| 
						 | 
					@ -96,6 +109,9 @@ psyco_conn_cursor(connectionObject *self, PyObject *args, PyObject *keywds)
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    if (withhold == Py_True)
 | 
				
			||||||
 | 
					        ((cursorObject*)obj)->withhold = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Dprintf("psyco_conn_cursor: new cursor at %p: refcnt = "
 | 
					    Dprintf("psyco_conn_cursor: new cursor at %p: refcnt = "
 | 
				
			||||||
        FORMAT_CODE_PY_SSIZE_T,
 | 
					        FORMAT_CODE_PY_SSIZE_T,
 | 
				
			||||||
        obj, Py_REFCNT(obj)
 | 
					        obj, Py_REFCNT(obj)
 | 
				
			||||||
| 
						 | 
					@ -525,7 +541,7 @@ psyco_conn_set_session(connectionObject *self, PyObject *args, PyObject *kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define psyco_conn_autocommit_doc \
 | 
					#define psyco_conn_autocommit_doc \
 | 
				
			||||||
"set or return the autocommit status."
 | 
					"Set or return the autocommit status."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static PyObject *
 | 
					static PyObject *
 | 
				
			||||||
psyco_conn_autocommit_get(connectionObject *self)
 | 
					psyco_conn_autocommit_get(connectionObject *self)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -237,6 +237,7 @@
 | 
				
			||||||
    <Compile Include="psycopg\green.c" />
 | 
					    <Compile Include="psycopg\green.c" />
 | 
				
			||||||
    <Compile Include="psycopg\notify_type.c" />
 | 
					    <Compile Include="psycopg\notify_type.c" />
 | 
				
			||||||
    <Compile Include="psycopg\xid_type.c" />
 | 
					    <Compile Include="psycopg\xid_type.c" />
 | 
				
			||||||
 | 
					    <Compile Include="psycopg\bytes_format.c" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
  <ProjectExtensions>
 | 
					  <ProjectExtensions>
 | 
				
			||||||
    <MonoDevelop>
 | 
					    <MonoDevelop>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,6 +35,10 @@ Global
 | 
				
			||||||
		$4.inheritsSet = VisualStudio
 | 
							$4.inheritsSet = VisualStudio
 | 
				
			||||||
		$4.inheritsScope = text/plain
 | 
							$4.inheritsScope = text/plain
 | 
				
			||||||
		$4.scope = text/x-readme
 | 
							$4.scope = text/x-readme
 | 
				
			||||||
 | 
							$0.TextStylePolicy = $5
 | 
				
			||||||
 | 
							$5.inheritsSet = VisualStudio
 | 
				
			||||||
 | 
							$5.inheritsScope = text/plain
 | 
				
			||||||
 | 
							$5.scope = text/plain
 | 
				
			||||||
		name = psycopg2
 | 
							name = psycopg2
 | 
				
			||||||
	EndGlobalSection
 | 
						EndGlobalSection
 | 
				
			||||||
EndGlobal
 | 
					EndGlobal
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -159,6 +159,11 @@ class CursorTests(unittest.TestCase):
 | 
				
			||||||
        self.assertEqual(curs.fetchall(), [(10,), (20,), (30,)])
 | 
					        self.assertEqual(curs.fetchall(), [(10,), (20,), (30,)])
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
    def test_withhold(self):
 | 
					    def test_withhold(self):
 | 
				
			||||||
 | 
					        self.assertRaises(psycopg2.ProgrammingError, self.conn.cursor, 
 | 
				
			||||||
 | 
					                          withhold=True)    
 | 
				
			||||||
 | 
					        self.assertRaises(psycopg2.ProgrammingError, self.conn.cursor, 
 | 
				
			||||||
 | 
					                          "NAME", withhold="")    
 | 
				
			||||||
 | 
					                          
 | 
				
			||||||
        curs = self.conn.cursor()
 | 
					        curs = self.conn.cursor()
 | 
				
			||||||
        curs.execute("drop table if exists withhold")
 | 
					        curs.execute("drop table if exists withhold")
 | 
				
			||||||
        curs.execute("create table withhold (data int)")
 | 
					        curs.execute("create table withhold (data int)")
 | 
				
			||||||
| 
						 | 
					@ -173,6 +178,13 @@ class CursorTests(unittest.TestCase):
 | 
				
			||||||
        curs.execute("select data from withhold order by data")
 | 
					        curs.execute("select data from withhold order by data")
 | 
				
			||||||
        self.conn.commit()
 | 
					        self.conn.commit()
 | 
				
			||||||
        self.assertEqual(curs.fetchall(), [(10,), (20,), (30,)])
 | 
					        self.assertEqual(curs.fetchall(), [(10,), (20,), (30,)])
 | 
				
			||||||
 | 
					        curs.close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        curs = self.conn.cursor("W", withhold=True)
 | 
				
			||||||
 | 
					        self.assertEqual(curs.withhold, True);
 | 
				
			||||||
 | 
					        curs.execute("select data from withhold order by data")
 | 
				
			||||||
 | 
					        self.conn.commit()
 | 
				
			||||||
 | 
					        self.assertEqual(curs.fetchall(), [(10,), (20,), (30,)])
 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
        curs = self.conn.cursor()
 | 
					        curs = self.conn.cursor()
 | 
				
			||||||
        curs.execute("drop table withhold")
 | 
					        curs.execute("drop table withhold")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user