Подтвердить что ты не робот

Как отправить более 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 (небуферизованный) и не исправил эту проблему)

4b9b3361

Ответ 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, попробуйте обновить.