Skip to main content

Read protobuf binary data using vanilla mysql stored functions

Project description

Myprotosql

A set of mysql stored functions/procedures to read protobuf binary data

Tests Tests PyPi

Getting started (with *.proto files)

See decode using .proto files for an example.

  • Download and install protoc

  • Install myprotosql (requires python):

    pip install myprotosql
    
  • Run protoc with the myprotosql plugin (your *.proto files located in ./proto, output in ./build):

    protoc  --proto_path=proto --myprotosql_out=build ./proto/*
    
  • Run the generated install_myproto.sql and myproto_descriptors.sql scripts in MySQL
    If you used this proto file, you can now decode your first protobuf message

    select myproto_decode_to_textformat(
        0x1a03089601, 'foo.bar.ParentMessage', myproto_descriptors());
    

Getting started (without *.proto files)

This is similar to protoc --decode_raw. See decode raw for an example.

  • Install myprotosql (requires python):

    pip install myprotosql
    
  • Generate the install script

    myprotosql-install-script > install_myproto.sql
    
  • Run the generated install_myproto.sql script in MySQL
    Decode your first protobuf message:

    select myproto_decode_to_textformat(0x1a03089601, null, null);
    

Alternative

Instead of using pip and python to install myprotosql, you can also just download the install_myproto.sql from the github repository and run that in MySQL.

Decoding

Running install_myproto.sql installs two functions that can be used to decode protobuf binary messages:

  • myproto_decode_to_textformat(binary_message, message_type, type_descriptors)
  • myproto_decode_to_jsonformat(binary_message, message_type, type_descriptors)

Decode raw

Decoding without the *.proto files

Textformat

decode_raw the 0x1a03089601 binary data to textformat:

select myproto_decode_to_textformat(0x1a03089601, null, null);

Returns:

3: {
 1: 150
}

JSON

select myproto_decode_to_jsonformat(0x1a03089601, null, null);

Returns:

{"3": {"1": 150}}

Decode using .proto files

Let's say we have a .proto file like this:

package foo.bar;

message SubMessage {
  optional int32 a = 1;
}

message ParentMessage {
  optional SubMessage c = 3;
}

Check out Getting started (with *.proto files) to compile these *.proto files in something MySQL can understand.

Textformat

For example to decode the 0x1a03089601 binary data to textformat:

select myproto_decode_to_textformat(0x1a03089601, 'foo.bar.ParentMessage', myproto_descriptors());

Returns:

c: {
 a: 150
}

JSON

select myproto_decode_to_jsonformat(0x1a03089601, 'foo.bar.ParentMessage', myproto_descriptors());

Returns:

{"c": {"a": 150}}

Troubleshooting

on Windows if you used Virtualenv

you need to specify the full path to the myprotosql plugin, like this:

protoc.exe  --proto_path=proto --myprotosql_out=build --plugin=protoc-gen-myprotosql=.\venv\Scripts\protoc-gen-myprotosql.exe .\proto\* 

This assumed your proto files are located in .\proto and your virtual env path is .\venv. In general the command is of the form:

protoc  --proto_path=<the-path-to-your-proto-files> --myprotosql_out=<the-output-path> --plugin=protoc-gen-myprotosql=<the-path-to-the-myprotosql-plugin> <the-path-to-your-proto-files>\*

Limitations of decode_raw

Decode raw has limitations because protobuf binary data does not contain all info to properly decode the data.

  • output will not contain field names, only field numbers
  • packed repeated scalar values will be decoded as one binary string
  • numbers will be decoded as unsigned integers

If you need proper decoding, then read on and learn how to use information in your *.proto files

Uninstalling

  • Generate the uninstall script

    myprotosql-uninstall-script > uninstall_myproto.sql
    
  • Run the generated uninstall_myproto.sql script in MySQL

Alternative

Download the uninstall_myproto.sql from the github repository and run that in MySQL.

Todo

  • todos in code

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

myprotosql-0.0.8.tar.gz (39.0 kB view details)

Uploaded Source

Built Distribution

myprotosql-0.0.8-py3-none-any.whl (30.4 kB view details)

Uploaded Python 3

File details

Details for the file myprotosql-0.0.8.tar.gz.

File metadata

  • Download URL: myprotosql-0.0.8.tar.gz
  • Upload date:
  • Size: 39.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.5

File hashes

Hashes for myprotosql-0.0.8.tar.gz
Algorithm Hash digest
SHA256 7c27375572335eb0a0202c9fbcdacee386f156a794402ff6859370412763c36c
MD5 abc1c372ed34edf27c71ce20cbf9b2cd
BLAKE2b-256 8eec045cb186fbb1775beb0fbadfdb7f5c4e21d66e585c836c107210e3942c28

See more details on using hashes here.

File details

Details for the file myprotosql-0.0.8-py3-none-any.whl.

File metadata

  • Download URL: myprotosql-0.0.8-py3-none-any.whl
  • Upload date:
  • Size: 30.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.5

File hashes

Hashes for myprotosql-0.0.8-py3-none-any.whl
Algorithm Hash digest
SHA256 685e35972b9f377a191e67b69ba8fbe39e24f9b3f3980c5a2f46d61c10461405
MD5 f82e40f4aa5b532e82dccb720e8559ec
BLAKE2b-256 e9e090af2fbc00ac13eb889df1c1c77dcf123c8db5fd128130e25493ca5c2f2f

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page