小编Mik*_*der的帖子

SQLite - UPSERT*不*INSERT或REPLACE

http://en.wikipedia.org/wiki/Upsert

在SQL Server上插入更新存储过程

在SQLite中有没有一些我没想到的聪明方法?

基本上,如果记录存在,我想更新四列中的三列,如果它不存在,我想用第四列的默认(NUL)值插入记录.

ID是主键,因此UPSERT只会有一条记录.

(我试图避免SELECT的开销,以确定我是否需要更新或插入显然)

建议?


我无法在SQLite网站上确认SQL CREATE的语法.我还没有构建一个演示来测试它,但它似乎不支持..

如果是,我有三列,所以它实际上看起来像:

CREATE TABLE table1( 
    id INTEGER PRIMARY KEY ON CONFLICT REPLACE, 
    Blob1 BLOB ON CONFLICT REPLACE, 
    Blob2 BLOB ON CONFLICT REPLACE, 
    Blob3 BLOB 
);
Run Code Online (Sandbox Code Playgroud)

但是前两个blob不会引起冲突,只有ID会因此我asusme Blob1和Blob2不会被替换(根据需要)


绑定数据时SQLite中的UPDATE是一个完整的事务,这意味着每个要更新的发送行都需要:Prepare/Bind/Step/Finalize语句,与允许使用重置函数的INSERT不同

语句对象的生命周期如下:

  1. 使用sqlite3_prepare_v2()创建对象
  2. 使用sqlite3_bind_接口将值绑定到主机参数.
  3. 通过调用sqlite3_step()运行SQL
  4. 使用sqlite3_reset()重置语句,然后返回步骤2并重复.
  5. 使用sqlite3_finalize()销毁语句对象.

更新我猜测与INSERT相比速度慢,但它与使用主键的SELECT相比如何呢?

也许我应该使用select来读取第4列(Blob3),然后使用REPLACE编写一条新记录,将原始的第4列与前3列的新数据混合在一起?

sql sqlite upsert

505
推荐指数
11
解决办法
28万
查看次数

使用Garmin Mapsource进行批量地理编码

几年前我忘记了这项工作,但需要每晚对成千上万的地址进行地理编码.我必须使用非常准确的数据库坐在机器上,当Nuvi地图更新安装Mapsource时安装.

几年前,当我联系Garmin时,他们表示有兴趣为此提供API,但之后我什么都没听到,也没有跟进.他们的数据库是由navtec提供的?我相信.有人有这种格式的经验吗?

我刚刚在Garmin开发者论坛上发帖,但那里有点昏昏欲睡:)

有没有人这样做过?有没有人知道如果没有API可以做到这一点; 意思是数据库结构和调用?

我会用任何语言解决问题.

添加:

Garmin表示有兴趣让我可以使用.他们还没有做到.

我不知道数据库格式.

我不是在寻找在线解决方案或任何其他"替代方案".这个问题非常具体.

联系信息:MikeTrader2 AT gmail DOT com

c++ geocoding garmin

29
推荐指数
1
解决办法
2870
查看次数

打破ReadFile()阻塞 - 命名管道(Windows API)

为简化起见,这是一种NamedPipe SERVER正在等待NamedPipe CLIENT写入管道的情况(使用WriteFile())

阻止的Windows API是ReadFile()

服务器已创建同步管道(没有重叠的I/O)并启用了阻塞

客户端已连接,现在服务器正在等待一些数据.

在正常的事物流中,客户端发送一些数据,服务器处理它,然后返回ReadFile()以等待下一个数据块.

同时发生一个事件(例如用户输入),并且NamedPipe SERVER现在必须执行一些其他代码,当ReadFile()阻塞时,它不能执行.

此时我需要提一下,NamedPipe客户端不是我的应用程序,所以我无法控制它.我不能让它发送几个字节来解锁服务器.它只是坐在那里,不发送数据.由于我无法控制客户端实现,因此我无法更改任何内容.

一种解决方案是创建一个单独的线程,其中执行所有ReadFile()操作.这样,当事件发生时,我可以只处理代码.问题在于,事件还需要一个单独的线程,所以现在我为这个服务器的每个实例都有两个额外的线程.由于这需要可扩展,因此这是不合需要的.

从我试过调用的另一个线程

 DisconnectNamedPipe()
Run Code Online (Sandbox Code Playgroud)

 CloseHandle()
Run Code Online (Sandbox Code Playgroud)

它们都不会返回(直到客户端写入管道.)

我无法连接到同一个管道并写入几个字节,因为:

"命名管道的所有实例共享相同的管道名称,但每个实例都有自己的缓冲区和句柄,并为客户端/服务器通信提供单独的管道."

http://msdn.microsoft.com/en-us/library/aa365590.aspx

我需要一种方法来伪造它,所以$ 64k美元的问题是:

如何打破ReadFile()的阻塞?

c c++ winapi named-pipes

23
推荐指数
3
解决办法
2万
查看次数

小型供应商的软件保护

这是我们在某些时候都必须考虑的问题.

经过多年和许多方法,我倾向于同意这个问题:"对于超过几百人使用的任何受保护软件,你可以找到破解版本.到目前为止,每个保护方案都可以被篡改." 您的雇主是否强制使用反盗版软件?

此外,每次我发布这个主题,有人会提醒我; "首先,无论你采用什么样的保护措施,真正专注的饼干最终都会通过所有的保护屏障." 对于单个开发人员而言,c#代码保护的最佳价值是什么?

因此,不要承受这两个广泛真实的免责声明,让我们谈谈"保护"!

我仍然觉得,对于那些不太可能提高熟练破解者时间和注意力的小型应用程序,保护是值得的.

很明显,无论你做什么,如果破解者可以通过修补应用程序来切换IF语句(jmp)的结果,那么世界上所有的密码和加密狗都无济于事.

因此,我的方法是使用以下产品对虚拟化代码进行混淆:http: //www.oreans.com/codevirtualizer.php 我对此产品非常满意.据我所知,它已经被打败了.我甚至可以使用PEcompact压缩可执行文件是否有其他人有使用它的经验?

只有EXEcryptor的问题 http://www.strongbit.com/news.asp 甚至该网站使用起来很麻烦.在进行任何WMI调用时,编译的应用程序将崩溃.

这种方法允许您通过混淆来包围较小的代码段,从而保护安全检查等.

我使用在线授权方法,因为应用程序需要定期从服务器获取数据,因此用户无需长时间离线使用它.根据定义,即使它被破解,该应用程序也毫无价值.

因此,简单的加密握手非常有用.我只是偶然在混淆保护中检查它.如果用户在另一台计算机上安装该应用程序,则在启动时会上载新ID,并且服务器会禁用旧ID并返回新的授权.

我还使用已编译应用程序的哈希值并在启动时检查它以查看是否有一个位已更改,然后从应用程序中打开应用程序作为文件(带有读取锁定)以防止任何人在启动后更改它.

由于所有静态字符串在.exe文件中都清晰可见,因此我尝试使用错误消息等通用字符串.您无法在任何地方找到字符串"授权失败".

为了防止内存转储,我使用简单的文本混淆技术(比如每个字符的XOR)这使得内存中的纯文本数据更难以与变量等区分开来.

当然,对于任何非常敏感的数据都有AES.我喜欢文本的计数器模式,因为这不会导致重复序列显示基础数据,如一系列空白.

但是使用所有这些技术,如果Key或Initialization向量可以从内存中转储,或者IF语句被绕过,那么一切都会被浪费掉.

我倾向于使用switch语句而不是条件语句.然后我创建了一个基本上是死胡同的第二个函数,而不是实际执行所需任务的函数.

另一个想法是编写添加了变量的指针.变量是授权的结果(通常为零).这将不可避免地在某个时候导致GPF.在一些较低级别的授权失败之后,我只使用它作为最后的手段,否则真正的用户可能会遇到它.然后降低软件的声誉.

你用什么技术?

(这不是讨论实现某些东西的优点的线索.它是为那些已经决定做某事的人而设计的)

obfuscation protection cracking piracy

18
推荐指数
4
解决办法
3093
查看次数

为Windows C++ Visual Studio 2008将Windows Dll转换为.lib

我知道有一个名为Dll to lib的工具,但开发人员要求1000美元.我只需要转换一个库一次,所以不容易证明这个价格.

我尝试了IMPLIB32.EXE,但我只是得到空的.lib文件.我怎么能做到这一点?也许我可以写一个简单的转换应用程序?

Added1:

Dll通常是stdcall而不是cdecl,用旧的C语言编写,而不是C#或.NET或C++.我现在需要从C++应用程序中调用它们.一个例子是SQLite.dll或zlib.dll.我无法访问这些dll的.lib文件.

Added2:

我为VS2008重新编写了这段代码 http://floodyberry.wordpress.com/2008/09/08/generating-dll-wrappers/, 并在此处下载了可下载的示例Dll等:http: //www.transferbigfiles.com/Get .aspx?id = 7d86fa0b-6ddc-4f6f-8d31-2c20824aae9a 这反过来又创建了一个创建Dll的项目.当我尝试编译Dll时,我收到链接器错误:AddShow.dll:致命错误LNK1107:文件无效或损坏:无法在0x300读取此处描述:http://list.isis.vanderbilt.edu/pipermail/udm-users /2006-March/000664.html 不确定如何继续.到目前为止如此接近

接下来我们转到这个方法

http://www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/

运行dumpbin参数/ exports C:\ path\to\AddShow.dll绝对没有做过一些研究

http://msdn.microsoft.com/en-us/library/aa446532.aspx 似乎需要从common/ide文件夹中找到mspdb71.dll(现在是mspdb80.dll),dumpbin.exe现在运行时出错:

致命错误LNK1106:无效文件或磁盘已满:无法寻求0x6179A这些线程表明dumpbin.exe的版本可能是问题

我有Microsoft(R)COFF/PE Dumper版本9.00.30729.01

所以我尝试了Microsoft(R)COFF二进制文件转储器版本5.12.8078但没有成功.经过多次阅读后,我不再接近了

http://support.microsoft.com/kb/815645 http://support.microsoft.com/kb/839286 http://markmail.org/message/p5vwzyfyv3bs6z34 http://fixunix.com/programmer/94825-fatal -错误- lnk1106,无效的文件,磁盘full.html

当我运行ProcMon时,我看到第一次出现queryopen和sqlite3.dll,当svchost.exe尝试打开它时失败,错误路径未找到.路径是C:\ Program Files\Microsoft Visual Studio 9.0\VC\bin\SQLITE3.DLL并且是正确的.如果我把它放在C盘的根部,那么我得到NAME NOT FOUND错误:

C:\ Program Files\Microsoft Visual Studio 9.0\VC\bin\link.exe.Local

C:\ Program Files\Microsoft Visual Studio 9.0\VC\bin\dumpbin.exe.Local

从link.exe和dumpbin.exe分别.我使用XPSP3而不是Vista,这是我对sysinternals的限制.什么是这些.local文件?

(csrss.exe也无法找到一些清单文件.)

所以没有成功,只是更神秘

补充3:

我试图从其安装位置\ Program Files\Microsoft Visual Studio 8\VC\bin运行dumpbin.exe,但操作系统说它无法找到mspdb80.dll.我从\ Program Files\Microsoft Visual Studio 8\Common7\IDE复制了mspdb80.dll,试图让dumpbin.exe运行.

现在我收到错误:"c1902程序数据库管理器不匹配,请检查您的安装"

如果我从\ Program Files\Microsoft Visual Studio …

c++ windows dllimport visual-c++

12
推荐指数
3
解决办法
2万
查看次数

最终MySQL遗留数据库的噩梦

表1:包括厨房水槽在内的一切.日期格式错误(年末,因此您无法对该列进行排序),存储为VARCHAR的数字,"street"列中的完整地址,firstname列中的firstname和lastname,lastname列中的city,不完整的地址,行数根据多年来发生变化的一些规则,重复记录,不完整记录,垃圾记录......将数据从一个字段移动到另一个字段,从而更新前一行...您可以将其命名为...哦,当然不是TIMESTAMP或PRIMARY KEY栏目即将来临.

表2:打开这个婴儿后,任何正常化的希望都消失了.对于表1中的每个条目和行更新,我们都有一行.所以复制品就像没有明天(800MB价值)和像Phone1 Phone2 Phone3 Phone4 ... Phone15这样的列(它们不叫电话.我用它来说明)foriegn键是......好好猜测.根据表1中行的数据类型,有三个候选项

表3:它会变得更糟吗?哦,是的."外键是短划线,点,数字和字母的VARCHAR列组合!如果不提供匹配(通常不提供),那么类似产品代码的第二列应该.具有名称的列与它们内部的数据没有关联,并且必须与Phone1进行电话交换... Phone15.从Table1复制列,而不是TIMESTAMP或PRIMARY KEY列.

表4:被描述为一项工作,并且随时可能发生变化.它与其他人相似.

在接近1米的行中,这是一个很大的混乱.幸运的是,这不是我的大混乱.不幸的是,我必须为每个"客户"提供一份复合记录.

最初,我设计了Table1的四步翻译,添加了一个PRIMARY KEY并将所有日期转换为可排序的格式.然后是几个返回过滤数据的查询步骤,直到我将Table1用于从其他表中拉出以形成合成.经过数周的工作,我使用一些技巧将其降低到一步.所以现在我可以将我的应用程序指向混乱并提取一个很好的合成数据表.幸运的是,我只需要一个电话号码,因此我的桌子正常化不是问题.

然而,这是真正的任务开始的地方,因为每天都有数百名员工以您不想要的方式添加/更新/删除此数据库,每天晚上我必须检索新行.

由于任何表中的现有行都可以更改,并且由于没有TIMESTAMP ON UPDATE列,因此我将不得不求助于日志以了解发生了什么.当然这假设有一个二进制日志,但没有!

介绍这个概念就像铅气球一样.我不妨告诉他们,他们的孩子将不得不接受实验性手术.他们并不完全是高科技...如果你没有聚集......

这种情况有点微妙,因为它们有一些我公司非常想要的有价值的信息.我被一家大公司的高级管理人员(你知道他们是怎么做的)发送给"实现它".

我想不出处理夜间更新的任何其他方法,比用另一个应用程序解析bin日志文件,弄清楚他们在白天对该数据库做了什么,然后相应地合成我的表.我真的只需要看看他们的table1来弄清楚该怎么做我的桌子.其他表只提供清除记录的字段.(使用MASTER SLAVE无济于事,因为我会有一塌糊涂.)

另一种方法是为table1的每一行创建一个唯一的哈希,并构建一个哈希表.然后我会每晚检查整个ENTIRE数据库,看看哈希值是否匹配.如果他们没有那么我会读取该记录并检查它是否存在于我的数据库中,如果确实存在,那么我会在我的数据库中更新它,如果它没有那么它是一个新的记录,我会插入它.这很难看并且不快,但解析二进制日志文件也不是很好.

我写这篇文章是为了帮助弄清楚这个问题.经常告诉别人有助于澄清问题,使解决方案更加明显.在这种情况下,我只是有一个更大的头痛!

非常感谢您的想法.

mysql database refactoring binary-log

10
推荐指数
1
解决办法
2104
查看次数

运行没有运行时可再发行组件的C++二进制文件(Server2k3,XPSP3)

在Visual Studio 2008中编写了CGI应用程序并在本地对其进行了删除后,我将其上传到Windows Server 2003操作系统,并立即无法运行.

我猜我需要安装可怜的Runtime distributable,但在阅读之后:

http://kobyk.wordpress.com/2007/07/20/dynamically-linking-with-msvcrtdll-using-visual-c-2005/

我想知道忽略这个并排的东西是否更有意义,只是重新编写应用程序.

我猜Windows Server 2003没有我需要的MSCRVT版本?Windows Server 2003有吗?

在部署胖客户端时,我想用我的应用程序分发所需的dll.他们假设我只是包含iostream,sstream,string?

如果我添加windows.h,它会发生重大变化吗?

添加:

使用下面推荐的/ MT开关

C/C++ - >代码生成 - >运行时库 - >多线程(/ MT)

(你可能需要做一个干净的事情:

建立 - >清洁

为了避免错误信息

"无法将更新后的清单保存到文件中")

我的应用程序从38k膨胀到573k.这就是我所谓的重要(想象一下,如果这是你的薪水).由于这个应用程序的许多实例将不断加载和卸载(需要宝贵的内存和处理器资源),我想找到一个更好(更小)的解决方案.

我知道这对于今天的许多情况并不重要,而不是许多开发人员关注的焦点,因此趋势为.NOT和60MB运行时,但这就是我想要做的.

添加:

删除调试后,让项目编译:

项目 - > Propeties - > c/c ++ - >预处理器 - >预处理器定义(删除DEBUG;)

大小减少到300k,它将运行.

补充:正如下面Chris Becke建议的那样,复制:msvcm90.dll msvcp90.dll msvcr90.dll Microsoft.VC90.CRT.manifest到应用程序的目录将提供所需的所有运行时.

几次使用Visual Studio 6已被建议,但它不支持Vista(或我们假设的Windows 7)其他不需要运行时可分发的解决方案可能是MASM甚至是Basic的风格.不幸的是,这违背了使用像C++这样的高级OOP语言的目的.

只要我确实需要安装C++可再发行组件,那么权衡额外是260k.这是可以接受的

c++ windows windows-xp runtime

9
推荐指数
2
解决办法
1万
查看次数

可以单个SetEvent()触发多个WaitForSingleObject()

这个:

http://msdn.microsoft.com/en-us/library/ms686915(VS.85).aspx

似乎没有暗示.

我有三个进程通过管道进行通信.进程A创建一个事件,进程B&C每个都使用WaitForSingleObject(在第二个线程中).

所以现在我们有-TWO-每个进程等待-SINGLE-事件.

进程A使用SetEvent()触发事件,进程B响应,进程C不响应.

结论:

每个WaitForSingleObject()都需要一个唯一的事件......正确吗?

c++ events winapi

7
推荐指数
1
解决办法
1万
查看次数

事件可以是进程间的吗?

我在一个进程中创建了一个事件并进行测试,通过管道将事件句柄发送到一个完全独立的进程(不是子线程)

当我在第一个事件中触发事件时,WaitForSingleObject没有检测到事件,所以我猜测答案是否定的,除非我错过了SECURITY_ATTRIBUTES结构中的一些技巧

或者我可能需要使用命名事件并调用OpenEvent()?

在这种情况下,我不能使用窗口消息,因为我试图发信号通知Windows服务.我可以使用管道,但是会有很多这样的应用程序,如果可能的话我想找到一个"低成本"的解决方案.

内存映射文件等其他选项的开销比管道更多?

你会怎么做?

c++ windows events ipc

7
推荐指数
1
解决办法
5851
查看次数

使用MS SSPI实现安全SLL/TLS客户端的可编译C++代码

如此处所述 http://www.ddj.com/cpp/184401688

我没有时间从头开始写这篇文章.

问及未回答 /sf/ask/30447301/

问题是:

我正在寻找一些可实现MS SSPI的可编译工作源代码(如上面的线程中所提到的),程序而不是OOP首选.

我在这里查看了代码项目示例:

http://www.codeproject.com/KB/IP/sslclasses.aspx

但这是C#OOP.将其转换为C++代码并非易事.

OpenSSL的

SChannel调用遵循GSS API标准.当然,还有一些替代方案 - 例如OpenSSL.这个包是一个完整而彻底的协议实现,对于熟悉UNIX的人来说无疑是最好的选择.该软件包最初针对UNIX社区,并且编译它依赖于Perl运行时,因此从未使用过UNIX类型系统的Windows开发人员需要一些学习曲线.

除此之外,OpenSLL做了一些非常不标准的事情

尼古拉,已经提供了很多可编译的源代码(www.coastrd.com),我希望找到愿意做同样事情的人.

c++ ssl sspi

7
推荐指数
3
解决办法
2万
查看次数