[pypy-svn] r69632 - in pypy/trunk/pypy/module/oracle: . test

afa at codespeak.net afa at codespeak.net
Wed Nov 25 13:24:07 CET 2009


Author: afa
Date: Wed Nov 25 13:24:06 2009
New Revision: 69632

Modified:
   pypy/trunk/pypy/module/oracle/__init__.py
   pypy/trunk/pypy/module/oracle/interp_lob.py
   pypy/trunk/pypy/module/oracle/interp_variable.py
   pypy/trunk/pypy/module/oracle/test/test_lobvar.py
Log:
Implement ExternalLob.trim() + tests for CLOB


Modified: pypy/trunk/pypy/module/oracle/__init__.py
==============================================================================
--- pypy/trunk/pypy/module/oracle/__init__.py	(original)
+++ pypy/trunk/pypy/module/oracle/__init__.py	Wed Nov 25 13:24:06 2009
@@ -18,6 +18,7 @@
         'FIXED_CHAR': 'interp_variable.VT_FixedChar',
         'CURSOR': 'interp_variable.VT_Cursor',
         'BLOB': 'interp_variable.VT_BLOB',
+        'CLOB': 'interp_variable.VT_CLOB',
         'Variable': 'interp_variable.W_Variable',
         'Timestamp': 'interp_error.get(space).w_DateTimeType',
         'Date': 'interp_error.get(space).w_DateType',

Modified: pypy/trunk/pypy/module/oracle/interp_lob.py
==============================================================================
--- pypy/trunk/pypy/module/oracle/interp_lob.py	(original)
+++ pypy/trunk/pypy/module/oracle/interp_lob.py	Wed Nov 25 13:24:06 2009
@@ -2,6 +2,9 @@
 from pypy.interpreter.typedef import TypeDef
 from pypy.interpreter.gateway import ObjSpace
 from pypy.interpreter.gateway import interp2app
+from pypy.interpreter.error import OperationError
+
+from pypy.module.oracle.interp_error import get
 
 class W_ExternalLob(Wrappable):
     def __init__(self, var, pos):
@@ -26,6 +29,11 @@
         return space.wrap(self.lobVar.getLength(space, self.pos))
     size.unwrap_spec=['self', ObjSpace]
 
+    def trim(self, space, newSize=0):
+        self._verify(space)
+        self.lobVar.trim(space, self.pos, newSize)
+    trim.unwrap_spec=['self', ObjSpace, int]
+
     def desc_str(self, space):
         return self.read(space, offset=1, amount=-1)
     desc_str.unwrap_spec=['self', ObjSpace]
@@ -36,6 +44,8 @@
                       unwrap_spec=W_ExternalLob.read.unwrap_spec),
     size = interp2app(W_ExternalLob.size,
                       unwrap_spec=W_ExternalLob.size.unwrap_spec),
+    trim = interp2app(W_ExternalLob.trim,
+                      unwrap_spec=W_ExternalLob.trim.unwrap_spec),
     __str__ = interp2app(W_ExternalLob.desc_str,
                          unwrap_spec=W_ExternalLob.desc_str.unwrap_spec),
     )

Modified: pypy/trunk/pypy/module/oracle/interp_variable.py
==============================================================================
--- pypy/trunk/pypy/module/oracle/interp_variable.py	(original)
+++ pypy/trunk/pypy/module/oracle/interp_variable.py	Wed Nov 25 13:24:06 2009
@@ -958,18 +958,7 @@
 
     def setValueProc(self, space, pos, w_value):
         self.ensureTemporary(space, pos)
-
-        # trim the current value
-        status = roci.OCILobTrim(
-            self.connection.handle,
-            self.environment.errorHandle,
-            self.getDataptr(pos)[0],
-            0)
-        self.environment.checkForError(
-            status,
-            "LobVar_SetValue(): trim")
-
-        # set the value
+        self.trim(space, pos, 0)
         self.write(space, pos, w_value, 1)
 
     def getLength(self, space, pos):
@@ -988,6 +977,16 @@
         finally:
             lltype.free(lengthptr, flavor='raw')
 
+    def trim(self, space, pos, newSize):
+        status = roci.OCILobTrim(
+            self.connection.handle,
+            self.environment.errorHandle,
+            self.getDataptr(pos)[0],
+            newSize)
+        self.environment.checkForError(
+            status,
+            "LobVar_Trim()")
+
     def read(self, space, pos, offset, amount):
         # modify the arguments
         if offset <= 0:

Modified: pypy/trunk/pypy/module/oracle/test/test_lobvar.py
==============================================================================
--- pypy/trunk/pypy/module/oracle/test/test_lobvar.py	(original)
+++ pypy/trunk/pypy/module/oracle/test/test_lobvar.py	Wed Nov 25 13:24:06 2009
@@ -30,5 +30,31 @@
         assert lob.size() == len(longString)
         assert lob.read() == longString
 
-class AppTestLob(LobTests, OracleTestBase):
+    def test_trim(self):
+        inputType = getattr(oracle, self.lobType)
+
+        cur = self.cnx.cursor()
+        try:
+            cur.execute("drop table pypy_temp_lobtable")
+        except oracle.DatabaseError:
+            pass
+        cur.execute("create table pypy_temp_lobtable "
+                    "(lobcol %s)" % self.lobType)
+
+        longString = "X" * 75000
+        cur.setinputsizes(lob=inputType)
+        cur.execute("insert into pypy_temp_lobtable values (:lob)",
+                    lob=longString)
+        cur.execute("select lobcol from pypy_temp_lobtable")
+        lob, = cur.fetchone()
+        assert lob.size() == 75000
+        lob.trim(25000)
+        assert lob.size() == 25000
+        lob.trim()
+        assert lob.size() == 0
+
+class AppTestBlob(LobTests, OracleTestBase):
     lobType = "BLOB"
+
+class AppTestClob(LobTests, OracleTestBase):
+    lobType = "CLOB"



More information about the Pypy-commit mailing list