Răsfoiți Sursa

[libdbms] Support JDBC statements without any result set

e.g.
use db, insert, delete...
Romain Rigaux 10 ani în urmă
părinte
comite
1fc39a6

+ 19 - 8
desktop/libs/librdbms/src/librdbms/jdbc.py

@@ -31,19 +31,20 @@ except ImportError, e:
 
 
 def query_and_fetch(db, statement, n=None):
+  data = None
   try:
     db.connect()
-
     curs = db.cursor()
 
     try:
-      curs.execute(statement)
-
-      return curs.fetchmany(n), curs.description
+      if curs.execute(statement):
+        data = curs.fetchmany(n)
+      meta = curs.description
+      return data, meta
     finally:
       curs.close()
   finally:
-    db.close()  
+    db.close()
 
 
 class Jdbc():
@@ -85,8 +86,15 @@ class Cursor():
 
   def execute(self, statement):
     self.stmt = self.conn.createStatement()
-    self.rs = self.stmt.executeQuery(statement)
-    self._meta = self.rs.getMetaData()
+    has_rs = self.stmt.execute(statement)
+
+    if has_rs:
+      self.rs = self.stmt.getResultSet()
+      self._meta = self.rs.getMetaData()
+    else:
+      self._meta = self.stmt.getUpdateCount()
+
+    return has_rs
 
   def fetchmany(self, n=None):
     res = []
@@ -110,7 +118,10 @@ class Cursor():
 
   @property
   def description(self):
-    return [[
+    if not self.rs:
+      return self._meta
+    else:
+      return [[
         self._meta.getColumnName(i),
         self._meta.getColumnTypeName(i),
         self._meta.getColumnDisplaySize(i),

+ 2 - 2
desktop/libs/notebook/src/notebook/api.py

@@ -84,7 +84,7 @@ def execute(request):
   response['handle'] = get_api(request.user, snippet, request.fs, request.jt).execute(notebook, snippet)
 
   # Materialize and HTML escape results
-  if response['handle'].get('sync') and 'data' in response['handle']['result']:
+  if response['handle'].get('sync') and response['handle']['result'].get('data'):
     response['handle']['result']['data'] = escape_rows(response['handle']['result']['data'])
 
   response['status'] = 0
@@ -121,7 +121,7 @@ def fetch_result_data(request):
   response['result'] = get_api(request.user, snippet, request.fs, request.jt).fetch_result(notebook, snippet, rows, start_over)
 
   # Materialize and HTML escape results
-  if 'data' in response['result']:
+  if response['result'].get('data'):
     response['result']['data'] = escape_rows(response['result']['data'])
 
   response['status'] = 0

+ 4 - 3
desktop/libs/notebook/src/notebook/connectors/jdbc.py

@@ -52,18 +52,19 @@ class JdbcApi(Api):
   @query_error_handler
   def execute(self, notebook, snippet):
     data, description = query_and_fetch(self.db, snippet['statement'], 100)
+    has_result_set = data is not None
 
     return {
       'sync': True,
-      'has_result_set': True,
+      'has_result_set': has_result_set,
       'result': {
         'has_more': False,
-        'data': data,
+        'data': data if has_result_set else [],
         'meta': [{
           'name': col[0],
           'type': col[1],
           'comment': ''
-        } for col in description],
+        } for col in description] if has_result_set else [],
         'type': 'table'
       }
     }