Langsung ke konten utama

Codeigniter Database Oracle Session

object =& get_instance();
  // set config variables
  $this->object->load->database();  
  $this->_lifetime = $this->object->config->item('sess_expiration');
  $this->_sess_id_ttl = $this->object->config->item('sess_time_to_update');
  $this->_match_ip = $this->object->config->item('sess_match_ip');
  $this->_match_useragent = $this->object->config->item('sess_match_useragent');
  $this->_useDB = $this->object->config->item('sess_use_database');
  $this->_sess_table = $this->object->config->item('sess_table_name');       
  log_message('debug', "Session Class Initialized");
  $this->_sess_run();
  
 }

    /**
    * Starts up the session system for current request
    */
 
    function _sess_run()
    {
  // Set session table and register this object as the session handler, if using databases
  if ($this->_useDB == TRUE) {
             
   session_set_save_handler(array($this, "_open"), array($this, "_close"), array($this, "_read"),
        array($this, "_write"),array($this, "_destroy"),array($this, "_gc"));    
  }
  
  
  // the following prevents unexpected effects when using objects as save handlers
  register_shutdown_function('session_write_close');
  //ini_set('session.use_only_cookies',0);
     //ini_set('session.cookie_lifetime',1440);
        session_start();

        $session_id_ttl =$this->object->config->item('sess_expiration');

        if (is_numeric($session_id_ttl))
        {
            if ($session_id_ttl > 0)
            {
                $this->session_id_ttl = $this->object->config->item('sess_expiration');
            }
            else
            {
                $this->session_id_ttl = (60*60*24*365*2);
            }
        }

        // check if session id needs regeneration
        if ( $this->_session_id_expired() )
        {
            // regenerate session id (session data stays the
            // same, but old session storage is destroyed)
            $this->regenerate_id();
        }

        // delete old flashdata (from last request)
        $this->_flashdata_sweep();

        // mark all new flashdata as old (data will be deleted before next request)
        $this->_flashdata_mark();
    }

    /**
    * Checks if session has expired
    */
    function _session_id_expired()
    {
        if ( !isset( $_SESSION['regenerated'] ) )
        {
            $_SESSION['regenerated'] = time();
            return false;
        }

        $expiry_time = time() - $this->session_id_ttl;

        if ( $_SESSION['regenerated'] <=  $expiry_time )
        {
            return true;
        }

        return false;
    }



   /**
   * Checks if stored user agent matches current user agent
   */
 function _useragents_match()
 {
  // if this is the first time coming in, initialize user agent
  if (!$this->userdata('sess_useragent')) {
    $this->set_userdata('sess_useragent', trim(substr($this->object->input->user_agent(), 0, 50)));
    return TRUE;
  }    

  return $this->userdata('sess_useragent') == trim(substr($this->object->input->user_agent(), 0, 50));
    }

    
 /**
    * Regenerates session id
    */
    function regenerate_id()
    {
        // copy old session data, including its id
        $old_session_id = session_id();
        $old_session_data = $_SESSION;

        // regenerate session id and store it
        session_regenerate_id();
        $new_session_id = session_id();

        // switch to the old session and destroy its storage
        session_id($old_session_id);
        session_destroy();

        // switch back to the new session id and send the cookie
        session_id($new_session_id);
        session_start();

        // restore the old session data into the new session
        $_SESSION = $old_session_data;

        // update the session creation time
        $_SESSION['regenerated'] = time();

        // session_write_close() patch based on this thread
        // http://www.codeigniter.com/forums/viewthread/1624/
        // there is a question mark ?? as to side affects

        // end the current session and store session data.
        session_write_close();
               
    }


    /**
    * Destroys the session and erases session storage
    */
 function sess_destroy()
 {
  session_unset();
  if ( isset( $_COOKIE[session_name()] ) )
    {
  //@@@ was having trouble just using setcookie() because it wasn't unsetting fast enough
  unset($_COOKIE[session_name()]);
  setcookie(session_name(), '', time()-42000, '/'); //@@@
    }

  session_destroy();
 }
    /**                                                                                                                                        * returns the session id of the current   session                                                                                                
    */
 
    function get_sess_id() 
 {
        return session_id();
    }


   /**
   * Reads given session attribute value: single variable, element of single dimensional array, or property of object
   * I was kind of of two minds about whether the object bit should be implemented
   * so you can take out that logic if you wish
   */    
    function userdata($item, $subitem=null)
    {
  // this item is in an array
  if ($subitem) {
    if ($subitem == 'session_id'){ //added for backward-compatibility                                                                           
   return session_id();
    } else {
   // array vs. object: handled differently
   if (isset($_SESSION[$item])) {
     if (is_array($_SESSION[$item])) return (!isset($_SESSION[$item][$subitem])) ? false : $_SESSION[$item][$subitem];
     if (is_object($_SESSION[$item])) return (!isset($_SESSION[$item]->$subitem)) ? false : $_SESSION[$item]->$subitem;
     return false;
   }
    }
  }

  // this item is not in an array
  else {
    if($item == 'session_id'){ //added for backward-compatibility
   return session_id();
    } else {
   return ( ! isset($_SESSION[$item])) ? false : $_SESSION[$item];
    }
  }

 }

 /**
 * Returns all session data
 */    
 function all_userdata()
 {
  if (isset($_SESSION['session_id'])) { //added for backward-compatibility
    $_SESSION['session_id'] = session_id();
  }
  return $_SESSION;
 }

    /**
     * Sets session attributes to the given values
    */
 function set_userdata($newdata = array(), $newval = '')
 {
  if (is_string($newdata))
    {
  $newdata = array($newdata => $newval);
    }

  if (count($newdata) > 0)
    {
  foreach ($newdata as $key => $val)
    {
   $_SESSION[$key] = $val;
    }
    }
 }

    /**
    * Erases given session attributes
    */
 function unset_userdata($newdata = array())
 {
  if (is_string($newdata))
    {
  $newdata = array($newdata => '');
    }

  if (count($newdata) > 0)
    {
  foreach ($newdata as $key => $val)
    {
   unset($_SESSION[$key]);
    }
    }
 }


 /**
 * Sets "flash" data which will be available only in next request (then it will
 * be deleted from session). You can use it to implement "Save succeeded" messages
 * after redirect.
 */
 function set_flashdata($key, $value)
 {
  $flash_key = $this->_flash_key.':new:'.$key;
  $this->set_userdata($flash_key, $value);
 }

 /**
  * Keeps existing "flash" data available to next request.
 */
 
 function keep_flashdata($key)
    {
  $old_flash_key = $this->_flash_key.':old:'.$key;
  $value = $this->userdata($old_flash_key);

  $new_flash_key = $this->_flash_key.':new:'.$key;
  $this->set_userdata($new_flash_key, $value);
 }

    /**
   * Returns "flash" data for the given key.
   */
 function flashdata($key)
 {
  $flash_key = $this->_flash_key.':old:'.$key;
  return $this->userdata($flash_key);
 }

 /**
 * PRIVATE: Internal method - marks "flash" session attributes as 'old'
 */
 function _flashdata_mark()
 {
  foreach ($_SESSION as $name => $value)
    {
  $parts = explode(':new:', $name);
  if (is_array($parts) && count($parts) == 2)
    {
   $new_name = $this->_flash_key.':old:'.$parts[1];
   $this->set_userdata($new_name, $value);
   $this->unset_userdata($name);
    }
    }
 }

    /**
    * PRIVATE: Internal method - removes "flash" session marked as 'old'
   */
 function _flashdata_sweep()
 {
  foreach ($_SESSION as $name => $value)
    {
  $parts = explode(':old:', $name);
  if (is_array($parts) && count($parts) == 2 && $parts[0] == $this->_flash_key)
    {
   $this->unset_userdata($name);
    }
    }
 }
 
 /************* DATABASE METHODS ***************/
    function _open()
    {
        $this->object->db->trans_begin();
  return TRUE;    
    }

    function _close()
    {
        $this->object->db->trans_commit();
  return TRUE;
    }
 
    function _read($id)
    {
        /* Build and execute the database query. */
        $query = "SELECT * FROM APP_SESSION WHERE SESSION_ID = '$id'";    
        $q     = $this->object->db->query($query);       
        if($q->num_rows() > 0)
        {
            $result = $q->row();
            $ret = $result->USER_DATA;     
           
        }
        else
        {
            $ret = false;
        }
    
        return $ret;
    }
 
    function _write($id, $data)
    {
        $val        = str_replace("'", "''", $data);
        $now        = time();
        $browser    = substr($this->object->input->user_agent(), 0, 120);
        $ip_address = $this->object->input->ip_address();
        $user_id    = @$_SESSION["USER_ID"];
  $login_api  = @$_SESSION["login_api"];
               
        $query1 = "DELETE FROM APP_SESSION WHERE session_id = '$id'";
        $query2 = "INSERT INTO APP_SESSION (SESSION_ID,LAST_ACTIVITY,USER_DATA,IP_ADDRESS,USER_AGENT,USER_ID,LOGIN_API) 
  VALUES('$id', $now, '$data','$ip_address','$browser','$user_id','$login_api')";
               
  
        $q1     = $this->object->db->query($query1);
        $q2     = $this->object->db->query($query2);
  
       
        
  if($q1 && $q2)
        {
            $ret = true;
   
        }
        else
        {
            $ret = false;
        }
              
        return ($ret);
    }
 
    function _destroy($id)
    {
        $query = "DELETE FROM APP_SESSION WHERE session_id = '$id'";     
        $q     = $this->object->db->query($query);
     
       
       if($q)
        {
            $ret = true;
        }
        else
        {
            $ret = false;
        }
               
        return $ret;
    }
 
    function _gc($max)
    {
        log_message('debug', "Session Expired");
        $expiry = time() - $max;
        $query = "DELETE FROM APP_SESSION WHERE LOGIN_API IS NULL AND LAST_ACTIVITY < $expiry  ";   
           
  $q     = $this->object->db->query($query);
      

  if($q)
        {
            $ret = true;
        }
        else
        {
            $ret = false;
        }
      
        return $ret;
    }

    

 // --------------------------------------------------------------------
 
}

// END Session Class

/* End of file Session.php */
/* Location: ./system/libraries/Session.php */

Komentar

Popular Posts

Extjs html class render

Ext.select('.datepicker').each(function(el){ new Ext.form.DateField({ allowBlank : true, renderTo: el, format:'m-d-Y', editable:false, width:140, fieldCls : 'tanggal x-form-field x-form-text x-trigger-noedit', }); }); Ext.select('.note').each(function(el){ new Ext.form.field.TextArea({ allowBlank : false, renderTo: el, grow : true, hideLabel : true, fieldCls : 'pesan x-form-field x-form-text x-trigger-noedit', }); });