static int memcachefs_rename(const char *from, const char *to) { int ret; handle_t *handle; char *key; size_t keylen; void *val; size_t vallen; if(opt.verbose){ fprintf(stderr, "%s(%s -> %s)\n", __func__, from, to); } handle = handle_get(pool); key = (char *)from + 1; keylen = strlen(key); val = (char*)mc_aget2(handle->mc, key, keylen, &vallen); if(!val){ handle_release(pool, handle->index); return -ENOENT; } key = (char *)to + 1; keylen = strlen(key); ret = mc_set(handle->mc, key, keylen, val, vallen, 0, 0); if(ret){ handle_release(pool, handle->index); return -EIO; } key = (char *)from + 1; keylen = strlen(key); ret = mc_delete(handle->mc, key, keylen, 0); if(ret){ handle_release(pool, handle->index); return -EIO; } free(val); return 0; }
static int l_sipmemcache_delete(lua_State *L) { struct sipmemcache *o; const char *key; size_t keylen; int ret; o = luaL_checkudata(L, 1, "siplua.memcache"); key = luaL_checklstring(L, 2, &keylen); if (o->finalized || !o->mc) { lua_pushnil(L); } else { int hold_timer = 0; ret = mc_delete(o->mc, (char *)key, keylen, hold_timer); lua_pushinteger(L, ret); } return 1; }
static int memcachefs_unlink(const char *path) { int ret; handle_t *handle; char *key; size_t keylen; if(opt.verbose){ fprintf(stderr, "%s(\"%s\")\n", __func__, path); } handle = handle_get(pool); if(!handle){ return -EMFILE; } key = (char *)path + 1; keylen = strlen(key); ret = mc_delete(handle->mc, key, keylen, 0); handle_release(pool, handle->index); if(ret){ return -EIO; } return 0; }
int main(int argc, char *argv[]) { struct memcache *mc = NULL; u_int32_t num_tests = 0, valsize = 0; u_int32_t i; struct timeval t1, t2; const char *key; char *tests = NULL; char *val; u_int32_t keylen; double addtime, deltime; const char fmt[] = "%s\t%f\t%f\t%f\n"; struct memcache_req *req; struct memcache_res *res; if (argc > 1) num_tests = strtol(argv[1], NULL, 10); if (num_tests == 0) num_tests = 10; if (argc > 2) valsize = strtol(argv[2], NULL, 10); if (argc > 3) tests = strdup(argv[3]); if (tests == NULL) tests = strdup("adgs"); if (valsize == 0) valsize = 50; val = (char *)malloc(valsize + 1); memset(val, 69, valsize); val[valsize] = '\0'; /* XXX I should add a min/max time value for each request */ printf("Value size:\t%d\n", valsize); printf("Num tests:\t%d\n", num_tests); printf("Test\tOps per second\tTotal Time\tTime per Request\n"); key = "bench_key"; keylen = strlen(key); mc = mc_new(); if (mc == NULL) err(EX_OSERR, "Unable to allocate a new memcache object"); mc_err_filter_del(MCM_ERR_LVL_INFO); mc_err_filter_del(MCM_ERR_LVL_NOTICE); mc_server_add4(mc, "localhost:11211"); /* Establish a connection */ mc_set(mc, key, keylen, val, valsize, 0, 0); /* BEGIN set test, if specified */ if (strchr(tests, (int)'s') != NULL) { if (gettimeofday(&t1, NULL) != 0) err(EX_OSERR, "gettimeofday(2)"); for (i = 0; i < num_tests; i++) { mc_set(mc, key, keylen, val, valsize, 0, 0); } if (gettimeofday(&t2, NULL) != 0) err(EX_OSERR, "gettimeofday(2)"); /* END set test */ printf(fmt, "set", num_tests / tt(&t1, &t2), tt(&t1, &t2), tt(&t1, &t2) / num_tests); } if (strchr(tests, (int)'g') != NULL) { /* BEGIN get request */ req = mc_req_new(); res = mc_req_add(req, key, keylen); res->size = valsize; res->val = malloc(res->size); mc_res_free_on_delete(res, 1); if (gettimeofday(&t1, NULL) != 0) err(EX_OSERR, "gettimeofday(2)"); for (i = 0; i < num_tests; i++) { mc_get(mc, req); } if (gettimeofday(&t2, NULL) != 0) err(EX_OSERR, "gettimeofday(2)"); mc_req_free(req); /* END get test */ printf(fmt, "get", num_tests / tt(&t1, &t2), tt(&t1, &t2), tt(&t1, &t2) / num_tests); } if (strchr(tests, 'a') != NULL || strchr(tests, 'd') != NULL) { /* Run the add/delete test */ mc_delete(mc, key, keylen, 0); addtime = deltime = 0.0; for (i = 0; i < num_tests; i++) { /* BEGIN add test */ if (strchr(tests, 'a') != NULL) { if (gettimeofday(&t1, NULL) != 0) err(EX_OSERR, "gettimeofday(2)"); mc_add(mc, key, keylen, val, valsize, 0, 0); if (gettimeofday(&t2, NULL) != 0) err(EX_OSERR, "gettimeofday(2)"); addtime += tt(&t1, &t2); /* END add test */ } /* BEGIN delete test */ if (strchr(tests, 'd') != NULL) { if (gettimeofday(&t1, NULL) != 0) err(EX_OSERR, "gettimeofday(2)"); mc_delete(mc, key, keylen, 0); if (gettimeofday(&t2, NULL) != 0) err(EX_OSERR, "gettimeofday(2)"); deltime += tt(&t1, &t2); /* END delete test */ } } if (strchr(tests, 'a') != NULL) printf(fmt, "add", num_tests / addtime, addtime, addtime / num_tests); if (strchr(tests, 'd') != NULL) printf(fmt, "delete", num_tests / deltime, deltime, deltime / num_tests); } free(tests); free(val); mc_free(mc); return EX_OK; }
static int cw_db_del_main(const char *family, const char *keys, int like, const char *value, int use_memcache ) { char *sql; char *zErr = 0; int res = 0; sqlite3 *db; char *op = "="; char *pct = ""; int retry=0; if (!family || cw_strlen_zero(family)) { family = "_undef_"; } if (like) { op = "like"; pct = "%"; } if (family && keys && value) { sql = sqlite3_mprintf("delete from %q where family %s '%q%s' and keys %s '%q%s' AND value %s '%q%s' ", globals.tablename, op, family, pct, op, keys, pct, op, value, pct ); } else if (family && keys) { sql = sqlite3_mprintf("delete from %q where family %s '%q%s' and keys %s '%q%s'", globals.tablename, op, family, pct, op, keys, pct); } else if (family) { sql = sqlite3_mprintf("delete from %q where family %s '%q%s'", globals.tablename, op, family, pct); } else { sql = sqlite3_mprintf("delete from %q", globals.tablename); } if ( !sql ) { cw_log(LOG_ERROR, "Memory Error!\n"); return -1; /* Return an error */ } #ifdef HAVE_MEMCACHE if ( memcached_data.active && use_memcache ) { //cw_log(LOG_ERROR,"MEMCACHE DEL Family %s : %s => %s (%d)\n", family, keys, value, like); if ( memcached_data.has_error ) database_cache_retry_connect(); if ( !like && !value ) { int fullkeylen; char fullkey[256] = ""; fullkeylen = snprintf(fullkey, sizeof(fullkey), "/%s/%s", family, keys); mc_delete( memcached_data.mc, fullkey, fullkeylen, 0); if ( !database_sql_queue(sql) ) { sqlite3_free(sql); return 0; } } else { // If it's a deltree or we're dropping a specific value. // then we shouldn't do anything. // The best way here is to force the flush of all the QUEUE // to the DB, clear all the cache and go on as usual. //TODO check it database_flush_cache(); } } #endif sanity_check(); if (!(db = sqlite_open_db(globals.dbfile))) { return -1; } if (sql) { retry_2: if (retry > 0) cw_log(LOG_DEBUG, "SQL Query: [%s] (retry %d)\n", sql, retry); else cw_log(LOG_DEBUG, "SQL [%s]\n", sql); res = sqlite3_exec(db, sql, NULL, NULL, &zErr ); if (zErr) { if (retry >= SQL_MAX_RETRIES) { cw_log(LOG_ERROR, "SQL ERR Query: [%s] Error: [%s] Retries: %d Max: %d\n", sql, zErr, retry, SQL_MAX_RETRIES); sqlite3_free(zErr); } else { cw_log(LOG_DEBUG, "SQL ERR Query: %s Error: [%s] Retries %d\n", sql, zErr, ++retry); sqlite3_free(zErr); usleep(SQL_RETRY_USEC); goto retry_2; } res = -1; } else { if (!sqlite3_changes(db)) res = -1; else res = 0; } } if (sql) { sqlite3_free(sql); sql = NULL; } sqlite3_close(db); return res; }
int cw_db_put(const char *family, const char *keys, char *value) { char *sql = NULL; char *zErr = 0; int res = 0; sqlite3 *db; int retry=0; if (!family || cw_strlen_zero(family)) { family = "_undef_"; } if ( !(sql = sqlite3_mprintf("insert into %q values('%q','%q','%q')", globals.tablename, family, keys, value)) ) { cw_log(LOG_ERROR, "Memory Error!\n"); res = -1; /* Return an error */ } cw_db_del(family, keys); #ifdef HAVE_MEMCACHE if ( memcached_data.active ) { if ( memcached_data.has_error ) database_cache_retry_connect(); //cw_log(LOG_ERROR,"MEMCACHE PUT Family %s : %s => %s (%d) \n", family, keys, value, strlen(value) ); int fullkeylen; char fullkey[256] = ""; fullkeylen = snprintf(fullkey, sizeof(fullkey), "/%s/%s", family, keys); mc_delete( memcached_data.mc, fullkey, fullkeylen, 0); if ( mc_set(memcached_data.mc, fullkey, fullkeylen, value, (size_t) strlen(value) , db_cache_lifetime, 0) == 0) { // ADD THE SQL TO THE QUEUE TO BE EXECUTED ASYNCRONOUSLY if ( !database_sql_queue(sql) ) { sqlite3_free(sql); return 0; } } else { //DIDN'T WORK // So store as we did before... } } #endif sanity_check(); if (!(db = sqlite_open_db(globals.dbfile))) { return -1; } retry_0: if ( sql ) { cw_log(LOG_DEBUG, "SQL [%s]\n", sql); res = sqlite3_exec(db, sql, NULL, NULL, &zErr ); if (zErr) { if (retry >= SQL_MAX_RETRIES) { cw_log(LOG_ERROR, "SQL ERR Query: [%s] Error: [%s] Retries: %d Max: %d\n", sql, zErr, retry, SQL_MAX_RETRIES); sqlite3_free(zErr); } else { cw_log(LOG_DEBUG, "SQL ERR Query: %s Error: [%s] Retries %d\n", sql, zErr, ++retry); sqlite3_free(zErr); usleep(SQL_RETRY_USEC); goto retry_0; } res = -1; } else { res = 0; } } if (sql) { sqlite3_free(sql); sql = NULL; } sqlite3_close(db); return res; }