1 |
commit: 7101e264cf9c68f701103dc123716c5984a93cae |
2 |
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org> |
3 |
AuthorDate: Fri Jun 1 19:37:43 2012 +0000 |
4 |
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua> |
5 |
CommitDate: Fri Jun 1 19:37:43 2012 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=7101e264 |
7 |
|
8 |
Refactor scanpackages. |
9 |
|
10 |
--- |
11 |
.../packages/management/commands/scanpackages.py | 148 ++++++++++---------- |
12 |
1 files changed, 76 insertions(+), 72 deletions(-) |
13 |
|
14 |
diff --git a/gpackages/apps/packages/management/commands/scanpackages.py b/gpackages/apps/packages/management/commands/scanpackages.py |
15 |
index 31644f8..133f886 100644 |
16 |
--- a/gpackages/apps/packages/management/commands/scanpackages.py |
17 |
+++ b/gpackages/apps/packages/management/commands/scanpackages.py |
18 |
@@ -8,6 +8,75 @@ import logging |
19 |
#l.setLevel(logging.DEBUG) |
20 |
#l.addHandler(logging.FileHandler('database.log')) |
21 |
|
22 |
+def _get_from_cache(cache, what): |
23 |
+ save_to = [] |
24 |
+ cached_items = frozenset(cache.keys()) |
25 |
+ geted_items = set() |
26 |
+ for item in ( cached_items & what): |
27 |
+ geted_items.add(item) |
28 |
+ save_to.append(cache[item]) |
29 |
+ return save_to, geted_items |
30 |
+ |
31 |
+def _get_from_database(Model, field_name, request_items): |
32 |
+ request_items = list(request_items) |
33 |
+ if not request_items: |
34 |
+ return None |
35 |
+ return Model.objects.filter(**{field_name + '__in': request_items}) |
36 |
+ |
37 |
+def _update_cache_by_queryset(cache, queryset, field_name): |
38 |
+ geted_items = set() |
39 |
+ for item in queryset: |
40 |
+ cache[getattr(item, field_name)] = item |
41 |
+ geted_items.add(getattr(item, field_name)) |
42 |
+ return geted_items |
43 |
+ |
44 |
+def _get_from_database_and_update_cache(Model, field_name, request_items, cache): |
45 |
+ queryset = _get_from_database(Model, field_name, request_items) |
46 |
+ if queryset is None: |
47 |
+ return None, set() |
48 |
+ geted = _update_cache_by_queryset(cache, queryset, field_name) |
49 |
+ return queryset, geted |
50 |
+ |
51 |
+def _create_objects(Model, field_name, need_create): |
52 |
+ if not need_create: |
53 |
+ return None |
54 |
+ creating_list = [] |
55 |
+ for item in need_create: |
56 |
+ creating_list.append(Model(**{field_name: item})) |
57 |
+ |
58 |
+ Model.objects.bulk_create(creating_list) |
59 |
+ created = Model.objects.filter(**{field_name + '__in': need_create}) |
60 |
+ return created |
61 |
+ |
62 |
+def _create_objects_and_update_cache(Model, field_name, need_create, cache): |
63 |
+ created = _create_objects(Model, field_name, need_create) |
64 |
+ if created is None: |
65 |
+ return None, None |
66 |
+ geted = _update_cache_by_queryset(cache, created, field_name) |
67 |
+ return created, geted |
68 |
+ |
69 |
+def _get_items(items_list, Model, field_name, cache_var): |
70 |
+ items_set = frozenset(items_list) |
71 |
+ # Getting from cache |
72 |
+ items_objects, geted_items = _get_from_cache(cache_var, items_set) |
73 |
+ # Getting from database |
74 |
+ queryset, geted = _get_from_database_and_update_cache(Model, field_name, items_set - geted_items, cache_var) |
75 |
+ if queryset is None: |
76 |
+ return items_objects |
77 |
+ geted_items = geted_items | geted |
78 |
+ |
79 |
+ # Add to list with items |
80 |
+ items_objects.extend(queryset) |
81 |
+ # Create not existend items fast using bulk_create, works only in django 1.4 or gt |
82 |
+ need_create = list(items_set - geted_items) |
83 |
+ created, geted = _create_objects_and_update_cache(Model, field_name, need_create, cache_var) |
84 |
+ if created is None: |
85 |
+ return items_objects |
86 |
+ items_objects.extend(created) |
87 |
+ geted_items = geted_items | geted |
88 |
+ return items_objects |
89 |
+ |
90 |
+ |
91 |
class Command(BaseCommand): |
92 |
args = '' |
93 |
help = 'Will scan package tree and update info about it in database' |
94 |
@@ -16,82 +85,12 @@ class Command(BaseCommand): |
95 |
licenses_cache = {} |
96 |
def get_licenses_objects(ebuild): |
97 |
licenses = ebuild.licenses |
98 |
- license_objects = [] |
99 |
- licenses_set = frozenset(licenses) |
100 |
- cached_licenses = set(licenses_cache.keys()) |
101 |
- # Getting from cache |
102 |
- geted_licenses = set() |
103 |
- for license in (cached_licenses & licenses_set): |
104 |
- geted_licenses.add(license) |
105 |
- license_objects.append(licenses_cache[license]) |
106 |
- # Getting from database |
107 |
- request_licenses = list(licenses_set - geted_licenses) |
108 |
- if not request_licenses: |
109 |
- return license_objects |
110 |
- request = models.LicensModel.objects.filter(name__in = request_licenses) |
111 |
- # Add to list with licenses |
112 |
- license_objects.extend(request) |
113 |
- # Update cache |
114 |
- for license in request: |
115 |
- licenses_cache[license.name] = license |
116 |
- geted_licenses.add(license.name) |
117 |
- # Create not existend licenses fast using bulk_create, works only in django 1.4 or gt |
118 |
- need_create = list(licenses_set - geted_licenses) |
119 |
- if not need_create: |
120 |
- return license_objects |
121 |
- creating_list = [] |
122 |
- for license in need_create: |
123 |
- creating_list.append(models.LicensModel(name = license)) |
124 |
- |
125 |
- models.LicensModel.objects.bulk_create(creating_list) |
126 |
- # Retriwing created licenses from database |
127 |
- request_created = models.LicensModel.objects.filter(name__in = need_create) |
128 |
- license_objects.extend(request_created) |
129 |
- # Update cache |
130 |
- for license in request_created: |
131 |
- licenses_cache[license.name] = license |
132 |
- geted_licenses.add(license.name) |
133 |
- return license_objects |
134 |
+ return _get_items(licenses, models.LicensModel, 'name', licenses_cache) |
135 |
|
136 |
uses_cache = {} |
137 |
def get_uses_objects(ebuild): |
138 |
uses = [ use.name for use in ebuild.iter_uses() ] |
139 |
- uses_objects = [] |
140 |
- uses_set = frozenset(uses) |
141 |
- cached_uses = set(uses_cache.keys()) |
142 |
- # Getting from cache |
143 |
- geted_uses = set() |
144 |
- for use in (cached_uses & uses_set): |
145 |
- geted_uses.add(use) |
146 |
- uses_objects.append(uses_cache[use]) |
147 |
- # Getting from database |
148 |
- request_use = list(uses_set - geted_uses) |
149 |
- if not request_use: |
150 |
- return uses_objects |
151 |
- request = models.UseFlagModel.objects.filter(name__in = request_use) |
152 |
- # Add to list with licenses |
153 |
- uses_objects.extend(request) |
154 |
- # Update cache |
155 |
- for use in request: |
156 |
- uses_cache[use.name] = use |
157 |
- geted_uses.add(use.name) |
158 |
- # Create not existend licenses fast using bulk_create, works only in django 1.4 or gt |
159 |
- need_create = list(uses_set - geted_uses) |
160 |
- if not need_create: |
161 |
- return license_objects |
162 |
- creating_list = [] |
163 |
- for use in need_create: |
164 |
- creating_list.append(models.UseFlagModel(name = use)) |
165 |
- |
166 |
- models.UseFlagModel.objects.bulk_create(creating_list) |
167 |
- # Retriwing created licenses from database |
168 |
- request_created = models.UseFlagModel.objects.filter(name__in = need_create) |
169 |
- uses_objects.extend(request_created) |
170 |
- # Update cache |
171 |
- for use in request_created: |
172 |
- uses_cache[use.name] = use |
173 |
- geted_uses.add(use.name) |
174 |
- return uses_objects |
175 |
+ return _get_items(uses, models.UseFlagModel, 'name', uses_cache) |
176 |
|
177 |
arches_cache = {} |
178 |
def get_keywords_objects(ebuild, ebuild_object): |
179 |
@@ -113,8 +112,13 @@ class Command(BaseCommand): |
180 |
|
181 |
|
182 |
|
183 |
+ homepages_cache = {} |
184 |
|
185 |
st = datetime.datetime.now() |
186 |
+ # Load homepages to cache |
187 |
+ for homepage in models.HomepageModel.objects.all(): |
188 |
+ homepages_cache[homepage.url] = homepage |
189 |
+ |
190 |
for category in self.porttree.iter_categories(): |
191 |
category_object, categor_created = models.CategoryModel.objects.get_or_create(category = category) |
192 |
for package in category.iter_packages(): |