Index: trunk/packages/invirt-remote-server/debian/changelog
===================================================================
--- trunk/packages/invirt-remote-server/debian/changelog	(revision 1727)
+++ trunk/packages/invirt-remote-server/debian/changelog	(revision 1728)
@@ -1,2 +1,10 @@
+invirt-remote-server (0.1.3) unstable; urgency=low
+
+  * Switched to using "raw" select expressions instead of using the ORM;
+    allows the same speed as the old object-based system but without any
+    caching necessary.
+
+ -- Quentin Smith <quentin@mit.edu>  Fri, 21 Nov 2008 04:15:50 -0500
+
 invirt-remote-server (0.1.2) unstable; urgency=low
 
Index: trunk/packages/invirt-remote-server/files/usr/sbin/invirt-remconffs
===================================================================
--- trunk/packages/invirt-remote-server/files/usr/sbin/invirt-remconffs	(revision 1727)
+++ trunk/packages/invirt-remote-server/files/usr/sbin/invirt-remconffs	(revision 1728)
@@ -6,4 +6,5 @@
 from syslog import *
 from time import time
+import sqlalchemy as sa
 
 from invirt import database
@@ -28,5 +29,4 @@
         """
         super(RemConfFS, self).__init__(*args, **kw)
-        self.lasttime = 0
         self.fuse_args.add("allow_other", True)
         
@@ -43,10 +43,4 @@
         return m
     
-    def recache(self):
-        if time() - self.lasttime > 5:
-            self.lasttime = time()
-            database.clear_cache()
-            self.machines = dict((machine.name, machine) for machine in database.session.query(database.Machine).all())
-    
     def getroot(self, **kw):
         return ['acl', 'conf']
@@ -55,8 +49,12 @@
         """Build the ACL file for a machine
         """
-        self.recache()
-        machine = self.machines[machine]
-        users = [acl.user for acl in machine.acl]
-        return "\n".join(map(self.userToPrinc, users)
+        s = sa.sql.select([database.machine_access_table.c.user], # Field to select from
+                          sa.sql.and_( # where clause
+                database.machine_table.c.machine_id==database.machine_access_table.c.machine_id, # join field
+                database.machine_table.c.name == machine), # filter field
+                          from_obj=[database.machine_access_table, database.machine_table]) # from tables
+        users = [self.userToPrinc(acl[0]) for acl in
+                 database.session.execute(s)]
+        return "\n".join(users
                  + ['include /etc/remctl/acl/web',
                     ''])
@@ -71,8 +69,6 @@
     
     def getmachines(self, **kw):
-        """Get the list of VMs in the database, clearing the cache if it's 
-        older than 15 seconds"""
-        self.recache()
-        return self.machines.keys()
+        """Get the list of VMs in the database. Does not cache to prevent race conditions."""
+        return list(row[0] for row in database.session.execute(sa.sql.select([database.Machine.c.name])))
     
     def userToPrinc(self, user):
