Browse Source

[1179] use N instead of O where we have constructors in BuildValue

Jelte Jansen 13 years ago
parent
commit
6d6353cea4

+ 2 - 1
src/lib/python/isc/datasrc/client_python.cc

@@ -90,7 +90,8 @@ DataSourceClient_findZone(PyObject* po_self, PyObject* args) {
 
 
             result::Result r = find_result.code;
             result::Result r = find_result.code;
             ZoneFinderPtr zfp = find_result.zone_finder;
             ZoneFinderPtr zfp = find_result.zone_finder;
-            return Py_BuildValue("IO", r, createZoneFinderObject(zfp));
+            // Use N instead of O so refcount isn't increased twice
+            return (Py_BuildValue("IN", r, createZoneFinderObject(zfp)));
         } catch (const std::exception& exc) {
         } catch (const std::exception& exc) {
             PyErr_SetString(getDataSourceException("Error"), exc.what());
             PyErr_SetString(getDataSourceException("Error"), exc.what());
             return (NULL);
             return (NULL);

+ 3 - 3
src/lib/python/isc/datasrc/finder_python.cc

@@ -132,10 +132,10 @@ PyObject* ZoneFinder_find(PyObject* po_self, PyObject* args) {
             ZoneFinder::Result r = find_result.code;
             ZoneFinder::Result r = find_result.code;
             isc::dns::ConstRRsetPtr rrsp = find_result.rrset;
             isc::dns::ConstRRsetPtr rrsp = find_result.rrset;
             if (rrsp) {
             if (rrsp) {
-                return Py_BuildValue("IO", r, isc::dns::python::createRRsetObject(*rrsp));
+                // Use N instead of O so the refcount isn't increased twice
+                return (Py_BuildValue("IN", r, isc::dns::python::createRRsetObject(*rrsp)));
             } else {
             } else {
-                Py_INCREF(Py_None);
-                return Py_BuildValue("IO", r, Py_None);
+                return (Py_BuildValue("IO", r, Py_None));
             }
             }
         } catch (const DataSourceError& dse) {
         } catch (const DataSourceError& dse) {
             PyErr_SetString(getDataSourceException("Error"), dse.what());
             PyErr_SetString(getDataSourceException("Error"), dse.what());

+ 1 - 1
src/lib/python/isc/datasrc/tests/datasrc_test.py

@@ -145,13 +145,13 @@ class DataSrcClient(unittest.TestCase):
                           None,
                           None,
                           "foo")
                           "foo")
 
 
+
 class DataSrcUpdater(unittest.TestCase):
 class DataSrcUpdater(unittest.TestCase):
 
 
     def setUp(self):
     def setUp(self):
         # Make a fresh copy of the writable database with all original content
         # Make a fresh copy of the writable database with all original content
         shutil.copyfile(READ_ZONE_DB_FILE, WRITE_ZONE_DB_FILE)
         shutil.copyfile(READ_ZONE_DB_FILE, WRITE_ZONE_DB_FILE)
 
 
-
     def test_update_delete_commit(self):
     def test_update_delete_commit(self):
         dsc = isc.datasrc.DataSourceClient(WRITE_ZONE_DB_FILE)
         dsc = isc.datasrc.DataSourceClient(WRITE_ZONE_DB_FILE)
 
 

+ 2 - 2
src/lib/python/isc/datasrc/updater_python.cc

@@ -188,9 +188,9 @@ PyObject* ZoneUpdater_find(PyObject* po_self, PyObject* args) {
             ZoneFinder::Result r = find_result.code;
             ZoneFinder::Result r = find_result.code;
             isc::dns::ConstRRsetPtr rrsp = find_result.rrset;
             isc::dns::ConstRRsetPtr rrsp = find_result.rrset;
             if (rrsp) {
             if (rrsp) {
-                return Py_BuildValue("IO", r, isc::dns::python::createRRsetObject(*rrsp));
+                // Use N instead of O so the refcount isn't increased twice
+                return Py_BuildValue("IN", r, isc::dns::python::createRRsetObject(*rrsp));
             } else {
             } else {
-                Py_INCREF(Py_None);
                 return Py_BuildValue("IO", r, Py_None);
                 return Py_BuildValue("IO", r, Py_None);
             }
             }
         } catch (const DataSourceError& dse) {
         } catch (const DataSourceError& dse) {