[protobuf] [PATCH] Display non-present fields with TextFormat.

2010-11-23 Thread Brenden Matthews
Greetings,

One of the best features of protocol buffers is the notion of presence.
 Another great feature is the ability to do 'message.PrintDebugString()'.
 One problem, however, is that fields which are not present do not get
displayed when printing the debug string.

Proposed solution: add an optional parameter to display optional fields and
their default values (if applicable) even when they aren't present.

Attached is a patch which implements this.

Please provide comments/suggestions, and let me know if this is the right
place for this.

-- 
You received this message because you are subscribed to the Google Groups 
Protocol Buffers group.
To post to this group, send email to proto...@googlegroups.com.
To unsubscribe from this group, send email to 
protobuf+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/protobuf?hl=en.

From edf13be13766caa1a496c9feeced8d9d24de0c10 Mon Sep 17 00:00:00 2001
From: Brenden Matthews bren...@diddyinc.com
Date: Tue, 23 Nov 2010 17:01:01 -0800
Subject: [PATCH] Display non-present fields with TextFormat.

This allows for the non-presence of optional fields to be represented in
string output for a message.  This greatly aids in debugging
data-intensive applications which use protobuf.
---
 protobuf/src/google/protobuf/descriptor.cc |2 +-
 .../protobuf/generated_message_reflection.cc   |9 +--
 .../google/protobuf/generated_message_reflection.h |4 +-
 protobuf/src/google/protobuf/message.h |   14 ++--
 protobuf/src/google/protobuf/text_format.cc|   74 
 protobuf/src/google/protobuf/text_format.h |   26 ---
 6 files changed, 76 insertions(+), 53 deletions(-)

diff --git a/protobuf/src/google/protobuf/descriptor.cc b/protobuf/src/google/protobuf/descriptor.cc
index b6f276d..9e8aa51 100644
--- a/protobuf/src/google/protobuf/descriptor.cc
+++ b/protobuf/src/google/protobuf/descriptor.cc
@@ -1507,7 +1507,7 @@ bool RetrieveOptions(const Message options, vectorstring *option_entries) {
 for (int j = 0; j  count; j++) {
   string fieldval;
   TextFormat::PrintFieldValueToString(options, fields[i],
-  repeated ? count : -1, fieldval);
+  repeated ? count : -1, fieldval, false);
   option_entries-push_back(fields[i]-name() +  =  + fieldval);
 }
   }
diff --git a/protobuf/src/google/protobuf/generated_message_reflection.cc b/protobuf/src/google/protobuf/generated_message_reflection.cc
index 8428b75..aa7e628 100644
--- a/protobuf/src/google/protobuf/generated_message_reflection.cc
+++ b/protobuf/src/google/protobuf/generated_message_reflection.cc
@@ -640,7 +640,8 @@ struct FieldNumberSorter {
 
 void GeneratedMessageReflection::ListFields(
 const Message message,
-vectorconst FieldDescriptor** output) const {
+vectorconst FieldDescriptor** output,
+const bool include_missing) const {
   output-clear();
 
   // Optimization:  The default instance never has any fields set.
@@ -652,10 +653,8 @@ void GeneratedMessageReflection::ListFields(
   if (FieldSize(message, field)  0) {
 output-push_back(field);
   }
-} else {
-  if (HasBit(message, field)) {
-output-push_back(field);
-  }
+} else if (all || HasBit(message, field)) {
+  output-push_back(field);
 }
   }
 
diff --git a/protobuf/src/google/protobuf/generated_message_reflection.h b/protobuf/src/google/protobuf/generated_message_reflection.h
index b545fa1..1475f9e 100644
--- a/protobuf/src/google/protobuf/generated_message_reflection.h
+++ b/protobuf/src/google/protobuf/generated_message_reflection.h
@@ -144,8 +144,8 @@ class LIBPROTOBUF_EXPORT GeneratedMessageReflection : public Reflection {
   void Swap(Message* message1, Message* message2) const;
   void SwapElements(Message* message, const FieldDescriptor* field,
 int index1, int index2) const;
-  void ListFields(const Message message,
-  vectorconst FieldDescriptor** output) const;
+  void ListFields(const Message message, vectorconst FieldDescriptor**
+  output, const bool include_missing = false) const;
 
   int32  GetInt32 (const Message message,
const FieldDescriptor* field) const;
diff --git a/protobuf/src/google/protobuf/message.h b/protobuf/src/google/protobuf/message.h
index c0062f9..988f50c 100644
--- a/protobuf/src/google/protobuf/message.h
+++ b/protobuf/src/google/protobuf/message.h
@@ -243,13 +243,13 @@ class LIBPROTOBUF_EXPORT Message : public MessageLite {
 
   // Generates a human readable form of this message, useful for debugging
   // and other purposes.
-  string DebugString() const;
+  string DebugString(const bool show_missing = false) const;
   // Like DebugString(), but with less whitespace.
   string ShortDebugString() const;
   // Like DebugString(), but do not escape UTF-8 byte sequences.
-  string 

Re: [protobuf] [PATCH] Display non-present fields with TextFormat.

2010-11-23 Thread Kenton Varda
Hi Brenden,

Thanks for your interest in improving protocol buffers.  I can see how this
option would be useful to some people.  Unfortunately, there are a lot of
options that different people find useful, and if we implemented all of
them, we'd end up with a very boated library that no one wants to use.
 Thus, depressingly, half of my job as the maintainer of protocol buffers is
refusing feature requests and contributions.  I even have to reject
contributions from other Google employees on a daily basis.

It is actually pretty easy to write a custom TextFormat implementation with
whatever modifications you want.  The TextFormat code itself does not depend
on any internal interfaces.  Also, you can reuse the code to format
individual values by calling TextFormat::PrintFieldValue().  So, what I
generally tell people who want to change TextFormat is to write your own
class similar to TextFormat that implements your alternative encoding.  I
think that would be appropriate in this case.

Sorry.

On Tue, Nov 23, 2010 at 5:04 PM, Brenden Matthews bren...@diddyinc.comwrote:

 Greetings,

 One of the best features of protocol buffers is the notion of presence.
  Another great feature is the ability to do 'message.PrintDebugString()'.
  One problem, however, is that fields which are not present do not get
 displayed when printing the debug string.

 Proposed solution: add an optional parameter to display optional fields and
 their default values (if applicable) even when they aren't present.

 Attached is a patch which implements this.

 Please provide comments/suggestions, and let me know if this is the right
 place for this.

 --
 You received this message because you are subscribed to the Google Groups
 Protocol Buffers group.
 To post to this group, send email to proto...@googlegroups.com.
 To unsubscribe from this group, send email to
 protobuf+unsubscr...@googlegroups.comprotobuf%2bunsubscr...@googlegroups.com
 .
 For more options, visit this group at
 http://groups.google.com/group/protobuf?hl=en.


-- 
You received this message because you are subscribed to the Google Groups 
Protocol Buffers group.
To post to this group, send email to proto...@googlegroups.com.
To unsubscribe from this group, send email to 
protobuf+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/protobuf?hl=en.