Skip to content

Commit

Permalink
create function, close #14 (and fix issues link in README)
Browse files Browse the repository at this point in the history
  • Loading branch information
daTokenizer committed Nov 26, 2016
1 parent 68005f9 commit ecc5eee
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 89 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[![GitHub version](https://img.shields.io/github/release/tamarlabs/rede.svg?style=flat-square)](https://github.com/TamarLabs/ReDe/releases/latest)
![issues count](https://img.shields.io/github/issues/tamarlabs/rede.svg?style=flat-square)
[![issues count](https://img.shields.io/github/issues/tamarlabs/rede.svg?style=flat-square)](https://github.com/TamarLabs/ReDe/issues)
[![Build Status](https://img.shields.io/travis/TamarLabs/ReDe/master.svg?style=flat-square)](https://travis-ci.org/TamarLabs/ReDe)
<h1> ReDe - The <img src="https://upload.wikimedia.org/wikipedia/en/6/6b/Redis_Logo.svg" alt="redis" height="47" align="top"/> Element Dehydration Module</h1>

Expand Down
119 changes: 31 additions & 88 deletions src/module.c
Original file line number Diff line number Diff line change
Expand Up @@ -732,32 +732,9 @@ int LookCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
return REDISMODULE_OK;
}



/*
* dehydrator.gidpush <timeout> <element>
* dehydrate <element> for <timeout> seconds
*/
int GIDPushCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
int pull_impl(RedisModuleCtx *ctx, RedisModuleString* dehydrator_name,
RedisModuleString* timeout, RedisModuleString* element, RedisModuleString* element_id)
{
if (argc != 4)
{
return RedisModule_WrongArity(ctx);
}

RedisModuleString* dehydrator_name = argv[1];
RedisModuleString * timeout = argv[2];
RedisModuleString * element = argv[3];

char* tmp = generate_id();
RedisModuleString * element_id = RedisModule_CreateString(ctx, tmp, ID_LENGTH);
RedisModule_Free(tmp);

// timeout str to int ttl
long long ttl;
int rep = RedisModule_StringToLongLong(timeout, &ttl);
if (rep == REDISMODULE_ERR) { return REDISMODULE_ERR; }

// get key dehydrator_name
RedisModuleKey *key = RedisModule_OpenKey(ctx, dehydrator_name,
REDISMODULE_READ|REDISMODULE_WRITE);
Expand All @@ -776,6 +753,11 @@ int GIDPushCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
return REDISMODULE_ERR;
}

// timeout str to int ttl
long long ttl;
int rep = RedisModule_StringToLongLong(timeout, &ttl);
if (rep == REDISMODULE_ERR) { return REDISMODULE_ERR; }

// get timeout_queues[ttl]
ElementList* timeout_queue = NULL;
khiter_t k = kh_get(16, dehydrator->timeout_queues, ttl); // first have to get iterator
Expand Down Expand Up @@ -807,94 +789,55 @@ int GIDPushCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
k = kh_put(32, dehydrator->element_nodes, RedisModule_StringPtrLen(saved_element_id, NULL), &retval);
kh_value(dehydrator->element_nodes, k) = node;

RedisModule_ReplyWithString(ctx, element_id);
RedisModule_FreeString(ctx,element_id);
RedisModule_CloseKey(key);

return REDISMODULE_OK;
}


/*
* dehydrator.push <timeout> <element> <element_id>
* dehydrator.gidpush <timeout> <element>
* dehydrate <element> for <timeout> seconds
*/
int PushCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
int GIDPushCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
{
if(argc != 5)
if (argc != 4)
{
return RedisModule_WrongArity(ctx);
}

RedisModuleString* dehydrator_name = argv[1];
RedisModuleString * timeout = argv[2];
RedisModuleString * element = argv[3];
RedisModuleString * element_id = argv[4];
char* tmp = generate_id();
RedisModuleString * element_id = RedisModule_CreateString(ctx, tmp, ID_LENGTH);
RedisModule_Free(tmp);

// timeout str to int ttl
long long ttl;
int rep = RedisModule_StringToLongLong(timeout, &ttl);
if (rep == REDISMODULE_ERR) { return REDISMODULE_ERR; }
int retval = pull_impl(ctx, argv[1], argv[2], argv[3], element_id);

// get key dehydrator_name
RedisModuleKey *key = RedisModule_OpenKey(ctx, dehydrator_name,
REDISMODULE_READ|REDISMODULE_WRITE);
Dehydrator* dehydrator = validateDehydratorKey(ctx, key, dehydrator_name);
if (dehydrator == NULL)
if (retval == REDISMODULE_OK)
{
RedisModule_ReplyWithError(ctx, "ERROR: Not a dehydrator.");
return REDISMODULE_ERR;
RedisModule_ReplyWithString(ctx, element_id);
}
RedisModule_FreeString(ctx,element_id);

// now we know we have a dehydrator check if there is anything in id = element_id
ElementListNode* node = _getNodeForID(dehydrator, element_id);
if (node != NULL) // somthing is already there
{
RedisModule_ReplyWithError(ctx, "ERROR: Element already dehydrating.");
return REDISMODULE_ERR;
}
return retval;
}

// get timeout_queues[ttl]
ElementList* timeout_queue = NULL;
khiter_t k = kh_get(16, dehydrator->timeout_queues, ttl); // first have to get iterator
if (k != kh_end(dehydrator->timeout_queues)) // k will be equal to kh_end if key not present
{
timeout_queue = kh_val(dehydrator->timeout_queues, k);
}
if (timeout_queue == NULL) //does not exist
/*
* dehydrator.push <timeout> <element> <element_id>
* dehydrate <element> for <timeout> seconds
*/
int PushCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
{
if(argc != 5)
{
// create an empty ElementList and add it to timeout_queues
timeout_queue = _createNewList();
int retval;
k = kh_put(16, dehydrator->timeout_queues, ttl, &retval);
kh_value(dehydrator->timeout_queues, k) = timeout_queue;
return RedisModule_WrongArity(ctx);
}

//let's make our own copy of these
RedisModuleString* saved_element_id = RedisModule_CreateStringFromString(ctx, element_id);
RedisModuleString* saved_element = RedisModule_CreateStringFromString(ctx, element);

//create an ElementListNode
node = _createNewNode(saved_element, saved_element_id, ttl, current_time_ms() + ttl);

// push to tail of the list
_listPush(timeout_queue, node);
int retval = pull_impl(ctx, argv[1], argv[2], argv[3], argv[4]);

// mark element dehytion location in element_nodes
int retval;
k = kh_put(32, dehydrator->element_nodes, RedisModule_StringPtrLen(saved_element_id, NULL), &retval);
kh_value(dehydrator->element_nodes, k) = node;
if (argc == 4)
{
RedisModule_ReplyWithString(ctx, element_id);
RedisModule_FreeString(ctx,element_id);
}
else
if (retval == REDISMODULE_OK)
{
RedisModule_ReplyWithSimpleString(ctx, "OK");
}
RedisModule_CloseKey(key);

return REDISMODULE_OK;
return retval;
}


Expand Down

0 comments on commit ecc5eee

Please sign in to comment.