Lines 1-6
Link Here
|
1 |
from time import localtime, strftime, time |
1 |
from time import localtime, strftime, time |
2 |
import datetime |
2 |
import datetime |
3 |
import re, sys |
3 |
import re, sys, types |
4 |
import operator |
4 |
import operator |
5 |
import cherrypy |
5 |
import cherrypy |
6 |
|
6 |
|
Lines 82-87
class PackageDB(object):
Link Here
|
82 |
columns_category_pn_pv = None |
82 |
columns_category_pn_pv = None |
83 |
sql = {} |
83 |
sql = {} |
84 |
mc = None |
84 |
mc = None |
|
|
85 |
valid_modes = ['+', '~', 'M', 'M+', 'M~', ''] |
85 |
|
86 |
|
86 |
def __init__(self, config=None): |
87 |
def __init__(self, config=None): |
87 |
# Do not complain about correct usage of ** magic |
88 |
# Do not complain about correct usage of ** magic |
Lines 348-353
class PackageDB(object):
Link Here
|
348 |
cursor.close() |
349 |
cursor.close() |
349 |
return entries |
350 |
return entries |
350 |
|
351 |
|
|
|
352 |
sql['SELECT_get_cpvs_by_searchcriteria'] = """ |
353 |
SELECT __CPV__, versions.mtime |
354 |
FROM versions |
355 |
JOIN packages USING (cp) |
356 |
JOIN categories USING (c) |
357 |
__JOINS__ |
358 |
WHERE __WHERE__ |
359 |
ORDER by versions.mtime DESC |
360 |
LIMIT 0, ? |
361 |
""" |
362 |
def get_cpvs_by_searchcriteria(self, sinfo, limit=None): |
363 |
"""return cpvs matching the search criteria""" |
364 |
criteria = [] |
365 |
params = [] |
366 |
joins = [] |
367 |
|
368 |
# strrep produces strings like "(?,?,?,?)" |
369 |
def strrep(chr, delimiter, count): |
370 |
ret = chr |
371 |
for i in range(count-1): |
372 |
ret += delimiter |
373 |
ret += chr |
374 |
return ret |
375 |
|
376 |
def add_criterion(arg, sql, join_info): |
377 |
if type(arg)==types.ListType: |
378 |
if replacer: |
379 |
sql = sql % replacer |
380 |
criteria.append(sql) |
381 |
params.extend(arg) |
382 |
else: |
383 |
criteria.append(sql) |
384 |
params.append(arg) |
385 |
if join_info: |
386 |
if join_info not in joins: |
387 |
joins.append(join_info) |
388 |
return |
389 |
|
390 |
sql_criteria = { |
391 |
"pkgname": "pn LIKE "+self.syntax_placeholder, |
392 |
"categories": "category IN (%s)", |
393 |
"category": "category LIKE "+self.syntax_placeholder, |
394 |
"version_eq": "pv = "+self.syntax_placeholder, |
395 |
"version_gt": "pv > "+self.syntax_placeholder, |
396 |
"version_ge": "pv >= "+self.syntax_placeholder, |
397 |
"version_lt": "pv < "+self.syntax_placeholder, |
398 |
"version_le": "pv <= "+self.syntax_placeholder, |
399 |
"anyfield": "((MATCH (description, changelog) AGAINST ("+self.syntax_placeholder+")) OR (MATCH (pn) AGAINST("+self.syntax_placeholder+")))" |
400 |
} |
401 |
|
402 |
if sinfo["pkgname"]: |
403 |
add_criterion("%"+sinfo["pkgname"]+"%", sql_criteria["pkgname"], None) |
404 |
|
405 |
if sinfo["categories"]: |
406 |
if len(sinfo["categories"]) > 1: |
407 |
add_criterion(sinfo["categories"], sql_criteria["categories"], None, strrep(self.syntax_placeholder, ",", len(sinfo["categories"]))) |
408 |
else: |
409 |
add_criterion("%"+sinfo["categories"][0]+"%", sql_criteria["category"], None) |
410 |
|
411 |
if sinfo["version"]: |
412 |
available_comparators = { |
413 |
">": sql_criteria["version_gt"], |
414 |
">=": sql_criteria["version_ge"], |
415 |
"=": sql_criteria["version_eq"], |
416 |
"<=": sql_criteria["version_le"], |
417 |
"<": sql_criteria["version_lt"] |
418 |
} |
419 |
if not sinfo["comparator"]: |
420 |
sinfo["comparator"] = "=" |
421 |
if sinfo["comparator"] not in available_comparators.keys(): |
422 |
return [] |
423 |
add_criterion(sinfo["version"], available_comparators[sinfo["comparator"]], None) |
424 |
|
425 |
if sinfo["anyfield"]: |
426 |
add_criterion(sinfo["anyfield"], sql_criteria["anyfield"], ["metadata", "cp"]) |
427 |
params.append(sinfo["anyfield"]) |
428 |
|
429 |
if limit is None: |
430 |
limit = 1000 |
431 |
try: |
432 |
limit = int(limit) |
433 |
except ValueError: |
434 |
return [] |
435 |
params.append(limit) |
436 |
|
437 |
|
438 |
# build sql query string |
439 |
criteria_str = "" |
440 |
i = 0 |
441 |
for c in criteria: |
442 |
if (i > 0) and i < len(criteria): |
443 |
criteria_str += " AND " |
444 |
criteria_str += c |
445 |
i += 1 |
446 |
joins_str = "" |
447 |
for j in joins: |
448 |
joins_str += "JOIN %s USING (%s) " % (j[0], j[1]) |
449 |
print joins_str |
450 |
|
451 |
sql = self.sql['SELECT_get_cpvs_by_searchcriteria'] |
452 |
|
453 |
reps = [] |
454 |
reps.append(('__JOINS__', joins_str)) |
455 |
reps.append(('__WHERE__', criteria_str)) |
456 |
# Only used once |
457 |
spacematch = re.compile(r'(\s+|\n)') |
458 |
for o, n in reps: |
459 |
sql = sql.replace(o, n) |
460 |
sql = spacematch.sub(' ', sql) |
461 |
|
462 |
|
463 |
cursor = self.cursor() |
464 |
cursor.execute(sql, params) |
465 |
entries = cursor.fetchall() |
466 |
cursor.close() |
467 |
return entries |
468 |
|
351 |
sql['SELECT_get_latest_cpvs_by_arch_mode'] = """ |
469 |
sql['SELECT_get_latest_cpvs_by_arch_mode'] = """ |
352 |
SELECT __CPV__, versions.mtime |
470 |
SELECT __CPV__, versions.mtime |
353 |
FROM arches |
471 |
FROM arches |
Lines 373-379
class PackageDB(object):
Link Here
|
373 |
def get_latest_cpvs_by_arch(self, arch, mode, limit=None): |
491 |
def get_latest_cpvs_by_arch(self, arch, mode, limit=None): |
374 |
"""return modified cpvs limited by arch and mode""" |
492 |
"""return modified cpvs limited by arch and mode""" |
375 |
|
493 |
|
376 |
valid_modes = ['+', '~', 'M', 'M+', 'M~', ''] |
494 |
valid_modes = self.valid_modes |
377 |
params = () |
495 |
params = () |
378 |
if mode not in valid_modes or arch not in self.arches: |
496 |
if mode not in valid_modes or arch not in self.arches: |
379 |
return [] |
497 |
return [] |