source: OpenRLabs-Git/deploy/rlabs-docker/web2py-rlabs/gluon/packages/dal/pydal/dialects/__init__.py

main
Last change on this file was 42bd667, checked in by David Fuertes <dfuertes@…>, 4 years ago

Historial Limpio

  • Property mode set to 100755
File size: 3.7 KB
Line 
1from .._compat import with_metaclass, iteritems
2from .._gae import gae
3from .._load import OrderedDict
4from ..helpers._internals import Dispatcher
5from ..objects import Expression
6
7
8dialects = Dispatcher("dialect")
9
10
11class sqltype_for(object):
12    _inst_count_ = 0
13
14    def __init__(self, key):
15        self.key = key
16        self._inst_count_ = sqltype_for._inst_count_
17        sqltype_for._inst_count_ += 1
18
19    def __call__(self, f):
20        self.f = f
21        return self
22
23
24class register_expression(object):
25    _inst_count_ = 0
26
27    def __init__(self, name):
28        self.name = name
29        self._inst_count_ = register_expression._inst_count_
30        register_expression._inst_count_ += 1
31
32    def __call__(self, f):
33        self.f = f
34        return self
35
36
37class ExpressionMethodWrapper(object):
38    def __init__(self, dialect, obj):
39        self.dialect = dialect
40        self.obj = obj
41
42    def __call__(self, expression, *args, **kwargs):
43        return self.obj.f(self.dialect, expression, *args, **kwargs)
44
45
46class MetaDialect(type):
47    def __new__(cls, name, bases, attrs):
48        new_class = type.__new__(cls, name, bases, attrs)
49        if bases == (object,):
50            return new_class
51        #: collect declared attributes
52        sqltypes = []
53        expressions = []
54        for key, value in list(attrs.items()):
55            if isinstance(value, sqltype_for):
56                sqltypes.append((key, value))
57            if isinstance(value, register_expression):
58                expressions.append((key, value))
59        sqltypes.sort(key=lambda x: x[1]._inst_count_)
60        expressions.sort(key=lambda x: x[1]._inst_count_)
61        declared_sqltypes = OrderedDict()
62        declared_expressions = OrderedDict()
63        for key, val in sqltypes:
64            declared_sqltypes[key] = val
65        new_class._declared_sqltypes_ = declared_sqltypes
66        for key, val in expressions:
67            declared_expressions[key] = val
68        new_class._declared_expressions_ = declared_expressions
69        #: get super declared attributes
70        all_sqltypes = OrderedDict()
71        all_expressions = OrderedDict()
72        for base in reversed(new_class.__mro__[1:]):
73            if hasattr(base, "_declared_sqltypes_"):
74                all_sqltypes.update(base._declared_sqltypes_)
75            if hasattr(base, "_declared_expressions_"):
76                all_expressions.update(base._declared_expressions_)
77        #: set re-constructed attributes
78        all_sqltypes.update(declared_sqltypes)
79        all_expressions.update(declared_expressions)
80        new_class._all_sqltypes_ = all_sqltypes
81        new_class._all_expressions_ = all_expressions
82        return new_class
83
84
85class Dialect(with_metaclass(MetaDialect)):
86    def __init__(self, adapter):
87        self.adapter = adapter
88        self.types = {}
89        for name, obj in iteritems(self._all_sqltypes_):
90            self.types[obj.key] = obj.f(self)
91        for name, obj in iteritems(self._all_expressions_):
92            Expression._dialect_expressions_[obj.name] = ExpressionMethodWrapper(
93                self, obj
94            )
95
96    def expand(self, *args, **kwargs):
97        return self.adapter.expand(*args, **kwargs)
98
99
100from .base import SQLDialect
101from .sqlite import SQLiteDialect, SpatialiteDialect
102from .postgre import PostgreDialect
103from .mysql import MySQLDialect
104from .mssql import MSSQLDialect
105from .mongo import MongoDialect
106from .db2 import DB2Dialect
107from .firebird import FireBirdDialect
108from .informix import InformixDialect
109from .ingres import IngresDialect
110from .oracle import OracleDialect
111from .sap import SAPDBDialect
112from .teradata import TeradataDialect
113from .couchdb import CouchDBDialect
114
115if gae is not None:
116    from .google import GoogleDatastoreDialect
Note: See TracBrowser for help on using the repository browser.