示例#1
0
wbt_status wbt_bmtp2_on_pub(wbt_event_t *ev) {
    wbt_bmtp2_t *bmtp = ev->data;
    
    stream_id = 0;
    wbt_memset(&wbt_mq_parsed_msg, 0, sizeof(wbt_mq_parsed_msg));
    
    if( wbt_bmtp2_param_parser(ev, wbt_bmtp2_on_pub_parser) != WBT_OK ) {
        if( stream_id ) {
            return wbt_bmtp2_send_puback(ev, stream_id, RET_INVALID_MESSAGE);
        } else {
            return WBT_OK;
        }
    }
    
    if( !wbt_mq_parsed_msg.consumer_id || !wbt_mq_parsed_msg.type || ( wbt_mq_parsed_msg.type != MSG_ACK  && !bmtp->payload_length ) ) {
        if( stream_id ) {
            return wbt_bmtp2_send_puback(ev, stream_id, RET_INVALID_MESSAGE);
        } else {
            return WBT_OK;
        }
    }
    
    if( bmtp->role == BMTP_SERVER || bmtp->role == BMTP_SERVER_REPL ) {
        if( wbt_conf.master_host.len > 0 ) {
            // slave 模式下不可写消息
            if( stream_id ) {
                return wbt_bmtp2_send_puback(ev, stream_id, RET_READ_ONLY_SLAVE);
            } else {
                return WBT_OK;
            }
        }
        wbt_mq_parsed_msg.msg_id = 0;
    } else if( bmtp->role == BMTP_CLIENT ) {
        if( wbt_mq_parsed_msg.msg_id == 0 ) {
            if( stream_id ) {
                return wbt_bmtp2_send_puback(ev, stream_id, RET_INVALID_MESSAGE);
            } else {
                return WBT_OK;
            }
        }
        wbt_mq_parsed_msg.create = 0;
    }
    
    wbt_mq_parsed_msg.data_len = bmtp->payload_length;
    wbt_mq_parsed_msg.data = wbt_strdup(bmtp->payload, bmtp->payload_length);
    
    wbt_status ret;
    if( wbt_mq_parsed_msg.is_lastwill ) {
        ret = wbt_mq_set_last_will(ev, &wbt_mq_parsed_msg);
    } else {
        ret = wbt_mq_push(ev, &wbt_mq_parsed_msg);
    }
    
    // wbt_mq_push 以及 wbt_mq_set_last_will 操作可能会失败,所以在这里释放一次
    // 以免内存泄漏。
    // 如果 data 被使用了,上述方法会将 data 置为 NULL 以防止数据被释放
    wbt_free(wbt_mq_parsed_msg.data);
    wbt_mq_parsed_msg.data = NULL;
    
    if( stream_id != 0 ) {
        if( ret != WBT_OK ) {
            // TODO 需要返回更详细的错误原因
            return wbt_bmtp2_send_puback(ev, stream_id, RET_PERMISSION_DENIED);
        } else {
            return wbt_bmtp2_send_puback(ev, stream_id, RET_OK);
        }
    }
    
    return WBT_OK;
}
示例#2
0
文件: wbt_rbtree.c 项目: wljcom/webit
wbt_rbtree_node_t * wbt_rbtree_insert(wbt_rbtree_t *rbt, wbt_str_t *key) {
    wbt_rbtree_node_t *tmp_node, *tail_node;
    wbt_mem_t buf;
    wbt_str_t tmp_str;
    int ret;

    /* 创建一个新的节点 */
    wbt_malloc(&buf, sizeof(wbt_rbtree_node_t));
    wbt_memset(&buf, 0);

    tmp_node = (wbt_rbtree_node_t *)buf.ptr;
    wbt_malloc(&tmp_node->key, key->len+1);
    wbt_memcpy(&tmp_node->key, (wbt_mem_t *)key, key->len);
    *((char *)tmp_node->key.ptr+key->len) =  '\0';
    tmp_node->left = tmp_node->right = wbt_rbtree_node_nil;
    tmp_node->parent = wbt_rbtree_node_nil;
    tmp_node->color = WBT_RBT_COLOR_RED;

    if( rbt->root == wbt_rbtree_node_nil ) {
        rbt->root = tmp_node;
    } else {
        tail_node = rbt->root;
        while(1) {
            tmp_str.len = tail_node->key.len-1;
            tmp_str.str = tail_node->key.ptr;

            ret = wbt_strcmp2(key, &tmp_str);
            if( ret == 0 ) {
                /* 键值已经存在 */
                return NULL;
            } else if( ret > 0 ) {
                if( tail_node->right != wbt_rbtree_node_nil ) {
                    tail_node = tail_node->right;
                } else {
                    /* 找到了插入位置 */
                    tail_node->right = tmp_node;
                    tmp_node->parent = tail_node;
                    break;
                }
            } else {
                if( tail_node->left != wbt_rbtree_node_nil ) {
                    tail_node = tail_node->left;
                } else {
                    /* 找到了插入位置 */
                    tail_node->left = tmp_node;
                    tmp_node->parent = tail_node;
                    break;
                }
            }
        }
    }
    
    /* 插入节点后需要调整 */
    wbt_rbtree_insert_fixup( rbt, tmp_node );
    
    rbt->size ++;

    wbt_log_debug("rbtree insert");
    
    return tmp_node;
}