Hace un tiempo había tenido que tratar con dumps de MySQL generados por mysqldump(1), a falta de una forma de control de versiones más específica (que por suerte no llegó a hacer falta) se utilizó git(7). Ahora bien, git permite hacer diff entre versiones, pero esto (al menos por defecto) se hace línea por línea, lo que produce que los diff entre dumps muestren grandes cambios aunque solo se produzcan en una fila de la base de datos, para solucionar ese inconveniente está este programa sqlsplit.c.

El programa no está muy pulido, tiene una función main que solo abre archivos y otra que (con la ayuda de dos macros *_*) simula algo parecido a un autómata de estados (realmente con una pila), la compilación es simple.

1
gcc sqlsplit.c -o sqlsplit

Por ejemplo, si la entrada fuera

1
2
3
4
5
set autocommit=0;
INSERT INTO `input_table` VALUES (1,'Title 1','File 1','Type','NULL','Date 1'),(2,'Another title','Another file, too','Type, you know','Language','9999'),(3,'A third title','File with \' too.heh','Some, types','NULL','Tomorrow');
/*!40000 ALTER TABLE `input_table` ENABLE KEYS */;
UNLOCK TABLES;
commit;

Haciendo esto...

1
./sqlsplit intput.sql output.sql

Conseguiríamos algo más legible

1
2
3
4
5
6
7
8
set autocommit=0;
INSERT INTO `input_table` VALUES
    (1,'Title 1','File 1','Type','NULL','Date 1'),
    (2,'Another title','Another file, too','Type, you know','Language','9999'),
    (3,'A third title','File with \' too.heh','Some, types','NULL','Tomorrow');
/*!40000 ALTER TABLE `input_table` ENABLE KEYS */;
UNLOCK TABLES;
commit;

Eso es todo, por supuesto si quisiéramos que aceptar o mostrar la salida por el terminal (por ejemplo para tomar o devolver archivos comprimidos) usaríamos /dev/stdin como entrada y/o /dev/stdout como salida.