cloudwu / pbc

A protocol buffers library for C
MIT License
1.62k stars 568 forks source link

调用parser.register报错 #82

Open yanglgtm opened 8 years ago

yanglgtm commented 8 years ago

我在 openresty里使用 pbc,注册 pb 文件(执行parser.register)的时候报错,版本是lua 5.1。我用wiki 里的测试 pb 文件(addressbook.proto)是没问题的。

下面是 pb 文件。我尝试将ReqBody和ReqBody删除后,文件就能注册成功了。麻烦帮忙看下,是 pb 文件本身的问题,还是解析的问题?多谢。

package page;

message StringPair {
    required bytes key   = 1;
    optional bytes value = 2;
}

message URL {
    enum Type {
        kT_Unknown    = 0;
        kT_Full       = 1;
        kT_Intercept  = 2;
    }
    enum Charset {
        kCS_Unknown  = 0;
        kCS_UTF8     = 1;
        kCS_GBK      = 2;
        kCS_BIG5     = 3;
    }
    required Charset    ct      = 1 [default = kCS_Unknown];
    required Type       type    = 2 [default = kT_Unknown ];
    optional bytes      url     = 3;
    optional bytes      host    = 4;
    optional bytes      uurl    = 5; 
    optional bytes      title   = 6;
}

message StatReport{
    required bytes sid          = 1;
    repeated StringPair data    = 2;
}

// 将后面的部分删除即可注册成功
message ReqBody{
    required int32 id          = 1 [default = 0];
    required int32 ver         = 2 [default = 0];
    optional URL   purl    = 3;
    repeated URL   prefers = 4;
}

message Request{
    enum ReqType{
        RecommendTip = 0; // default
    }
    required ReqType    type        = 1 [default = RecommendTip];
    required string     pt          = 2 [default = ""];
    required string     combo       = 3 [default = ""];
    required string     bver        = 4 [default = ""];
    required string     mid         = 5 [default = ""];
    repeated StringPair head        = 6; // all stat info
    repeated StatReport stat        = 7;
    repeated ReqBody    body        = 8;
}

错误信息:

2016/08/12 12:29:21 [error] 4024#0: *45 lua entry thread aborted: runtime error: /path/pb/protobuf.lua:365: default
stack traceback:
coroutine 0:
    [C]: in function 'assert'
    /path/pb/protobuf.lua:365: in function '__index'
    /path/pb/protobuf.lua:247: in function 'encode_message'
    /path/pb/protobuf.lua:269: in function 'func'
    /path/pb/protobuf.lua:248: in function 'encode_message'
    /path/pb/protobuf.lua:299: in function 'func'
    /path/pb/protobuf.lua:248: in function 'encode_message'
    /path/pb/protobuf.lua:299: in function 'func'
    /path/pb/protobuf.lua:248: in function 'encode_message'
    /path/pb/protobuf.lua:299: in function 'func'
    /path/pb/protobuf.lua:248: in function 'encode_message'
    /path/pb/protobuf.lua:381: in function 'encode'
    /path/pb/parser.lua:388: in function 'register'
    /path/rr.lua:29: in function </path/rr.lua:1>, ...
lf723 commented 7 years ago

是parser.lua的问题,其中的function _fix_field(namespace , field, all),云风原来只判断是个复合类型,才会去解析default(放在了函数后面),由于云风不再维护PBC了,可以自行修改下,比如

local function _fix_field(namespace , field, all)
    local options = field.options
    if options then
        if options.default then
            field.default_value = tostring(options.default)
            options.default = nil
        end
        if next(options) == nil then
            field.options = nil
        end
    end

    local type_name = field.type_name
    if type_name == "" then
        field.type_name = nil
        return
    elseif type_name == nil then
        return
    end

    local full_name = assert(_match_name(namespace, field.type_name, all) , field.type_name , all)

    field.type_name = full_name
    field.type = all[full_name]
end

让default的解析优先即可

yanglgtm commented 7 years ago

@lf723 非常感谢,我这边已经换用 protoc-gen-lua 这个库了,也有坑,不过都填上了。。