Russ,

On 22/06/10 16:43, bobbysmith007 wrote:
I am trying to port all of the plugins I maintain to trac 12 (Timing and
Estimation and Estimator primarily).

We've been thinking about this too. I asked a couple of questions on IRC, but not come up with anything great yet.

Attached is what we have so far, but it's not at all good. Mostly kind of a hack to "make it work" for now...

I think the dbhelper.py layer functions are not so necessary these days, and it could be easier to read without them?

(note the revision numbers are not those of trac-hacks.org)

Regards,

 Nick

--
[email protected] | www.logica.com
Logica UK Limited, registered in England & Wales (registered number 947968)
Registered Office: 250 Brook Drive, Green Park, Reading RG2 6UA, United Kingdom

Sorry for this disclaimer:
Index: 
trunk/plugins/open/timingandestimationplugin/timingandestimationplugin/api.py
===================================================================
--- 
trunk/plugins/open/timingandestimationplugin/timingandestimationplugin/api.py   
    (revision 325)
+++ 
trunk/plugins/open/timingandestimationplugin/timingandestimationplugin/api.py   
    (revision 452)
@@ -72,6 +72,6 @@
         # Legacy support hack (supports upgrades from 0.1.6 to 0.1.7)
         if self.db_installed_version == 0:
+            report_version = dbhelper.db_table_exists(self, 'report_version');
             bill_date = dbhelper.db_table_exists(self, 'bill_date');
-            report_version = dbhelper.db_table_exists(self, 'report_version');
             if bill_date and report_version:
                 self.db_installed_version = 1
Index: 
trunk/plugins/open/timingandestimationplugin/timingandestimationplugin/dbhelper.py
===================================================================
--- 
trunk/plugins/open/timingandestimationplugin/timingandestimationplugin/dbhelper.py
  (revision 325)
+++ 
trunk/plugins/open/timingandestimationplugin/timingandestimationplugin/dbhelper.py
  (revision 452)
@@ -2,58 +2,31 @@
 def get_all(com, sql, *params):
     """Executes the query and returns the (description, data)"""
-    db = com.env.get_db_cnx()
+    db = com.env.get_read_db()
     cur = db.cursor()
     desc  = None
     data = None
-    try:
-        cur.execute(sql, params)
-        data = list(cur.fetchall())
-        desc = cur.description
-        db.commit();
-    except Exception, e:
-        com.log.error('There was a problem executing sql:%s \n \
-with parameters:%s\nException:%s'%(sql, params, e));
-        db.rollback();
-    try:
-        db.close()
-    except:
-        pass
-
+    cur.execute(sql, params)
+    data = list(cur.fetchall())
+    desc = cur.description
     return (desc, data)
 
 def execute_non_query(com,  sql, *params):
     """Executes the query on the given project"""
-    db = com.env.get_db_cnx()
+    @com.env.with_transaction()
+    def do_execute(db):
+        cur = db.cursor()
+        cur.execute(sql, params)
+
+def get_first_row(com,  sql, *params):
+    """ Returns the first row of the query results as a tuple of values (or 
None)"""
+    db = com.env.get_read_db()
     cur = db.cursor()
     try:
         cur.execute(sql, params)
-        db.commit()
+        return cur.fetchone()
     except Exception, e:
         com.log.error('There was a problem executing sql:%s \n \
-with parameters:%s\nException:%s'%(sql, params, e));
-        db.rollback();
-    try:
-        db.close()
-    except:
-        pass
-
-def get_first_row(com,  sql,*params):
-    """ Returns the first row of the query results as a tuple of values (or 
None)"""
-    db = com.env.get_db_cnx()
-    cur = db.cursor()
-    data = None;
-    try:
-        cur.execute(sql, params)
-        data = cur.fetchone();
-        db.commit();
-    except Exception, e:
-        com.log.error('There was a problem executing sql:%s \n \
-        with parameters:%s\nException:%s'%(sql, params, e));
-        db.rollback()
-    try:
-        db.close()
-    except:
-        pass
-    return data;
+        with parameters:%s\nException:%s'%(sql, params, e))
+        return None
 
 def get_scalar(com, sql, col=0, *params):
@@ -66,39 +39,21 @@
 
 def execute_in_trans(com, *args):
-    db = com.env.get_db_cnx()
-    cur = db.cursor()
-    result = True
-    try:
+    @com.env.with_transaction()
+    def do_execute(db):
+        cur = db.cursor()
         for sql, params in args:
             cur.execute(sql, params)
-        db.commit()
-    except Exception, e:
-        com.log.error('There was a problem executing sql:%s \n \
-        with parameters:%s\nException:%s'%(sql, params, e));
-        db.rollback();
-        result = e
-    try:
-        db.close()
-    except:
-        pass
-    return result
+        return True
 
 def db_table_exists(com,  table):
-    db = com.env.get_db_cnx()
-    sql = "SELECT * FROM %s LIMIT 1" % table;
-    cur = db.cursor()
-    has_table = True;
-    try:
-        cur.execute(sql)
-        db.commit()
-    except Exception, e:
-        has_table = False
-        db.rollback()
-
-    try:
-        db.close()
-    except:
-        pass
-    return has_table
+    @com.env.with_transaction()
+    def do_check(db):
+        sql = "SELECT * FROM %s LIMIT 1" % table;
+        cur = db.cursor()
+        try:
+            cur.execute(sql)
+        except Exception, e:
+            return False
+        return True
 
 def get_column_as_list(com, sql, col=0, *params):
@@ -110,10 +65,5 @@
 
 def set_system_value(com, key, value):
-    if get_system_value(com, key):
-        execute_non_query(com, "UPDATE system SET value=%s WHERE name=%s", 
value, key)
-    else:
-        execute_non_query(com, "INSERT INTO system (value, name) VALUES (%s, 
%s)",
-            value, key)
-
+    execute_non_query(com, "REPLACE INTO system (value, name) VALUES (%s, 
%s)", value, key)
 
 def get_result_set(com, sql, *params):
Index: 
trunk/plugins/open/timingandestimationplugin/timingandestimationplugin/reportmanager.py
===================================================================
--- 
trunk/plugins/open/timingandestimationplugin/timingandestimationplugin/reportmanager.py
     (revision 325)
+++ 
trunk/plugins/open/timingandestimationplugin/timingandestimationplugin/reportmanager.py
     (revision 452)
@@ -1,5 +1,4 @@
 from trac.core import *
-
-
+from trac.db.postgres_backend import PostgreSQLConnection
 
 class CustomReportManager:
@@ -18,22 +17,22 @@
   def upgrade(self):  
     # Check to see what version we have
-    db = self.env.get_db_cnx()
-    cursor = db.cursor()
-    cursor.execute("SELECT value FROM system WHERE name=%s", (self.name,))
-    try:
-      version = int(cursor.fetchone()[0])
-    except:
-      version = 0
-      cursor.execute("INSERT INTO system (name,value) VALUES(%s,%s)",
-                     (self.name, version))
-        
-    if version > self.version:
-      raise TracError("Fatal Error: You appear to be running two plugins with 
conflicting versions "
-                      "of the CustomReportManager class. Please ensure that 
'%s' is updated to "
-                      "version %s of the file reportmanager.py (currently 
using version %s)."
-                      % (__name__, str(version), str(self.version)))
-    
-    # Do the staged updates
-    try:
+    @self.env.with_transaction()
+    def do_upgrade(db):
+      cursor = db.cursor()
+      cursor.execute("SELECT value FROM system WHERE name=%s", (self.name,))
+      try:
+        version = int(cursor.fetchone()[0])
+      except:
+        version = 0
+        cursor.execute("INSERT INTO system (name,value) VALUES(%s,%s)",
+                       (self.name, version))
+
+      if version > self.version:
+        raise TracError("Fatal Error: You appear to be running two plugins 
with conflicting versions "
+                        "of the CustomReportManager class. Please ensure that 
'%s' is updated to "
+                        "version %s of the file reportmanager.py (currently 
using version %s)."
+                        % (__name__, str(version), str(self.version)))
+
+      # Do the staged updates
       if version < 1:
         cursor.execute("CREATE TABLE custom_report ("
@@ -51,10 +50,4 @@
       cursor.execute("UPDATE system SET value=%s WHERE name=%s", 
                      (self.version, self.name))
-      db.commit()
-      db.close()
-    
-    except Exception, e:
-      self.log.error("CustomReportManager Exception: %s" % (e,));
-      db.rollback()
 
   def get_report_id_and_version (self, uuid):
@@ -86,10 +79,12 @@
                            "VALUES (%s, %s, %s, %s, %s, %s)",
                            (next_id, uuid, maingroup, subgroup, version, 
ordering)))
-    self.log.debug("Attempting to increment sequence (only works in postgres)")
-    try:
-      self.execute_in_trans(("SELECT nextval('report_id_seq');",[]));
-      self.log.debug("Sequence updated");
-    except:
-      self.log.debug("Sequence failed to update, perhaps you are not running 
postgres?");
+
+    if isinstance(self.env.get_read_db().cnx, PostgreSQLConnection):
+      self.log.debug("Attempting to increment sequence (only works in 
postgres)")
+      try:
+        self.execute_in_trans(("SELECT nextval('report_id_seq');",[]));
+        self.log.debug("Sequence updated");
+      except:
+        self.log.debug("Sequence failed to update, perhaps you are not running 
postgres?");
 
   def _update_report (self, id, title, author, description, query,
@@ -136,5 +131,5 @@
   def get_reports_by_group(self, group):
     """Gets all of the reports for a given group"""
-    db = self.env.get_db_cnx()
+    db = self.env.get_read_db()
     cursor = db.cursor()
     rv = {}
@@ -156,5 +151,5 @@
   def get_version_hash_by_group(self, group):
     """Gets all of the reports for a given group as a uuid=>version hash"""
-    db = self.env.get_db_cnx()
+    db = self.env.get_read_db()
     cursor = db.cursor()
     rv = {}
@@ -173,22 +168,15 @@
   # similar functions are found in dbhelper, but this file should be fairly
   # stand alone so that it can be copied and pasted around
-  def get_first_row(self, sql,*params):
+  def get_first_row(self, sql, *params):
     """ Returns the first row of the query results as a tuple of values (or 
None)"""
-    db = self.env.get_db_cnx()
+    db = self.env.get_read_db()
     cur = db.cursor()
-    data = None;
     try:
       cur.execute(sql, params)
-      data = cur.fetchone();
-      db.commit();
+      return cur.fetchone()
     except Exception, e:
       self.log.error('There was a problem executing sql:%s \n \
       with parameters:%s\nException:%s'%(sql, params, e));
-      db.rollback()
-    try:
-      db.close()
-    except:
-      pass
-    return data;
+      return None
 
   def get_scalar(self, sql, col=0, *params):
@@ -201,21 +189,8 @@
 
   def execute_in_trans(self, *args):
-    success = True
-    db = self.env.get_db_cnx()
-    cur = db.cursor()
-    try:
+    @self.env.with_transaction()
+    def do_execute(db):
+      cur = db.cursor()
       for sql, params in args:
         cur.execute(sql, params)
-      db.commit()
-    except Exception, e:
-      self.log.error('There was a problem executing sql:%s \n \
-      with parameters:%s\nException:%s'%(sql, params, e));
-      db.rollback();
-      success = False
-    try:
-      db.close()
-    except:
-      pass
-    return success
-
-    
+      return True
-- 
You received this message because you are subscribed to the Google Groups "Trac 
Users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/trac-users?hl=en.

Reply via email to