Skip to main content

Protobuf Module Example

In this example the protobuf Lua rock provides a compiler plugin for the protocol buffers compiler protoc. The Person message in person.proto is compiled into a Lua module person_rb.lua.

Prerequisites

yum install protobuf # or see: https://github.com/google/protobuf#protobuf-runtime-installation
luarocks install protobuf # installs the protobuf rock https://luarocks.org/modules/djungelorm/protobuf

Be aware that in this case you must ensure the prerequisites on all the nodes of the cluster.

Protocol Buffers Message

In person.proto

syntax = "proto2";

message Person {
required int32 id = 1;
required string name = 2;
optional string email = 3;
}

Compiled Module

In person_rb.lua. This was generated by the Lua plugin for protoc.

-- Generated by protobuf; do not edit
local module = {}
local protobuf = require 'protobuf'

module.PERSON = protobuf.Descriptor()
module.PERSON_ID_FIELD = protobuf.FieldDescriptor()
module.PERSON_NAME_FIELD = protobuf.FieldDescriptor()
module.PERSON_EMAIL_FIELD = protobuf.FieldDescriptor()

module.PERSON_ID_FIELD.name = 'id'
module.PERSON_ID_FIELD.full_name = '.Person.id'
module.PERSON_ID_FIELD.number = 1
module.PERSON_ID_FIELD.index = 0
module.PERSON_ID_FIELD.label = 2
module.PERSON_ID_FIELD.has_default_value = false
module.PERSON_ID_FIELD.default_value = 0
module.PERSON_ID_FIELD.type = 5
module.PERSON_ID_FIELD.cpp_type = 1

module.PERSON_NAME_FIELD.name = 'name'
module.PERSON_NAME_FIELD.full_name = '.Person.name'
module.PERSON_NAME_FIELD.number = 2
module.PERSON_NAME_FIELD.index = 1
module.PERSON_NAME_FIELD.label = 2
module.PERSON_NAME_FIELD.has_default_value = false
module.PERSON_NAME_FIELD.default_value = ''
module.PERSON_NAME_FIELD.type = 9
module.PERSON_NAME_FIELD.cpp_type = 9

module.PERSON_EMAIL_FIELD.name = 'email'
module.PERSON_EMAIL_FIELD.full_name = '.Person.email'
module.PERSON_EMAIL_FIELD.number = 3
module.PERSON_EMAIL_FIELD.index = 2
module.PERSON_EMAIL_FIELD.label = 1
module.PERSON_EMAIL_FIELD.has_default_value = false
module.PERSON_EMAIL_FIELD.default_value = ''
module.PERSON_EMAIL_FIELD.type = 9
module.PERSON_EMAIL_FIELD.cpp_type = 9

module.PERSON.name = 'Person'
module.PERSON.full_name = '.Person'
module.PERSON.nested_types = {}
module.PERSON.enum_types = {}
module.PERSON.fields = {module.PERSON_ID_FIELD, module.PERSON_NAME_FIELD, module.PERSON_EMAIL_FIELD}
module.PERSON.is_extendable = false
module.PERSON.extensions = {}

module.Person = protobuf.Message(module.PERSON)


module.MESSAGE_TYPES = {'Person'}
module.ENUM_TYPES = {}

return module

UDF Module

In the UDF module pbuf.lu

-- Adopted the example from djungelorm/protobuf-lua
function vartix(rec, id, name, email)
local person_pb = require "person_pb"

-- Serialize Example
local msg = person_pb.Person()
msg.id = id
msg.name = name
msg.email = email
local pb_data = msg:SerializeToString()
local pb_bytes = bytes(pb_data:len())
bytes.set_type(pb_bytes, 4)
bytes.set_string(pb_bytes, 1, pb_data)
rec["person"] = pb_bytes
if aerospike:exists(rec) then
aerospike:update(rec)
else
aerospike:create(rec)
end
end

function velkor(rec)
local person_pb = require "person_pb"

-- Parse Example
local pb_bytes = rec["person"]
local pb_data = bytes.get_string(pb_bytes, 1, bytes.size(pb_bytes))
local msg = person_pb.Person()
msg:ParseFromString(pb_data)
return msg.id
end

function is_bytes(rec, bin)
local t = rec[bin]
return getmetatable(t) == getmetatable(bytes())
end

Registering the Modules

$ aql
Aerospike Query Client
Version 3.15.3.6
C Client Version 4.3.11
Copyright 2012-2017 Aerospike. All rights reserved.
aql> register module 'pbuf.lua'
OK, 1 module added.

aql> register module 'person_pb.lua'
OK, 1 module added.

aql> show modules
+-----------------+--------------------------------------------+-------+
| filename | hash | type |
+-----------------+--------------------------------------------+-------+
| "person_pb.lua" | "e6dee5a956d7be0e8c016df612465c45e39bdd0a" | "LUA" |
| "pbuf.lua" | "9c714c1e2bbff24cea7531aac881f771ab9a896b" | "LUA" |
+-----------------+--------------------------------------------+-------+
2 rows in set (0.003 secs)

Example

See the example for calling the UDF.