Explorar o código

[librdbms] Convert JDBC interface to basic DB 2.0

Romain Rigaux %!s(int64=10) %!d(string=hai) anos
pai
achega
382ef4bca5

+ 54 - 30
desktop/libs/librdbms/src/librdbms/jdbc.py

@@ -46,36 +46,60 @@ class Jdbc():
     if self.conn is None:
       self.conn = self.gateway.jvm.java.sql.DriverManager.getConnection(self.db_url, self.username, self.password)
 
-  def execute(self, statement):
-    stmt = self.conn.createStatement()
-
-    try:
-      rs = stmt.executeQuery(statement)
-
-      try:
-        md = rs.getMetaData()
-
-        rs_meta = [{
-            'name': md.getColumnName(i + 1),
-            'type': md.getColumnTypeName(i + 1),
-            'length': md.getColumnDisplaySize(i + 1),
-            'precision': md.getPrecision(i + 1),
-          } for i in xrange(md.getColumnCount())]
-
-        res = []
-        while rs.next():
-          row = []
-          for c in xrange(md.getColumnCount()):
-            row.append(rs.getString(c + 1))
-          res.append(row)
-
-        return res, rs_meta
-      finally:
-        rs.close()
-    finally:
-      stmt.close()
-
-  def disconnect(self):
+  def cursor(self):
+    return Cursor(self.conn)
+
+  def close(self):
     if self.conn is not None:
       self.conn.close()
       self.conn = None
+
+
+class Cursor():
+  """Similar to DB-API 2.0 Cursor interface"""
+
+  def __init__(self, conn):
+    self.conn = conn
+    self.stmt = None
+    self.rs = None
+    self._meta = None
+
+  def execute(self, statement):
+    self.stmt = self.conn.createStatement()
+    self.rs = self.stmt.executeQuery(statement)
+    self._meta = self.rs.getMetaData()
+
+  def fetchmany(self, n):
+    res = []
+
+    while self.rs.next() and n > 0:
+      row = []
+      for c in xrange(self._meta.getColumnCount()):
+        row.append(self.rs.getObject(c + 1))
+      res.append(row)
+      n -= 1
+
+    return res
+
+  @property
+  def description(self):
+    return [[
+        self._meta.getColumnName(i),
+        self._meta.getColumnTypeName(i),
+        self._meta.getColumnDisplaySize(i),
+        self._meta.getColumnDisplaySize(i),
+        self._meta.getPrecision(i),
+        self._meta.getScale(i),
+        self._meta.isNullable(i),
+      ] for i in xrange(1, self._meta.getColumnCount() + 1)]
+
+  def close(self):
+    self._meta = None
+
+    if self.rs is not None:
+      self.rs.close()
+      self.rs = None
+
+    if self.stmt is not None:
+      self.stmt.close()
+      self.stmt = None

+ 9 - 5
desktop/libs/notebook/src/notebook/connectors/jdbc.py

@@ -64,10 +64,14 @@ class JDBCApi(Api):
     db = Jdbc(jclassname, url, user, password)
     db.connect()
 
+    curs = db.cursor()
+    curs.execute(snippet['statement'])
 
-    data, meta = db.execute(snippet['statement'])
+    data = curs.fetchmany(100)
+    description = curs.description
 
-    db.disconnect()
+    curs.close()
+    db.close()
 
     return {
       'sync': True,
@@ -76,10 +80,10 @@ class JDBCApi(Api):
         'has_more': False,
         'data': list(data),
         'meta': [{
-          'name': column['name'],
-          'type': column['type'],
+          'name': col[0],
+          'type': col[1],
           'comment': ''
-        } for column in meta],
+        } for col in description],
         'type': 'table'
       }
     }