请考虑以下代码
char bar[] = "hello world \"One\", two, 'three'";
char *zSQL = sqlite3_mprintf("INSERT INTO stuff (`foo`) VALUES ('%q');", bar ) ;
sqlite3_exec(db, zSQL, 0, 0, 0);
sqlite3_free(zSQL);
/* Produces a exception error */
Run Code Online (Sandbox Code Playgroud)
问题是引号不会在SQL语句中被转义.如果我在PHP中编程,我会使用像sqlite_escape_string这样的函数来转义字符串,然后再将它们插入SQL查询中,但我似乎无法在C++中找到等效的函数.我可以构建我自己的sqlite_escape_string函数,但我相信必须有一个已经编写/测试...
是否有一个sqlite_escape_string()等效的c ++函数?
我正在将Win32串行类转换为Linux(Ubuntu)这个串行类所需的功能之一是"查看"串行缓冲区,以查看在读取串行端口之前在串行端口上等待了多少字节.
在这种修脚情况下,我只需要知道端口上是否有任何字节,然后再尝试读取它.
在Windows中我使用COMSTATS,但我似乎无法在Linux中找到类似的功能.
我的问题是:
在Linux上如何读取等待串口的BYTES/chars数量而不将其从串口缓冲区中删除?
我有一系列c ++类存储在带有C接口的库中(参见下面的示例).我有一个C程序,通过C接口包含这个c ++库.这似乎工作得很好,直到我尝试用new
和创建一个库在库中delete
.
我正在使用gcc为C++库编译C代码和g ++,我在unbunu上用Eclipse创建了项目.
我得到的错误消息是
undefined reference to 'operator new(unsigned int)'
undefined reference to 'operator delete(void*)'
Run Code Online (Sandbox Code Playgroud)
Libary H文件
#ifndef CFOO_H_
#define CFOO_H_
#ifdef __cplusplus
class CBar {
public:
int i ;
};
class CFoo {
public:
int work();
};
extern CFoo g_foo ;
extern "C" {
#endif /* __cplusplus */
int foo_bar( ) ;
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* CFOO_H_ */
Run Code Online (Sandbox Code Playgroud)
Libary cpp文件
#include "CFoo.h"
CFoo g_foo ;
int CFoo::work() { …
Run Code Online (Sandbox Code Playgroud) std :: list thread是安全的吗?我假设它不是这样我添加了自己的同步机制(我认为我有正确的术语).但我仍然遇到问题
每个函数都由一个单独的线程调用.Thread1不能等待,它必须尽可能快
std::list<CFoo> g_buffer;
bool g_buffer_lock;
void thread1( CFoo frame ) {
g_buffer_lock = true ;
g_buffer.push_back( frame ) ;
g_buffer_lock = false;
}
void thread2( )
{
while( g_buffer_lock ) {
// Wait
}
// CMSTP_Send_Frame * pMSTPFrame = NULL ;
while ( ! g_buffer_lock && g_buffer.size() > 0 )
{
// Get the top item
CFoo& pFoo = g_buffer.front() ;
// Do something.
// remove the front item
g_buffer.pop_front();
}
}
Run Code Online (Sandbox Code Playgroud)
在大约170k调用thread1和900k调用thread2后,我得到一个异常错误 CFoo& pFoo = …
在C++类中,使用静态函数而不是成员函数会产生任何开销.
class CExample
{
public:
int foo( int a, int b) {
return a + b ;
}
static int bar( int a, int b) {
return a + b ;
}
};
Run Code Online (Sandbox Code Playgroud)
我的问题是;
我有一个现有的Web应用程序,我转换为使用CakePHP.问题是大多数表的主键都是这种格式"$ {table_name} _id"(story_id)而不是'id'的CakePHP方式
当我尝试更新故事表中某行的某些字段时,Save()函数将返回false.有没有办法从Save()函数获取更详细的错误报告.?
当我Configure::write('debug', 2);
进入core.php
并检查SQL语句时,我没有看到任何UPDATE命令,只看到SELECT语句.
我试图编辑控制器添加以下行来手动设置控制器的id字段,但它没有帮助.
$this->Story->id = $this->data['Story']['story_id'] ;
Run Code Online (Sandbox Code Playgroud)
我的想法已经不多了.有什么建议?
我已经包含了我在下面使用的源代码
故事控制器:
function admin_edit($id = null)
{
if (!$id && empty($this->data)) {
$this->Session->setFlash(__('Invalid '. Configure::read('Site.media') , true));
$this->redirect(array('action'=>'index'));
}
$this->layout = 'admin';
if (!empty($this->data)) {
if ($this->Story->save($this->data)) {
$this->Session->setFlash(__('The '. Configure::read('Site.media') .' has been saved', true));
} else {
$this->Session->setFlash(__('The '. Configure::read('Site.media') .' could not be saved. Please, try again.', true));
}
}
$this->data = $this->Story->read(null, $id );
}
Run Code Online (Sandbox Code Playgroud)
故事模型:
class Story extends AppModel …
Run Code Online (Sandbox Code Playgroud) 我正在使用SQLite数据库来存储数据记录器中的值.数据记录器最终将填满计算机上的所有可用硬盘空间.我正在寻找一种方法,一旦达到一定的限制,从数据库中删除最后25%的日志.
使用以下代码:
$ret = Query( 'SELECT id as last FROM data ORDER BY id desc LIMIT 1 ;' );
$last_id = $ret[0]['last'] ;
$ret = Query( 'SELECT count( * ) as total FROM data' );
$start_id = $last_id - $ret[0]['total'] * 0.75 ;
Query( 'DELETE FROM data WHERE id < '. round( $start_id, 0 ) );
Run Code Online (Sandbox Code Playgroud)
将在数据库旁边创建一个日志文件,该文件将填满驱动器上的剩余空间,直到脚本失败.
如何/我可以阻止创建该日志文件?无论如何将所有三个SQL查询合并到一个语句中?
我有一个代码库,我正在编译到库中.通常我会发送图书馆,MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010)
但我的客户要求它MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012)
.
我已经使用Visual Studio 2012下载/安装并编译了我的Lib的新版本.现在我想检查lib以查看它当前使用的_MSC_VER版本以确保我发送它们正确的版本.
如何检测库中使用的_MSC_VER?