import os
import os.path
import traceback
+import itertools
import misc
idxfile_path = misc.get_thread_idx_path(bbs_type)
datadic = default_dict.copy()
- try:
- for line in file(idxfile_path):
- key_equal_value = line.rstrip()
+ def adjust_type(name, value):
+ if name in int_data:
try:
- index = key_equal_value.index("=")
- except ValueError:
- pass
- else:
- 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
+ value = int(value)
+ except:
+ value = 0
+ return name, value
+
+ try:
+ iterable = itertools.imap(lambda l: l.rstrip(), file(idxfile_path))
+ iterable = itertools.imap(misc.split_key_and_value, iterable)
+ iterable = itertools.ifilter(None, iterable)
+ iterable = misc.unpack_ifilter(
+ lambda name, value: name in metadata_namelist, iterable)
+ iterable = itertools.starmap(adjust_type, iterable)
+ for name, value in iterable: datadic[name] = value
except IOError:
- traceback.print_exc()
+ pass
return datadic
no need to save empty or non-existing metadata
"""
- # create a directory where idx file should belong if does not exist
- idxfile_path = misc.get_thread_idx_path(bbs_type)
- basedir = os.path.dirname(idxfile_path)
- if not os.path.isdir(basedir):
- os.makedirs(basedir)
-
- 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
+ def validate(name, value):
if name in int_data and value > 0:
- f.write(name + "=" + str(value) + "\n")
+ return True
elif name not in int_data and value:
- f.write(name + "=" + value + "\n")
+ return True
+ return False
+
+ iterable = datadic.iteritems()
- f.close()
+ # save metadata only if its name exists in metadata_namelist
+ iterable = misc.unpack_ifilter(
+ lambda name, value: name in metadata_namelist, iterable)
+
+ # no need to save an empty or invalid field
+ iterable = misc.unpack_ifilter(validate, iterable)
+
+ # format
+ iterable = itertools.starmap(lambda n,v: "%s=%s\n" % (n, str(v)), iterable)
+
+ # write
+ idx_file = misc.FileWrap(misc.get_thread_idx_path(bbs_type), "w")
+ try:
+ idx_file.writelines(iterable)
+ except IOError:
+ traceback.print_exc()