Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F2527765
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
9 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/plugins/database_attachments/config.inc.php.dist b/plugins/database_attachments/config.inc.php.dist
new file mode 100644
index 000000000..b23a9a1be
--- /dev/null
+++ b/plugins/database_attachments/config.inc.php.dist
@@ -0,0 +1,12 @@
+<?php
+
+// By default this plugin stores attachments in filesystem
+// and copies them into sql database.
+// You can change it to use 'memcache' or 'apc'.
+$rcmail_config['database_attachments_cache'] = 'db';
+
+// Attachment data expires after specied TTL time in seconds (max.2592000).
+// Default is 12 hours.
+$rcmail_config['database_attachments_cache_ttl'] = 12 * 60 * 60;
+
+?>
diff --git a/plugins/database_attachments/database_attachments.php b/plugins/database_attachments/database_attachments.php
index 2511dbbb2..47e2b5222 100644
--- a/plugins/database_attachments/database_attachments.php
+++ b/plugins/database_attachments/database_attachments.php
@@ -1,169 +1,163 @@
<?php
/**
- * Filesystem Attachments
+ * Database Attachments
*
* This plugin which provides database backed storage for temporary
* attachment file handling. The primary advantage of this plugin
* is its compatibility with round-robin dns multi-server roundcube
* installations.
*
* This plugin relies on the core filesystem_attachments plugin
*
* @author Ziba Scott <ziba@umich.edu>
* @author Aleksander Machniak <alec@alec.pl>
* @version @package_version@
*/
require_once('plugins/filesystem_attachments/filesystem_attachments.php');
class database_attachments extends filesystem_attachments
{
+ // Cache object
+ protected $cache;
// A prefix for the cache key used in the session and in the key field of the cache table
- private $cache_prefix = "db_attach";
-
- /**
- * Helper method to generate a unique key for the given attachment file
- */
- private function _key($args)
- {
- $uname = $args['path'] ? $args['path'] : $args['name'];
- return $this->cache_prefix . $args['group'] . md5(mktime() . $uname . $_SESSION['user_id']);
- }
+ protected $prefix = "db_attach";
/**
* Save a newly uploaded attachment
*/
function upload($args)
{
$args['status'] = false;
- $rcmail = rcmail::get_instance();
- $key = $this->_key($args);
- $data = file_get_contents($args['path']);
+ $cache = $this->get_cache();
+ $key = $this->_key($args);
+ $data = file_get_contents($args['path']);
- if ($data === false)
+ if ($data === false) {
return $args;
+ }
- $data = base64_encode($data);
-
- $status = $rcmail->db->query(
- "INSERT INTO ".$rcmail->db->table_name('cache')
- ." (created, user_id, cache_key, data)"
- ." VALUES (".$rcmail->db->now().", ?, ?, ?)",
- $_SESSION['user_id'],
- $key,
- $data);
+ $data = base64_encode($data);
+ $status = $cache->write($key, $data);
if ($status) {
$args['id'] = $key;
$args['status'] = true;
unset($args['path']);
}
return $args;
}
/**
* Save an attachment from a non-upload source (draft or forward)
*/
function save($args)
{
$args['status'] = false;
- $rcmail = rcmail::get_instance();
- $key = $this->_key($args);
+ $cache = $this->get_cache();
+ $key = $this->_key($args);
if ($args['path']) {
$args['data'] = file_get_contents($args['path']);
- if ($args['data'] === false)
+ if ($args['data'] === false) {
return $args;
+ }
}
- $data = base64_encode($args['data']);
-
- $status = $rcmail->db->query(
- "INSERT INTO ".$rcmail->db->table_name('cache')
- ." (created, user_id, cache_key, data)"
- ." VALUES (".$rcmail->db->now().", ?, ?, ?)",
- $_SESSION['user_id'],
- $key,
- $data);
+ $data = base64_encode($args['data']);
+ $status = $cache->write($key, $data);
if ($status) {
$args['id'] = $key;
$args['status'] = true;
}
return $args;
}
/**
* Remove an attachment from storage
* This is triggered by the remove attachment button on the compose screen
*/
function remove($args)
{
$args['status'] = false;
- $rcmail = rcmail::get_instance();
- $status = $rcmail->db->query(
- "DELETE FROM ".$rcmail->db->table_name('cache')
- ." WHERE user_id = ?"
- ." AND cache_key = ?",
- $_SESSION['user_id'],
- $args['id']);
+
+ $cache = $this->get_cache();
+ $status = $cache->remove($args['id']);
if ($status) {
$args['status'] = true;
}
return $args;
}
/**
* When composing an html message, image attachments may be shown
* For this plugin, $this->get() will check the file and
* return it's contents
*/
function display($args)
{
return $this->get($args);
}
/**
* When displaying or sending the attachment the file contents are fetched
* using this method. This is also called by the attachment_display hook.
*/
function get($args)
{
- $rcmail = rcmail::get_instance();
-
- $sql_result = $rcmail->db->query(
- "SELECT data"
- ." FROM ".$rcmail->db->table_name('cache')
- ." WHERE user_id=?"
- ." AND cache_key=?",
- $_SESSION['user_id'],
- $args['id']);
-
- if ($sql_arr = $rcmail->db->fetch_assoc($sql_result)) {
- $args['data'] = base64_decode($sql_arr['data']);
+ $cache = $this->get_cache();
+ $data = $cache->read($args['id']);
+
+ if ($data) {
+ $args['data'] = base64_decode($data);
$args['status'] = true;
}
return $args;
}
/**
* Delete all temp files associated with this user
*/
function cleanup($args)
{
- $prefix = $this->cache_prefix . $args['group'];
- $rcmail = rcmail::get_instance();
- $rcmail->db->query(
- "DELETE FROM ".$rcmail->db->table_name('cache')
- ." WHERE user_id = ?"
- ." AND cache_key LIKE '{$prefix}%'",
- $_SESSION['user_id']);
+ $cache = $this->get_cache();
+ $cache->remove($args['group'], true);
+ }
+
+ /**
+ * Helper method to generate a unique key for the given attachment file
+ */
+ protected function _key($args)
+ {
+ $uname = $args['path'] ? $args['path'] : $args['name'];
+ return $args['group'] . md5(mktime() . $uname . $_SESSION['user_id']);
+ }
+
+ /**
+ * Initialize and return cache object
+ */
+ protected function get_cache()
+ {
+ if (!$this->cache) {
+ $this->load_config();
+
+ $rcmail = rcube::get_instance();
+ $ttl = 12 * 60 * 60; // default: 12 hours
+ $ttl = $rcmail->config->get('database_attachments_cache_ttl', $ttl);
+ $type = $rcmail->config->get('database_attachments_cache', 'db');
+
+ // Init SQL cache (disable cache data serialization)
+ $this->cache = $rcmail->get_cache($this->prefix, 'db', $ttl, false);
+ }
+
+ return $this->cache;
}
}
diff --git a/plugins/database_attachments/package.xml b/plugins/database_attachments/package.xml
index 40db858a4..44adc219e 100644
--- a/plugins/database_attachments/package.xml
+++ b/plugins/database_attachments/package.xml
@@ -1,62 +1,62 @@
<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" packagerversion="1.9.0" version="2.0" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
http://pear.php.net/dtd/tasks-1.0.xsd
http://pear.php.net/dtd/package-2.0
http://pear.php.net/dtd/package-2.0.xsd">
<name>database_attachments</name>
<channel>pear.roundcube.net</channel>
- <summary>SQL database storage for uploaded attachments</summary>
+ <summary>Database storage for uploaded attachments</summary>
<description>
This plugin which provides database backed storage for temporary
attachment file handling. The primary advantage of this plugin
is its compatibility with round-robin dns multi-server Roundcube
installations.
</description>
<lead>
<name>Aleksander Machniak</name>
<user>alec</user>
<email>alec@alec.pl</email>
<active>yes</active>
</lead>
<developer>
<name>Ziba Scott</name>
<user>ziba</user>
<email>ziba@umich.edu</email>
<active>yes</active>
</developer>
- <date>2011-11-21</date>
+ <date>2013-06-13</date>
<version>
- <release>1.0</release>
+ <release>1.1</release>
<api>1.0</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license>
<notes>-</notes>
<contents>
<dir baseinstalldir="/" name="/">
<file name="database_attachments.php" role="php">
<tasks:replace from="@name@" to="name" type="package-info"/>
<tasks:replace from="@package_version@" to="version" type="package-info"/>
</file>
</dir>
<!-- / -->
</contents>
<dependencies>
<required>
<php>
<min>5.2.1</min>
</php>
<pearinstaller>
<min>1.7.0</min>
</pearinstaller>
<package>
<name>filesystem_attachments</name>
<channel>pear.roundcube.net</channel>
</package>
</required>
</dependencies>
<phprelease/>
</package>
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Jan 31, 12:21 PM (1 d, 1 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
426287
Default Alt Text
(9 KB)
Attached To
Mode
R3 roundcubemail
Attached
Detach File
Event Timeline
Log In to Comment