//togo_hash.c void togo_hash_test() { togo_log(DEBUG, "Testing togo_hash.c start ============================"); int i, j; //togo_djb_hash i = togo_djb_hash("WOSHISHEN"); j = togo_djb_hash("asdsadsad"); if (i == 321158909 && j == 1542131117) { togo_log(DEBUG, "Testing function:togo_djb_hash .............................OK"); } else { togo_log(DEBUG, "Testing function:togo_djb_hash .............................FAIL"); togo_exit(); } //togo_murmur_hash2 i = togo_murmur_hash2("WOSHISHEN", togo_strlen("WOSHISHEN")); j = togo_murmur_hash2("asdsadsad", togo_strlen("asdsadsad")); if (i == 1501669989 && j == 844110999) { togo_log(DEBUG, "Testing function:togo_djb_hash .............................OK"); } else { togo_log(DEBUG, "Testing function:togo_djb_hash .............................FAIL"); togo_exit(); } togo_log(DEBUG, "Testing togo_hash.c end ============================\r\n"); }
BOOL togo_m_cache_get(TOGO_THREAD_ITEM * socket_item, u_char * key) { TOGO_M_CACHE_ITEM * item; TOGO_HASHTABLE_ITEM * hitem; uint32_t vlen; void * buf; if (togo_m_cache->is_flush == TRUE) { return FALSE; } hitem = togo_hashtable_get(togo_m_cache_hashtable, key); if (hitem == NULL) { togo_send_data(socket_item, TOGO_SBUF_NOT_EXIST, togo_strlen(TOGO_SBUF_NOT_EXIST)); return TRUE; } item = (TOGO_M_CACHE_ITEM *) hitem->p; if (item->expires != 0 && item->expires < togo_get_time()) { togo_m_cache_delete_comm(item); togo_send_data(socket_item, TOGO_SBUF_NOT_EXIST, togo_strlen(TOGO_SBUF_NOT_EXIST)); return TRUE; } buf = togo_m_cache_get_val_addr(item, item->klen); vlen = item->vlen; togo_send_dbig(socket_item, buf, vlen, togo_m_cache_get_cb, (void *) item); return TRUE; }
BOOL togo_m_cache_replace(TOGO_THREAD_ITEM * socket_item, u_char * key, uint32_t expires, uint32_t vlen) { TOGO_M_CACHE_ITEM * item; TOGO_HASHTABLE_ITEM * hitem; hitem = togo_hashtable_get(togo_m_cache_hashtable, key); if (hitem == NULL) { /* Skip to read the value!*/ togo_read_skip(socket_item, vlen); togo_send_data(socket_item, TOGO_SBUF_NOT_EXIST, togo_strlen(TOGO_SBUF_NOT_EXIST)); return TRUE; } item = (TOGO_M_CACHE_ITEM *) hitem->p; if (item->expires != 0 && item->expires < togo_get_time()) { /* Skip to read the value!*/ togo_read_skip(socket_item, vlen); togo_m_cache_delete_comm(item); togo_send_data(socket_item, TOGO_SBUF_NOT_EXIST, togo_strlen(TOGO_SBUF_NOT_EXIST)); return TRUE; } togo_m_cache_delete_comm(item); return togo_m_cache_set_comm(socket_item, key, expires, vlen); }
//togo_pool.c void togo_pool_test() { togo_log(DEBUG, "Testing togo_pool.c start ============================"); void * p; void * p1; //togo_pool_create TOGO_POOL * pool = togo_pool_create(10 * 1024); if (pool->total_size == 10288 && pool->max == 10 * 1024) { togo_log(DEBUG, "Testing function:togo_pool_create .............................OK"); } else { togo_log(DEBUG, "Testing function:togo_pool_create .............................FAIL"); togo_exit(); } //togo_pool_calloc p1 = togo_pool_calloc(pool, 10 * 1024); p = togo_pool_calloc(pool, 10); togo_strcpy(p, "woshishen"); if (strcmp(p, "woshishen") == 0 && togo_strlen(p) == 9 && pool->large->size == 10 * 1024) { togo_log(DEBUG, "Testing function:togo_pool_calloc .............................OK"); } else { togo_log(DEBUG, "Testing function:togo_pool_calloc .............................FAIL"); togo_exit(); } //togo_pool_realloc(pool, 20); p = togo_pool_realloc(pool, (void *) p, 10, 15); togo_strcpy(p, "woshishen11234"); if (strcmp(p, "woshishen11234") == 0 && togo_strlen(p) == 14) { togo_log(DEBUG, "Testing function:togo_pool_realloc .............................OK"); } else { togo_log(DEBUG, "Testing function:togo_pool_realloc .............................FAIL"); togo_exit(); } //togo_pool_free_data togo_pool_free_data(pool, (void *) p); togo_pool_free_large(pool, (void *) p1); if (pool->large == NULL) { togo_log(DEBUG, "Testing function:togo_pool_free_large .............................OK"); } else { togo_log(DEBUG, "Testing function:togo_pool_free_large .............................FAIL"); togo_exit(); } togo_log(DEBUG, "Testing togo_pool.c end ============================\r\n"); }
int togo_wt_send_cb(TOGO_THREAD_ITEM * socket_item) { int ret; char int_str[12]; /* If sstatus equal to 3, send the big data! */ if (socket_item->sstatus == 3) { BDATA_CALLBACK callback; if (socket_item->bsbuf == NULL || socket_item->bssize == 0) { return 0; } togo_itoa((uint32_t) socket_item->bssize, int_str, 10); /** * Retrun:TOGO_S10TOGO_E/r/nAAAAAAAAAA */ ret = bufferevent_write(socket_item->bev, TOGO_SBUF_START, togo_strlen(TOGO_SBUF_START)); ret = bufferevent_write(socket_item->bev, int_str, togo_strlen(int_str)); ret += bufferevent_write(socket_item->bev, TOGO_SBUF_END, togo_strlen(TOGO_SBUF_END)); ret += bufferevent_write(socket_item->bev, socket_item->bsbuf, socket_item->bssize); if (ret < 0) { togo_log(INFO, "Send data error"); } callback = socket_item->bscb; if (callback != NULL) { callback(socket_item); } socket_item->sstatus = 0; } else { if (socket_item->sfd < 1 || socket_item->sbuf == NULL || socket_item->ssize == 0) { return 0; } ret = bufferevent_write(socket_item->bev, socket_item->sbuf, socket_item->ssize); if (ret < 0) { togo_log(INFO, "Send data error"); } socket_item->ssize = 0; } return ret; }
BOOL togo_m_cache_delete(TOGO_THREAD_ITEM * socket_item, u_char * key) { TOGO_M_CACHE_ITEM * item; TOGO_HASHTABLE_ITEM * hitem; hitem = togo_hashtable_get(togo_m_cache_hashtable, key); if (hitem == NULL) { togo_send_data(socket_item, TOGO_SBUF_NOT_EXIST, togo_strlen(TOGO_SBUF_NOT_EXIST)); return TRUE; } item = (TOGO_M_CACHE_ITEM *) hitem->p; return togo_m_cache_delete_comm(item); }
BOOL togo_m_queue_count(u_char * name, TOGO_THREAD_ITEM * socket_item) { uint32_t count; TOGO_M_QUEUE * queue; size_t str_size; queue = togo_m_queue_get(name); count = (queue == NULL) ? 0 : queue->total_elt; u_char * str = (u_char *) togo_pool_alloc(queue->pool, 12); togo_itoa(count, str, 10); togo_send_data(socket_item, str, togo_strlen(str)); togo_pool_free_data(queue->pool, (void *) str); return TRUE; }
static BOOL togo_m_cache_set_comm(TOGO_THREAD_ITEM * socket_item, u_char * key, uint32_t expires, uint32_t vlen) { uint32_t klen, item_size, area_id, i, this_time; TOGO_M_CACHE_AREA * area; TOGO_M_CACHE_ITEM * item; TOGO_M_CACHE_CHUNK * chunk; TOGO_M_CACHE_ITEM * temp; klen = togo_strlen(key); if (klen == 0 || vlen == 0 || togo_m_cache->area == NULL) { return FALSE; } item_size = togo_m_cache_item_size(klen, vlen); area_id = togo_m_cache_area_search(togo_m_cache->area_table, item_size, togo_m_cache->total_area); if (area_id == -1) { return FALSE; } area = (TOGO_M_CACHE_AREA *) (togo_m_cache->area + area_id); pthread_mutex_lock(&area->lock); if (togo_m_cache->is_flush == TRUE) { pthread_mutex_unlock(&area->lock); return FALSE; } if (area->chunk_item_curr < area->chunk_item_num) { chunk = area->chunk_curr; item = (TOGO_M_CACHE_ITEM *) ((u_char *) chunk->p + (area->msize * area->chunk_item_curr)); togo_m_cache_create_item(socket_item, item, area, klen, vlen, key, expires); area->chunk_item_curr++; } else { if (area->free_list != NULL) { item = area->free_list; if (area->free_list->next == NULL) { area->free_list = NULL; } else { area->free_list->next->prev = NULL; area->free_list = area->free_list->next; } togo_m_cache_create_item(socket_item, item, area, klen, vlen, key, expires); } else { /* Alloc a new chunk*/ pthread_mutex_lock(&togo_m_cache->glock); if (togo_m_cache->total_size < TOGO_M_CACHE_MAX_SIZE) { chunk = togo_m_cache_create_chunk(area); if (chunk == NULL) { pthread_mutex_unlock(&area->lock); return FALSE; } if (area->chunk_list == NULL) { area->chunk_list = chunk; } else { area->chunk_list->prev = chunk; chunk->next = area->chunk_list; area->chunk_list = chunk; } area->chunk_curr = chunk; area->chunk_item_curr = 0; area->total_chunk++; area->total_size += TOGO_M_CACHE_CHUNK_SIZE; pthread_mutex_unlock(&togo_m_cache->glock); item = (TOGO_M_CACHE_ITEM *) ((u_char *) chunk->p + (area->msize * area->chunk_item_curr)); togo_m_cache_create_item(socket_item, item, area, klen, vlen, key, expires); } else { pthread_mutex_unlock(&togo_m_cache->glock); /* LRU */ if (area->lru_tail == NULL) { pthread_mutex_unlock(&area->lock); return FALSE; } this_time = togo_get_time(); item = NULL; temp = area->lru_tail; for (i = 0; i < tries; i++) { if (temp == NULL) { break; } if (temp->expires != 0 && temp->expires < this_time) { break; } temp = temp->prev; } if (temp == NULL || temp->expires == 0 || temp->expires > this_time) { item = (TOGO_M_CACHE_ITEM *) area->lru_tail; area->lru_tail = area->lru_tail->prev; } else { item = temp; if (temp->next != NULL) { temp->next->prev = temp->prev; } if (temp->prev != NULL) { temp->prev->next = temp->next; } if (area->lru_head == temp) { area->lru_head = temp->next; } if (area->lru_tail == temp) { area->lru_tail = temp->prev; } } u_char * old_key = togo_m_cache_get_key_addr(item); togo_hashtable_remove(togo_m_cache_hashtable, old_key); togo_m_cache_create_item(socket_item, item, area, klen, vlen, key, expires); } } } togo_m_cache->total_write++; togo_m_cache->total_hit++; pthread_mutex_unlock(&area->lock); return TRUE; }
//togo_string.c void togo_string_test() { togo_log(DEBUG, "Testing togo_string.c start ============================"); u_char c; char * dst = togo_alloc(100); char * str2 = togo_alloc(100); //togo_encode_base64 int i; char * str = "SAODOSADO988766556asdsad"; i = togo_encode_base64(dst, str); if (strcmp(dst, "U0FPRE9TQURPOTg4NzY2NTU2YXNkc2Fk") == 0 && strlen("U0FPRE9TQURPOTg4NzY2NTU2YXNkc2Fk") == i) { togo_log(DEBUG, "Testing function:togo_encode_base64 .............................OK"); } else { togo_log(DEBUG, "Testing function:togo_encode_base64 .............................FAIL"); togo_exit(); } //togo_decode_base64 i = togo_decode_base64(str2, dst); if (strcmp(str, str2) == 0 && strlen(str2) == i) { togo_log(DEBUG, "Testing function:togo_decode_base64 .............................OK "); } else { togo_log(DEBUG, "Testing function:togo_decode_base64 .............................FAIL "); togo_exit(); } //togo_tolower c = togo_tolower('X'); if (c == 'x') { togo_log(DEBUG, "Testing function:togo_tolower .............................OK "); } else { togo_log(DEBUG, "Testing function:togo_tolower .............................FAIL "); togo_exit(); } //togo_toupper c = togo_toupper('a'); if (c == 'A') { togo_log(DEBUG, "Testing function:togo_toupper .............................OK "); } else { togo_log(DEBUG, "Testing function:togo_toupper .............................FAIL "); togo_exit(); } //togo_strcmp char * s1 = "woshishen"; char * s2 = "woshishen"; i = togo_strcmp(s1, s2); if (i == 0) { togo_log(DEBUG, "Testing function:togo_strcmp .............................OK "); } else { togo_log(DEBUG, "Testing function:togo_strcmp .............................FAIL "); togo_exit(); } //togo_strncmp char * s11 = "woshishen"; char * s22 = "woshidfdf"; i = togo_strncmp(s11, s22, 5); if (i == 0) { togo_log(DEBUG, "Testing function:togo_strncmp .............................OK "); } else { togo_log(DEBUG, "Testing function:togo_strncmp .............................FAIL "); togo_exit(); } //togo_strchr char * strchr_p = togo_strchr("woshishen", 's'); if (*strchr_p == 's') { togo_log(DEBUG, "Testing function:togo_strchr .............................OK "); } else { togo_log(DEBUG, "Testing function:togo_strchr .............................FAIL "); togo_exit(); } //togo_strstr char * strstr_p = togo_strstr("woshishen", "shi"); if (*strstr_p == 's') { togo_log(DEBUG, "Testing function:togo_strstr .............................OK "); } else { togo_log(DEBUG, "Testing function:togo_strstr .............................FAIL "); togo_exit(); } //togo_strlen i = togo_strlen("woshishen"); if (i == 9) { togo_log(DEBUG, "Testing function:togo_strlen .............................OK "); } else { togo_log(DEBUG, "Testing function:togo_strlen .............................FAIL "); togo_exit(); } //togo_atofp(u_char *line, size_t n, size_t point) i = togo_atofp("10.98", 5, 2); if (i == 1098) { togo_log(DEBUG, "Testing function:togo_atofp .............................OK "); } else { togo_log(DEBUG, "Testing function:togo_atofp .............................FAIL "); togo_exit(); } //togo_atoi(u_char *line, size_t n); i = togo_atoi("1024", 4); if (i == 1024) { togo_log(DEBUG, "Testing function:togo_atoi .............................OK "); } else { togo_log(DEBUG, "Testing function:togo_atoi .............................FAIL "); togo_exit(); } //togo_cpystrn(u_char *s1, char *s2, size_t len) togo_cpystrn(dst, "woshishen", 8); if (togo_strcmp(dst, "woshishe") == 0) { togo_log(DEBUG, "Testing function:togo_cpystrn .............................OK "); } else { togo_log(DEBUG, "Testing function:togo_cpystrn .............................FAIL %s", dst); togo_exit(); } //togo_strtolower togo_cpystrn(dst, "WOSHISHEN", 9); char * x111 = togo_strtolower(dst); if (togo_strcmp(x111, "woshishen") == 0) { togo_log(DEBUG, "Testing function:togo_strtolower .............................OK "); } else { togo_log(DEBUG, "Testing function:togo_strtolower .............................FAIL "); togo_exit(); } //togo_strtolower togo_cpystrn(dst, "woshishen", 9); char * x222 = togo_strtoupper(dst); if (togo_strcmp(x222, "WOSHISHEN") == 0) { togo_log(DEBUG, "Testing function:togo_strtoupper .............................OK "); } else { togo_log(DEBUG, "Testing function:togo_strtoupper .............................FAIL "); togo_exit(); } //togo_strpos char * ddd = "woshishen"; int ddds = togo_strpos(ddd, 'i'); if (ddds == 4) { togo_log(DEBUG, "Testing function:togo_strpos .............................OK "); } else { togo_log(DEBUG, "Testing function:togo_strpos .............................FAIL "); togo_exit(); } //togo_strrpos int ddds2 = togo_strrpos(ddd, 'i'); if (ddds2 == 4) { togo_log(DEBUG, "Testing function:togo_strrpos .............................OK "); } else { togo_log(DEBUG, "Testing function:togo_strrpos .............................FAIL "); togo_exit(); } //togo_trim togo_cpystrn(dst, " woshishen ", 15); char * dst1 = togo_trim(dst); if (togo_strcmp(dst1, "woshishen") == 0) { togo_log(DEBUG, "Testing function:togo_trim .............................OK"); } else { togo_log(DEBUG, "Testing function:togo_trim .............................FAIL"); togo_exit(); } //togo_ltrim togo_cpystrn(dst, " woshishen ", 15); char * dst2 = togo_ltrim(dst); if (togo_strcmp(dst2, "woshishen ") == 0) { togo_log(DEBUG, "Testing function:togo_ltrim .............................OK "); } else { togo_log(DEBUG, "Testing function:togo_ltrim .............................FAIL "); togo_exit(); } //togo_rtrim togo_cpystrn(dst, " woshishen ", 15); char * dst3 = togo_rtrim(dst); if (togo_strcmp(dst3, " woshishen") == 0) { togo_log(DEBUG, "Testing function:togo_rtrim .............................OK"); } else { togo_log(DEBUG, "Testing function:togo_rtrim .............................FAIL "); togo_exit(); } togo_log(DEBUG, "Testing togo_string.c end ============================"); }
void togo_dispatcher(TOGO_COMMAND_TAG command_tag[], TOGO_THREAD_ITEM *socket_item, int ntag) { BOOL ret = FALSE; if (strcmp(command_tag[0].value, "VERSION") == 0) { togo_send_data(socket_item, TOGO_VERSION, togo_strlen(TOGO_VERSION)); ret = TRUE; } else if (strcmp(command_tag[0].value, "QUIT") == 0) { togo_server_disconnect(socket_item); ret = TRUE; } else { /** * command_tag[0] : Module * command_tag[1] : Action * command_tag[2] : Object * command_tag[3] : Value * command_tag[4] : Option */ if (ntag < 3 || command_tag[0].value == NULL) { ret = FALSE; } else if (strcmp(command_tag[0].value, "QUEUE") == 0) { /** * command_tag[0] : Module QUEUE * command_tag[1] : Action RPUSH|LPUSH|LPOP|RPOP|COUNT|STATUS * command_tag[2] : Object Queue name * command_tag[3] : Value value * command_tag[4] : Option priority:1|2|3 */ ret = togo_m_queue_command(command_tag, socket_item, ntag); } else if (strcmp(command_tag[0].value, "COUNTER") == 0) { /** * command_tag[0] : Module COUNTER * command_tag[1] : Action PLUS|MINUS|GET|RESET * command_tag[2] : Object Count name * command_tag[3] : Step 1 MAX:99999999 */ ret = togo_m_counter_command(command_tag, socket_item, ntag); } else if (strcmp(command_tag[0].value, "LOCK") == 0) { /** * command_tag[0] : Module LOCK * command_tag[1] : Action LOCK|UNLOCK|STATUS * command_tag[2] : Object Count name */ ret = togo_m_lock_command(command_tag, socket_item, ntag); } } /* If fail, We will return "TOGO_FAIL"! */ if (ret == FALSE) { togo_send_fail(socket_item); } }