diff --git a/core/cache.c b/core/cache.c index 544715a9..db3b9d0d 100644 --- a/core/cache.c +++ b/core/cache.c @@ -171,6 +171,41 @@ static void cache_sync_hook(char *k, uint16_t kl, char *v, uint16_t vl, void *da } } +static void uwsgi_cache_add_items(struct uwsgi_cache *uc) { + struct uwsgi_string_list *usl = uwsgi.add_cache_item; + while(usl) { + char *space = strchr(usl->value, ' '); + char *key = usl->value; + uint16_t key_len = usl->len; + if (space) { + // need to skip ? + if (uwsgi_strncmp(uc->name, uc->name_len, usl->value, space-usl->value)) { + goto next; + } + key = space+1; + key_len = usl->len - ((space-usl->value)+1); + } + char *value = strchr(key, '='); + if (!value) { + uwsgi_log("[cache] unable to store item %s\n", usl->value); + goto next; + } + key_len = value - key; + value++; + uint64_t len = (usl->value + usl->len) - value; + uwsgi_wlock(uc->lock); + if (!uwsgi_cache_set2(uc, key, key_len, value, len, 0, 0)) { + uwsgi_log("[cache] stored \"%.*s\" in \"%s\"\n", key_len, key, uc->name); + } + else { + uwsgi_log("[cache-error] unable to store \"%.*s\" in \"%s\"\n", key_len, key, uc->name); + } + uwsgi_rwunlock(uc->lock); +next: + usl = usl->next; + } +} + static void uwsgi_cache_load_files(struct uwsgi_cache *uc) { struct uwsgi_string_list *usl = uwsgi.load_file_in_cache; @@ -341,6 +376,8 @@ void uwsgi_cache_init(struct uwsgi_cache *uc) { uwsgi_cache_load_files(uc); + uwsgi_cache_add_items(uc); + } static uint64_t uwsgi_cache_get_index(struct uwsgi_cache *uc, char *key, uint16_t keylen) { diff --git a/core/uwsgi.c b/core/uwsgi.c index 4a84e2b4..50a63e9a 100644 --- a/core/uwsgi.c +++ b/core/uwsgi.c @@ -236,6 +236,7 @@ static struct uwsgi_option uwsgi_base_options[] = { {"cache-sync", required_argument, 0, "copy the whole content of another uWSGI cache server on server startup", uwsgi_opt_set_str, &uwsgi.cache_sync, 0}, {"cache-use-last-modified", no_argument, 0, "update last_modified_at timestamp on every cache item modification (default is disabled)", uwsgi_opt_true, &uwsgi.cache_use_last_modified, 0}, + {"add-cache-item", required_argument, 0, "add an item in the cache", uwsgi_opt_add_string_list, &uwsgi.add_cache_item, 0}, {"load-file-in-cache", required_argument, 0, "load a static file in the cache", uwsgi_opt_add_string_list, &uwsgi.load_file_in_cache, 0}, #ifdef UWSGI_ZLIB {"load-file-in-cache-gzip", required_argument, 0, "load a static file in the cache with gzip compression", uwsgi_opt_add_string_list, &uwsgi.load_file_in_cache_gzip, 0}, diff --git a/uwsgi.h b/uwsgi.h index e8c95192..9f77c857 100644 --- a/uwsgi.h +++ b/uwsgi.h @@ -2250,6 +2250,7 @@ struct uwsgi_server { size_t lock_size; size_t rwlock_size; + struct uwsgi_string_list *add_cache_item; struct uwsgi_string_list *load_file_in_cache; #ifdef UWSGI_ZLIB struct uwsgi_string_list *load_file_in_cache_gzip;