Gentoo Archives: gentoo-commits

From: Slava Bacherikov <slava@××××××××××××××.ua>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/apps/packages/management/commands/
Date: Fri, 01 Jun 2012 21:29:19
Message-Id: 1338579463.7101e264cf9c68f701103dc123716c5984a93cae.bacher09@gentoo
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():