[ci skip] Proper error handling for Sessions on PHP 5

This was actually a PHP bug, see https://wiki.php.net/rfc/session.user.return-value

Also related: #4039
diff --git a/system/libraries/Session/drivers/Session_database_driver.php b/system/libraries/Session/drivers/Session_database_driver.php
index 72b39d1..40a358f 100644
--- a/system/libraries/Session/drivers/Session_database_driver.php
+++ b/system/libraries/Session/drivers/Session_database_driver.php
@@ -125,9 +125,12 @@
 	 */
 	public function open($save_path, $name)
 	{
-		return empty($this->_db->conn_id)
-			? (bool) $this->_db->db_connect()
-			: TRUE;
+		if (empty($this->_db->conn_id) && ! $this->_db->db_connect())
+		{
+			return $this->_failure;
+		}
+
+		return $this->_success;
 	}
 
 	// ------------------------------------------------------------------------
@@ -201,7 +204,7 @@
 		{
 			if ( ! $this->_release_lock() OR ! $this->_get_lock($session_id))
 			{
-				return FALSE;
+				return $this->_failure;
 			}
 
 			$this->_row_exists = FALSE;
@@ -209,7 +212,7 @@
 		}
 		elseif ($this->_lock === FALSE)
 		{
-			return FALSE;
+			return $this->_failure;
 		}
 
 		if ($this->_row_exists === FALSE)
@@ -224,10 +227,11 @@
 			if ($this->_db->insert($this->_config['save_path'], $insert_data))
 			{
 				$this->_fingerprint = md5($session_data);
-				return $this->_row_exists = TRUE;
+				$this->_row_exists = TRUE;
+				return $this->_success;
 			}
 
-			return FALSE;
+			return $this->_failure;
 		}
 
 		$this->_db->where('id', $session_id);
@@ -247,10 +251,10 @@
 		if ($this->_db->update($this->_config['save_path'], $update_data))
 		{
 			$this->_fingerprint = md5($session_data);
-			return TRUE;
+			return $this->_success;
 		}
 
-		return FALSE;
+		return $this->_failure;
 	}
 
 	// ------------------------------------------------------------------------
@@ -264,9 +268,9 @@
 	 */
 	public function close()
 	{
-		return ($this->_lock)
-			? $this->_release_lock()
-			: TRUE;
+		return ($this->_lock && ! $this->_release_lock())
+			? $this->_failure
+			: $this->_success;
 	}
 
 	// ------------------------------------------------------------------------
@@ -289,12 +293,19 @@
 				$this->_db->where('ip_address', $_SERVER['REMOTE_ADDR']);
 			}
 
-			return $this->_db->delete($this->_config['save_path'])
-				? ($this->close() && $this->_cookie_destroy())
-				: FALSE;
+			if ( ! $this->_db->delete($this->_config['save_path']))
+			{
+				return $this->_failure;
+			}
 		}
 
-		return ($this->close() && $this->_cookie_destroy());
+		if ($this->close())
+		{
+			$this->_cookie_destroy();
+			return $this->_success;
+		}
+
+		return $this->_failure;
 	}
 
 	// ------------------------------------------------------------------------
@@ -309,7 +320,9 @@
 	 */
 	public function gc($maxlifetime)
 	{
-		return $this->_db->delete($this->_config['save_path'], 'timestamp < '.(time() - $maxlifetime));
+		return ($this->_db->delete($this->_config['save_path'], 'timestamp < '.(time() - $maxlifetime)))
+			? $this->_success
+			: $this->_failure;
 	}
 
 	// ------------------------------------------------------------------------
@@ -390,4 +403,4 @@
 		return parent::_release_lock();
 	}
 
-}
+}
\ No newline at end of file