Как отправить более 4 тыс. Запросов из SQL-буфера в буфер sql-mysql в Emacs?
Я часто сталкивался с раздражением в режиме 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, которая вызывает send_process
, как в src/process.c
в источнике Emacs.
Похоже, это может быть просто ограничение, созданное буфером 4k на трубе IPC. Поскольку кажется, что для изменения этого размера необходим хакер ядра, это не отличный ответ.
Я думаю, что я озадачен тем, почему SQL, посланный через канал, не собирается должным образом повторно собранным клиентом mysql, если он больше 4k. Любые идеи?
Версия Emacs: GNU Emacs 23.3.1 (x86_64-pc-linux-gnu, GTK + Версия 2.24.10) от 2012-03-25 по allspice, измененная Debian
mysql -V: mysql Ver 14.14 Распространение 5.5.24 для debian-linux-gnu (x86_64) с использованием readline 6.2
Sql Mysql Опции: -A -C -n (NB Я пробовал как с, так и без -n (небуферизованный) и не исправил эту проблему)
Ответы
Ответ 1
Я подозреваю, что виновником является код связи процесса Emacs, используемый comint
, выделяя PTY для общения с процессами. Хотя они полезны для интерактивной работы, потому что они позволяют контролировать работу, они также ограничены в том, сколько данных они могут передавать в одном фрагменте без промежуточной новой строки. 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
получает reset только в буферах взаимодействия MySQL.
ИЗМЕНИТЬ
Согласно http://tinyurl.com/car439o/, Emacs больше не мешает прерывать длинный вывод PTY с парами новой строки + EOF. Хотя фиксация происходит с 2010-04-13, она появилась только в Emacs 24, выпущенной в 2012 году. Это объясняет, почему проблема, по-видимому, не воспроизводится в 24.2.1. Если вы используете Emacs до 24, попробуйте обновить.