diff RestDbInterface.py @ 4:e3ee1f358fe6

new version that doesn't use ZSQLExtend but the database connection more directly. new templates to go with that (returned data structures are different)
author casties
date Mon, 07 Jun 2010 14:02:17 +0000
parents 61a3764cd5fb
children 7539a9e69365
line wrap: on
line diff
--- a/RestDbInterface.py	Wed Jun 02 15:44:03 2010 +0000
+++ b/RestDbInterface.py	Mon Jun 07 14:02:17 2010 +0000
@@ -15,6 +15,8 @@
 #from zope.publisher.interfaces import NotFound 
 #from zope.app import zapi 
 #from zope.component import queryMultiAdapter
+import Shared.DC.ZRDB.DA
+from Products.ZSQLMethods.SQL import SQLConnectionIDs
 
 
 class RestDbInterface(Folder):
@@ -26,6 +28,12 @@
     implements(IPublishTraverse)
     
     meta_type="RESTdb"
+    manage_options=Folder.manage_options+(
+        {'label':'Config','action':'manage_editRestDbInterfaceForm'},
+        )
+
+    # management templates
+    manage_editRestDbInterfaceForm=PageTemplateFile('zpt/editRestDbInterface',globals())
 
     # data templates
     XML_list_schemas = PageTemplateFile('zpt/XML_list_schemas', globals())
@@ -37,13 +45,54 @@
 
     
     
-    def __init__(self, id, title):
+    def __init__(self, id, title, connection_id=None):
         """init"""
         self.id = id
         self.title = title
+        # database connection id
+        self.connection_id = connection_id
         # create template folder
         self.manage_addFolder('template')
 
+
+    def getCursor(self):
+        """returns fresh DB cursor"""
+        conn = getattr(self,"_v_database_connection",None)
+        if conn is None:
+            # create a new connection object
+            try:
+                if self.connection_id is None:
+                    # try to take the first existing ID
+                    connids = SQLConnectionIDs(self)
+                    if len(connids) > 0:
+                        connection_id = connids[0][0]
+                        self.connection_id = connection_id
+                        logging.debug("connection_id: %s"%repr(connection_id))
+
+                da = getattr(self, self.connection_id)
+                da.connect('')
+                # we copy the DAs database connection
+                conn = da._v_database_connection
+                #conn._register() # register with the Zope transaction system
+                self._v_database_connection = conn
+            except Exception, e:
+                raise IOError("No database connection! (%s)"%str(e))
+        
+        cursor = conn.getCursor()
+        return cursor
+    
+    def executeSQL(self, query, *args):
+        """execute query with args on database and return all results.
+        result format: {"fields":fields, "rows":data}"""
+        cur = self.getCursor()
+        cur.execute(query, args)
+        # description of returned fields 
+        fields = cur.description
+        # get all data in an array
+        data = cur.fetchall()
+        cur.close()
+        return {"fields":fields, "rows":data}
+
     
     def publishTraverse(self,request,name):
         """change the traversal"""
@@ -91,7 +140,7 @@
         # don't know what to do
         return str(REQUEST)
 
- 
+
     def showTable(self,format='XML',schema='public',table=None):
         """returns PageTemplate with tables"""
         logging.debug("showtable")
@@ -106,8 +155,7 @@
     def getTable(self,schema='public',table=None,username='guest'):
         """return table data"""
         logging.debug("gettable")
-        qstr="select * from %s"%table
-        data=self.ZSQLSimpleSearch(qstr)
+        data = self.executeSQL("select * from %s"%table)
         return data
 
     def showListOfTables(self,format='XML',schema='public'):
@@ -129,7 +177,7 @@
             WHERE c.relkind IN ('r','') AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
             AND pg_catalog.pg_table_is_visible(c.oid)"""
         #qstr="select attname, format_type(pg_attribute.atttypid, pg_attribute.atttypmod) from pg_attribute, pg_class where attrelid = pg_class.oid and pg_attribute.attnum > 0"
-        data=self.ZSQLSimpleSearch(qstr)
+        data=self.executeSQL(qstr)
         return data
 
     def showListOfSchemas(self,format='XML'):
@@ -146,10 +194,22 @@
         """return list of schemas"""
         logging.debug("getlistofschemas")
         # TODO: really look up schemas
-        data=['public']
+        data={'fields':'schemas','data':'public'}
         return data
 
         
+    def manage_editRestDbInterface(self, title=None, connection_id=None,
+                     REQUEST=None):
+        """Change the object"""
+        if title is not None:
+            self.title = title
+            
+        if connection_id is not None:
+            self.connection_id = connection_id
+                
+        #checkPermission=getSecurityManager().checkPermission
+        REQUEST.RESPONSE.redirect('manage_main')
+
         
 manage_addRestDbInterfaceForm=PageTemplateFile('zpt/addRestDbInterface',globals())