Skip to content

Commit 8be2bf4

Browse files
committed
update for ease of consolidation of forks
1 parent 26f4393 commit 8be2bf4

File tree

3 files changed

+39
-41
lines changed

3 files changed

+39
-41
lines changed

sql_server/pyodbc/base.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
"""
22
MS SQL Server database backend for Django.
33
"""
4-
import sys
4+
import datetime
55
import os
66
import re
7-
import datetime
7+
import sys
88

99
from django.core.exceptions import ImproperlyConfigured
1010

@@ -26,8 +26,6 @@
2626
if DjangoVersion[:2] >= (1,5):
2727
_DJANGO_VERSION = 15
2828
elif DjangoVersion[:2] == (1,4):
29-
# Django version 1.4 adds a backwards incompatible change to
30-
# DatabaseOperations
3129
_DJANGO_VERSION = 14
3230
elif DjangoVersion[:2] == (1,3):
3331
_DJANGO_VERSION = 13
@@ -66,8 +64,8 @@ class DatabaseFeatures(BaseDatabaseFeatures):
6664
#uses_savepoints = True
6765

6866
def _supports_transactions(self):
69-
# for Django 1.3/1.4 compatibility
70-
return True
67+
# keep it compatible with Django 1.3 and 1.4
68+
return self.supports_transactions
7169

7270
class DatabaseWrapper(BaseDatabaseWrapper):
7371
_DJANGO_VERSION = _DJANGO_VERSION
@@ -78,7 +76,6 @@ class DatabaseWrapper(BaseDatabaseWrapper):
7876
unicode_results = False
7977
datefirst = 7
8078
use_legacy_datetime = False
81-
create_new_test_db = True
8279
connection_recovery_interval_msec = 0.0
8380

8481
# Collations: http://msdn2.microsoft.com/en-us/library/ms184391.aspx
@@ -153,12 +150,10 @@ def __init__(self, *args, **kwargs):
153150
for op in self.operators:
154151
sql = self.operators[op]
155152
if sql.startswith('LIKE '):
156-
ops[op] = sql + ' COLLATE ' + self.collation
153+
ops[op] = '%s COLLATE %s' % (sql, self.collation)
157154
self.operators.update(ops)
158155

159-
# setting mainly for running tests with Windows Azure SQL Database
160-
# not to be charged too much for creating new databases in every test
161-
self.create_new_test_db = self.settings_dict.get('TEST_CREATE', True)
156+
self.test_create = self.settings_dict.get('TEST_CREATE', True)
162157

163158
if _DJANGO_VERSION >= 13:
164159
self.features = DatabaseFeatures(self)
@@ -206,15 +201,20 @@ def _cursor(self):
206201
else:
207202
driver = 'FreeTDS'
208203

204+
# Microsoft driver names assumed here are:
205+
# * SQL Server
206+
# * SQL Native Client
207+
# * SQL Server Native Client 10.0/11.0
208+
# * ODBC Driver 11 for SQL Server
209209
ms_drivers = re.compile('.*SQL (Server$|(Server )?Native Client)')
210210
if 'dsn' in options:
211211
cstr_parts.append('DSN=%s' % options['dsn'])
212212
else:
213213
# Only append DRIVER if DATABASE_ODBC_DSN hasn't been set
214214
cstr_parts.append('DRIVER={%s}' % driver)
215215

216-
if ms_drivers.match(driver) or driver == 'FreeTDS' \
217-
and options.get('host_is_server', False):
216+
if ms_drivers.match(driver) or driver == 'FreeTDS' and \
217+
options.get('host_is_server', False):
218218
if port_str:
219219
host_str += ';PORT=%s' % port_str
220220
cstr_parts.append('SERVER=%s' % host_str)
@@ -292,7 +292,7 @@ def _cursor(self):
292292

293293
return CursorWrapper(cursor, self)
294294

295-
def _execute_on_tables(self, sql, table_names=None):
295+
def _execute_foreach(self, sql, table_names=None):
296296
cursor = self.cursor()
297297
if not table_names:
298298
table_names = self.introspection.get_table_list(cursor)
@@ -312,12 +312,12 @@ def _on_error(self, e):
312312
time.sleep(self.connection_recovery_interval_msec)
313313

314314
def check_constraints(self, table_names=None):
315-
self._execute_on_tables('ALTER TABLE %s WITH CHECK CHECK CONSTRAINT ALL', table_names)
315+
self._execute_foreach('ALTER TABLE %s WITH CHECK CHECK CONSTRAINT ALL', table_names)
316316

317317
def disable_constraint_checking(self):
318318
# Windows Azure SQL Database doesn't support sp_msforeachtable
319319
#cursor.execute('EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT ALL"')
320-
self._execute_on_tables('ALTER TABLE %s NOCHECK CONSTRAINT ALL')
320+
self._execute_foreach('ALTER TABLE %s NOCHECK CONSTRAINT ALL')
321321
return True
322322

323323
def enable_constraint_checking(self):

sql_server/pyodbc/creation.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import base64
22
import random
33

4-
from django.db.backends.creation import BaseDatabaseCreation, TEST_DATABASE_PREFIX
4+
from django.db.backends.creation import BaseDatabaseCreation
55

66
from sql_server.pyodbc.compat import b, md5_constructor
77

@@ -63,18 +63,15 @@ def _create_test_db(self, verbosity, autoclobber):
6363
if settings_dict['TEST_NAME']:
6464
test_name = settings_dict['TEST_NAME']
6565
else:
66+
from django.db.backends.creation import TEST_DATABASE_PREFIX
6667
test_name = TEST_DATABASE_PREFIX + settings_dict['NAME']
6768
if not settings_dict['TEST_NAME']:
6869
settings_dict['TEST_NAME'] = test_name
6970

70-
if not self.connection.create_new_test_db:
71-
# clean an existing database for reuse in a test
71+
if not self.connection.test_create:
72+
# use the existing database instead of creating a new one
7273
if verbosity >= 1:
73-
test_db_repr = ''
74-
if verbosity >= 2:
75-
test_db_repr = " ('%s')" % test_name
76-
print("Cleaning the existing database%s " \
77-
"instead of creating a new one..." % test_db_repr)
74+
print("Dropping tables ... ")
7875

7976
self.connection.close()
8077
settings_dict["NAME"] = test_name
@@ -87,6 +84,8 @@ def _create_test_db(self, verbosity, autoclobber):
8784
objs = (qn(row[0]), qn(row[1]))
8885
cursor.execute("ALTER TABLE %s DROP CONSTRAINT %s" % objs)
8986
for table in self.connection.introspection.get_table_list(cursor):
87+
if verbosity >= 1:
88+
print("Dropping table %s" % table)
9089
cursor.execute('DROP TABLE %s' % qn(table))
9190
self.connection.connection.commit()
9291
return test_name
@@ -99,7 +98,7 @@ def _create_test_db(self, verbosity, autoclobber):
9998

10099
def _destroy_test_db(self, test_database_name, verbosity):
101100
"Internal implementation - remove the test db tables."
102-
if self.connection.create_new_test_db:
101+
if self.connection.test_create:
103102
if self.connection.ops.on_azure_sql_db:
104103
self.connection.close()
105104
self.connection.settings_dict["NAME"] = 'master'
@@ -117,7 +116,7 @@ def _destroy_test_db(self, test_database_name, verbosity):
117116
test_db_repr = ''
118117
if verbosity >= 2:
119118
test_db_repr = " ('%s')" % test_database_name
120-
print("skipped the destruction of the database%s." % test_db_repr)
119+
print("The database is left undestroyed%s." % test_db_repr)
121120

122121
self.connection.close()
123122

@@ -126,7 +125,7 @@ def _prepare_for_test_db_ddl(self):
126125
self.connection.connection.autocommit = True
127126

128127
def _rollback_works(self):
129-
# for Django 1.2 compatibility
128+
# keep it compatible with Django 1.2
130129
return self.connection.features.supports_transactions
131130

132131
def sql_table_creation_suffix(self):

sql_server/pyodbc/operations.py

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1+
import datetime
2+
import decimal
3+
import time
4+
15
from django.conf import settings
26
from django.db.backends import BaseDatabaseOperations
37

48
from sql_server.pyodbc.compat import smart_text, string_types, timezone
5-
import datetime
6-
import time
7-
import decimal
8-
import warnings
9+
10+
EDITION_AZURE_SQL_DB = 5
911

1012
class DatabaseOperations(BaseDatabaseOperations):
1113
_aggregate_functions = (
@@ -24,10 +26,8 @@ class DatabaseOperations(BaseDatabaseOperations):
2426
def __init__(self, connection):
2527
if connection._DJANGO_VERSION >= 14:
2628
super(DatabaseOperations, self).__init__(connection)
27-
self.supports_tz = True
2829
else:
2930
super(DatabaseOperations, self).__init__()
30-
self.supports_tz = False
3131

3232
self.connection = connection
3333
self._ss_ver = None
@@ -55,13 +55,12 @@ def _get_sql_server_ver(self):
5555
sql_server_ver = property(_get_sql_server_ver)
5656

5757
def _on_azure_sql_db(self):
58-
edition_azure_sql_db = 5
5958
if self._ss_edition is not None:
60-
return self._ss_edition == edition_azure_sql_db
59+
return self._ss_edition == EDITION_AZURE_SQL_DB
6160
cur = self.connection.cursor()
6261
cur.execute("SELECT CAST(SERVERPROPERTY('EngineEdition') as integer)")
6362
self._ss_edition = cur.fetchone()[0]
64-
return self._ss_edition == edition_azure_sql_db
63+
return self._ss_edition == EDITION_AZURE_SQL_DB
6564
on_azure_sql_db = property(_on_azure_sql_db)
6665

6766
def bulk_batch_size(self, fields, objs):
@@ -289,9 +288,9 @@ def sql_flush(self, style, tables, sequences):
289288
style.SQL_FIELD(self.quote_name(table)) ) for table in tables])
290289

291290
if self.on_azure_sql_db:
292-
warnings.warn("SQL for identity reset is not available " \
293-
"on Windows Azure SQL Database " \
294-
"(it doesn't support DBCC CHECKIDENT).",
291+
import warnings
292+
warnings.warn("The identity columns will never be reset " \
293+
"on Windows Azure SQL Database.",
295294
RuntimeWarning)
296295
else:
297296
# Then reset the counters on each table.
@@ -362,9 +361,9 @@ def value_to_db_datetime(self, value):
362361
"""
363362
if value is None:
364363
return None
365-
if self.supports_tz and settings.USE_TZ:
364+
if self.connection._DJANGO_VERSION >= 14 and settings.USE_TZ:
366365
if timezone.is_aware(value):
367-
# pyodbc donesn't support tz-aware datetimes
366+
# pyodbc donesn't support datetimeoffset
368367
value = value.astimezone(timezone.utc)
369368
if not self.connection.features.supports_microsecond_precision:
370369
value = value.replace(microsecond=0)

0 commit comments

Comments
 (0)