static void do_mc_list(TTSOCK *sock, TASKARG *arg, TTREQ *req, char **tokens, int tnum){ ttservlog(g_serv, TTLOGDEBUG, "doing mc_list command"); TCADB *adb = arg->adb; if(tnum < 1){ ttsockprintf(sock, "CLIENT_ERROR error\r\n"); return; } TCXSTR *xstr = tcxstrnew(); TCXSTR * head = tcxstrnew(); pthread_cleanup_push((void (*)(void *))tcxstrdel, xstr); pthread_cleanup_push((void (*)(void *))tcxstrdel, head); tcadbiterinit(adb); char * key; int list_size; while((key=tcadbiternext2(adb))!=NULL){ tcxstrcat(xstr, key, strlen(key)); tcxstrcat(xstr,"\r\n",2); } list_size=tcxstrsize(xstr); tcxstrprintf(head,"LIST %d\r\n",list_size); tcxstrcat(xstr, "END\r\n",5); if( ttsocksend(sock, tcxstrptr(head), tcxstrsize(head)) && ttsocksend(sock,tcxstrptr(xstr),tcxstrsize(xstr)) ){ req->keep = true; } else { ttservlog(g_serv, TTLOGINFO, "do_mc_list: response failed"); return ; } pthread_cleanup_pop(1); pthread_cleanup_pop(1); }
TCXSTR *str_filter(const char *subject) { int i, j; uint16_t cur; TCXSTR *out = NULL; out = tcxstrnew3(100); for(i=0; subject[i] != 0; i++) { cur = 0; for(j = 0; filter[j].search; j++) { if(strncmp(subject+i, filter[j].search, filter[j].len) == 0) { cur = filter[j].len; i += filter[j].len - 1; tcxstrcat2(out, filter[j].replace); break; } } if(cur == 0) tcxstrcat(out, subject+i, 1); } return out; }
static gearman_return_t _libtokyocabinet_add(gearman_server_st *server, void *context, const void *unique, size_t unique_size, const void *function_name, size_t function_name_size, const void *data, size_t data_size, gearman_job_priority_t priority) { gearman_queue_libtokyocabinet_st *queue= (gearman_queue_libtokyocabinet_st *)context; bool rc; TCXSTR *key; TCXSTR *job_data; gearman_log_debug(server->gearman, "libtokyocabinet add: %.*s", (uint32_t)unique_size, (char *)unique); char key_str[GEARMAN_QUEUE_TOKYOCABINET_MAX_KEY_LEN]; size_t key_length= (size_t)snprintf(key_str, GEARMAN_QUEUE_TOKYOCABINET_MAX_KEY_LEN, "%.*s-%.*s", (int)function_name_size, (const char *)function_name, (int)unique_size, (const char *)unique); key= tcxstrnew(); tcxstrcat(key, key_str, (int)key_length); gearman_log_debug(server->gearman, "libtokyocabinet key: %.*s", (int)key_length, key_str); job_data= tcxstrnew(); tcxstrcat(job_data, (const char *)function_name, (int)function_name_size); tcxstrcat(job_data, "\0", 1); tcxstrcat(job_data, (const char *)unique, (int)unique_size); tcxstrcat(job_data, "\0", 1); switch (priority) { case GEARMAN_JOB_PRIORITY_HIGH: case GEARMAN_JOB_PRIORITY_MAX: tcxstrcat2(job_data,"0"); break; case GEARMAN_JOB_PRIORITY_LOW: tcxstrcat2(job_data,"2"); break; case GEARMAN_JOB_PRIORITY_NORMAL: default: tcxstrcat2(job_data,"1"); } tcxstrcat(job_data, (const char *)data, (int)data_size); rc= tcadbput(queue->db, tcxstrptr(key), tcxstrsize(key), tcxstrptr(job_data), tcxstrsize(job_data)); tcxstrdel(key); tcxstrdel(job_data); if (!rc) return GEARMAN_QUEUE_ERROR; return GEARMAN_SUCCESS; }