1 | from .._compat import with_metaclass, iteritems |
---|
2 | from .._gae import gae |
---|
3 | from .._load import OrderedDict |
---|
4 | from ..helpers._internals import Dispatcher |
---|
5 | from ..objects import Expression |
---|
6 | |
---|
7 | |
---|
8 | dialects = Dispatcher("dialect") |
---|
9 | |
---|
10 | |
---|
11 | class 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 | |
---|
24 | class 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 | |
---|
37 | class 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 | |
---|
46 | class 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 | |
---|
85 | class 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 | |
---|
100 | from .base import SQLDialect |
---|
101 | from .sqlite import SQLiteDialect, SpatialiteDialect |
---|
102 | from .postgre import PostgreDialect |
---|
103 | from .mysql import MySQLDialect |
---|
104 | from .mssql import MSSQLDialect |
---|
105 | from .mongo import MongoDialect |
---|
106 | from .db2 import DB2Dialect |
---|
107 | from .firebird import FireBirdDialect |
---|
108 | from .informix import InformixDialect |
---|
109 | from .ingres import IngresDialect |
---|
110 | from .oracle import OracleDialect |
---|
111 | from .sap import SAPDBDialect |
---|
112 | from .teradata import TeradataDialect |
---|
113 | from .couchdb import CouchDBDialect |
---|
114 | |
---|
115 | if gae is not None: |
---|
116 | from .google import GoogleDatastoreDialect |
---|