ethumb: use xattr as cache when available.

SVN revision: 59004
This commit is contained in:
Cedric BAIL 2011-04-28 13:25:14 +00:00
parent 7280b0d852
commit c5b107f144
2 changed files with 51 additions and 2 deletions

View File

@ -195,6 +195,27 @@ fi
AM_CONDITIONAL(HAVE_LIBEXIF, test $HAVE_LIBEXIF = yes)
AC_SUBST(HAVE_LIBEXIF)
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM(
[[
#include <stdlib.h>
#include <sys/types.h>
#include <sys/xattr.h>
]],
[[
size_t tmp = listxattr("/", NULL, 0);
tmp = getxattr("/", "user.ethumb.md5", NULL, 0);
setxattr("/", "user.ethumb.md5", NULL, 0, 0);
]])],
[
AC_DEFINE(HAVE_XATTR, 1, [Define to 1 if you have 'listxattr', 'setxattr' and 'getxattr'])
have_xattr="yes"
],
[have_xattr="no"])
AC_MSG_CHECKING([for Xattr])
AC_MSG_RESULT([${have_xattr}])
AC_SUBST(requirement_ethumb)
AC_SUBST(requirement_ethumb_client)
AC_SUBST(dbusservicedir)
@ -248,6 +269,7 @@ Summary:
Configuration Options Summary:
* use xattr........: ${have_xattr}
* maximum log level: ${with_max_log_level}
* documentation....: ${build_doc}

View File

@ -52,6 +52,10 @@ void *alloca (size_t);
#include <dlfcn.h>
#include <ctype.h>
#ifdef HAVE_XATTR
# include <sys/xattr.h>
#endif
#ifndef PATH_MAX
# define PATH_MAX 4096
#endif
@ -824,6 +828,27 @@ _ethumb_generate_hash(const char *file)
char *t;
const unsigned char *c;
#ifdef HAVE_XATTR
ssize_t length;
length = getxattr(file, "user.e.md5", NULL, 0);
if (length > 0)
{
char *tmp;
tmp = alloca(length);
length = getxattr(file, "user.e.md5", tmp, length);
/* check if we have at least something that look like a md5 hash */
if (length > 0 && (length == MD5_HASHBYTES * 2 + 1))
{
tmp[length] = '\0';
return eina_stringshare_add(tmp);
}
}
#endif
#define _check_uri_char(c) \
((c) >= 32 && (c) < 128 && (ACCEPTABLE_URI_CHARS[(c) - 32] & 0x08))
@ -859,6 +884,10 @@ _ethumb_generate_hash(const char *file)
}
md5out[2 * n] = '\0';
#ifdef HAVE_XATTR
setxattr(file, "user.e.md5", md5out, 2 * n + 1, 0);
#endif
DBG("md5=%s, file=%s", md5out, file);
return eina_stringshare_add(md5out);
}
@ -924,7 +953,6 @@ _ethumb_file_generate_path(Ethumb *e)
const char *ext;
int fdo_format;
fdo_format = _ethumb_file_check_fdo(e);
if (e->thumb_dir)
@ -957,7 +985,6 @@ _ethumb_file_generate_path(Ethumb *e)
else
ext = "eet";
fullname = ecore_file_realpath(e->src_path);
hash = _ethumb_generate_hash(fullname);
snprintf(buf, sizeof(buf), "%s/%s/%s.%s", thumb_dir, category, hash, ext);