使用 CQL 准备的查询在 C++ 中管理计数器
Managing counters in c++ using CQL prepared queries
重新发布实际代码
// cassandra is a connected org::apache::cassandra::CassandraClient
// statement is a CqlPreparedResult
// result is a CqlResult
// CF declaration is:
/*
CREATE COLUMNFAMILY xp (
cid ascii PRIMARY KEY,
exp4 counter,
exp2 counter,
exp3 counter,
exp1 counter
) WITH
comment='' AND
comparator=text AND
read_repair_chance=0.100000 AND
gc_grace_seconds=864000 AND
default_validation=counter AND
min_compaction_threshold=4 AND
max_compaction_threshold=32 AND
replicate_on_write=True AND
compaction_strategy_class='SizeTieredCompactionStrategy' AND
compression_parameters:sstable_compression='org.apache.cassandra.io.compress.SnappyCompressor';
*/
std::vector<std::string> values;
values.resize(2);
values[0]="1";
values[1]="103";
cassandra->prepare_cql_query(statement,"update xp set exp2 = exp2 + ? where cid=?",Compression::NONE);
int32_t handle=statement.itemId;
try {
cassandra->execute_prepared_cql_query(result,handle,values);
}
catch(InvalidRequestException &e) {
cout << __LINE__ << " " << e.why << " "<< e.what() << endl;
}
// throws '?' is an invalid value, should be a long.
values.resize(1);
values[0]="103";
cassandra->prepare_cql_query(statement,"update xp set exp2 = exp2 + 1 where cid=?",Compression::NONE);
handle=statement.itemId;
cassandra->execute_prepared_cql_query(result,handle,values);
//works
所以看起来问题在于我们无法传递二进制数据。我试图传入一个包含长整型实际表示的字符串,但没有成功。当我从中读取数据时会出现同样的问题,但我认为我可以管理它(扫描返回的字符串并一次转换一个字节作为最后的手段)
是否有人成功使用计数器、c++ 和 cql?
long 值应编码为大端序 64 位整数。所以试试:
values[0] = " x64";
如果要在没有驱动程序的情况下继续使用 CQL,则需要大量编组/解组例程来涵盖此类内容。
好吧,我发现我缺少满足正确的二进制编码。使用这个函数将我的长整型转换为字符串,我成功地使用了准备好的查询
string to_counter(const long value) {
union {
long v;
char cc[8];
} xx;
xx.v=value;
string r;
r.assign(xx.cc,8);
reverse(r.begin(),r.end());
return r;
}
它是伴侣
long from_counter(const string& value) {
union {
long v;
char cc[8];
} xx;
for (size_t i=0; i < 8;++i) {
xx.cc[7-i]=value.at(i);
}
return xx.v;
}
我很确定这段代码可以改进,任何建议都将受到欢迎:)
相关文章:
- 当vector是tje全局变量时,c++中vector的内存管理
- 如何维护资源管理器项目视图中当前可见的项目列表
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 资源管理设计模式
- 使用"Task"函数指针队列定义作业管理器
- 实现动态插件管理器
- Alt+Enter 在 Win32 应用中,管理大小调整和分辨率
- libcurl 和 DNS ttl 中的内部连接管理
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- 在C++管理一家中国.txt
- 编译器资源管理器和 GCC 具有不同的输出
- 我们可以通过 IPC 传递具有动态管理成员的类对象吗?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- Q没有管理权限的 exe 无法启动维护工具
- QT:管理来自 QNetworkReply 的回复
- 使用 std::vector<double> 访问由 std::unique_ptr<double[2] 管理的数据>
- 读取 TCP 标头并使用RAW_SOCKET管理 TCP 连接
- Windows 资源管理器中的图标在使用 resource.rc 时显示 2 个不同的图标
- 管理字符串文本的最佳做法
- 在 QNX 中,如何管理服务器和客户端之间的 IPC 连接?