DBZ-486 Replication message provides info about optionality

pull/8/merge
Jiri Pechanec 2017-11-27 14:32:36 +01:00 committed by Gunnar Morling
parent 2f3179ef4e
commit e375003c3b
4 changed files with 23 additions and 5 deletions

View File

@ -32,6 +32,7 @@ message DatumMessage {
message TypeInfo { message TypeInfo {
required string modifier = 1; required string modifier = 1;
required bool value_optional = 2;
} }
message RowMessage { message RowMessage {

View File

@ -640,6 +640,7 @@ static void add_metadata_to_msg(Decoderbufs__TypeInfo **tmsg,
Form_pg_attribute attr; Form_pg_attribute attr;
char *typ_mod; char *typ_mod;
Decoderbufs__TypeInfo typeinfo = DECODERBUFS__TYPE_INFO__INIT; Decoderbufs__TypeInfo typeinfo = DECODERBUFS__TYPE_INFO__INIT;
bool not_null;
attr = tupdesc->attrs[natt]; attr = tupdesc->attrs[natt];
@ -649,10 +650,12 @@ static void add_metadata_to_msg(Decoderbufs__TypeInfo **tmsg,
continue; continue;
} }
not_null = attr->attnotnull;
typ_mod = TextDatumGetCString(DirectFunctionCall2(format_type, attr->atttypid, attr->atttypmod)); typ_mod = TextDatumGetCString(DirectFunctionCall2(format_type, attr->atttypid, attr->atttypmod));
elog(DEBUG1, "Adding typemodifier '%s' for column %d", typ_mod, natt); elog(DEBUG1, "Adding typemodifier '%s' for column %d, optional %s", typ_mod, natt, !not_null ? "true" : "false");
typeinfo.modifier = typ_mod; typeinfo.modifier = typ_mod;
typeinfo.value_optional = !not_null;
tmsg[valid_attr_cnt] = palloc(sizeof(typeinfo)); tmsg[valid_attr_cnt] = palloc(sizeof(typeinfo));
memcpy(tmsg[valid_attr_cnt], &typeinfo, sizeof(typeinfo)); memcpy(tmsg[valid_attr_cnt], &typeinfo, sizeof(typeinfo));

View File

@ -385,7 +385,7 @@ const ProtobufCMessageDescriptor decoderbufs__datum_message__descriptor =
(ProtobufCMessageInit) decoderbufs__datum_message__init, (ProtobufCMessageInit) decoderbufs__datum_message__init,
NULL,NULL,NULL /* reserved[123] */ NULL,NULL,NULL /* reserved[123] */
}; };
static const ProtobufCFieldDescriptor decoderbufs__type_info__field_descriptors[1] = static const ProtobufCFieldDescriptor decoderbufs__type_info__field_descriptors[2] =
{ {
{ {
"modifier", "modifier",
@ -399,14 +399,27 @@ static const ProtobufCFieldDescriptor decoderbufs__type_info__field_descriptors[
0, /* flags */ 0, /* flags */
0,NULL,NULL /* reserved1,reserved2, etc */ 0,NULL,NULL /* reserved1,reserved2, etc */
}, },
{
"value_optional",
2,
PROTOBUF_C_LABEL_REQUIRED,
PROTOBUF_C_TYPE_BOOL,
0, /* quantifier_offset */
offsetof(Decoderbufs__TypeInfo, value_optional),
NULL,
NULL,
0, /* flags */
0,NULL,NULL /* reserved1,reserved2, etc */
},
}; };
static const unsigned decoderbufs__type_info__field_indices_by_name[] = { static const unsigned decoderbufs__type_info__field_indices_by_name[] = {
0, /* field[0] = modifier */ 0, /* field[0] = modifier */
1, /* field[1] = value_optional */
}; };
static const ProtobufCIntRange decoderbufs__type_info__number_ranges[1 + 1] = static const ProtobufCIntRange decoderbufs__type_info__number_ranges[1 + 1] =
{ {
{ 1, 0 }, { 1, 0 },
{ 0, 1 } { 0, 2 }
}; };
const ProtobufCMessageDescriptor decoderbufs__type_info__descriptor = const ProtobufCMessageDescriptor decoderbufs__type_info__descriptor =
{ {
@ -416,7 +429,7 @@ const ProtobufCMessageDescriptor decoderbufs__type_info__descriptor =
"Decoderbufs__TypeInfo", "Decoderbufs__TypeInfo",
"decoderbufs", "decoderbufs",
sizeof(Decoderbufs__TypeInfo), sizeof(Decoderbufs__TypeInfo),
1, 2,
decoderbufs__type_info__field_descriptors, decoderbufs__type_info__field_descriptors,
decoderbufs__type_info__field_indices_by_name, decoderbufs__type_info__field_indices_by_name,
1, decoderbufs__type_info__number_ranges, 1, decoderbufs__type_info__number_ranges,

View File

@ -82,10 +82,11 @@ struct _Decoderbufs__TypeInfo
{ {
ProtobufCMessage base; ProtobufCMessage base;
char *modifier; char *modifier;
protobuf_c_boolean value_optional;
}; };
#define DECODERBUFS__TYPE_INFO__INIT \ #define DECODERBUFS__TYPE_INFO__INIT \
{ PROTOBUF_C_MESSAGE_INIT (&decoderbufs__type_info__descriptor) \ { PROTOBUF_C_MESSAGE_INIT (&decoderbufs__type_info__descriptor) \
, NULL } , NULL, 0 }
struct _Decoderbufs__RowMessage struct _Decoderbufs__RowMessage