X-Git-Url: http://git.sourceforge.jp/view?p=fukui-no-namari%2Ffukui-no-namari.git;a=blobdiff_plain;f=src%2FFukuiNoNamari%2Fcachefile.py;h=8077d8126f77980dde18c44e4e28b793958d9f0e;hp=53184d11df19b8b4810ad502cfec1a0e27e8b20c;hb=0b5aa5690f9fbc46f4429bcb5ce8abd667be6c8b;hpb=60b4d06284830c9575d3e3c3823ebaae5cd8f52c diff --git a/src/FukuiNoNamari/cachefile.py b/src/FukuiNoNamari/cachefile.py index 53184d1..8077d81 100644 --- a/src/FukuiNoNamari/cachefile.py +++ b/src/FukuiNoNamari/cachefile.py @@ -15,103 +15,79 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -import os +import itertools import misc -metadata_namelist = ["title", "lineCount", "lastModified", "idxlastModified"] - -def load_cache(bbs_type, func): - """ Loads metadata from .cache file - - loads metadata and invokes handler per one thread - - bbs: bbs id - - board: board id - - func: invoked at loading one thread's metadata - should be of the form: - def handler_example(id, metadata_dic): - where the first argument is thread id and - the second metadata dic which key is in metadata_namelist - """ - - # nothing to do if .cache file does not exist - cachefile_path = misc.get_board_cache_path(bbs_type) - if not os.path.exists(cachefile_path): - return - - f = open(cachefile_path, "r") - try: - line = f.readline() - while line: - metadatas = line.split("\t") - dic = {} - for field in metadatas: - for name in ["id", "title", "lineCount", - "lastModified", "idxlastModified"]: - if field.startswith(name+"="): - value = field[len(name)+1:] - if name is "lineCount" or name is "idxlastModified": - try: - dic[name] = int(value) - except: - dic[name] = 0 - else: - dic[name] = value - # invoke func only if id exists - if "id" in dic and dic["id"]: - # if metadata in metadata_namelist does not exist, - # set empty str or 0 - for name in metadata_namelist: - if name not in dic: - if name is "lineCount" or name is "idxlastModified": - dic[name] = 0 - else: - dic[name] = "" - func(dic["id"], dic) - line = f.readline() - finally: - f.close() - -def save_cache(bbs_type, dic): - """ Saves metadata list to .cache file - - bbs: bbs id - - board: board id - - dic: dictionary of thread id and metadata dictionary - which key is in metadata_namelist - """ - # nothing to do if dic is empty - if not dic: - return - - cachefile_path = misc.get_board_cache_path(bbs_type) - - # create a directroy where .cache file is if not exists - basedir = os.path.dirname(cachefile_path) - if not os.path.isdir(basedir): - os.makedirs(basedir) - - f = open(cachefile_path, "w") - for id, metadata_list in dic.iteritems(): - # save only if id is not empty - if id: - line = "id=" + id + "\t" - # save metadata only if exists in metadata_namelist - for name in metadata_namelist: - # save metadata only if exists in metadata_list - # and no need to save an empty or invalid field - if name in metadata_list: - if name is "lineCount" or name is "idxlastModified": - if metadata_list[name] > 0: - line += name + "=" + str(metadata_list[name]) + "\t" - else: - if metadata_list[name]: - line += name + "=" + metadata_list[name] + "\t" - line += "\n" - f.write(line) - f.close() +metadata_namelist = ("title", "lineCount", "lastModified", "idxlastModified") +recorded_data = ("id", "title", "lineCount", "lastModified", "idxlastModified") +int_data = ("lineCount", "idxlastModified") + +def _empty_generator(): + for name in metadata_namelist: + if name in int_data: + yield name, 0 + else: + yield name, "" + +default_dict = dict([pair for pair in _empty_generator()]) + +def _tabbed_to_dict(tabbed): + + def adjust_type(key, value): + if key in int_data: + try: + value = int(value) + except: + value = 0 + return key, value + + iterable = misc.tabbed_to_dict_generator(tabbed) + iterable = misc.unpack_ifilter(lambda k, v: k in recorded_data, iterable) + iterable = itertools.starmap(adjust_type, iterable) + + dic = default_dict.copy() + for key, value in iterable: + dic[key] = value + + return dic + +def _dict_to_tabbed(dic): + + def validate(name, value): + if name in int_data and value > 0: + return True + elif name not in int_data and value: + return True + return False + + iterable = dic.iteritems() + + # save metadata only if its name exists in metadata_namelist + iterable = misc.unpack_ifilter(lambda n,v: n in metadata_namelist,iterable) + + # no need to save an empty or invalid field + iterable = misc.unpack_ifilter(validate, iterable) + + iterable = itertools.starmap(lambda n,v: "%s=%s\t" % (n, str(v)), iterable) + + line = "" + for tabbed in iterable: + line += tabbed + return line + +def do_formatted_to_dict(formatted): + dic = _tabbed_to_dict(formatted) + if "id" in dic and dic["id"]: + return dic + +def formatted_to_dict(iterable): + iterable = itertools.imap(do_formatted_to_dict, iterable) + iterable = itertools.ifilter(None, iterable) + return iterable + +def do_dict_to_formatted(thread_id, dic): + return "id=%s\t%s\n" % (thread_id, _dict_to_tabbed(dic)) + +def dict_to_formatted(iterable): + return itertools.starmap(do_dict_to_formatted, iterable)