# # # patch "dws/dws.py" # from [c31ab032fae324c0034023819864c543cccf133c] # to [7853844582830b64230cd0b272be887d7dd80fd9] # # patch "dws/dws_test.py" # from [008fb3f4cc233de176539c6de51a45cce3d3def4] # to [f5915fa3aea50a74d44f10a842aca7cb447d22d2] # # patch "fs_dws.py" # from [bafaede69f2dae878da78f0ac77e104320287cdd] # to [af966f103059a6fa257f81115387d69a9215b6d5] # ============================================================ --- dws/dws.py c31ab032fae324c0034023819864c543cccf133c +++ dws/dws.py 7853844582830b64230cd0b272be887d7dd80fd9 @@ -50,6 +50,8 @@ class Connection: return (req.status, req.reason, dict(req.getheaders()), req.read()) class Connection: + MAX_POST = 512*1024 + def __init__(self, base, path="", verbosity=0): """ base - address of DWS server (example: http://yourhost.org/dws.php" @@ -136,24 +138,44 @@ class Connection: partsArg = ",".join( [ "%i:%i" % (off, size) for off, size in parts ] ) return self.request("getparts", n = realName, parts = partsArg) + # TODO: test split! def put(self,name, content): realName = self.path + name - return self.request("put", n = realName, postData=content) + if len(content) > self.MAX_POST: + i = splitContent(content, self.MAX_POST) + chunk = i.next() + result = self.request("put", n = realName, postData=chunk) + for chunk in i: + result = self.request("append", n = realName, postData=chunk) + return result + else: + return self.request("put", n = realName, postData=content) # params: # files = [ (name, content), ... ] # returns: # dws.Response + # TODO: test split! def putMany(self, files): agrContent = "" names = [] sizes = [] + result = None for name, content in files: - agrContent += content - names.append(self.path + name) - sizes.append(str(len(content))) - - return self.request("put_many", n=",".join(names), s=",".join(sizes), postData = agrContent) + if len(content) > self.MAX_POST: + result = self.put(name,content) + elif len(agrContent) + len(content) > self.MAX_POST: + result = self.request("put_many", n=",".join(names), s=",".join(sizes), postData = agrContent) + agrContent = "" + names = [] + sizes = [] + else: + agrContent += content + names.append(self.path + name) + sizes.append(str(len(content))) + if names: + result = self.request("put_many", n=",".join(names), s=",".join(sizes), postData = agrContent) + return result # # params: @@ -193,9 +215,14 @@ class Connection: result.append(None) return result + # TODO: test split! def append(self, name, content): realName = self.path + name - return self.request("append", n = realName, postData=content) + lastResult = None + for chunk in splitContent(content, self.MAX_POST): + lastResult = self.request("append", n = realName, postData=chunk) + return lastResult + def error(self, msg): print >> sys.stderr, "dws: error: %s" % msg @@ -207,3 +234,16 @@ class Connection: def warning(self, msg): print >> sys.stderr, "dws: warning: %s" % msg + +def splitContent(content, size): + offset = 0 + todo = len(content) + while todo > 0: + if todo > size: + yield content[offset:offset+size] + todo -= size + offset += size + else: + yield content[offset:offset+todo] + break + ============================================================ --- dws/dws_test.py 008fb3f4cc233de176539c6de51a45cce3d3def4 +++ dws/dws_test.py f5915fa3aea50a74d44f10a842aca7cb447d22d2 @@ -12,7 +12,8 @@ class TestSequenceFunctions(unittest.Tes class TestSequenceFunctions(unittest.TestCase): def setUp(self): - self.c = Connection("http://zbigg.internet.v.pl/zbigg-dump/","dws_python_test/") + self.c = Connection("http://zbigg.internet.v.pl/zbigg-dump/","dws_python_test2/") + self.c.verbosity = 1 def testList(self): self.c.list() @@ -91,6 +92,26 @@ class TestSequenceFunctions(unittest.Tes def testGet(self): pass + + def testSplit(self): + om = self.c.MAX_POST + try: + self.c.MAX_POST = 127 + + self.c.MAX_POST = 1 + self.__doTestContent("s1","abcdefg") + + self.c.MAX_POST = 3 + self.__doTestContent("s1","abcdefg" * 50) + + self.c.MAX_POST = 512 + self.__doTestContent("s1","abcdefghij" * 52) + + self.c.MAX_POST = 520 + self.__doTestContent("s1","abcdefghij" * 52) + + finally: + self.c.MAX_POST = om if __name__ == '__main__': unittest.main() ============================================================ --- fs_dws.py bafaede69f2dae878da78f0ac77e104320287cdd +++ fs_dws.py af966f103059a6fa257f81115387d69a9215b6d5 @@ -60,27 +60,18 @@ class AppendableFileFake: def __init__(self, conn,name): self.conn = conn self.name = name - self.content = "" - self._need_flush = False def write(self, a): - self.content += a - self._need_flush = True + self.conn.append(self.name, a) return len(a) def flush(self): - return self._flush() + pass def close(self): - self._flush() return True - - def _flush(self): - if self._need_flush: - self.conn.append(self.name, self.content) - self._need_flush = False - return True + class DWSWriteableFS(DWSReadableFS, fs.WriteableFS): def open_append(self, filename): return AppendableFileFake( self.conn, filename )