Juan,
check the attached source file .

Cao Jiguang

2010-03-17 



casablinca126.com 



发件人: Juan Manuel Garcia del Moral 
发送时间: 2010-03-17  00:09:53 
收件人: user@cassandra.apache.org 
抄送: 
主题: Re: Re: SuperColumns in C++ API 
 
Many thanks for your code, would you please send me the get_slice() function as 
well so I can compile it?

thanks in advance 

Juan



2010/3/15 casablinca126.com <casabli...@126.com>

hello Juan,
this is the C++ code with super-column  I'm using. I hope it will be useful :

#include "Cassandra.h"
#include <protocol/TBinaryProtocol.h>
#include <transport/TBufferTransports.h>
#include <transport/TSocket.h>
#include <string>
//#include <stdio.h>
#include <iostream>
#include <fstream>
#include <pthread.h>
#include <vector>
#include <map>

using namespace std;

using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;

using boost::shared_ptr;

using namespace org::apache::cassandra;

//macros..
#define MAX_STRLEN  100000
#define ITEM_COUNT   100000
#define ChapterNumPerNovel 30

//global variables  & functions 

int port = 9160; 

void insert();
void get(void );
void get_slice();
void remove();

const string strKeyspace = "Keyspace1";
const string strColFamily_org = "Super1";
string strColFamily = "Super1";
string strColOrg = "chapter";
string strCol = "chapter";
string strSuperColOrg = "Novel";
string strSuperCol = "Novel";
string strKeyOrg = "novel_key";
string strKey = "novel_key";
string strValue = "";
size_t thread_id = 0;

bool STOP = false;
size_t start_time = 0;
size_t average_time = 0;
int ret_num = 0;
unsigned long long total_get_count = 0;
unsigned long long ntmp = 10;
int error_num = 0;





int main(int argc, char **argv)
{
 //insert();
 //get(NULL);
 get_slice();
 //remove();
  
    
 return EXIT_SUCCESS;
}


void insert()
{
 
 shared_ptr<TTransport> socket_novel(new TSocket("localhost", port));  
 shared_ptr<TTransport> transport_novel(new TBufferedTransport(socket_novel) );
 shared_ptr<TProtocol> protocol_novel(new TBinaryProtocol(transport_novel) );
 CassandraClient client(protocol_novel);
 transport_novel->open();
 string strValueOrg = "1234567";


 ColumnPath col_path;
 int i = 0;
 char chTmp[MAX_STRLEN];
 string str_zeros;
 while(i<ITEM_COUNT )
 {
  memset(&chTmp, 0, MAX_STRLEN);
  sprintf(chTmp, "%d", i++);
  
  strValue = strValueOrg + string(chTmp);
  strKey = strKeyOrg + string(chTmp);
  strSuperCol = strSuperColOrg + string(chTmp);
  
  col_path.column_family.assign(strColFamily );
  col_path.column.assign(strCol);
  col_path.super_column.assign(strSuperCol);
  col_path.__isset.super_column = true;
  col_path.__isset.column = true;


  try
  {
   for(int j=0; j<ChapterNumPerNovel; j++)
   {
    memset(&chTmp, 0, MAX_STRLEN);
    sprintf(chTmp, "%d", j);
    int len = string(chTmp).length();
    str_zeros = "";
    for(int k=len; k<10; k++)
    {
     str_zeros += "0";
    }
    strCol= strSuperCol + "_" + strColOrg + str_zeros + string(chTmp);
    col_path.column.assign(strCol);
    client.insert(strKeyspace,strKey, col_path, strValue,time(NULL), ONE);
   }
  }
  catch(TException &tx)
  {
   printf("ERROR: %s\n", tx.what());
   error_num ++ ;
  }

  total_get_count ++ ;
  
 }

 STOP = true;
 transport_novel->close();
}
//---------------------------------------

cheers,
Cao Jiguang


2010-03-16 



casablinca126.com 



发件人: Juan Manuel Garcia del Moral 
发送时间: 2010-03-16  05:16:50 
收件人: user@cassandra.apache.org 
抄送: 
主题: Re: SuperColumns in C++ API 
Ok, I'll check out libcassandra in a while.

I've been able to insert values with this:

    new_col.__isset.super_column = true; 
    new_col.__isset.column     = true; /* this is required! */
    new_col.column_family.assign("Anonimos");
    new_col.super_column.assign("Tag");
    new_col.column.assign("300");
 
    client.insert("SocialAds",
                  "50",
                  new_col,
                  "5",
                  12345678,
                  ONE);

I thought I could GET it by doing:

    client.get(ret_val,
               "SocialAds",
               "50",
               new_col,
               ONE);

But I'm getting this error:
 Default TException.

Ah nothing on the server log

Thanks, and sorry for all these newbie questions



2010/3/15 Jonathan Ellis <jbel...@gmail.com>

you're still not setting isset on column_family.

you need both isset and assign on each value you're sending.

maybe you should use http://github.com/posulliv/libcassandra ?

On Mon, Mar 15, 2010 at 3:29 PM, Juan Manuel Garcia del Moral

<j...@southcode.com.ar> wrote:
> Ok,
>
> Now I've changed to:
>
>     ColumnPath new_col;
>     new_col.__isset.super_column = true;
>     new_col.__isset.column     = true; /* this is required! */
>     new_col.column_family.assign("Anonimos");
>     new_col.super_column.assign("Tag");
>     new_col.column.assign("300");
>
>
>     client.insert("SocialAds",
>                   "1",
>                   new_col,
>                   "200",
>                   12345678,
>                   ONE);
>
> I'm not getting any error but no entry on the log either, and the value is
> not being inserted...
>
>
> Thanks
>
>
> 2010/3/15 Jonathan Ellis <jbel...@gmail.com>
>>
>> Ah, thrift is letting you set something to be null, that shouldn't be
>> legal.  This is fixed in 0.6 svn, btw.
>>
>> it looks like you are setting new_col.__isset.column to true, but not
>> actually assigning it a value.
>>
>> On Mon, Mar 15, 2010 at 3:14 PM, Juan Manuel Garcia del Moral
>> <j...@southcode.com.ar> wrote:
>> > This is what the log says:
>> >
>> > ERROR [pool-1-thread-8] 2010-03-15 15:54:06,753 Cassandra.java (line
>> > 1482)
>> > Internal error processing insert
>> > java.lang.AssertionError: QueryPath(columnFamilyName='Anonimos',
>> > superColumnName='[...@d0357a', columnName='null')
>> >         at
>> > org.apache.cassandra.db.ColumnFamily.addColumn(ColumnFamily.java:165)
>> >         at
>> > org.apache.cassandra.db.ColumnFamily.addColumn(ColumnFamily.java:159)
>> >         at org.apache.cassandra.db.RowMutation.add(RowMutation.java:159)
>> >         at
>> >
>> > org.apache.cassandra.thrift.CassandraServer.insert(CassandraServer.java:351)
>> >         at
>> >
>> > org.apache.cassandra.thrift.Cassandra$Processor$insert.process(Cassandra.java:1474)
>> >         at
>> >
>> > org.apache.cassandra.thrift.Cassandra$Processor.process(Cassandra.java:1115)
>> >         at
>> >
>> > org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:253)
>> >         at
>> >
>> > java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>> >         at
>> >
>> > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>> >         at java.lang.Thread.run(Thread.java:619)
>> >
>> >
>> > I need to do replicate this:
>> > set SocialAds.Anonimos['122']['Tag']['150'] = '100';
>> >
>> > from my code...
>> >
>> > any ideas?
>> >
>> > thanks in advance
>> >
>> > Juan
>> >
>> >
>> > 2010/3/15 Jonathan Ellis <jbel...@gmail.com>
>> >>
>> >> check the server log for exception.  and if you are not on 0.5.1 or
>> >> 0.6 svn branch, upgrade.
>> >>
>> >> On Mon, Mar 15, 2010 at 12:47 PM, Juan Manuel Garcia del Moral
>> >> <j...@southcode.com.ar> wrote:
>> >> > Many thanks!
>> >> >
>> >> > That seems to be useful,
>> >> >
>> >> > But now I'm getting
>> >> >  The error message: "Internal error processing insert"
>> >> >
>> >> > I'm not sure if I'm setting the timestamp properly
>> >> >
>> >> >
>> >> >
>> >> > 2010/3/15 Padraig O'Sullivan <osullivan.padr...@gmail.com>
>> >> >>
>> >> >> You need to manually set the __isset fields when using the thift API
>> >> >> in C++. Since you are trying to insert a super column, you need to
>> >> >> set
>> >> >> the super_column __isset field.
>> >> >>
>> >> >> So this:
>> >> >>
>> >> >> new_col.__isset.column = true;
>> >> >>
>> >> >> should become:
>> >> >>
>> >> >> new_col.__isset.super_column = true;
>> >> >>
>> >> >> -Padraig
>> >> >>
>> >> >> On Mon, Mar 15, 2010 at 12:36 PM, Juan Manuel Garcia del Moral
>> >> >> <j...@southcode.com.ar> wrote:
>> >> >> > Hello
>> >> >> >
>> >> >> > I'm trying to add values using supercolumns but I get this error
>> >> >> >
>> >> >> > ERROR: supercolumn parameter is not optional for super CF Anonimos
>> >> >> >
>> >> >> > This is my code
>> >> >> >
>> >> >> > // **********
>> >> >> >  ColumnPath new_col;
>> >> >> >     new_col.__isset.column     = true; /* this is required! */
>> >> >> >     new_col.column_family.assign("Anonimos");
>> >> >> >     new_col.super_column.assign("Tag");
>> >> >> >
>> >> >> >     client.insert("SocialAds",
>> >> >> >                   "1",
>> >> >> >                   new_col,
>> >> >> >                   "200",
>> >> >> >                   123456789,
>> >> >> >                   ONE);
>> >> >> >
>> >> >> > // **********
>> >> >> >
>> >> >> > What I'm doing wrong?
>> >> >> >
>> >> >> > Thanks
>> >> >> >
>> >> >> > Juan
>> >> >> >
>> >> >> >
>> >> >
>> >> >
>> >> >
>> >>
>> >
>> >
>> >
>
>
>
> --
> Juan Manuel García del Moral
> Southcode Global IT Resources
> j...@southcode.com.ar
> http://www.southcode.com.ar
>
>




-- 
Juan Manuel García del Moral
Southcode Global IT Resources
j...@southcode.com.ar
http://www.southcode.com.ar





-- 
Juan Manuel García del Moral
Southcode Global IT Resources
j...@southcode.com.ar
http://www.southcode.com.ar

Attachment: cassandra_client.cpp
Description: Binary data

Reply via email to