Hi,
After it was suggested that set cannot be used in php, I changed from php to
python. Even in python, am facing the same issue (I think).
Traceback (most recent call last):
File "depository.py", line 52, in <module>
responses = client.findValue(request)
File "/home/shraddha/dev/python/packages/mvr/MyServer.py", line 40, in
findValue
return self.recv_findValue()
File "/home/shraddha/dev/python/packages/mvr/MyServer.py", line 58, in
recv_findValue
result.read(self._iprot)
File "/home/shraddha/dev/python/packages/mvr/MyServer.py", line 194, in
read
self.success.add(_elem21)
TypeError: unhashable instance
Below is the python thrift code generated.
def read(self, iprot):
if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and
isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec
is not None and fastbinary is not None:
fastbinary.decode_binary(self, iprot.trans, (self.__class__,
self.thrift_spec))
return
iprot.readStructBegin()
while True:
(fname, ftype, fid) = iprot.readFieldBegin()
if ftype == TType.STOP:
break
if fid == 0:
if ftype == TType.SET:
self.success = set()
(_etype19, _size16) = iprot.readSetBegin()
for _i20 in xrange(_size16):
_elem21 = MVRResponse()
_elem21.read(iprot)
self.success.add(_elem21)
iprot.readSetEnd()
else:
iprot.skip(ftype)
elif fid == 1:
if ftype == TType.STRUCT:
self.ex = MVRException()
self.ex.read(iprot)
else:
iprot.skip(ftype)
else:
iprot.skip(ftype)
iprot.readFieldEnd()
iprot.readStructEnd()
AFAIK, support supports set. Any idea, how to resolve it.
Regards
Bala Mudiam
On Tue, Mar 9, 2010 at 6:15 PM, Balanagireddy Mudiam <
[email protected]> wrote:
> Thank you Mark Slee. I will make the suggested changes.
>
> Regards
> Bala Mudiam
>
>
>
>
>
> On Tue, Mar 9, 2010 at 5:51 PM, Mark Slee <[email protected]> wrote:
> > Ah yes, here's the issue:
> >
> > service MyServer {
> > set<MyResponse> findValue(1: MyRequest request )
> > throws (1: MyException ex)
> >
> > Thrift/PHP does not support sets of objects. This is because in PHP
> Thrift implements sets as a dictionary hash, and PHP arrays only support
> scalar keys.
> >
> > You should probably just use list<MyResponse> instead of set.
> >
> > -----Original Message-----
> > From: Balanagireddy Mudiam [mailto:[email protected]]
> > Sent: Tuesday, March 09, 2010 2:45 PM
> > To: [email protected]
> > Subject: Re: PHP error calling thrift method
> >
> > Hi,
> >
> > The reason I kept the request was, I thought set type was creating the
> problem.
> >
> > Here is the complete thrift file.
> >
> > struct MyResponse {
> > 1: i64 totalValue,
> > 2: i64 Value1,
> > 3: i64 Value2,
> > 4: i64 Value3,
> > 5: map<string,i64> sourceValMap
> > }
> >
> > struct MyRequest {
> > 1: set<string> name,
> > 2: i32 startDate,
> > 3: i32 endDate,
> > }
> >
> > service MyServer {
> > set<MyResponse> findValue(1: MyRequest request )
> > throws (1: MyException ex)
> >
> > }
> >
> >
> > Here is the read method for response, generated by thrift.
> >
> > public function read($input)
> > {
> > $xfer = 0;
> > $fname = null;
> > $ftype = 0;
> > $fid = 0;
> > $xfer += $input->readStructBegin($fname);
> > while (true)
> > {
> > $xfer += $input->readFieldBegin($fname, $ftype, $fid);
> > if ($ftype == TType::STOP) {
> > break;
> > }
> > switch ($fid)
> > {
> > case 0:
> > if ($ftype == TType::SET) {
> > $this->success = array();
> > $_size16 = 0;
> > $_etype19 = 0;
> > $xfer += $input->readSetBegin($_etype19, $_size16);
> > for ($_i20 = 0; $_i20 < $_size16; ++$_i20)
> > {
> > $elem21 = null;
> > $elem21 = new MyResponse();
> > $xfer += $elem21->read($input);
> > --> $this->success[$elem21] = true;
> > }
> > $xfer += $input->readSetEnd();
> > } else {
> > $xfer += $input->skip($ftype);
> > }
> > break;
> > case 1:
> > if ($ftype == TType::STRUCT) {
> > $this->ex = new MyException();
> > $xfer += $this->ex->read($input);
> > } else {
> > $xfer += $input->skip($ftype);
> > }
> > break;
> > default:
> > $xfer += $input->skip($ftype);
> > break;
> > }
> > $xfer += $input->readFieldEnd();
> > }
> > $xfer += $input->readStructEnd();
> > return $xfer;
> > }
> >
> > Here is how I am invoking it.
> >
> > $vals['name'] = array("USA");
> > $vals['startDate'] = '20100201';
> > $vals['endDate'] = '20100120';
> >
> > $myrequest = new MyRequest($vals);
> >
> > $results = $mvr->findValue($myrequest);
> >
> > Thank you.
> >
> > Regards
> > Bala Mudiam
> >
> >
> >
> >
> >
> > On Tue, Mar 9, 2010 at 5:34 PM, Mark Slee <[email protected]> wrote:
> >> I think something is missing here. The struct you show is MyRequest but
> this generated code is dealing with a MyResponse.
> >>
> >> Can you send over your full .thrift file, more context in the generated
> code, and how you're invoking it?
> >>
> >> -----Original Message-----
> >> From: Balanagireddy Mudiam [mailto:[email protected]]
> >> Sent: Tuesday, March 09, 2010 2:20 PM
> >> To: [email protected]
> >> Subject: PHP error calling thrift method
> >>
> >> Hi,
> >>
> >> I am having the below request object and I am calling a method using
> >> thrift from php.
> >>
> >> struct MyRequest {
> >> 1: set<string> name,
> >> 2: i32 startDate,
> >> 3: i32 endDate,
> >> }
> >>
> >> When I execute my php, I get the following error. This warning is
> >> thrown from thrift generated code. The reason for the warning is
> >> $elem21(object) cannot be used as a key.
> >>
> >> Warning: Illegal offset type in Server.php on line 226
> >>
> >> 223 $elem21 = null;
> >> 224 $elem21 = new MyResponse();
> >> 225 $xfer += $elem21->read($input);
> >> 226 $this->success[$elem21] = true;
> >>
> >> Any idea, how to resolve this issue.
> >>
> >> Thank you.
> >>
> >> Regards
> >> Bala Mudiam
> >>
> >
>