Browse code

- Added support for stroing/loading inodes. No data yet however.

git-svn-id: https://s3tools.svn.sourceforge.net/svnroot/s3tools/s3py/trunk@65 830e0280-6d2a-0410-9c65-932aecc39d9d

Michal Ludvig authored on 2007/01/26 12:42:34
Showing 1 changed files
... ...
@@ -10,41 +10,60 @@ import pickle
10 10
 
11 11
 class S3fs(object):
12 12
 	_sync_attrs = [ "tree" ]
13
-	fsname = None
14
-	tree = None
13
+
14
+	## These are instance variables - we must
15
+	## catch when they are used uninitialized
16
+	###   _object_name = ...
17
+	###  fsname = ...
18
+	###  tree = ...
19
+
15 20
 	def __init__(self, fsname = None):
16 21
 		self.n = S3fsObjectName()
17 22
 		if fsname:
18 23
 			self.openfs(fsname)
19 24
 
20 25
 	def mkfs(self, fsname):
26
+		self.fsname = fsname
21 27
 		self._object_name = self.n.fs(fsname)
22 28
 		if self.object_exists(self._object_name):
23
-			raise S3fsError("Filesystem already exists", errno.EEXIST)
24
-		self.fsname = fsname
29
+			raise S3fsError("Filesystem '%s' already exists" % fsname, errno.EEXIST)
25 30
 		root_inode = S3fsInode(self)
26 31
 		S3fsSync.store(self, root_inode)
27 32
 		self.tree = { "/" : root_inode.inode_id }
28 33
 		S3fsSync.store(self, self)
34
+		self.openfs(fsname)
29 35
 	
30 36
 	def openfs(self, fsname):
31
-		raise S3fsError("Not implemented", errno.ENOSYS)
37
+		self.fsname = fsname
38
+		self._object_name = self.n.fs(fsname)
39
+		if not self.object_exists(self._object_name):
40
+			raise S3fsError("Filesystem '%s' does not exist" % fsname, errno.ENOENT)
41
+		S3fsSync.load(self, self)
42
+		print self.tree
43
+
44
+	def syncfs(self):
45
+		S3fsSync.store(self, self)
32 46
 	
47
+	def get_inode(self, path):
48
+		inode_id = self.tree[path]
49
+		inode = S3fsInode(self, inode_id)
50
+		return inode
51
+
33 52
 class S3fsInode(object):
34 53
 	_fs = None
35 54
 
36 55
 	## Interface for S3fsSync
37 56
 	_sync_attrs = [ "properties" ]
38
-	_object_name = None
57
+	# _object_name = 
39 58
 
40 59
 	## Properties
41 60
 	inode_id = None
42 61
 	properties = {
43
-		"ctime" : None,
44
-		"mtime" : None,
45
-		"uid" : None,
46
-		"gid" : None,
47
-		"mode" : None,
62
+		"ctime" : 0,
63
+		"mtime" : 0,
64
+		"uid" : 0,
65
+		"gid" : 0,
66
+		"mode" : 0,
48 67
 	}
49 68
 
50 69
 	def __init__(self, fs, inode_id = None):
... ...
@@ -53,6 +72,7 @@ class S3fsInode(object):
53 53
 		self.inode_id = inode_id
54 54
 		self._object_name = fs.n.inode(fs.fsname, inode_id)
55 55
 		self._fs = fs
56
+		S3fsSync.try_load(self._fs, self)
56 57
 
57 58
 	def setprop(self, property, value):
58 59
 		self.assert_property_name(property)
... ...
@@ -68,18 +88,14 @@ class S3fsInode(object):
68 68
 			raise ValueError("Property '%s' not known to S3fsInode")
69 69
 
70 70
 class S3fsLocalDir(S3fs):
71
-	def __init__(self, directory):
72
-		S3fs.__init__(self)
71
+	def __init__(self, directory, fsname = None):
73 72
 		if not os.path.isdir(directory):
74
-			raise S3fsError("Directory %s does not exist" % directory, errno.ENOENT)
73
+			raise IOError("Directory %s does not exist" % directory, errno.ENOENT)
75 74
 		self._dir = directory
76
-	
77
-	def lock(self):
78
-		pass
79
-
80
-	def unlock(self):
81
-		pass
82 75
 
76
+		## SubClass must be set to go before calling parent constructor!
77
+		S3fs.__init__(self, fsname)
78
+	
83 79
 	def object_exists(self, object_name):
84 80
 		real_path = os.path.join(self._dir, object_name)
85 81
 		if os.path.isfile(real_path):	## Is file, all good
... ...
@@ -139,10 +155,19 @@ class S3fsSync(object):
139 139
 			object_name = instance._object_name
140 140
 		from_sync = pickle.loads(fs.object_read(object_name))
141 141
 		for attr in instance._sync_attrs:
142
-			if from_sync.has_key[attr]:
142
+			if from_sync.has_key(attr):
143 143
 				setattr(instance, attr, from_sync[attr])
144 144
 		print "Loaded object: %s" % (object_name)
145 145
 
146
+	@staticmethod
147
+	def try_load(fs, instance, object_name = None):
148
+		if not object_name:
149
+			object_name = instance._object_name
150
+		if fs.object_exists(object_name):
151
+			S3fsSync.load(fs, instance, object_name)
152
+		else:
153
+			print "Nonexist object: %s" % (object_name)
154
+
146 155
 class S3fsError(Exception):
147 156
 	def __init__(self, message, errno = -1):
148 157
 		Exception.__init__(self, message)
... ...
@@ -150,13 +175,22 @@ class S3fsError(Exception):
150 150
 	
151 151
 if __name__ == "__main__":
152 152
 	local_dir = "/tmp/s3fs"
153
+	fsname = "testFs"
154
+	if not os.path.isdir(local_dir):
155
+		os.mkdir(local_dir)
156
+
153 157
 	try:
154
-		fs = S3fsLocalDir(local_dir)
158
+		fs = S3fsLocalDir(local_dir, fsname)
159
+		print "Filesystem '%s' opened." % fsname
155 160
 	except S3fsError, e:
156 161
 		if e.errno == errno.ENOENT:
157
-			os.mkdir(local_dir)
162
+			print "Filesystem %s does not exist -> mkfs()" % fsname
163
+			fs = S3fsLocalDir(local_dir)
164
+			fs.mkfs(fsname)
158 165
 		else:
159 166
 			raise
160
-	print "RandomStrings = %s %s" % (fs.n.rndstr(5), fs.n.rndstr(10))
161
-
162
-	fs.mkfs("testFs")
167
+	root_inode = fs.get_inode("/")
168
+	print "root_inode(%s).mode = 0%o" % (root_inode.inode_id, root_inode.getprop("mode"))
169
+	if root_inode.getprop("mode") == 0:
170
+		root_inode.setprop("mode", 0755)
171
+	S3fsSync.store(fs, root_inode)