浏览代码

Merge pull request #8874 from richardkchapman/cassandra-24-sets

HPCC-15885 Cassandra cpp driver 2.4.x list type issue

Reviewed-by: Gavin Halliday <ghalliday@hpccsystems.com>
Gavin Halliday 9 年之前
父节点
当前提交
b0af0c2c93
共有 1 个文件被更改,包括 20 次插入12 次删除
  1. 20 12
      plugins/cassandra/cassandraembed.cpp

+ 20 - 12
plugins/cassandra/cassandraembed.cpp

@@ -1639,7 +1639,15 @@ public:
         }
         else
             numElems = totalBytes / elemSize;
-        CassandraCollection collection(cass_collection_new(CASS_COLLECTION_TYPE_SET, numElems));
+
+        // We don't know whether the corresponding field in Cassandra is a list or a set. Try binding a dummy list to tell which.
+        Owned<CassandraCollection> collection;
+        CassandraCollection temp(cass_collection_new(CASS_COLLECTION_TYPE_LIST, 0));
+        if (cass_statement_bind_collection(stmtInfo->queryStatement(), nextParam, temp) == CASS_OK)
+            collection.setown(new CassandraCollection(cass_collection_new(CASS_COLLECTION_TYPE_LIST, numElems)));
+        else
+            collection.setown(new CassandraCollection(cass_collection_new(CASS_COLLECTION_TYPE_SET, numElems)));
+
         while (inData < endData)
         {
             size32_t thisSize = elemSize;
@@ -1648,9 +1656,9 @@ public:
             {
             case type_int:
                 if (elemSize > 4)
-                    rc = cass_collection_append_int64(collection, rtlReadInt(inData, elemSize));
+                    rc = cass_collection_append_int64(*collection, rtlReadInt(inData, elemSize));
                 else
-                    rc = cass_collection_append_int32(collection, rtlReadInt(inData, elemSize));
+                    rc = cass_collection_append_int32(*collection, rtlReadInt(inData, elemSize));
                 break;
             case type_unsigned:
                 UNSUPPORTED("UNSIGNED columns");
@@ -1663,7 +1671,7 @@ public:
                 size32_t utf8chars;
                 rtlDataAttr utfText;
                 rtlStrToUtf8X(utf8chars, utfText.refstr(), numChars, (const char *) inData);
-                rc = cass_collection_append_string_n(collection, utfText.getstr(), rtlUtf8Size(utf8chars, utfText.getstr()));
+                rc = cass_collection_append_string_n(*collection, utfText.getstr(), rtlUtf8Size(utf8chars, utfText.getstr()));
                 break;
             }
             case type_string:
@@ -1676,18 +1684,18 @@ public:
                 size32_t utf8chars;
                 rtlDataAttr utfText;
                 rtlStrToUtf8X(utf8chars, utfText.refstr(), thisSize, (const char *) inData);
-                rc = cass_collection_append_string_n(collection, utfText.getstr(), rtlUtf8Size(utf8chars, utfText.getstr()));
+                rc = cass_collection_append_string_n(*collection, utfText.getstr(), rtlUtf8Size(utf8chars, utfText.getstr()));
                 break;
             }
             case type_real:
                 if (elemSize == sizeof(double))
-                    rc = cass_collection_append_double(collection, * (double *) inData);
+                    rc = cass_collection_append_double(*collection, * (double *) inData);
                 else
-                    rc = cass_collection_append_float(collection, * (float *) inData);
+                    rc = cass_collection_append_float(*collection, * (float *) inData);
                 break;
             case type_boolean:
                 assertex(elemSize == sizeof(bool));
-                rc = cass_collection_append_bool(collection, *(bool*)inData ? cass_true : cass_false);
+                rc = cass_collection_append_bool(*collection, *(bool*)inData ? cass_true : cass_false);
                 break;
             case type_unicode:
             {
@@ -1700,7 +1708,7 @@ public:
                 rtlDataAttr unicode;
                 rtlUnicodeToUtf8X(unicodeChars, unicode.refstr(), thisSize / sizeof(UChar), (const UChar *) inData);
                 size32_t sizeBytes = rtlUtf8Size(unicodeChars, unicode.getstr());
-                rc = cass_collection_append_string_n(collection, unicode.getstr(), sizeBytes);
+                rc = cass_collection_append_string_n(*collection, unicode.getstr(), sizeBytes);
                 break;
             }
             case type_utf8:
@@ -1709,7 +1717,7 @@ public:
                 size32_t numChars = * (size32_t *) inData;
                 inData += sizeof(size32_t);
                 thisSize = rtlUtf8Size(numChars, inData);
-                rc = cass_collection_append_string_n(collection, (const char *) inData, thisSize);
+                rc = cass_collection_append_string_n(*collection, (const char *) inData, thisSize);
                 break;
             }
             case type_data:
@@ -1718,7 +1726,7 @@ public:
                     thisSize = * (size32_t *) inData;
                     inData += sizeof(size32_t);
                 }
-                rc = cass_collection_append_bytes(collection, (const cass_byte_t*) inData, thisSize);
+                rc = cass_collection_append_bytes(*collection, (const cass_byte_t*) inData, thisSize);
                 break;
             }
             checkBind(rc, name);
@@ -1726,7 +1734,7 @@ public:
         }
         checkBind(cass_statement_bind_collection(stmtInfo->queryStatement(),
                                                  checkNextParam(name),
-                                                 collection),
+                                                 *collection),
                   name);
     }
     virtual IInterface *bindParamWriter(IInterface *esdl, const char *esdlservice, const char *esdltype, const char *name)