[ 
https://issues.apache.org/jira/browse/THRIFT-370?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12681957#action_12681957
 ] 

Jérémie BORDIER commented on THRIFT-370:
----------------------------------------

The problem here is a real behavior inconsistency between languages. The point 
here is that if the field is not declared as optional in the thrift file, the 
C++ implementation always gets it serialized and the server receives it as an 
empty string and considers the field as set. Unlike Java, C++ doesn't have 
"null" values for objects, and "" is the default value. We could have this 
fixed by serializing the string only when it's set, and forcing the set via the 
constructor or via a setter (so the __isset.field boolean gets updated 
consistently), but this would lead into backward compatibilities issues as 
there's currently no setters and the fields are public (which makes me wonder 
if the __isset flag is actually used somewhere..)

I'm available to get the patch done, i already have something working but not 
cleaned.

> unset fields in structs in c++ have __isset set to true
> -------------------------------------------------------
>
>                 Key: THRIFT-370
>                 URL: https://issues.apache.org/jira/browse/THRIFT-370
>             Project: Thrift
>          Issue Type: Bug
>          Components: Library (C++)
>    Affects Versions: 0.1
>         Environment: Linux 2.6.27-11 x86_64
>            Reporter: Nick Lanham
>             Fix For: 0.1
>
>         Attachments: issetTest.tar.gz
>
>
> If you have a struct like:
> struct test_struct {
>   1:string test_string
> }
> and then in a c++ client you do:
>   test_struct foo;
>   client.someFunc(foo)
> then the server will see it's argument (arg) as having 
> arg.__isset.test_string set to true.
> similarly from the client side if expect a return value and do:
>   test_struct returnVal;
>   client.someFunc(returnVal);
> and the server does not set the returnVal to anything it will still see 
> returnVal.__isset.test_string as true
> in all cases the string *is* set to the empty string as the constuctor for 
> test_struct sets it, but __isset should not be true.
> Attached (should be) a simple test case.  Just untar run "thrift --gen cpp 
> isset.thrift" and then run make.  start up the server and run the client to 
> see the output.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to