我在SQL SELECT语句返回的行上有一个循环,并且在对行的数据进行一些处理之后,我有时想要更新行的值.循环体中的处理非常重要,我无法在SQL中编写它.当我尝试为所选行执行UPDATE时,我得到一个错误(在Perl的DBD :: SQLite :: st执行失败:数据库表被锁定).是否有可读,高效且便携的方式来实现我想要做的事情?如果不这样做,是否有DBD或SQLite特定的方法呢?
显然,我可以在单独的数据结构中推送更新并在循环之后执行它们,但是我讨厌代码看起来那样.
如果您有兴趣,这里是相应的Perl代码.
my $q = $dbh->prepare(q{
SELECT id, confLoc FROM Confs WHERE confLocId ISNULL});
$q->execute or die;
my $u = $dbh->prepare(q{
UPDATE Confs SET confLocId = ? WHERE id = ?});
while (my $r = $q->fetchrow_hashref) {
next unless ($r->{confLoc} =~ m/something-hairy/);
next unless ($locId = unique_name_state($1, $2));
$u->execute($locId, $r->{id}) or die;
}
Run Code Online (Sandbox Code Playgroud) 最近的 Windows 10 更新(可能也是神秘的KB4577586)似乎已经导致调用SelectObject并将位图句柄作为参数在打印机兼容的设备上下文中执行时返回 NULL。
相关行可以在这个位图打印示例中看到,它在早期的 Windows 10 版本上运行良好,而且似乎在过去十年中运行良好。您可以在此 GitHub 存储库 中找到完整的最小工作示例。
hBitmap = (HBITMAP)LoadImage(NULL,szFileName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE|LR_VGACOLOR);
// [...]
HDC prn = GetPrinterDC(hwnd);
hdcMem = CreateCompatibleDC(prn);
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, hBitmap);
// hbmOld is NULL at this point, indicating SelectObject failure
Run Code Online (Sandbox Code Playgroud)
卸载 Windows 更新 KB5000802后问题不再发生,但这显然不是长期修复。
在许多操作系统下,Unix域套接字允许进程以不会被恶意破坏的方式可靠地将其凭据传递给另一个进程.例如,这是通过SO_PASSCRED和SO_PEERCRED选项在Linux上完成的,在FreeBSD上通过传递包含cmsgcred结构的消息,在NetBSD上通过设置LOCAL_CREDS选项完成.但是,我还没有找到在Mac OS X下执行此操作的方法.相应的标题(socket.h)似乎已禁用Apple的构建功能.
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
#ifndef __APPLE__
// ...
struct cmsgcred {
Run Code Online (Sandbox Code Playgroud)
想到另一个可以实现相同结果的Mac OS X工具吗?
当尝试使用写时复制语义(PROT_READ | PROT_WRITE和MAP_PRIVATE)映射5GB文件时,会在2.6.26-2-amd64 Linux内核上发生这种情况.映射小于4GB的文件或仅使用PROT_READ工作正常.这不是本问题中报告的软资源限制问题 ; 虚拟限制大小是无限的.
这是重现问题的代码(实际代码是Boost.Interprocess的一部分).
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
main()
{
struct stat b;
void *base;
int fd = open("foo.bin", O_RDWR);
fstat(fd, &b);
base = mmap(0, b.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
if (base == MAP_FAILED) {
perror("mmap");
return 1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
以下是发生的事情:
dd if=/dev/zero of=foo.bin bs=1M seek=5000 count=1
./test-mmap
mmap: Cannot allocate memory
Run Code Online (Sandbox Code Playgroud)
这是相关的strace(新编译的4.5.20)输出,如nos所述.
open("foo.bin", O_RDWR) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=5243928576, ...}) = 0
mmap(NULL, …Run Code Online (Sandbox Code Playgroud)