Show More
@@ -220,6 +220,20 b' class BaseModel(object):' | |||
|
220 | 220 | obj = cls.query().get(id_) |
|
221 | 221 | Session().delete(obj) |
|
222 | 222 | |
|
223 | @classmethod | |
|
224 | def identity_cache(cls, session, attr_name, value): | |
|
225 | exist_in_session = [] | |
|
226 | for (item_cls, pkey), instance in session.identity_map.items(): | |
|
227 | if cls == item_cls and getattr(instance, attr_name) == value: | |
|
228 | exist_in_session.append(instance) | |
|
229 | if exist_in_session: | |
|
230 | if len(exist_in_session) == 1: | |
|
231 | return exist_in_session[0] | |
|
232 | log.exception( | |
|
233 | 'multiple objects with attr %s and ' | |
|
234 | 'value %s found with same name: %r', | |
|
235 | attr_name, value, exist_in_session) | |
|
236 | ||
|
223 | 237 | def __repr__(self): |
|
224 | 238 | if hasattr(self, '__unicode__'): |
|
225 | 239 | # python repr needs to return str |
@@ -639,16 +653,26 b' class User(Base, BaseModel):' | |||
|
639 | 653 | log.error(traceback.format_exc()) |
|
640 | 654 | |
|
641 | 655 | @classmethod |
|
642 |
def get_by_username(cls, username, case_insensitive=False, |
|
|
656 | def get_by_username(cls, username, case_insensitive=False, | |
|
657 | cache=False, identity_cache=False): | |
|
658 | session = Session() | |
|
659 | ||
|
643 | 660 | if case_insensitive: |
|
644 | q = cls.query().filter(func.lower(cls.username) == func.lower(username)) | |
|
661 | q = cls.query().filter( | |
|
662 | func.lower(cls.username) == func.lower(username)) | |
|
645 | 663 | else: |
|
646 | 664 | q = cls.query().filter(cls.username == username) |
|
647 | 665 | |
|
648 | 666 | if cache: |
|
649 | q = q.options(FromCache( | |
|
650 | "sql_cache_short", | |
|
651 | "get_user_%s" % _hash_key(username))) | |
|
667 | if identity_cache: | |
|
668 | val = cls.identity_cache(session, 'username', username) | |
|
669 | if val: | |
|
670 | return val | |
|
671 | else: | |
|
672 | q = q.options( | |
|
673 | FromCache("sql_cache_short", | |
|
674 | "get_user_by_name_%s" % _hash_key(username))) | |
|
675 | ||
|
652 | 676 | return q.scalar() |
|
653 | 677 | |
|
654 | 678 | @classmethod |
@@ -1364,7 +1388,7 b' class Repository(Base, BaseModel):' | |||
|
1364 | 1388 | def normalize_repo_name(cls, repo_name): |
|
1365 | 1389 | """ |
|
1366 | 1390 | Normalizes os specific repo_name to the format internally stored inside |
|
1367 |
da |
|
|
1391 | database using URL_SEP | |
|
1368 | 1392 | |
|
1369 | 1393 | :param cls: |
|
1370 | 1394 | :param repo_name: |
@@ -1372,19 +1396,20 b' class Repository(Base, BaseModel):' | |||
|
1372 | 1396 | return cls.NAME_SEP.join(repo_name.split(os.sep)) |
|
1373 | 1397 | |
|
1374 | 1398 | @classmethod |
|
1375 | def get_by_repo_name(cls, repo_name): | |
|
1399 | def get_by_repo_name(cls, repo_name, cache=False, identity_cache=False): | |
|
1376 | 1400 | session = Session() |
|
1377 | exist_in_session = [] | |
|
1378 | for (item_cls, pkey), instance in session.identity_map.items(): | |
|
1379 | if cls == item_cls and instance.repo_name == repo_name: | |
|
1380 | exist_in_session.append(instance) | |
|
1381 | if exist_in_session: | |
|
1382 | if len(exist_in_session) == 1: | |
|
1383 | return exist_in_session[0] | |
|
1384 | log.exception( | |
|
1385 | 'multiple repos with same name: %r' % exist_in_session) | |
|
1386 | ||
|
1387 | 1401 | q = session.query(cls).filter(cls.repo_name == repo_name) |
|
1402 | ||
|
1403 | if cache: | |
|
1404 | if identity_cache: | |
|
1405 | val = cls.identity_cache(session, 'repo_name', repo_name) | |
|
1406 | if val: | |
|
1407 | return val | |
|
1408 | else: | |
|
1409 | q = q.options( | |
|
1410 | FromCache("sql_cache_short", | |
|
1411 | "get_repo_by_name_%s" % _hash_key(repo_name))) | |
|
1412 | ||
|
1388 | 1413 | return q.scalar() |
|
1389 | 1414 | |
|
1390 | 1415 | @classmethod |
General Comments 0
You need to be logged in to leave comments.
Login now