我经常在Emacs的sql-mysql
模式中遇到麻烦,我想知道是否有人有解决方案或更好的解决方法。每当我尝试将查询从sql-mode
缓冲区发送到活动的SQL进程缓冲区时,该查询都不能大于4k。如果它大于4k,则会出现某种中断 - 可能是换行符 - 这会导致mysql解释器在下一行引发错误。
sql-mysql
由sql.el
实现,并使用函数sql-send-region
将查询区域(或整个缓冲区)发送到选定的SQL进程缓冲区。 sql-send-region
拨打comint-send-region
,然后拨打process-send-region
。 process-send-region
是一个C函数,可以在Emacs源代码的send_process
中调用src/process.c
。
看起来这可能只是IPC管道上4k缓冲区产生的限制。由于看来内核黑客攻击是改变这个大小的必要条件,因此这不是一个好的答案。
我想我很困惑的是,如果mysql客户端大于4k,那么通过管道发送的SQL没有被mysql客户端正确地重新组装。有什么想法吗?
Emacs版本:2012-03-25关于allspice的GNU Emacs 23.3.1(x86_64-pc-linux-gnu,GTK +版本2.24.10),由Debian修改
mysql -V:mysql Ver 14.14 Distrib 5.5.24,debian-linux-gnu(x86_64)使用readline 6.2
Sql Mysql选项:-A -C -n(注意我已尝试使用和不使用-n(未缓冲)并且都没有修复此问题)
答案 0 :(得分:5)
我怀疑罪魁祸首是Emacs的进程通信代码,由comint
使用,分配PTYs与进程通信。虽然这些对于交互式工作很有用,因为它们允许作业控制,但它们也可以在一个块中传输多少数据,而无需插入新行。 Emacs也可以被告知使用管道,没有这个限制。
要对此进行测试,请启动新的Emacs,评估M-: (setq process-connection-type nil)
,然后启动sql-mysql
。如果问题消失,这就是你的罪魁祸首。在这种情况下,您将需要使用以下内容:
(add-hook 'sql-mysql-mode-hook
(lambda ()
(set (make-local-variable 'process-connection-type) nil)))
确保process-connection-type
仅在MySQL交互缓冲区中重置。
修改强>
根据http://tinyurl.com/car439o/,Emacs不再需要使用换行符+ EOF对中断long PTY输出。虽然提交时间是2010年4月13日,但它只出现在2012年发布的Emacs 24中。这可以解释为什么问题在24.2.1中显然不可复制。如果您在24之前使用Emacs,请尝试升级。