Class: Tina4::SessionHandlers::DatabaseHandler
- Inherits:
-
Object
- Object
- Tina4::SessionHandlers::DatabaseHandler
- Defined in:
- lib/tina4/session_handlers/database_handler.rb
Constant Summary collapse
- TABLE_NAME =
"tina4_session"- CREATE_TABLE_SQL =
<<~SQL CREATE TABLE IF NOT EXISTS #{TABLE_NAME} ( session_id VARCHAR(255) PRIMARY KEY, data TEXT NOT NULL, expires_at REAL NOT NULL ) SQL
Instance Method Summary collapse
- #cleanup ⇒ Object
- #destroy(session_id) ⇒ Object
-
#gc(max_age) ⇒ Object
Garbage-collect expired sessions.
-
#initialize(options = {}) ⇒ DatabaseHandler
constructor
A new instance of DatabaseHandler.
- #read(session_id) ⇒ Object
- #write(session_id, data) ⇒ Object
Constructor Details
#initialize(options = {}) ⇒ DatabaseHandler
Returns a new instance of DatabaseHandler.
18 19 20 21 22 |
# File 'lib/tina4/session_handlers/database_handler.rb', line 18 def initialize( = {}) @ttl = [:ttl] || 86400 @db = [:db] || Tina4::Database.new(ENV["DATABASE_URL"]) ensure_table end |
Instance Method Details
#cleanup ⇒ Object
55 56 57 |
# File 'lib/tina4/session_handlers/database_handler.rb', line 55 def cleanup @db.execute("DELETE FROM #{TABLE_NAME} WHERE expires_at > 0 AND expires_at < ?", [Time.now.to_f]) end |
#destroy(session_id) ⇒ Object
51 52 53 |
# File 'lib/tina4/session_handlers/database_handler.rb', line 51 def destroy(session_id) @db.execute("DELETE FROM #{TABLE_NAME} WHERE session_id = ?", [session_id]) end |
#gc(max_age) ⇒ Object
Garbage-collect expired sessions. Matches the Python interface.
61 62 63 |
# File 'lib/tina4/session_handlers/database_handler.rb', line 61 def gc(max_age) @db.execute("DELETE FROM #{TABLE_NAME} WHERE expires_at > 0 AND expires_at < ?", [Time.now.to_f]) end |
#read(session_id) ⇒ Object
24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/tina4/session_handlers/database_handler.rb', line 24 def read(session_id) row = @db.fetch_one("SELECT data, expires_at FROM #{TABLE_NAME} WHERE session_id = ?", [session_id]) return nil unless row expires_at = (row[:expires_at] || row["expires_at"]).to_f if expires_at > 0 && expires_at < Time.now.to_f destroy(session_id) return nil end JSON.parse(row[:data] || row["data"]) rescue JSON::ParserError nil end |
#write(session_id, data) ⇒ Object
39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/tina4/session_handlers/database_handler.rb', line 39 def write(session_id, data) expires_at = @ttl > 0 ? Time.now.to_f + @ttl : 0.0 json_data = JSON.generate(data) existing = @db.fetch_one("SELECT session_id FROM #{TABLE_NAME} WHERE session_id = ?", [session_id]) if existing @db.execute("UPDATE #{TABLE_NAME} SET data = ?, expires_at = ? WHERE session_id = ?", [json_data, expires_at, session_id]) else @db.execute("INSERT INTO #{TABLE_NAME} (session_id, data, expires_at) VALUES (?, ?, ?)", [session_id, json_data, expires_at]) end end |