public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Lucas Meneghel Rodrigues <lmr@redhat.com>
To: autotest@test.kernel.org
Cc: kvm@vger.kernel.org
Subject: [PATCH 3/6] Adding afe custom database engine
Date: Fri, 27 May 2011 01:21:31 -0300	[thread overview]
Message-ID: <1306470094-16960-4-git-send-email-lmr@redhat.com> (raw)
In-Reply-To: <1306470094-16960-1-git-send-email-lmr@redhat.com>

Turns out that we rely on custom code to generate
joins that does some trickery with Django ORM system,
and was using a method calling get_from_clause, that
was present on the Query class on Django 1.1. Now,
the method was moved to a class upper in the hierarchy,
called SQLCompiler, and SQLCompiler is tied to the db
backend being used. After some research, seems like there's
no solution cleaner than implementing one db backend
special for autotest, just to accomodate this function.

So created one db engine that inherits pretty much everything
from the mysql one, except for the compiler classes.

Tested, and it works fairly well. Eventually more work
needs to be put in getting the web app into better shape.

Signed-off-by: Lucas Meneghel Rodrigues <lmr@redhat.com>
---
 frontend/db/backends/afe/base.py          |   22 +++++++++++++++++++
 frontend/db/backends/afe/compiler.py      |   32 +++++++++++++++++++++++++++++
 frontend/db/backends/afe/creation.py      |    1 +
 frontend/db/backends/afe/introspection.py |    1 +
 frontend/db/backends/afe/validation.py    |    1 +
 5 files changed, 57 insertions(+), 0 deletions(-)
 create mode 100644 frontend/db/__init__.py
 create mode 100644 frontend/db/backends/__init__.py
 create mode 100644 frontend/db/backends/afe/__init__.py
 create mode 100644 frontend/db/backends/afe/base.py
 create mode 100644 frontend/db/backends/afe/compiler.py
 create mode 100644 frontend/db/backends/afe/creation.py
 create mode 100644 frontend/db/backends/afe/introspection.py
 create mode 100644 frontend/db/backends/afe/validation.py

diff --git a/frontend/db/__init__.py b/frontend/db/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/db/backends/__init__.py b/frontend/db/backends/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/db/backends/afe/__init__.py b/frontend/db/backends/afe/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/db/backends/afe/base.py b/frontend/db/backends/afe/base.py
new file mode 100644
index 0000000..6d617d2
--- /dev/null
+++ b/frontend/db/backends/afe/base.py
@@ -0,0 +1,22 @@
+from django.db.backends.mysql.base import DatabaseCreation as MySQLCreation
+from django.db.backends.mysql.base import DatabaseOperations as MySQLOperations
+from django.db.backends.mysql.base import DatabaseWrapper as MySQLDatabaseWrapper
+from django.db.backends.mysql.base import DatabaseIntrospection as MySQLIntrospection
+
+try:
+    import MySQLdb as Database
+except ImportError, e:
+    from django.core.exceptions import ImproperlyConfigured
+    raise ImproperlyConfigured("Error loading MySQLdb module: %s" % e)
+
+
+class DatabaseOperations(MySQLOperations):
+    compiler_module = "autotest_lib.frontend.db.backends.afe.compiler"
+
+
+class DatabaseWrapper(MySQLDatabaseWrapper):
+    def __init__(self, *args, **kwargs):
+        super(DatabaseWrapper, self).__init__(*args, **kwargs)
+        self.creation = MySQLCreation(self)
+        self.ops = DatabaseOperations()
+        self.introspection = MySQLIntrospection(self)
diff --git a/frontend/db/backends/afe/compiler.py b/frontend/db/backends/afe/compiler.py
new file mode 100644
index 0000000..9971415
--- /dev/null
+++ b/frontend/db/backends/afe/compiler.py
@@ -0,0 +1,32 @@
+from django.db.backends.mysql import compiler as mysql_compiler
+from autotest_lib.frontend.afe.model_logic import _quote_name
+
+class SQLCompiler(mysql_compiler.SQLCompiler):
+    def get_from_clause(self):
+        from_, params = super(SQLCompiler, self).get_from_clause()
+
+        if hasattr(self.query, "_custom_joins"):
+            for join_dict in self.query._custom_joins:
+                from_.append('%s %s AS %s ON (%s)'
+                             % (join_dict['join_type'],
+                                _quote_name(join_dict['table']),
+                                _quote_name(join_dict['alias']),
+                                join_dict['condition']))
+                params.extend(join_dict['condition_values'])
+
+        return from_, params
+
+class SQLInsertCompiler(mysql_compiler.SQLInsertCompiler, SQLCompiler):
+    pass
+
+class SQLDeleteCompiler(mysql_compiler.SQLDeleteCompiler, SQLCompiler):
+    pass
+
+class SQLUpdateCompiler(mysql_compiler.SQLUpdateCompiler, SQLCompiler):
+    pass
+
+class SQLAggregateCompiler(mysql_compiler.SQLAggregateCompiler, SQLCompiler):
+    pass
+
+class SQLDateCompiler(mysql_compiler.SQLDateCompiler, SQLCompiler):
+    pass
diff --git a/frontend/db/backends/afe/creation.py b/frontend/db/backends/afe/creation.py
new file mode 100644
index 0000000..955a11e
--- /dev/null
+++ b/frontend/db/backends/afe/creation.py
@@ -0,0 +1 @@
+from django.db.backends.mysql.creation import *
diff --git a/frontend/db/backends/afe/introspection.py b/frontend/db/backends/afe/introspection.py
new file mode 100644
index 0000000..222bc9b
--- /dev/null
+++ b/frontend/db/backends/afe/introspection.py
@@ -0,0 +1 @@
+from django.db.backends.mysql.introspection import *
diff --git a/frontend/db/backends/afe/validation.py b/frontend/db/backends/afe/validation.py
new file mode 100644
index 0000000..818b34a
--- /dev/null
+++ b/frontend/db/backends/afe/validation.py
@@ -0,0 +1 @@
+from django.db.backends.mysql.validation import *
-- 
1.7.5.2

  parent reply	other threads:[~2011-05-27  4:21 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-05-27  4:21 [PATCH 0/6] Update the web interface to the latest versions of foundation components Lucas Meneghel Rodrigues
2011-05-27  4:21 ` [PATCH 1/6] Update admin site URL dispatcher to Django 1.3 Lucas Meneghel Rodrigues
     [not found]   ` <BANLkTi=VgwjAZ5bP=6_GZgRiv0g_TNbS7g@mail.gmail.com>
2011-05-27 17:33     ` Lucas Meneghel Rodrigues
2011-05-27  4:21 ` [PATCH 2/6] afe/readonly connection: Catch AttributeError exceptions Lucas Meneghel Rodrigues
2011-05-27  4:21 ` Lucas Meneghel Rodrigues [this message]
2011-05-27  4:21 ` [PATCH 4/6] Change web app to use new DB engine Lucas Meneghel Rodrigues
2011-05-27  4:21 ` [PATCH 5/6] Removing get_from_clause() from custom query class Lucas Meneghel Rodrigues
2011-05-27  4:21 ` [PATCH 6/6] external_packages: Bump version number requirements for web deps Lucas Meneghel Rodrigues

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1306470094-16960-4-git-send-email-lmr@redhat.com \
    --to=lmr@redhat.com \
    --cc=autotest@test.kernel.org \
    --cc=kvm@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox