Changeset 645 for branches/4.x


Ignore:
Timestamp:
Nov 27, 2015, 10:22:56 AM (4 years ago)
Author:
cito
Message:

Fixed small issue with large object

When an object was already unlinked, getting its attributes would
return without error, but leave an error indicator set. Also fixed
a similar issue with the destructor.

Location:
branches/4.x/module
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/4.x/module/pgmodule.c

    r639 r645  
    12461246pglarge_dealloc(pglargeobject *self)
    12471247{
    1248         if (self->lo_fd >= 0 && check_cnx_obj(self->pgcnx))
     1248        if (self->lo_fd >= 0 && self->pgcnx->valid)
    12491249                lo_close(self->pgcnx->cnx, self->lo_fd);
    12501250
     
    16131613                        return (PyObject *) (self->pgcnx);
    16141614                }
    1615 
     1615                PyErr_Clear();
    16161616                Py_INCREF(Py_None);
    16171617                return Py_None;
     
    16231623                if (check_lo_obj(self, 0))
    16241624                        return PyInt_FromLong(self->lo_oid);
    1625 
     1625                PyErr_Clear();
    16261626                Py_INCREF(Py_None);
    16271627                return Py_None;
  • branches/4.x/module/tests/test_classic_largeobj.py

    r640 r645  
    1616except ImportError:
    1717    import unittest
     18import tempfile
     19import os
    1820import sys
    19 import tempfile
    2021
    2122import pg  # the module under test
     
    3132except ImportError:
    3233    pass
     34
     35windows = os.name == 'nt'
    3336
    3437
     
    6164
    6265    def tearDown(self):
    63         self.c.query('end')
     66        self.c.query('rollback')
    6467        self.c.close()
    6568
     
    111114        finally:
    112115            del large_object
     116        self.assertIsInstance(r, str)
    113117        self.assertEqual(r, data)
    114118
    115119    def testLoImport(self):
    116         f = tempfile.NamedTemporaryFile()
     120        if windows:
     121            # NamedTemporaryFiles don't work well here
     122            fname = 'temp_test_pg_largeobj_import.txt'
     123            f = open(fname, 'wb')
     124        else:
     125            f = tempfile.NamedTemporaryFile()
     126            fname = f.name
    117127        data = 'some data to be imported'
    118128        f.write(data)
    119         f.flush()
    120         f.seek(0)
     129        if windows:
     130            f.close()
     131            f = open(fname, 'rb')
     132        else:
     133            f.flush()
     134            f.seek(0)
    121135        large_object = self.c.loimport(f.name)
    122136        try:
    123137            f.close()
     138            if windows:
     139                os.remove(fname)
    124140            self.assertIsLargeObject(large_object)
    125141            large_object.open(pg.INV_READ)
     
    149165            try:
    150166                self.obj.close()
    151             except IOError:
     167            except (SystemError, IOError):
    152168                pass
    153169            try:
    154170                self.obj.unlink()
    155             except IOError:
     171            except (SystemError, IOError):
    156172                pass
    157173        del self.obj
    158         self.pgcnx.query('end')
     174        try:
     175            self.pgcnx.query('rollback')
     176        except SystemError:
     177            pass
    159178        self.pgcnx.close()
    160179
     
    246265        seek(0, pg.SEEK_SET)
    247266        r = self.obj.read(9)
     267        self.assertIsInstance(r, str)
    248268        self.assertEqual(r, 'some data')
    249269        seek(4, pg.SEEK_CUR)
    250270        r = self.obj.read(2)
     271        self.assertIsInstance(r, str)
    251272        self.assertEqual(r, 'be')
    252273        seek(-10, pg.SEEK_CUR)
    253274        r = self.obj.read(4)
     275        self.assertIsInstance(r, str)
    254276        self.assertEqual(r, 'data')
    255277        seek(0, pg.SEEK_SET)
    256278        r = self.obj.read(4)
     279        self.assertIsInstance(r, str)
    257280        self.assertEqual(r, 'some')
    258281        seek(-6, pg.SEEK_END)
    259282        r = self.obj.read(4)
     283        self.assertIsInstance(r, str)
    260284        self.assertEqual(r, 'seek')
    261285
     
    288312        # unlinking when object is still open
    289313        self.obj.open(pg.INV_WRITE)
     314        self.assertIsNotNone(self.obj.oid)
     315        self.assertNotEqual(0, self.obj.oid)
    290316        self.assertRaises(IOError, unlink)
    291317        data = 'some data to be sold'
    292318        self.obj.write(data)
    293319        self.obj.close()
    294         oid = self.obj.oid
    295         self.assertIsInstance(oid, int)
    296         self.assertNotEqual(oid, 0)
    297         obj = self.pgcnx.getlo(oid)
    298         try:
    299             self.assertIsNot(obj, self.obj)
    300             self.assertEqual(obj.oid, oid)
    301             obj.open(pg.INV_READ)
    302             r = obj.read(80)
    303             obj.close()
    304             self.assertEqual(r, data)
    305         finally:
    306             del obj
     320        # unlinking after object has been closed
    307321        unlink()
    308322        self.assertIsNone(self.obj.oid)
     
    355369        self.assertRaises(TypeError, export, 0)
    356370        self.assertRaises(TypeError, export, 'invalid', 0)
    357         f = tempfile.NamedTemporaryFile()
     371        if windows:
     372            # NamedTemporaryFiles don't work well here
     373            fname = 'temp_test_pg_largeobj_export.txt'
     374            f = open(fname, 'wb')
     375        else:
     376            f = tempfile.NamedTemporaryFile()
     377            fname = f.name
    358378        data = 'some data to be exported'
    359379        self.obj.open(pg.INV_WRITE)
     
    362382        self.assertRaises(IOError, export, f.name)
    363383        self.obj.close()
    364         export(f.name)
     384        export(fname)
    365385        r = f.read()
    366386        f.close()
Note: See TracChangeset for help on using the changeset viewer.