[CalendarServer-changes] [2279]
CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.xattrprops
.patch
source_changes at macosforge.org
source_changes at macosforge.org
Thu Apr 3 15:22:59 PDT 2008
Revision: 2279
http://trac.macosforge.org/projects/calendarserver/changeset/2279
Author: wsanchez at apple.com
Date: 2008-04-03 15:22:51 -0700 (Thu, 03 Apr 2008)
Log Message:
-----------
Use pickle/unpickle instead of XML serialization and parsing to store properties
Modified Paths:
--------------
CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.xattrprops.patch
Modified: CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.xattrprops.patch
===================================================================
--- CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.xattrprops.patch 2008-04-03 22:13:57 UTC (rev 2278)
+++ CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.xattrprops.patch 2008-04-03 22:22:51 UTC (rev 2279)
@@ -2,7 +2,7 @@
===================================================================
--- twisted/web2/dav/xattrprops.py (revision 19773)
+++ twisted/web2/dav/xattrprops.py (working copy)
-@@ -33,12 +33,18 @@
+@@ -33,12 +33,19 @@
import urllib
import sys
@@ -11,6 +11,7 @@
+from random import random
+from errno import EAGAIN
+from zlib import compress, decompress
++from cPickle import dumps as pickle, loads as unpickle, PicklingError, UnpicklingError
import xattr
@@ -21,7 +22,7 @@
from twisted.web2 import responsecode
from twisted.web2.http import HTTPError, StatusResponse
from twisted.web2.dav import davxml
-@@ -66,16 +72,8 @@
+@@ -66,16 +73,8 @@
deadPropertyXattrPrefix = "user."
def _encode(clazz, name):
@@ -40,20 +41,12 @@
return r
def _decode(clazz, name):
-@@ -97,19 +95,41 @@
+@@ -97,20 +96,51 @@
def get(self, qname):
try:
- value = self.attrs[self._encode(qname)]
+ data = self.attrs[self._encode(qname)]
-+ try:
-+ value = decompress(data)
-+ except zlib.error:
-+ # Value is not compressed; data was stored by old
-+ # code. This is easy to handle, so let's keep
-+ # compatibility here.
-+ value = data
-+ del data
except KeyError:
raise HTTPError(StatusResponse(
responsecode.NOT_FOUND,
@@ -62,20 +55,37 @@
- doc = davxml.WebDAVDocument.fromString(value)
+ try:
-+ doc = davxml.WebDAVDocument.fromString(value)
++ return unpickle(data)
++ except UnpicklingError:
++ try:
++ # Data is not pickled; try reading as compressed XML text
++ value = decompress(data)
++ except zlib.error:
++ # Value is not compressed; try reading as XML text
++ value = data
++ del data
- return doc.root_element
-+ return doc.root_element
-+ except ValueError:
-+ msg = "Invalid property value stored on server: {%s}%s %s" % (qname[0], qname[1], value)
-+ log.err(msg)
-+ raise HTTPError(StatusResponse(responsecode.INTERNAL_SERVER_ERROR, msg))
++ try:
++ doc = davxml.WebDAVDocument.fromString(value)
++ return doc.root_element
++ except ValueError:
++ msg = "Invalid property value stored on server: {%s}%s %s" % (qname[0], qname[1], value)
++ log.err(msg)
++ raise HTTPError(StatusResponse(responsecode.INTERNAL_SERVER_ERROR, msg))
def set(self, property):
- self.attrs[self._encode(property.qname())] = property.toxml()
+ for n in range(20):
+ try:
-+ self.attrs[self._encode(property.qname())] = compress(property.toxml())
++ data = pickle(property)
++ except PicklingError, e:
++ log.err("Unable to pickle property %r: %s" % (property, e))
+
++ # Can't pickle this for some reason; fall back to XML serialization
++ data = compress(property.toxml())
++ try:
++ self.attrs[self._encode(property.qname())] = data
+ except IOError, error:
+ if error.errno != EAGAIN:
+ raise
@@ -83,6 +93,7 @@
+ else:
+ break
+
-
++
# Update the resource because we've modified it
self.resource.fp.restat()
+
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20080403/d378d295/attachment.html
More information about the calendarserver-changes
mailing list