如何在Cassandra C++DataStax中绑定十进制类型

How to bind decimal type in Cassandra C++ DataStax

本文关键字:绑定 十进制 类型 C++DataStax Cassandra      更新时间:2023-10-16

我正在使用DataStax Cassandra驱动程序我正在尝试将行插入到cassandra表中。如果表为十进制类型,则为其中一列。我的查询是

插入表格(id,price)值(?,?)

我准备语句cass_session_prepare,然后绑定cass_statement_bind_int32_by_name id。

当我尝试绑定十进制时,问题就开始了。该方法的原型是

CassError cass_statement_bind_decimal ( statement, index, varint, varint_size, scale )

其中,variant是指向字节的指针,variant_size是字节数,scale是小数位数。

所以,最后我的问题是,如何计算我应该传递给该方法的字节数组的内容?首先,我天真地认为,如果我只传递一个数字的字符表示("1234.56"),它就会起作用。但我当然不工作。现在我明白了,我应该传递的字节数组在Java中被称为BigInteger。但是我不知道如何将字符串或double转换为这个BigInteger数组。我不认为Cassandra驱动程序API提供了任何可以帮助我转换的东西。所以,如果有人能帮助我解决这个问题,我将非常感谢

有许多库可以用来执行转换:

  • GNU多精度算术库(GMP)
  • 多精度整数与有理数(MPIR)
  • 助推。多精度
  • OpenSSL BIGNUM
  • 其他多精度库

如果您查看DataStax C/C++驱动程序的集成测试,您会发现一个利用OpenSSL BIGNUM库的基本BigNumber实现。此实现不执行算术运算,但允许您轻松地将字节数组(带小数位数)转换为BigNumber以进行比较和显示。

注意:众所周知,OpenSSL BIGNUM实现比许多其他库慢。更完整的实现可以在使用GMP库的DataStax PHP驱动程序GitHub存储库中找到。