~ubuntu-branches/debian/jessie/sqlalchemy/jessie

« back to all changes in this revision

Viewing changes to lib/sqlalchemy/dialects/mysql/gaerdbms.py

  • Committer: Package Import Robot
  • Author(s): Piotr Ożarowski, Jakub Wilk, Piotr Ożarowski
  • Date: 2013-07-06 20:53:52 UTC
  • mfrom: (1.4.23) (16.1.17 experimental)
  • Revision ID: package-import@ubuntu.com-20130706205352-ryppl1eto3illd79
Tags: 0.8.2-1
[ Jakub Wilk ]
* Use canonical URIs for Vcs-* fields.

[ Piotr Ożarowski ]
* New upstream release
* Upload to unstable
* Build depend on python3-all instead of -dev, extensions are not built for
  Python 3.X 

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# mysql/gaerdbms.py
2
 
# Copyright (C) 2005-2012 the SQLAlchemy authors and contributors <see AUTHORS file>
 
2
# Copyright (C) 2005-2013 the SQLAlchemy authors and contributors <see AUTHORS file>
3
3
#
4
4
# This module is part of SQLAlchemy and is released under
5
5
# the MIT License: http://www.opensource.org/licenses/mit-license.php
6
 
"""Support for Google Cloud SQL on Google App Engine.
7
 
 
8
 
This dialect is based primarily on the :mod:`.mysql.mysqldb` dialect with minimal
9
 
changes.
10
 
 
11
 
.. versionadded:: 0.7.8
12
 
 
13
 
Connecting
14
 
----------
15
 
 
16
 
Connect string format::
17
 
 
18
 
    mysql+gaerdbms:///<dbname>
19
 
 
20
 
E.g.::
21
 
 
22
 
  create_engine('mysql+gaerdbms:///mydb',
23
 
                 connect_args={"instance":"instancename"})
 
6
"""
 
7
.. dialect:: mysql+gaerdbms
 
8
    :name: Google Cloud SQL
 
9
    :dbapi: rdbms
 
10
    :connectstring: mysql+gaerdbms:///<dbname>?instance=<instancename>
 
11
    :url: https://developers.google.com/appengine/docs/python/cloud-sql/developers-guide
 
12
 
 
13
    This dialect is based primarily on the :mod:`.mysql.mysqldb` dialect with minimal
 
14
    changes.
 
15
 
 
16
    .. versionadded:: 0.7.8
 
17
 
24
18
 
25
19
Pooling
26
20
-------
32
26
 
33
27
"""
34
28
 
35
 
from sqlalchemy.dialects.mysql.mysqldb import MySQLDialect_mysqldb
36
 
from sqlalchemy.pool import NullPool
 
29
import os
 
30
 
 
31
from .mysqldb import MySQLDialect_mysqldb
 
32
from ...pool import NullPool
37
33
import re
38
34
 
39
35
 
 
36
def _is_dev_environment():
 
37
    return os.environ.get('SERVER_SOFTWARE', '').startswith('Development/')
 
38
 
 
39
 
40
40
class MySQLDialect_gaerdbms(MySQLDialect_mysqldb):
41
41
 
42
42
    @classmethod
43
43
    def dbapi(cls):
44
 
        from google.appengine.api import rdbms
45
 
        return rdbms
 
44
        # from django:
 
45
        # http://code.google.com/p/googleappengine/source/
 
46
        #     browse/trunk/python/google/storage/speckle/
 
47
        #     python/django/backend/base.py#118
 
48
        # see also [ticket:2649]
 
49
        # see also http://stackoverflow.com/q/14224679/34549
 
50
        from google.appengine.api import apiproxy_stub_map
 
51
 
 
52
        if _is_dev_environment():
 
53
            from google.appengine.api import rdbms_mysqldb
 
54
            return rdbms_mysqldb
 
55
        elif apiproxy_stub_map.apiproxy.GetStub('rdbms'):
 
56
            from google.storage.speckle.python.api import rdbms_apiproxy
 
57
            return rdbms_apiproxy
 
58
        else:
 
59
            from google.storage.speckle.python.api import rdbms_googleapi
 
60
            return rdbms_googleapi
46
61
 
47
62
    @classmethod
48
63
    def get_pool_class(cls, url):
50
65
        return NullPool
51
66
 
52
67
    def create_connect_args(self, url):
53
 
        return [[],{'database':url.database}]
 
68
        opts = url.translate_connect_args()
 
69
        if not _is_dev_environment():
 
70
            # 'dsn' and 'instance' are because we are skipping
 
71
            # the traditional google.api.rdbms wrapper
 
72
            opts['dsn'] = ''
 
73
            opts['instance'] = url.query['instance']
 
74
        return [], opts
54
75
 
55
76
    def _extract_error_code(self, exception):
56
 
        match = re.compile(r"^(\d+):").match(str(exception))
57
 
        code = match.group(1)
 
77
        match = re.compile(r"^(\d+)L?:|^\((\d+)L?,").match(str(exception))
 
78
        # The rdbms api will wrap then re-raise some types of errors
 
79
        # making this regex return no matches.
 
80
        code = match.group(1) or match.group(2) if match else None
58
81
        if code:
59
82
            return int(code)
60
83
 
61
 
dialect = MySQLDialect_gaerdbms
 
 
b'\\ No newline at end of file'
 
84
dialect = MySQLDialect_gaerdbms