[CalendarServer-changes] [2578] CalendarServer/branches/users/cdaboo/sqlpropstore-2563

source_changes at macosforge.org source_changes at macosforge.org
Tue Jun 17 14:25:53 PDT 2008


Revision: 2578
          http://trac.macosforge.org/projects/calendarserver/changeset/2578
Author:   cdaboo at apple.com
Date:     2008-06-17 14:25:53 -0700 (Tue, 17 Jun 2008)

Log Message:
-----------
Need a "move" options for properties as xattr copy vs move has to be different.
Change caching to cache the entire set of properties off a resource when any one is accessed.

Modified Paths:
--------------
    CalendarServer/branches/users/cdaboo/sqlpropstore-2563/lib-patches/Twisted/twisted.web2.dav.method.copymove.patch
    CalendarServer/branches/users/cdaboo/sqlpropstore-2563/lib-patches/Twisted/twisted.web2.dav.xattrprops.patch
    CalendarServer/branches/users/cdaboo/sqlpropstore-2563/twistedcaldav/sqlprops.py

Modified: CalendarServer/branches/users/cdaboo/sqlpropstore-2563/lib-patches/Twisted/twisted.web2.dav.method.copymove.patch
===================================================================
--- CalendarServer/branches/users/cdaboo/sqlpropstore-2563/lib-patches/Twisted/twisted.web2.dav.method.copymove.patch	2008-06-17 21:24:54 UTC (rev 2577)
+++ CalendarServer/branches/users/cdaboo/sqlpropstore-2563/lib-patches/Twisted/twisted.web2.dav.method.copymove.patch	2008-06-17 21:25:53 UTC (rev 2578)
@@ -53,7 +53,7 @@
          yield destparent
          destparent = destparent.getResult()
  
-@@ -144,10 +155,30 @@
+@@ -144,10 +155,29 @@
          log.err(msg)
          raise HTTPError(StatusResponse(responsecode.BAD_REQUEST, msg))
  
@@ -69,8 +69,7 @@
 +        result = x.getResult()
  
 +        # Explicitly move properties - no one else does it
-+        destination.deadProperties().copy(self.deadProperties())
-+        self.deadProperties().deleteAll()
++        destination.deadProperties().move(self.deadProperties())
 +
 +        yield result
 +    else:

Modified: CalendarServer/branches/users/cdaboo/sqlpropstore-2563/lib-patches/Twisted/twisted.web2.dav.xattrprops.patch
===================================================================
--- CalendarServer/branches/users/cdaboo/sqlpropstore-2563/lib-patches/Twisted/twisted.web2.dav.xattrprops.patch	2008-06-17 21:24:54 UTC (rev 2577)
+++ CalendarServer/branches/users/cdaboo/sqlpropstore-2563/lib-patches/Twisted/twisted.web2.dav.xattrprops.patch	2008-06-17 21:25:53 UTC (rev 2578)
@@ -139,7 +139,7 @@
      def contains(self, qname):
          try:
              return self._encode(qname) in self.attrs
-@@ -129,7 +187,8 @@
+@@ -129,7 +187,12 @@
              return False
  
      def list(self):
@@ -151,3 +151,7 @@
 +    def copy(self, props):
 +        for item in props.list():
 +            self.set(props.get(item))
++
++    def move(self, props):
++        # xattrs move with the underlying file
++        pass

Modified: CalendarServer/branches/users/cdaboo/sqlpropstore-2563/twistedcaldav/sqlprops.py
===================================================================
--- CalendarServer/branches/users/cdaboo/sqlpropstore-2563/twistedcaldav/sqlprops.py	2008-06-17 21:24:54 UTC (rev 2577)
+++ CalendarServer/branches/users/cdaboo/sqlpropstore-2563/twistedcaldav/sqlprops.py	2008-06-17 21:25:53 UTC (rev 2578)
@@ -19,13 +19,9 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 ##
-from twistedcaldav.log import Logger
 
 """
-DAV Property store an sqlite database.
-
-This API is considered private to static.py and is therefore subject to
-change.
+DAV Property store using an sqlite database.
 """
 
 __all__ = ["sqlPropertyStore"]
@@ -36,6 +32,7 @@
 from twisted.web2 import responsecode
 from twisted.web2.http import HTTPError, StatusResponse
 
+from twistedcaldav.log import Logger
 from twistedcaldav.sql import AbstractSQLDatabase
 
 log = Logger()
@@ -186,6 +183,19 @@
         oldprops = props._getAll(hidden=True)
         self._setAll(oldprops.itervalues())
 
+    def move(self, props):
+        """
+        Move properties from another property store into this one, replacing everything
+        currently present.
+        
+        @param props: a property store to copy from
+        @type props: C{sqlPropertyStore}
+        """
+        
+        oldprops = props._getAll(hidden=True)
+        self._setAll(oldprops.itervalues())
+        props.deleteAll()
+
 class SQLPropertiesDatabase(AbstractSQLDatabase):
     """
     A database to store properties on resources in a collection.
@@ -232,28 +242,21 @@
         @return: an object representing the property.
         """
         
-        def _getOneFromDB():
-            members = []
-            for row in self._db_execute("select PROPERTYOBJECT from PROPERTIES where RESOURCENAME = :1 and PROPERTYNAME = :2", rname, self._encode(pname)):
-                members.append(row[0])
-            setlength =  len(members)
-            if setlength == 0:
-                value = None
-            elif setlength == 1:
-                value = cPickle.loads(members[0])
-            else:
-                raise ValueError("Multiple properties of the same name \"%s\" stored for resource \"%s\"" % (pname, rname,))
-            return value
-
         # Check cache first
         if self.use_cache:
-            if not self.cache.has_key((rname, pname)):
-                # Get the property
-                log.debug("getPropertyValue: %s \"%s\" \"%s\"" % (self.dbpath, rname, pname))
-                self.cache[(rname, pname)] = _getOneFromDB()
-            return self.cache[(rname, pname)]
+            # Make sure we have a cache entry
+            if not self.cache.has_key(rname):
+                self.cache[rname] = {}
+                for row in self._db_execute("select PROPERTYNAME, PROPERTYOBJECT from PROPERTIES where RESOURCENAME = :1", rname):
+                    self.cache[rname][self._decode(row[0])] = cPickle.loads(row[1])
+            
+            # Get the property and do negative caching if not present
+            return self.cache[rname].setdefault(pname, None)
         else:
-            return _getOneFromDB()
+            property = self._db_value_for_sql("select PROPERTYOBJECT from PROPERTIES where RESOURCENAME = :1 and PROPERTYNAME = :2", rname, self._encode(pname))
+            if property:
+                property = cPickle.loads(property)
+            return property
 
     def getAllPropertyValues(self, rname, hidden):
         """
@@ -288,8 +291,8 @@
         self._add_to_db(rname, self._encode(pname), cPickle.dumps(pvalue), pvalue.toxml(), hidden)
         self._db_commit()
         
-        if self.use_cache:
-            self.cache[(rname, pname)] = pvalue 
+        if self.use_cache and self.cache.has_key(rname):
+            self.cache[rname][pname] = pvalue 
 
     def setSeveralPropertyValues(self, rname, properties):
         """
@@ -305,6 +308,10 @@
             self._add_to_db(rname, self._encode(p[0]), cPickle.dumps(p[1]), p[1].toxml(), p[2])
         self._db_commit()
 
+        if self.use_cache and self.cache.has_key(rname):
+            for p in properties:
+                self.cache[rname][p[0]] = p[1]
+
     def removeProperty(self, rname, pname):
         """
         Remove a property.
@@ -316,11 +323,8 @@
         self._delete_from_db(rname, self._encode(pname))
         self._db_commit()
         
-        if self.use_cache:
-            try:
-                del self.cache[(rname, pname)]
-            except KeyError:
-                pass
+        if self.use_cache and self.cache.has_key(rname):
+            self.cache[rname][pname] = None
 
     def removeAllProperties(self, rname):
         """
@@ -333,10 +337,10 @@
         self._db_commit()
         
         if self.use_cache:
-            for key in list(self.cache.iterkeys()):
-                key_rname, _ignore_pname = key
-                if key_rname == rname:
-                    del self.cache[key]
+            try:
+                del self.cache[rname]
+            except KeyError:
+                pass
 
     def listProperties(self, rname):
         """
@@ -347,8 +351,11 @@
         """
 
         members = set()
-        for row in self._db_execute("select PROPERTYNAME from PROPERTIES where RESOURCENAME = :1", rname):
-            members.add(self._decode(row[0]))
+        if self.use_cache and self.cache.has_key(rname):
+            members.update(self.cache[rname].iterkeys())
+        else:
+            for row in self._db_execute("select PROPERTYNAME from PROPERTIES where RESOURCENAME = :1", rname):
+                members.add(self._decode(row[0]))
         return members
 
     def _add_to_db(self, rname, pname, pobject, pvalue, hidden):

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20080617/ea7f9b57/attachment.htm 


More information about the calendarserver-changes mailing list