Merge from trunk
[plcapi.git] / trunk / psycopg2 / lib / psycopg1.py
diff --git a/trunk/psycopg2/lib/psycopg1.py b/trunk/psycopg2/lib/psycopg1.py
new file mode 100644 (file)
index 0000000..d539888
--- /dev/null
@@ -0,0 +1,87 @@
+"""psycopg 1.1.x compatibility module
+
+This module uses the new style connection and cursor types to build a psycopg
+1.1.1.x compatibility layer. It should be considered a temporary hack to run
+old code while porting to psycopg 2. Import it as follows::
+
+    from psycopg2 import psycopg1 as psycopg
+"""
+# psycopg/psycopg1.py - psycopg 1.1.x compatibility module
+#
+# Copyright (C) 2003-2004 Federico Di Gregorio  <fog@debian.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY
+# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+
+import _psycopg as _2psycopg
+from psycopg2.extensions import cursor as _2cursor
+from psycopg2.extensions import connection as _2connection
+
+from psycopg2 import *
+del connect
+
+
+def connect(*args, **kwargs):
+    """connect(dsn, ...) -> new psycopg 1.1.x compatible connection object"""
+    kwargs['connection_factory'] = connection
+    conn = _2psycopg.connect(*args, **kwargs)
+    conn.set_isolation_level(2)
+    return conn
+    
+class connection(_2connection):
+    """psycopg 1.1.x connection."""
+    
+    def cursor(self):
+        """cursor() -> new psycopg 1.1.x compatible cursor object"""
+        return _2connection.cursor(self, cursor_factory=cursor)
+
+    def autocommit(self, on_off=1):
+        """autocommit(on_off=1) -> switch autocommit on (1) or off (0)"""
+        if on_off > 0:
+            self.set_isolation_level(0)
+        else:
+            self.set_isolation_level(2)
+            
+
+class cursor(_2cursor):
+    """psycopg 1.1.x cursor.
+
+    Note that this cursor implements the exact procedure used by psycopg 1 to
+    build dictionaries out of result rows. The DictCursor in the
+    psycopg.extras modules implements a much better and faster algorithm.
+    """
+
+    def __build_dict(self, row):
+        res = {}
+        for i in range(len(self.description)):
+            res[self.description[i][0]] = row[i]
+        return res
+    
+    def dictfetchone(self):
+        row = _2cursor.fetchone(self)
+        if row:
+            return self.__build_dict(row)
+        else:
+            return row
+            
+    def dictfetchmany(self, size):
+        res = []
+        rows = _2cursor.fetchmany(self, size)
+        for row in rows:
+            res.append(self.__build_dict(row))
+        return res
+    
+    def dictfetchall(self):
+        res = []
+        rows = _2cursor.fetchall(self)
+        for row in rows:
+            res.append(self.__build_dict(row))
+        return res
+