Skip to content

Commit

Permalink
Refactored get_date_extract_sql() to DatabaseOperations.date_extract_…
Browse files Browse the repository at this point in the history
…sql(). Refs #5106

git-svn-id: http://code.djangoproject.com/svn/django/trunk@5951 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
adrianholovaty committed Aug 19, 2007
1 parent 38b5d7f commit aab04a4
Show file tree
Hide file tree
Showing 10 changed files with 30 additions and 43 deletions.
7 changes: 7 additions & 0 deletions django/db/backends/__init__.py
Expand Up @@ -53,3 +53,10 @@ def autoinc_sql(self, table):
This SQL is executed when a table is created.
"""
return None

def date_extract_sql(self, lookup_type, field_name):
"""
Given a lookup_type of 'year', 'month' or 'day', returns the SQL that
extracts a value from the given date field field_name.
"""
raise NotImplementedError()
7 changes: 2 additions & 5 deletions django/db/backends/ado_mssql/base.py
Expand Up @@ -49,7 +49,8 @@ def variantToPython(variant, adType):
Database.convertVariantToPython = variantToPython

class DatabaseOperations(BaseDatabaseOperations):
pass
def date_extract_sql(self, lookup_type, field_name):
return "DATEPART(%s, %s)" % (lookup_type, field_name)

class DatabaseWrapper(BaseDatabaseWrapper):
ops = DatabaseOperations()
Expand Down Expand Up @@ -88,10 +89,6 @@ def get_last_insert_id(cursor, table_name, pk_name):
cursor.execute("SELECT %s FROM %s WHERE %s = @@IDENTITY" % (pk_name, table_name, pk_name))
return cursor.fetchone()[0]

def get_date_extract_sql(lookup_type, table_name):
# lookup_type is 'year', 'month', 'day'
return "DATEPART(%s, %s)" % (lookup_type, table_name)

def get_date_trunc_sql(lookup_type, field_name):
# lookup_type is 'year', 'month', 'day'
if lookup_type=='year':
Expand Down
1 change: 0 additions & 1 deletion django/db/backends/dummy/base.py
Expand Up @@ -44,7 +44,6 @@ def close(self):
dictfetchmany = complain
dictfetchall = complain
get_last_insert_id = complain
get_date_extract_sql = complain
get_date_trunc_sql = complain
get_datetime_cast_sql = complain
get_limit_offset_sql = complain
Expand Down
9 changes: 3 additions & 6 deletions django/db/backends/mysql/base.py
Expand Up @@ -54,7 +54,9 @@
# TRADITIONAL will automatically cause most warnings to be treated as errors.

class DatabaseOperations(BaseDatabaseOperations):
pass
def date_extract_sql(self, lookup_type, field_name):
# http://dev.mysql.com/doc/mysql/en/date-and-time-functions.html
return "EXTRACT(%s FROM %s)" % (lookup_type.upper(), field_name)

class DatabaseWrapper(BaseDatabaseWrapper):
ops = DatabaseOperations()
Expand Down Expand Up @@ -137,11 +139,6 @@ def quote_name(name):
def get_last_insert_id(cursor, table_name, pk_name):
return cursor.lastrowid

def get_date_extract_sql(lookup_type, table_name):
# lookup_type is 'year', 'month', 'day'
# http://dev.mysql.com/doc/mysql/en/date-and-time-functions.html
return "EXTRACT(%s FROM %s)" % (lookup_type.upper(), table_name)

def get_date_trunc_sql(lookup_type, field_name):
# lookup_type is 'year', 'month', 'day'
fields = ['year', 'month', 'day', 'hour', 'minute', 'second']
Expand Down
9 changes: 3 additions & 6 deletions django/db/backends/mysql_old/base.py
Expand Up @@ -64,7 +64,9 @@ def __getattr__(self, attr):
return getattr(self.cursor, attr)

class DatabaseOperations(BaseDatabaseOperations):
pass
def date_extract_sql(self, lookup_type, field_name):
# http://dev.mysql.com/doc/mysql/en/date-and-time-functions.html
return "EXTRACT(%s FROM %s)" % (lookup_type.upper(), field_name)

class DatabaseWrapper(BaseDatabaseWrapper):
ops = DatabaseOperations()
Expand Down Expand Up @@ -156,11 +158,6 @@ def quote_name(name):
def get_last_insert_id(cursor, table_name, pk_name):
return cursor.lastrowid

def get_date_extract_sql(lookup_type, table_name):
# lookup_type is 'year', 'month', 'day'
# http://dev.mysql.com/doc/mysql/en/date-and-time-functions.html
return "EXTRACT(%s FROM %s)" % (lookup_type.upper(), table_name)

def get_date_trunc_sql(lookup_type, field_name):
# lookup_type is 'year', 'month', 'day'
fields = ['year', 'month', 'day', 'hour', 'minute', 'second']
Expand Down
9 changes: 4 additions & 5 deletions django/db/backends/oracle/base.py
Expand Up @@ -38,6 +38,10 @@ def autoinc_sql(self, table):
END;/""" % (tr_name, quote_name(table), sq_name)
return sequence_sql, trigger_sql

def date_extract_sql(self, lookup_type, field_name):
# http://download-east.oracle.com/docs/cd/B10501_01/server.920/a96540/functions42a.htm#1017163
return "EXTRACT(%s FROM %s)" % (lookup_type, field_name)

class DatabaseWrapper(BaseDatabaseWrapper):
ops = DatabaseOperations()

Expand Down Expand Up @@ -153,11 +157,6 @@ def get_last_insert_id(cursor, table_name, pk_name):
cursor.execute('SELECT %s_sq.currval FROM dual' % sq_name)
return cursor.fetchone()[0]

def get_date_extract_sql(lookup_type, table_name):
# lookup_type is 'year', 'month', 'day'
# http://download-east.oracle.com/docs/cd/B10501_01/server.920/a96540/functions42a.htm#1017163
return "EXTRACT(%s FROM %s)" % (lookup_type, table_name)

def get_date_trunc_sql(lookup_type, field_name):
# lookup_type is 'year', 'month', 'day'
# Oracle uses TRUNC() for both dates and numbers.
Expand Down
9 changes: 3 additions & 6 deletions django/db/backends/postgresql/base.py
Expand Up @@ -58,7 +58,9 @@ def __getattr__(self, attr):
postgres_version = None

class DatabaseOperations(BaseDatabaseOperations):
pass
def date_extract_sql(self, lookup_type, field_name):
# http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT
return "EXTRACT('%s' FROM %s)" % (lookup_type, field_name)

class DatabaseWrapper(BaseDatabaseWrapper):
ops = DatabaseOperations()
Expand Down Expand Up @@ -122,11 +124,6 @@ def get_last_insert_id(cursor, table_name, pk_name):
cursor.execute("SELECT CURRVAL('\"%s_%s_seq\"')" % (table_name, pk_name))
return cursor.fetchone()[0]

def get_date_extract_sql(lookup_type, table_name):
# lookup_type is 'year', 'month', 'day'
# http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT
return "EXTRACT('%s' FROM %s)" % (lookup_type, table_name)

def get_date_trunc_sql(lookup_type, field_name):
# lookup_type is 'year', 'month', 'day'
# http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC
Expand Down
9 changes: 3 additions & 6 deletions django/db/backends/postgresql_psycopg2/base.py
Expand Up @@ -20,7 +20,9 @@
postgres_version = None

class DatabaseOperations(BaseDatabaseOperations):
pass
def date_extract_sql(self, lookup_type, field_name):
# http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT
return "EXTRACT('%s' FROM %s)" % (lookup_type, field_name)

class DatabaseWrapper(BaseDatabaseWrapper):
ops = DatabaseOperations()
Expand Down Expand Up @@ -76,11 +78,6 @@ def get_last_insert_id(cursor, table_name, pk_name):
cursor.execute("SELECT CURRVAL('\"%s_%s_seq\"')" % (table_name, pk_name))
return cursor.fetchone()[0]

def get_date_extract_sql(lookup_type, table_name):
# lookup_type is 'year', 'month', 'day'
# http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT
return "EXTRACT('%s' FROM %s)" % (lookup_type, table_name)

def get_date_trunc_sql(lookup_type, field_name):
# lookup_type is 'year', 'month', 'day'
# http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC
Expand Down
11 changes: 4 additions & 7 deletions django/db/backends/sqlite3/base.py
Expand Up @@ -35,7 +35,10 @@
Database.register_adapter(decimal.Decimal, util.rev_typecast_decimal)

class DatabaseOperations(BaseDatabaseOperations):
pass
def date_extract_sql(self, lookup_type, field_name):
# sqlite doesn't support extract, so we fake it with the user-defined
# function _sqlite_extract that's registered in connect().
return 'django_extract("%s", %s)' % (lookup_type.lower(), field_name)

class DatabaseWrapper(BaseDatabaseWrapper):
ops = DatabaseOperations()
Expand Down Expand Up @@ -100,12 +103,6 @@ def quote_name(name):
def get_last_insert_id(cursor, table_name, pk_name):
return cursor.lastrowid

def get_date_extract_sql(lookup_type, table_name):
# lookup_type is 'year', 'month', 'day'
# sqlite doesn't support extract, so we fake it with the user-defined
# function _sqlite_extract that's registered in connect(), above.
return 'django_extract("%s", %s)' % (lookup_type.lower(), table_name)

def _sqlite_extract(lookup_type, dt):
try:
dt = util.typecast_timestamp(dt)
Expand Down
2 changes: 1 addition & 1 deletion django/db/models/query.py
Expand Up @@ -808,7 +808,7 @@ def get_where_clause(lookup_type, table_prefix, field_name, value, db_type):
elif lookup_type in ('range', 'year'):
return '%s BETWEEN %%s AND %%s' % field_sql
elif lookup_type in ('month', 'day'):
return "%s = %%s" % backend.get_date_extract_sql(lookup_type, field_sql)
return "%s = %%s" % connection.ops.date_extract_sql(lookup_type, field_sql)
elif lookup_type == 'isnull':
return "%s IS %sNULL" % (field_sql, (not value and 'NOT ' or ''))
elif lookup_type == 'search':
Expand Down

0 comments on commit aab04a4

Please sign in to comment.