Revision: 1791
Author: andreassolberg
Date: Mon Sep 28 02:45:06 2009
Log: Adding new functionality permanent key value store using SQLite. To be  
used in Oauth module and others...
http://code.google.com/p/simplesamlphp/source/detail?r=1791

Added:
  /trunk/data
  /trunk/modules/core/lib/Storage
  /trunk/modules/core/lib/Storage/SQLPermanentStorage.php
Modified:
  /trunk/config-templates/config.php

=======================================
--- /dev/null
+++ /trunk/modules/core/lib/Storage/SQLPermanentStorage.php     Mon Sep 28  
02:45:06 2009
@@ -0,0 +1,179 @@
+<?php
+
+/**
+ * SQLPermanentStorage
+ *
+ * Generic SQL Store to store key value pairs. To be used in several other  
modules that needs
+ * to store data permanently.
+ *
+ * @author Andreas Åkre Solberg <[email protected]>, UNINETT AS.
+ * @package simpleSAMLphp
+ * @version $Id$
+ */
+class sspmod_core_Storage_SQLPermanentStorage {
+
+       private $db;
+
+       function __construct($name, $config = NULL) {
+               if (is_null($config))
+                       $config = SimpleSAML_Configuration::getInstance();
+
+               $datadir = $config->getPathValue('datadir');
+
+               if (!is_dir($datadir))
+                       throw new Exception('Data directory [' . $datadir. '] 
does not exist');
+               if (!is_writable($datadir))
+                       throw new Exception('Data directory [' . $datadir. '] 
is not writable');
+
+               $sqllitedir = $datadir . 'sqllite/';
+               if (!is_dir($sqllitedir)) {
+                       mkdir($sqllitedir);
+               }
+
+               $dbfile = $sqllitedir . $name . '.sqllite';
+
+               if ($this->db = new SQLiteDatabase($dbfile)) {
+                       $q = @$this->db->query('SELECT key1 FROM data LIMIT 1');
+                       if ($q === false) {
+                               $this->db->queryExec('
+               CREATE TABLE data (
+                       key1 text,
+                       key2 text,
+                       type text,
+                       value text,
+                       created timestamp,
+                       updated timestamp,
+                       expire timestamp,
+                       PRIMARY KEY (key1,key2,type)
+               );
+               ');
+                       }
+               } else {
+                   throw new Exception('Error creating SQL lite database [' .  
$dbfile . '].');
+               }
+       }
+
+       public function set($type, $key1, $key2, $value, $duration = NULL) {
+               if ($this->exists($type, $key1, $key2)) {
+                       $this->update($type, $key1, $key2, $value, $duration);
+               } else {
+                       $this->insert($type, $key1, $key2, $value, $duration);
+               }
+       }
+
+       private function insert($type, $key1, $key2, $value, $duration = NULL) {
+
+               $setDuration = '';
+               if (is_null($duration)) {
+                       $setDuration = 'NULL';
+               } else {
+                       $setDuration = "'" . sqlite_escape_string(time() + 
$duration) . "'";
+               }
+
+               $query = "INSERT INTO data 
(key1,key2,type,created,updated,expire,value)  
VALUES (" .
+                       "'" . sqlite_escape_string($key1) . "'," .
+                       "'" . sqlite_escape_string($key2) . "'," .
+                       "'" . sqlite_escape_string($type) . "'," .
+                       "'" . sqlite_escape_string(time()) . "'," .
+                       "'" . sqlite_escape_string(time()) . "'," .
+                       $setDuration . "," .
+                       "'" . sqlite_escape_string(serialize($value)) . "')";
+               $results = $this->db->queryExec($query);
+               return $results;
+       }
+
+       private function update($type, $key1, $key2, $value, $duration = NULL) {
+
+               $setDuration = '';
+               if (is_null($duration)) {
+                       $setDuration = ", expire = NULL ";
+               } else {
+                       $setDuration = ", expire = '" . 
sqlite_escape_string(time() +  
$duration) . "' ";
+               }
+
+               $query = "UPDATE data SET " .
+                       "updated = '" . sqlite_escape_string(time()) . "'," .
+                       "value = '" . sqlite_escape_string(serialize($value)) . 
"'" .
+                       $setDuration .
+                       "WHERE " .
+                       "key1 = '" . sqlite_escape_string($key1) . "' AND " .
+                       "key2 = '" . sqlite_escape_string($key2) . "' AND " .
+                       "type = '" . sqlite_escape_string($type) . "'";
+               $results = $this->db->queryExec($query);
+               # echo $query;
+               # echo $this->db>changes;
+               return $results;
+       }
+
+       public function get($type, $key1, $key2) {
+               $query = "SELECT * FROM data WHERE " .
+                       "key1 = '" . sqlite_escape_string($key1) . "' AND " .
+                       "key2 = '" . sqlite_escape_string($key2) . "' AND " .
+                       "type = '" . sqlite_escape_string($type) . "'";
+               $results = $this->db->arrayQuery($query, SQLITE_ASSOC);
+               if (count($results) !== 1) return NULL;
+
+               $res = $results[0];
+               $res['value'] = unserialize($res['value']);
+               return $res;
+       }
+
+       public function exists($type, $key1, $key2) {
+               $query = "SELECT * FROM data WHERE " .
+                       "key1 = '" . sqlite_escape_string($key1) . "' AND " .
+                       "key2 = '" . sqlite_escape_string($key2) . "' AND " .
+                       "type = '" . sqlite_escape_string($type) . "' LIMIT 1";
+               $results = $this->db->arrayQuery($query, SQLITE_ASSOC);
+               return (count($results) == 1);
+       }
+
+       public function getList($type = NULL, $key1 = NULL, $key2 = NULL) {
+
+               $condition = self::getCondition($type, $key1, $key2);
+               $query = "SELECT * FROM data WHERE " . $condition;
+               $results = $this->db->arrayQuery($query, SQLITE_ASSOC);
+               if (count($results) == 0) return NULL;
+
+               foreach($results AS $key => $value) {
+                       $results[$key]['value'] = 
unserialize($results[$key]['value']);
+               }
+               return $results;
+       }
+
+       public function remove($type, $key1, $key2) {
+               $query = "DELETE FROM data WHERE " .
+                       "key1 = '" . sqlite_escape_string($key1) . "' AND " .
+                       "key2 = '" . sqlite_escape_string($key2) . "' AND " .
+                       "type = '" . sqlite_escape_string($type) . "'";
+               $results = $this->db->arrayQuery($query, SQLITE_ASSOC);
+               return (count($results) == 1);
+       }
+
+       public function removeExpired() {
+               $query = "DELETE FROM data WHERE expire NOT NULL AND expire < " 
. time();
+               $this->db->arrayQuery($query, SQLITE_ASSOC);
+               $changes = $this->db>changes;
+               return $changes;
+       }
+
+
+       /**
+        * Create a SQL condition statement based on parameters
+        */
+       private static function getCondition($type = NULL, $key1 = NULL, $key2 
=  
NULL) {
+               $conditions = array();
+
+               if (!is_null($type)) $conditions[] = "type = '" .  
sqlite_escape_string($type) . "'";
+               if (!is_null($key1)) $conditions[] = "key1 = '" .  
sqlite_escape_string($key1) . "'";
+               if (!is_null($key2)) $conditions[] = "type = '" .  
sqlite_escape_string($key2) . "'";
+
+               if (count($conditions) === 0) return '1';
+
+               $condition = join(' AND ', $conditions);
+
+               return $condition;
+       }
+
+
+}
+
=======================================
--- /trunk/config-templates/config.php  Mon Sep 21 02:56:05 2009
+++ /trunk/config-templates/config.php  Mon Sep 28 02:45:06 2009
@@ -28,14 +28,15 @@
        'certdir'               => 'cert/',
        'dictionarydir'         => 'dictionaries/',
        'loggingdir'            => 'log/',
-
+       'datadir'                               => 'data/',
+
        /*
         * A directory where simpleSAMLphp can save temporary files.
         *
         * SimpleSAMLphp will attempt to create this directory if it doesn't  
exist.
         */
        'tempdir'               => '/tmp/simplesaml',
-
+
        'version'                               =>      'trunk',

        /**

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"simpleSAMLphp commits" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/simplesamlphp-commits?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to