OSDN Git Service

Use progressbar of board window.
[fukui-no-namari/fukui-no-namari.git] / src / FukuiNoNamari / cachefile.py
1 # Copyright (C) 2006 by Aiwota Programmer
2 # aiwotaprog@tetteke.tk
3 #
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 2 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
18 import os
19 import traceback
20
21 import misc
22
23 metadata_namelist = ("title", "lineCount", "lastModified", "idxlastModified")
24 recorded_data = ("id", "title", "lineCount", "lastModified", "idxlastModified")
25 int_data = ("lineCount", "idxlastModified")
26
27 def _empty_generator():
28     for name in metadata_namelist:
29         if name in int_data:
30             yield name, 0
31         else:
32             yield name, ""
33
34 default_dict = dict([pair for pair in _empty_generator()])
35
36
37 def _tabbed_to_key_value_generator(line):
38     for key_equal_value in line.split("\t"):
39         try:
40             index = key_equal_value.index("=")
41         except ValueError:
42             pass
43         else:
44             key = key_equal_value[:index]
45             if key in recorded_data:
46                 value = key_equal_value[index+1:]
47                 if key in int_data:
48                     try:
49                         value = int(value)
50                     except:
51                         value = 0
52                 yield key, value
53
54 def _dict_to_tabbed(dic):
55     line = ""
56     for name, value in dic.iteritems():
57
58         # save metadata only if its name exists in metadata_namelist
59         if name not in metadata_namelist:
60             continue
61
62         # no need to save an empty or invalid field
63         if name in int_data and value > 0:
64             line += name + "=" + str(value) + "\t"
65         elif name not in int_data and value:
66             line += name + "=" + value + "\t"
67
68     return line
69
70 def load_cache(bbs_type):
71     """ Loads metadata from .cache file. This is generator.
72
73     loads metadata and yield per one thread
74
75     metadata dic key is in metadata_namelist
76     """
77
78     cachefile_path = misc.get_board_cache_path(bbs_type)
79     try:
80         for line in file(cachefile_path):
81
82             dic = default_dict.copy()
83             for key, value in _tabbed_to_key_value_generator(line.rstrip()):
84                 dic[key] = value
85
86             # only if id exists
87             if "id" in dic and dic["id"]:
88                 yield dic, line
89
90     except IOError:
91         traceback.print_exc()
92
93 def save_cache(bbs_type, dic):
94     """ Saves metadata list to .cache file
95
96     dic: dictionary of thread id and metadata dictionary
97     which key is in metadata_namelist
98     """
99     # nothing to do if dic is empty
100     if not dic:
101         return
102
103     cachefile_path = misc.get_board_cache_path(bbs_type)
104
105     # create a directroy where .cache file is if not exists
106     basedir = os.path.dirname(cachefile_path)
107     if not os.path.isdir(basedir):
108         os.makedirs(basedir)
109
110     f = open(cachefile_path, "w")
111     for id, metadata_list in dic.iteritems():
112         # save only if id is not empty
113         if id:
114             line = "id=" + id + "\t"
115             line += _dict_to_tabbed(metadata_list)
116             line += "\n"
117             f.write(line)
118     f.close()