/*
* redis_feed_api.c
*
* Created on: 2011-4-1
* Author: saint
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <glib.h>
#include "redis_feed_api.h"
#define FORBIDDEN_FEEDS "_forbidden_feeds"
#define FORBIDDEN_JIDS "_forbidden_jids"
#define FORBIDDEN "_forbidden_"
#define GOZAP_FEEDS "gozap_feeds"
#define SEND "_send"
#define receive "_receive"
#define COMPS "comps"
#define PROCESSES "processes"
typedef enum{
ADD, REMOVE
}fobidden_op_st;
static redis_return_st do_key_value_by_op(redis_client_st *redis_client,
const char *key, const char *val, fobidden_op_st op) {
redis_return_st rc = REDIS_FAILURE;
switch (op) {
case ADD:
rc = redis_sadd(redis_client, key, val);
break;
case REMOVE:
default:
rc = redis_srem(redis_client, key, val);
break;
}
return rc;
}
char *jid_send_forFeedtype_key(const char *jid)
{
return generate_key("{%s}%s%s", jid, SEND, FORBIDDEN_FEEDS);
}
char *jid_send_forJid_key(const char *jid)
{
return generate_key("{%s}%s%s", jid, SEND, FORBIDDEN_JIDS);
}
char *jid_send_forFeedtypeJid_key(const char *jid, const char *feed)
{
return generate_key("{%s}%s%s%s",jid, SEND, FORBIDDEN, feed);
}
char *jid_feed_auto_key(const char *jid, const char *feed)
{
return generate_key("{%s}_%s_%s", jid, feed, "auto");
}
char *gozap_feed_auto_key( const char *feed)
{
return generate_key("%s_%s_%s", "gozap", feed, "auto");
}
char *jid_receive_forFeedtype_key(const char *jid)
{
return generate_key("{%s}%s%s", jid, receive, FORBIDDEN_FEEDS);
}
char *jid_receive_forJid_key(const char *jid)
{
return generate_key("{%s}%s%s", jid, receive, FORBIDDEN_JIDS);
}
char *jid_receive_forFeedtypeJid_key(const char *jid, const char *feed)
{
return generate_key("{%s}%s%s%s",jid, receive, FORBIDDEN, feed);
}
char *gozap_feed_comps_key(const char *feed)
{
return generate_key("{%s}_%s", feed, COMPS );
}
char *gozap_feed_processes_key(const char *feed)
{
return generate_key("{%s}_%s", feed, PROCESSES);
}
/******************************************send********************************/
redis_return_st redis_set_send_forFeedtype(redis_client_st *redis_client, const char *srcJid,
char *feeds[], int argc)
{
if(redis_client == NULL || srcJid == NULL || feeds == NULL || argc < 0)
{
return REDIS_FAILURE;
}
redis_return_st rc;
char *key = jid_send_forFeedtype_key(srcJid);
if (REDIS_SUCCESS != (rc = redis_del(redis_client,key)))
{
free_and_nil(key);
return rc;
}
int i = 0;
for(i = 0; i < argc; i ++)
{
if(REDIS_SUCCESS != (rc = redis_sadd(redis_client, key, feeds[i])))
{
break;
}
}
free_and_nil(key);
return rc;
}
redis_return_st redis_set_send_forJid(redis_client_st *redis_client, const char *srcJid,
char *jids[], int argc)
{
if(redis_client == NULL || srcJid == NULL || jids == NULL || argc < 0)
{
return REDIS_FAILURE;
}
redis_return_st rc;
char *key = jid_send_forJid_key(srcJid);
if(REDIS_SUCCESS != (rc = redis_del(redis_client, key)))
{
free_and_nil(key);
return rc;
}
int i = 0;
for(i = 0; i < argc; i ++)
{
if(REDIS_SUCCESS != (rc = redis_sadd(redis_client, key, jids[i])))
{
break;
}
}
free_and_nil(key);
return rc;
}
redis_return_st redis_set_send_forFeedtypeJid(redis_client_st *redis_client,
const char *srcJid, char *feeds[], int feed_argc, char *jids[], int jid_argc)
{
if(redis_client == NULL || srcJid == NULL || feeds == NULL || feed_argc < 0 || jids == NULL || jid_argc < 0)
{
return REDIS_FAILURE;
}
redis_return_st rc = REDIS_FAILURE;
int i, j;
char *key = NULL;
for(i = 0; i < feed_argc; i ++)
{
key = jid_send_forFeedtypeJid_key(srcJid, feeds[i]);
if(REDIS_SUCCESS != (rc = redis_del(redis_client, key)))
{
free_and_nil(key);
return rc;
}
for(j = 0; j < jid_argc; j ++)
{
if(REDIS_SUCCESS != (rc = redis_sadd(redis_client, key, jids[j])))
{
free_and_nil(key);
return rc;
}
}
free_and_nil(key);
}
return rc;
}
redis_return_st redis_set_feed_auto(redis_client_st *redis_client, const char *jid,
const char *feed, int is_auto)
{
char *auto_yes = "1";
char *auto_no = "0";
char *auto_str = NULL;
if(redis_client == NULL || jid == NULL || feed == NULL)
{
return REDIS_FAILURE;
}
redis_return_st rc = REDIS_FAILURE;
char *key = jid_feed_auto_key(jid,feed);
auto_str = (is_auto == 1 ? auto_yes : auto_no);
rc = redis_set(redis_client, key, auto_str);
free_and_nil(key);
return rc;
}
redis_return_st redis_add_send_forFeedtype(redis_client_st *redis_client, const char *srcJid,
const char *feed)
{
if(redis_client == NULL || srcJid == NULL || feed == NULL)
{
return REDIS_FAILURE;
}
redis_return_st rc = REDIS_FAILURE;
char *key = jid_send_forFeedtype_key(srcJid);
rc = do_key_value_by_op(redis_client, key, feed, ADD);
free_and_nil(key);
return rc;
}
redis_return_st redis_add_send_forJid(redis_client_st * redis_client,const char * srcJid,
const char * jid)
{
if(redis_client == NULL || srcJid == NULL || jid == NULL)
{
return REDIS_FAILURE;
}
redis_return_st rc = REDIS_FAILURE;
char *key = jid_send_forJid_key(srcJid);
rc = do_key_value_by_op(redis_client,key, jid, ADD);
free_and_nil(key);
return rc;
}
redis_return_st redis_add_send_forFeedtypeJid(redis_client_st * redis_client,
const char * srcJid,const char * feed,const char * jid)
{
if(redis_client == NULL || srcJid == NULL || feed == NULL || jid == NULL)
{
return REDIS_FAILURE;
}
redis_return_st rc = REDIS_FAILURE;
char *key = jid_send_forFeedtypeJid_key(srcJid, feed);
rc = do_key_value_by_op(redis_client,key, jid,ADD);
free_and_nil(key);
return rc;
}
redis_return_st redis_rem_send_forFeedtype(redis_client_st *redis_client,
const char *srcJid, const char *feed)
{
if(redis_client == NULL || srcJid == NULL || feed == NULL)
{
return REDIS_FAILURE;
}
redis_return_st rc = REDIS_FAILURE;
char *key = jid_send_forFeedtype_key(srcJid);
rc = do_key_value_by_op(redis_client, key, feed, REMOVE);
free_and_nil(key);
return rc;
}
redis_return_st redis_rem_send_forJid(redis_client_st *redis_client, const char *srcJid,
const char *jid)
{
if(redis_client == NULL || srcJid == NULL || jid == NULL)
{
return REDIS_FAILURE;
}
redis_return_st rc = REDIS_FAILURE;
char *key = jid_send_forJid_key(srcJid);
rc = do_key_value_by_op(redis_client,key, jid, REMOVE);
free_and_nil(key);
return rc;
}
redis_return_st redis_rem_send_forFeedtypeJid(redis_client_st *redis_client,
const char *srcJid, const char *feed, const char *jid)
{
if(redis_client == NULL || srcJid == NULL || feed == NULL || jid == NULL)
{
return REDIS_FAILURE;
}
redis_return_st rc = REDIS_FAILURE;
char *key = jid_send_forFeedtypeJid_key(srcJid, feed);
rc = do_key_value_by_op(redis_client,key, jid, REMOVE);
free_and_nil(key);
return rc;
}
/******************************************receive********************************/
redis_return_st redis_set_receive_forFeedtype(redis_client_st * redis_client,
const char * srcJid,char * feeds [ ],int argc)
{
if(redis_client == NULL || srcJid == NULL || feeds == NULL || argc < 0)
{
return REDIS_FAILURE;
}
redis_return_st rc;
char *key = jid_receive_forFeedtype_key(srcJid);
if (REDIS_SUCCESS != (rc = redis_del(redis_client,key)))
{
free_and_nil(key);
return rc;
}
int i = 0;
for(i = 0; i < argc; i ++)
{
if(REDIS_SUCCESS != (rc = redis_sadd(redis_cli