¿Cómo enviar consultas de más de 4k desde el búfer de SQL al búfer sql-mysql en Emacs?
linux buffer (1)
Sospecho que el culpable es el código de comunicación del proceso de Emacs, utilizado por comint
, que asigna PTY para hablar con los procesos. Si bien estos son útiles para el trabajo interactivo porque permiten el control del trabajo, también están limitados en cuanto a la cantidad de datos que pueden transferir en una porción sin una nueva línea de intervención. A Emacs también se le puede decir que use tuberías, que no tienen esta limitación.
Para probar esto, inicie un Emacs nuevo, evalúe M-: (setq process-connection-type nil)
e inicie sql-mysql
. Si el problema desaparece, este es tu culpable. En ese caso, querrás usar algo como:
(add-hook ''sql-mysql-mode-hook
(lambda ()
(set (make-local-variable ''process-connection-type) nil)))
para asegurarse de que el process-connection-type
se reinicie solo en los buffers de interacción de MySQL.
EDITAR
Según http://tinyurl.com/car439o/ , Emacs ya no se molesta en interrumpir la salida PTY larga con pares de nueva línea + EOF. Aunque el compromiso es de 2010-04-13, solo apareció en Emacs 24, lanzado en 2012. Esto explicaría por qué el problema aparentemente no es reproducible en 24.2.1. Si está utilizando Emacs antes de 24, intente actualizar.
Con frecuencia me encuentro con una molestia en el modo sql-mysql
Emacs, y me pregunto si alguien tiene una solución o una solución mejor. Cada vez que trato de enviar una consulta desde un búfer de sql-mode
a un búfer de proceso de SQL activo, esa consulta no puede ser más grande que 4k. Si es más grande que 4k, parece que se inserta algún tipo de interrupción, tal vez una nueva línea, y esto hace que el intérprete de mysql emita un error en la siguiente línea.
sql-mysql
se implementa mediante sql.el
y usa la función sql-send-region
para enviar regiones de consulta (o buffers completos) al búfer de proceso SQL seleccionado. sql-send-region
llama a comint-send-region
, que a su vez llama a process-send-region
. process-send-region
es una función de C que llama a send_process
, tanto en src/process.c
en la fuente de Emacs.
Parece que esto puede ser solo una limitación producida por el búfer de 4k en una tubería IPC. Dado que parece que la piratería del kernel es necesaria para cambiar este tamaño, no es una buena respuesta.
Lo que supongo que me sorprende es por qué el cliente mysql no vuelve a ensamblar correctamente el SQL enviado a través de la tubería si es más grande que 4k. ¿Algunas ideas?
Versión de Emacs: GNU Emacs 23.3.1 (x86_64-pc-linux-gnu, GTK + versión 2.24.10) de 2012-03-25 en todas las especias, modificado por Debian
mysql -V: mysql Ver 14.14 Distrib 5.5.24, para debian-linux-gnu (x86_64) usando readline 6.2
Opciones de Sql Mysql: -A -C -n (NB, lo he intentado con y sin -n (sin búfer) y ninguno de ellos solucionó este problema)