import os
import os.path
-from fileinput import FileInput
+import traceback
+
import misc
-metadata_namelist = ["title", "lineCount", "lastModified", "etag"]
+metadata_namelist = ("title", "lineCount", "lastModified", "etag")
+int_data = ("lineCount")
-def load_idx(bbs_type):
- """Loads index file of thread
-
- bbs: bbs id
+def _empty_generator():
+ for name in metadata_namelist:
+ if name in int_data:
+ yield name, 0
+ else:
+ yield name, ""
- board: board id
+default_dict = dict([pair for pair in _empty_generator()])
- thread: thread id
+def load_idx(bbs_type):
+ """Loads index file of thread
return dictionary which key is in metadata_namelist if idx file exist,
otherwise return empty dic
"""
idxfile_path = misc.get_thread_idx_path(bbs_type)
- if not os.path.exists(idxfile_path):
- return {"title":"","lineCount":0,"lastModified":"","etag":""}
-
- datadic = {}
- f = FileInput(idxfile_path)
- for line in f:
- for name in metadata_namelist:
- if line.startswith(name+"="):
- value = line[len(name)+1:].rstrip("\n")
- if name is "lineCount":
- try:
- datadic[name] = int(value)
- except:
- datadic[name] = 0
- else:
- datadic[name] = value
- #print name, datadic[name]
- break;
- f.close()
-
- # if datadic does not have key, insert empty entry.
- for name in metadata_namelist:
- if name not in datadic:
- if name is "lineCount":
- datadic[name] = 0
+ datadic = default_dict.copy()
+
+ try:
+ for line in file(idxfile_path):
+ key_equal_value = line.rstrip()
+ try:
+ index = key_equal_value.index("=")
+ except ValueError:
+ pass
else:
- datadic[name] = ""
+ key = key_equal_value[:index]
+ if key in metadata_namelist:
+ value = key_equal_value[index+1:]
+ if key in int_data:
+ try:
+ value = int(value)
+ except:
+ value = 0
+ datadic[key] = value
+ except IOError:
+ traceback.print_exc()
+
return datadic
def save_idx(bbs_type, datadic):
"""Saves thread metadatas to a index file
- bbs: bbs id
-
- board: board id
-
- thread: thread id
-
datadic: dictionary which key is in metadata_namelist
no need to save empty or non-existing metadata
if not os.path.isdir(basedir):
os.makedirs(basedir)
- f = open(idxfile_path, "w")
- for name in metadata_namelist:
- if name in datadic:
- if name is "lineCount":
- if datadic[name] > 0:
- f.write(name + "=" + str(datadic[name]) + "\n")
- else:
- if datadic[name]:
- f.write(name + "=" + datadic[name] + "\n")
+ f = file(idxfile_path, "w")
+ for name, value in datadic.iteritems():
+
+ # save metadata only if its name exists in metadata_namelist
+ if name not in metadata_namelist:
+ continue
+
+ # no need to save an empty or invalid field
+ if name in int_data and value > 0:
+ f.write(name + "=" + str(value) + "\n")
+ elif name not in int_data and value:
+ f.write(name + "=" + value + "\n")
+
f.close()