From ece98b55a44702e0fa4a829a366eaf5200fdd404 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 29 Mar 2012 20:02:59 +0200 Subject: [PATCH] ownCloud: Added a flag for the existance of the current directory. That saves a lot of stat calls because the for each PUT a stat has to be done if the parent dir exists. --- modules/csync_owncloud.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 2592c0675a..09e8844f8c 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -548,14 +548,14 @@ static int _stat_perms( int type ) { int ret = 0; if( type == CSYNC_VIO_FILE_TYPE_DIRECTORY ) { - DEBUG_WEBDAV(("Setting mode in stat (dir)\n")); + /* DEBUG_WEBDAV(("Setting mode in stat (dir)\n")); */ /* directory permissions */ ret = S_IFDIR | S_IRUSR | S_IWUSR | S_IXUSR /* directory, rwx for user */ | S_IRGRP | S_IXGRP /* rx for group */ | S_IROTH | S_IXOTH; /* rx for others */ } else { /* regualar file permissions */ - DEBUG_WEBDAV(("Setting mode in stat (file)\n")); + /* DEBUG_WEBDAV(("Setting mode in stat (file)\n")); */ ret = S_IFREG | S_IRUSR | S_IWUSR /* regular file, user read & write */ | S_IRGRP /* group read perm */ | S_IROTH; /* others read perm */ @@ -758,9 +758,11 @@ static void install_content_reader( ne_request *req, void *userdata, const ne_st } } +static char*_lastDir = NULL; + static csync_vio_method_handle_t *owncloud_open(const char *durl, - int flags, - mode_t mode) { + int flags, + mode_t mode) { char *uri = NULL; char *dir = NULL; char getUrl[PATH_MAX]; @@ -807,14 +809,21 @@ static csync_vio_method_handle_t *owncloud_open(const char *durl, return NULL; } DEBUG_WEBDAV(("Stating directory %s\n", dir )); - if( owncloud_stat( dir, (csync_vio_method_handle_t*)(&statBuf) ) == 0 ) { - DEBUG_WEBDAV(("Directory of file to open exists.\n")); + if( c_streq( dir, _lastDir )) { + DEBUG_WEBDAV(("Dir %s is there, we know it already.\n", dir)); } else { - DEBUG_WEBDAV(("Directory %s of file to open does NOT exist.\n", dir )); - /* the directory does not exist. That is an ENOENT */ - errno = ENOENT; - SAFE_FREE( dir ); - return NULL; + if( owncloud_stat( dir, (csync_vio_method_handle_t*)(&statBuf) ) == 0 ) { + DEBUG_WEBDAV(("Directory of file to open exists.\n")); + SAFE_FREE( _lastDir ); + _lastDir = c_strdup(dir); + + } else { + DEBUG_WEBDAV(("Directory %s of file to open does NOT exist.\n", dir )); + /* the directory does not exist. That is an ENOENT */ + errno = ENOENT; + SAFE_FREE( dir ); + return NULL; + } } } @@ -855,13 +864,6 @@ static csync_vio_method_handle_t *owncloud_open(const char *durl, DEBUG_WEBDAV(("PUT request on %s!\n", uri)); writeCtx->req = ne_request_create(dav_session.ctx, "PUT", uri); - if( writeCtx->req ) { - rc = ne_begin_request( writeCtx->req ); - if (rc != NE_OK) { - DEBUG_WEBDAV(("Can not open a request, bailing out.\n")); - errno = EACCES; - } - } writeCtx->method = "PUT"; }