Hi everyone
I ported a ODBC Driver that works in an RPC fashion from windows to linux.
The port was actually quite trivial since the code was already Cross OS
Friendly.
The protobuf has never been an issue on Windows side. The protobuf package
was V3.12.3 and was also installed by visual studio.
However when I download Protobuf C++ and compile them on both Ubuntu and
CentOS. And compile my program I get strange errors ALWAYS resulting from
"repeated_field.h.
Sometimes the error is on line 1750 and other times its on 1744 but no
matter what version I compile or what OS I use it just never seems to want
to process anything that needs to use "repeated_field.h" . I will paste my
backtrace and also my ldd of the driver. With the makefile I use to compile
the protobufs.
This is a backtrace of a string of data that needs to be parsed. This
always breaks.
The class its trying to parse into is -> ExecuteResponse : Please check the
proto files.
This is the backtrace.
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff6369cc4 in
google::protobuf::internal::RepeatedPtrFieldBase::Add<google::protobuf::RepeatedPtrField<ColumnValue>::TypeHandler>
(this=0x68e8d0, prototype=0x0)
at /usr/local/include/google/protobuf/repeated_field.h:1744
1744 if (rep_ != NULL && current_size_ < rep_->allocated_size) {
(gdb) backtrace
#0 0x00007ffff6369cc4 in
google::protobuf::internal::RepeatedPtrFieldBase::Add<google::protobuf::RepeatedPtrField<ColumnValue>::TypeHandler>
(this=0x68e8d0, prototype=0x0)
at /usr/local/include/google/protobuf/repeated_field.h:1744
#1 0x00007ffff6366e39 in
google::protobuf::RepeatedPtrField<ColumnValue>::Add (this=0x68e8d0) at
/usr/local/include/google/protobuf/repeated_field.h:2195
#2 0x00007ffff63646fa in Row::_internal_add_value (this=0x68e8c0) at
common.pb.h:5781
#3 0x00007ffff635697f in Row::_InternalParse (this=0x68e8c0,
ptr=0x67c5f0 "*\n\023\b\025\032\017Alex", '*' <repeats 11 times>,
"\"\023\b\025\032\017Alex", '*' <repeats 11 times>,
"\n,\n\024\b\025\032\020a***oum.br\"\024\b\025\032
\020a***com.br\n\030\n\n\b\025\032\006Brazil\"\n\b\025\032\006Brazil\n\026\n\t\b\032\032\005\063\067.62\"\t\b\032\032\005\063\067.62\032\234\001\n*\n\023\b\025\032\017Edua"
, '*' <repeats 11 times>, "\"\023\b\025\032\017Edua", '*' <repeats 11
times>, "\n<\n\034\b\025\032\030e*****"..., ctx=0x7fffffffce30) at
common.pb.cc:3927
#4 0x00007ffff6367db6 in
google::protobuf::internal::ParseContext::ParseMessage<Row>
(this=0x7fffffffce30, msg=0x68e8c0,
ptr=0x67c5ef "\n*\n\023\b\025\032\017Alex", '*' <repeats 11 times>,
"\"\023\b\025\032\017Alex", '*' <repeats 11 times>,
"\n,\n\024\b\025\032\020a*com.br\"\024\b\025\0
32\020a***oom.br\n\030\n\n\b\025\032\006Brazil\"\n\b\025\032\006Brazil\n\026\n\t\b\032\032\005\063\067.62\"\t\b\032\032\005\063\067.62\032\234\001\n*\n\023\b\025\032\017Edu
a", '*' <repeats 11 times>, "\"\023\b\025\032\017Edua", '*' <repeats 11
times>, "\n<\n\034\b\025\032\030e****"...) at
/usr/local/include/google/protobuf/parse_context.h:614
#5 0x00007ffff635596f in Frame::_InternalParse (this=0x68d830,
ptr=0x67c5ed "\214\001\n*\n\023\b\025\032\017Alex", '*' <repeats 11
times>, "\"\023\b\025\032\017Alex", '*' <repeats 11 times>,
"\n,\n\024\b\025\032\020a*l.com.br\"\024
\b\025\032\020aom.br\n\030\n\n\b\025\032\006Brazil\"\n\b\025\032\006Brazil\n\026\n\t\b\032\032\005\063\067.62\"\t\b\032\032\005\063\067.62\032\234\001\n*\n\023\b\025\03
2\017Edua", '*' <repeats 11 times>, "\"\023\b\025\032\017Edua", '*'
<repeats 11 times>, "\n<\n\034\b\025\032\030e**"..., ctx=0x7fffffffce30) at
common.pb.cc:3688
#6 0x00007ffff63ac758 in
google::protobuf::internal::ParseContext::ParseMessage<Frame>
(this=0x7fffffffce30, msg=0x68d830,
ptr=0x67c5ea "\020\001\032\214\001\n*\n\023\b\025\032\017Alex", '*'
<repeats 11 times>, "\"\023\b\025\032\017Alex", '*' <repeats 11 times>,
"\n,\n\024\b\025\032\020a*l.
com.br\"\024\b\025\032\020a****l.com.br\n\030\n\n\b\025\032\006Brazil\"\n\b\025\032\006Brazil\n\026\n\t\b\032\032\005\063\067.62\"\t\b\032\032\005\063\067.62\032\234\001\n*\n\
023\b\025\032\017Edua", '*' <repeats 11 times>, "\"\023\b\025\032\017Edua",
'*' <repeats 11 times>, "\n<\n\034\b\025\032\030"...)
at /usr/local/include/google/protobuf/parse_context.h:614
#7 0x00007ffff6395e79 in ResultSetResponse::_InternalParse (this=0x674310,
ptr=0x67c5e8 "\215\006\020\001\032\214\001\n*\n\023\b\025\032\017Alex",
'*' <repeats 11 times>, "\"\023\b\025\032\017Alex", '*' <repeats 11 times>,
"\n,\n\024\b\025\032\020a*
**com.br\"\024\b\025\032\020a*om.br\n\030\n\n\b\025\032\006Brazil\"\n\b\025\032\006Brazil\n\026\n\t\b\032\032\005\063\067.62\"\t\b\032\032\005\063\067.62\032\234\0
01\n*\n\023\b\025\032\017Edua", '*' <repeats 11 times>,
"\"\023\b\025\032\017Edua", '*' <repeats 11 times>, "\n<\n\034\b\025"...,
ctx=0x7fffffffce30) at response.pb.cc:788
#8 0x00007ffff63aca34 in
google::protobuf::internal::ParseContext::ParseMessage<ResultSetResponse>
(this=0x7fffffffce30, msg=0x674310,
ptr=0x67c4a3 "\n\b0pOR9266\020B\030\001\"\263\002\nJ
\001\060\001@\377\001J\bfullnameR\bfullname`\377\001z\005Spark\200\001\001\232\001\020java.lang.String\242\001\f\b\f\022\
006STRING\030\025\nF\b\001
\001\060\001@\377\001J\005emailR\005email`\377\001z\005Spark\200\001\001\232\001\020java.lang.String\242\001\f\b\f\022\006STRING\030\025\nJ\b\002
\001\
060\001@\377\001J\acountryR\acountry`\377\001z\005S"...) at
/usr/local/include/google/protobuf/parse_context.h:614
#9 0x00007ffff6397670 in ExecuteResponse::_InternalParse
(this=0x7fffffffd300,
ptr=0x67c4a1 "\205\t\n\b0pOR9266\020B\030\001\"\263\002\nJ
\001\060\001@\377\001J\bfullnameR\bfullname`\377\001z\005Spark\200\001\001\232\001\020java.lang.String\242\001\f\b\
f\022\006STRING\030\025\nF\b\001
\001\060\001\377\001J\005emailR\005email`\377\001z\005Spark\200\001\001\232\001\020java.lang.String\242\001\f\b\f\022\006STRING\030\025\nJ\b\002
\001\060\001\377\001J\acountryR\acountry`\377\001z"..., ctx=0x7fffffffce30)
at response.pb.cc:1135
#10 0x00007ffff55350a0 in google::protobuf::internal::MergeFromImpl<false>
(input=..., msg=0x7fffffffd300,
parse_flags=google::protobuf::MessageLite::kParse)
at ./google/protobuf/parse_context.h:224
#11 0x00007ffff62ad4b7 in proto::helper::parseNonStream<ExecuteResponse>
(inc=0x7fffffffd0f0, outClass=0x7fffffffd300) at transProto.h:32
#12 0x00007ffff62a88b6 in ConnectEngine::PrepareAndExecuteReq
(this=0x671170, query="select * from VidDemo ", PERResponse=0x7fffffffd300,
maxRows=9223372036854775807,
frameMaxSize=2147483647, _statementId=66) at ConnectEngine.cpp:639
#13 0x00007ffff62b462c in Consolidation::executeQuery (this=0x6710b0,
query="select * from VidDemo ") at Consolidation.cpp:173
#14 0x00007ffff62f3f9e in Statement::requestNextPackOfResultSets
(this=0x68bfe0, mutator=...) at statement.cpp:215
//THIS IS MY MAKEFILE
LDFLAGS = -L/usr/local/lib `pkg-config --libs protobuf grpc++`\
-Wl,--no-as-needed -lgrpc++_reflection -Wl,--as-needed\
-ldl
CXX = g++
CPPFLAGS += `pkg-config --cflags protobuf grpc`
CXXFLAGS += -std=c++14
DEBUG = -g
GRPC_CPP_PLUGIN = grpc_cpp_plugin
GRPC_CPP_PLUGIN_PATH ?= `which $(GRPC_CPP_PLUGIN)`
all: common request response common.o request.o response.o
common:
protoc -I=. --cpp_out=. ./common.proto
request:
protoc -I=. --cpp_out=. ./request.proto
response:
protoc -I=. --cpp_out=. ./response.proto
common.o: common.pb.cc
$(CXX) $(DEBUG) -fPIC -c $^ $(LDFLAGS) -o $@ $(CXXFLAGS)
request.o: request.pb.cc
$(CXX) $(DEBUG) -fPIC -c $^ $(LDFLAGS) -o $@ $(CXXFLAGS)
response.o: response.pb.cc
$(CXX) $(DEBUG) -fPIC -c $^ $(LDFLAGS) -o $@ $(CXXFLAGS)
clean:
rm -f *.o *.pb.cc *.pb.h client
//This is my 3 Proto files. Its part of the Calcite Avatica package.
//COMMON.PROTO
syntax = "proto3";
//option cc_generic_services = true;
option cc_generic_services = false;
//option csharp_namespace = "Calcite.Avatica";
// Details about a connection
message ConnectionProperties {
bool is_dirty = 1;
bool auto_commit = 2;
bool has_auto_commit = 7; // field is a Boolean, need to discern null and
default value
bool read_only = 3;
bool has_read_only = 8; // field is a Boolean, need to discern null and
default value
uint32 transaction_isolation = 4;
string catalog = 5;
string schema = 6;
}
// Statement handle
message StatementHandle {
string connection_id = 1;
uint32 id = 2;
Signature signature = 3;
}
// Results of preparing a statement
message Signature {
repeated ColumnMetaData columns = 1;
string sql = 2;
repeated AvaticaParameter parameters = 3;
CursorFactory cursor_factory = 4;
StatementType statementType = 5;
}
// Has to be consistent with Meta.StatementType
enum StatementType {
SELECT = 0;
INSERT = 1;
UPDATE = 2;
DELETE = 3;
UPSERT = 4;
MERGE = 5;
OTHER_DML = 6;
CREATE = 7;
DROP = 8;
ALTER = 9;
OTHER_DDL = 10;
CALL = 11;
}
message ColumnMetaData {
uint32 ordinal = 1;
bool auto_increment = 2;
bool case_sensitive = 3;
bool searchable = 4;
bool currency = 5;
uint32 nullable = 6;
bool signed = 7;
uint32 display_size = 8;
string label = 9;
string column_name = 10;
string schema_name = 11;
uint32 precision = 12;
uint32 scale = 13;
string table_name = 14;
string catalog_name = 15;
bool read_only = 16;
bool writable = 17;
bool definitely_writable = 18;
string column_class_name = 19;
AvaticaType type = 20;
}
enum Rep {
PRIMITIVE_BOOLEAN = 0;
PRIMITIVE_BYTE = 1;
PRIMITIVE_CHAR = 2;
PRIMITIVE_SHORT = 3;
PRIMITIVE_INT = 4;
PRIMITIVE_LONG = 5;
PRIMITIVE_FLOAT = 6;
PRIMITIVE_DOUBLE = 7;
BOOLEAN = 8;
BYTE = 9;
CHARACTER = 10;
SHORT = 11;
INTEGER = 12;
LONG = 13;
FLOAT = 14;
DOUBLE = 15;
BIG_INTEGER = 25;
BIG_DECIMAL = 26;
JAVA_SQL_TIME = 16;
JAVA_SQL_TIMESTAMP = 17;
JAVA_SQL_DATE = 18;
JAVA_UTIL_DATE = 19;
BYTE_STRING = 20;
STRING = 21;
NUMBER = 22;
OBJECT = 23;
NULL = 24;
ARRAY = 27;
STRUCT = 28;
MULTISET = 29;
}
// Base class for a column type
message AvaticaType {
uint32 id = 1;
string name = 2;
Rep rep = 3;
repeated ColumnMetaData columns = 4; // Only present when name = STRUCT
AvaticaType component = 5; // Only present when name = ARRAY
}
// Metadata for a parameter
message AvaticaParameter {
bool signed = 1;
uint32 precision = 2;
uint32 scale = 3;
uint32 parameter_type = 4;
string type_name = 5;
string class_name = 6;
string name = 7;
}
// Information necessary to convert an Iterable into a Calcite Cursor
message CursorFactory {
enum Style {
OBJECT = 0;
RECORD = 1;
RECORD_PROJECTION = 2;
ARRAY = 3;
LIST = 4;
MAP = 5;
}
Style style = 1;
string class_name = 2;
repeated string field_names = 3;
}
// A collection of rows
message Frame {
uint64 offset = 1;
bool done = 2;
repeated Row rows = 3;
}
// A row is a collection of values
message Row {
repeated ColumnValue value = 1;
}
// Database property, list of functions the database provides for a certain
operation
message DatabaseProperty {
string name = 1;
repeated string functions = 2;
}
// Message which encapsulates another message to support a single RPC
endpoint
message WireMessage {
string name = 1;
bytes wrapped_message = 2;
}
// A value might be a TypedValue or an Array of TypedValue's
message ColumnValue {
repeated TypedValue value = 1; // deprecated, use array_value or
scalar_value
repeated TypedValue array_value = 2;
bool has_array_value = 3; // Is an array value set?
TypedValue scalar_value = 4;
}
// Generic wrapper to support any SQL type. Struct-like to work around no
polymorphism construct.
message TypedValue {
Rep type = 1; // The actual type that was serialized in the general
attribute below
bool bool_value = 2; // boolean
string string_value = 3; // char/varchar
sint64 number_value = 4; // var-len encoding lets us shove anything from
byte to long
// includes numeric types and date/time types.
bytes bytes_value = 5; // binary/varbinary
double double_value = 6; // big numbers
bool null = 7; // a null object
repeated TypedValue array_value = 8; // The Array
Rep component_type = 9; // If an Array, the representation for the array
values
bool implicitly_null = 10; // Differentiate between explicitly null
(user-set) and implicitly null
// (un-set by the user)
}
// The severity of some unexpected outcome to an operation.
// Protobuf enum values must be unique across all other enums
enum Severity {
UNKNOWN_SEVERITY = 0;
FATAL_SEVERITY = 1;
ERROR_SEVERITY = 2;
WARNING_SEVERITY = 3;
}
// Enumeration corresponding to DatabaseMetaData operations
enum MetaDataOperation {
GET_ATTRIBUTES = 0;
GET_BEST_ROW_IDENTIFIER = 1;
GET_CATALOGS = 2;
GET_CLIENT_INFO_PROPERTIES = 3;
GET_COLUMN_PRIVILEGES = 4;
GET_COLUMNS = 5;
GET_CROSS_REFERENCE = 6;
GET_EXPORTED_KEYS = 7;
GET_FUNCTION_COLUMNS = 8;
GET_FUNCTIONS = 9;
GET_IMPORTED_KEYS = 10;
GET_INDEX_INFO = 11;
GET_PRIMARY_KEYS = 12;
GET_PROCEDURE_COLUMNS = 13;
GET_PROCEDURES = 14;
GET_PSEUDO_COLUMNS = 15;
GET_SCHEMAS = 16;
GET_SCHEMAS_WITH_ARGS = 17;
GET_SUPER_TABLES = 18;
GET_SUPER_TYPES = 19;
GET_TABLE_PRIVILEGES = 20;
GET_TABLES = 21;
GET_TABLE_TYPES = 22;
GET_TYPE_INFO = 23;
GET_UDTS = 24;
GET_VERSION_COLUMNS = 25;
}
// Represents the breadth of arguments to DatabaseMetaData functions
message MetaDataOperationArgument {
enum ArgumentType {
STRING = 0;
BOOL = 1;
INT = 2;
REPEATED_STRING = 3;
REPEATED_INT = 4;
NULL = 5;
}
string string_value = 1;
bool bool_value = 2;
sint32 int_value = 3;
repeated string string_array_values = 4;
repeated sint32 int_array_values = 5;
ArgumentType type = 6;
}
enum StateType {
SQL = 0;
METADATA = 1;
}
message QueryState {
StateType type = 1;
string sql = 2;
MetaDataOperation op = 3;
repeated MetaDataOperationArgument args = 4;
bool has_args = 5;
bool has_sql = 6;
bool has_op = 7;
}
//REQUESTER.PROTO
syntax = "proto3";
option cc_generic_services = false;
//option java_package = "org.apache.calcite.avatica.proto";
import "common.proto";
// Request for Meta#getCatalogs()
message CatalogsRequest {
string connection_id = 1;
}
// Request for Meta#getDatabaseProperties()
message DatabasePropertyRequest {
string connection_id = 1;
}
// Request for Meta#getSchemas(String, org.apache.calcite.avatica.Meta.Pat)}
message SchemasRequest {
string catalog = 1;
string schema_pattern = 2;
string connection_id = 3;
}
// Request for Request for Meta#getTables(String,
org.apache.calcite.avatica.Meta.Pat,
// org.apache.calcite.avatica.Meta.Pat, java.util.List)
message TablesRequest {
string catalog = 1;
string schema_pattern = 2;
string table_name_pattern = 3;
repeated string type_list = 4;
bool has_type_list = 6; // Having an empty type_list is distinct from a
null type_list
string connection_id = 7;
}
// Request for Meta#getTableTypes()
message TableTypesRequest {
string connection_id = 1;
}
// Request for Meta#getColumns(String, org.apache.calcite.avatica.Meta.Pat,
// org.apache.calcite.avatica.Meta.Pat,
org.apache.calcite.avatica.Meta.Pat).
message ColumnsRequest {
string catalog = 1;
string schema_pattern = 2;
string table_name_pattern = 3;
string column_name_pattern = 4;
string connection_id = 5;
}
// Request for Meta#getTypeInfo()
message TypeInfoRequest {
string connection_id = 1;
}
// Request for Meta#prepareAndExecute(Meta.StatementHandle, String, long,
Meta.PrepareCallback)
message PrepareAndExecuteRequest {
string connection_id = 1;
string sql = 2;
uint64 max_row_count = 3; // Deprecated
uint32 statement_id = 4;
int64 max_rows_total = 5; // The maximum number of rows that will be
allowed for this query
int32 first_frame_max_size = 6; // The maximum number of rows that will be
returned in the
// first Frame returned for this query.
}
// Request for Meta.prepare(Meta.ConnectionHandle, String, long)
message PrepareRequest {
string connection_id = 1;
string sql = 2;
uint64 max_row_count = 3; // Deprecated
int64 max_rows_total = 4; // The maximum number of rows that will be
allowed for this query
}
// Request for Meta#fetch(Meta.StatementHandle, List, long, int)
message FetchRequest {
string connection_id = 1;
uint32 statement_id = 2;
uint64 offset = 3;
uint32 fetch_max_row_count = 4; // Maximum number of rows to be returned in
the frame. Negative means no limit. Deprecated!
int32 frame_max_size = 5;
}
// Request for Meta#createStatement(Meta.ConnectionHandle)
message CreateStatementRequest {
string connection_id = 1;
}
// Request for Meta#closeStatement(Meta.StatementHandle)
message CloseStatementRequest {
string connection_id = 1;
uint32 statement_id = 2;
}
// Request for Meta#openConnection(Meta.ConnectionHandle, Map<String,
String>)
message OpenConnectionRequest {
string connection_id = 1;
map<string, string> info = 2;
}
// Request for Meta#closeConnection(Meta.ConnectionHandle)
message CloseConnectionRequest {
string connection_id = 1;
}
message ConnectionSyncRequest {
string connection_id = 1;
ConnectionProperties conn_props = 2;
}
// Request for Meta#execute(Meta.ConnectionHandle, list, long)
message ExecuteRequest {
StatementHandle statementHandle = 1;
repeated TypedValue parameter_values = 2;
uint64 deprecated_first_frame_max_size = 3; // Deprecated, use the signed
int instead.
bool has_parameter_values = 4;
int32 first_frame_max_size = 5; // The maximum number of rows to return in
the first Frame
}
message SyncResultsRequest {
string connection_id = 1;
uint32 statement_id = 2;
QueryState state = 3;
uint64 offset = 4;
}
// Request to invoke a commit on a Connection
message CommitRequest {
string connection_id = 1;
}
// Request to invoke rollback on a Connection
message RollbackRequest {
string connection_id = 1;
}
// Request to prepare and execute a collection of sql statements.
message PrepareAndExecuteBatchRequest {
string connection_id = 1;
uint32 statement_id = 2;
repeated string sql_commands = 3;
}
// Each command is a list of TypedValues
message UpdateBatch {
repeated TypedValue parameter_values = 1;
}
message ExecuteBatchRequest {
string connection_id = 1;
uint32 statement_id = 2;
repeated UpdateBatch updates = 3; // A batch of updates is a
list<list<typevalue>>
}
//RESPONSE.PROTO
syntax = "proto3";
//option java_package = "org.apache.calcite.avatica.proto";
import "common.proto";
// Response that contains a result set.
message ResultSetResponse {
string connection_id = 1;
uint32 statement_id = 2;
bool own_statement = 3;
Signature signature = 4;
Frame first_frame = 5;
uint64 update_count = 6; // -1 for normal result sets, else this response
contains a dummy result set
// with no signature nor other data.
RpcMetadata metadata = 7;
}
// Response to PrepareAndExecuteRequest
message ExecuteResponse {
repeated ResultSetResponse results = 1;
bool missing_statement = 2; // Did the request fail because of no-cached
statement
RpcMetadata metadata = 3;
}
// Response to PrepareRequest
message PrepareResponse {
StatementHandle statement = 1;
RpcMetadata metadata = 2;
}
// Response to FetchRequest
message FetchResponse {
Frame frame = 1;
bool missing_statement = 2; // Did the request fail because of no-cached
statement
bool missing_results = 3; // Did the request fail because of a
cached-statement w/o ResultSet
RpcMetadata metadata = 4;
}
// Response to CreateStatementRequest
message CreateStatementResponse {
string connection_id = 1;
uint32 statement_id = 2;
RpcMetadata metadata = 3;
}
// Response to CloseStatementRequest
message CloseStatementResponse {
RpcMetadata metadata = 1;
}
// Response to OpenConnectionRequest {
message OpenConnectionResponse {
RpcMetadata metadata = 1;
}
// Response to CloseConnectionRequest {
message CloseConnectionResponse {
RpcMetadata metadata = 1;
}
// Response to ConnectionSyncRequest
message ConnectionSyncResponse {
ConnectionProperties conn_props = 1;
RpcMetadata metadata = 2;
}
message DatabasePropertyElement {
DatabaseProperty key = 1;
TypedValue value = 2;
RpcMetadata metadata = 3;
}
// Response for Meta#getDatabaseProperties()
message DatabasePropertyResponse {
repeated DatabasePropertyElement props = 1;
RpcMetadata metadata = 2;
}
// Send contextual information about some error over the wire from the
server.
message ErrorResponse {
repeated string exceptions = 1; // exception stacktraces, many for linked
exceptions.
bool has_exceptions = 7; // are there stacktraces contained?
string error_message = 2; // human readable description
Severity severity = 3;
uint32 error_code = 4; // numeric identifier for error
string sql_state = 5; // five-character standard-defined value
RpcMetadata metadata = 6;
}
message SyncResultsResponse {
bool missing_statement = 1; // Server doesn't have the statement with the
ID from the request
bool more_results = 2; // Should the client fetch() to get more results
RpcMetadata metadata = 3;
}
// Generic metadata for the server to return with each response.
message RpcMetadata {
string server_address = 1; // The host:port of the server
}
// Response to a commit request
message CommitResponse {
}
// Response to a rollback request
message RollbackResponse {
}
// Response to a batch update request
message ExecuteBatchResponse {
string connection_id = 1;
uint32 statement_id = 2;
repeated uint64 update_counts = 3;
bool missing_statement = 4; // Did the request fail because of no-cached
statement
RpcMetadata metadata = 5;
}
--
You received this message because you are subscribed to the Google Groups
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/protobuf/98864904-d137-419a-901c-917727bddbe6n%40googlegroups.com.