Can we have a little discussion on pros/cons of this? Does this make mod_python dependent on sqlite?

Thanks,

Grisha


On Tue, 20 Sep 2005 [EMAIL PROTECTED] wrote:

Author: nlehuen
Date: Tue Sep 20 14:28:32 2005
New Revision: 290569

URL: http://svn.apache.org/viewcvs?rev=290569&view=rev
Log:
A first try at implementing a session storage relying on SQLite. It is slower 
than FileSession but could scale better ?

Added:
   httpd/mod_python/trunk/lib/python/mod_python/SQLiteSession.py

Added: httpd/mod_python/trunk/lib/python/mod_python/SQLiteSession.py
URL: 
http://svn.apache.org/viewcvs/httpd/mod_python/trunk/lib/python/mod_python/SQLiteSession.py?rev=290569&view=auto
==============================================================================
--- httpd/mod_python/trunk/lib/python/mod_python/SQLiteSession.py (added)
+++ httpd/mod_python/trunk/lib/python/mod_python/SQLiteSession.py Tue Sep 20 
14:28:32 2005
@@ -0,0 +1,150 @@
+ #
+ # Copyright 2004 Apache Software Foundation
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License"); you
+ # may not use this file except in compliance with the License.  You
+ # may obtain a copy of the License at
+ #
+ #      http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ # implied.  See the License for the specific language governing
+ # permissions and limitations under the License.
+ #
+ # Originally developed by Gregory Trubetskoy.
+ #
+ # $Id: Session.py 231126 2005-08-09 22:26:38Z jgallacher $
+from Session import *
+from time import time
+
+try:
+    # If this code is included into Session.py,
+    # we don't want to add a dependency to SQLite
+    from pysqlite2 import dbapi2 as sqlite
+except:
+    pass
+else:
+    class SQLiteSession(BaseSession):
+        """ A session implementation using SQLite to store session data.
+            pysqlite2 is required, see http://pysqlite.org/
+        """
+
+        def __init__(self, req, filename=None, sid=0, secret=None, timeout=0, 
lock=1):
+            # if no filename is given, get it from PythonOption
+            if not filename:
+                opts = req.get_options()
+                if opts.has_key("session_filename"):
+                    filename = opts["session_filename"]
+                else:
+                    # or build a session file in a temporary directory
+                    filename = os.path.join(
+                        opts.get('session_directory', tempdir),
+                        'mp_sess.sqlite'
+                    )
+
+            self.filename = filename
+
+            # check whether the sessions table exists, and create it if not
+            db = sqlite.connect(self.filename)
+            try:
+                try:
+                    cur = db.cursor()
+                    cur.execute("""
+                        select name from sqlite_master
+                        where name='sessions' and type='table'
+                    """)
+                    if cur.fetchone() is None:
+                        cur.execute("""
+                            create table sessions
+                            (id text,data blob,timeout real)
+                        """)
+                        cur.execute("""
+                            create unique index idx_session on sessions (id)
+                        """)
+                        db.commit()
+                finally:
+                    cur.close()
+            finally:
+                db.close()
+
+            BaseSession.__init__(self, req, sid=sid, secret=secret,
+                                 timeout=timeout, lock=lock)
+
+        def count(self):
+            db = sqlite.connect(self.filename)
+            try:
+                try:
+                    cur = db.cursor()
+                    cur.execute("select count(*) from sessions")
+                    return cur.fetchone()[0]
+                finally:
+                    cur.close()
+            finally:
+                db.close()
+
+        def do_cleanup(self):
+            db = sqlite.connect(self.filename)
+            try:
+                try:
+                    cur = db.cursor()
+                    cur.execute(
+                        "delete from sessions where timeout<?",
+                        (time(),)
+                    )
+                    db.commit()
+                finally:
+                    cur.close()
+            finally:
+                db.close()
+
+        def do_load(self):
+            db = sqlite.connect(self.filename)
+            try:
+                try:
+                    cur = db.cursor()
+                    cur.execute(
+                        "select data from sessions where id=?",
+                        (self._sid,)
+                    )
+                    row = cur.fetchone()
+                    if row is None:
+                        return None
+                    else:
+                        return cPickle.loads(str(row[0]))
+                finally:
+                    cur.close()
+            finally:
+                db.close()
+
+        def do_save(self, dict):
+            db = sqlite.connect(self.filename)
+            try:
+                try:
+                    cur = db.cursor()
+                    data = buffer(cPickle.dumps(dict,2))
+                    timeout = self._accessed+self._timeout
+                    cur.execute("""
+                        insert or replace into sessions (id,data,timeout)
+                        values (?,?,?)
+                    """,(self._sid,data,timeout))
+                    db.commit()
+                finally:
+                    cur.close()
+            finally:
+                db.close()
+
+        def do_delete(self):
+            db = sqlite.connect(self.filename)
+            try:
+                try:
+                    cur = db.cursor()
+                    cur.execute(
+                        "delete from sessions where id=?",
+                        (self._sid,)
+                    )
+                finally:
+                    cur.close()
+            finally:
+                db.close()


Reply via email to