El preprocesador de c (CPP) está asociado históricamente con C (de ahí el nombre), pero realmente es un procesador de texto genérico que puede ser utilizado (o abusado) por algo más.
Considere este archivo, llamado location.src (más sobre esto más adelante).
// C++ style comments works here
/* C style works also */
-- plain old SQL comments also work,
-- but you should avoid using '#' style of comments,
-- this will confuse the C pre-processor ...
#define LOCATION_LEN 25
/* Debug helper macro */
#include "debug.src"
DROP TABLE IF EXISTS test.locations;
CREATE TABLE test.locations
(
`location` VARCHAR(LOCATION_LEN) NOT NULL
);
DROP PROCEDURE IF EXISTS test.AddLocation;
delimiter $$
CREATE PROCEDURE test.AddLocation (IN location VARCHAR(LOCATION_LEN))
BEGIN
-- example of macro
ASSERT(length(location) > 0, "lost or something ?");
-- do something
select "Hi there.";
END
$$
delimiter ;
y debug.src archivo, que se incluye:
#ifdef HAVE_DEBUG
#define ASSERT(C, T) \
begin \
if (not (C)) then \
begin \
declare my_msg varchar(1000); \
set my_msg = concat("Assert failed, file:", __FILE__, \
", line: ", __LINE__, \
", condition ", #C, \
", text: ", T); \
signal sqlstate "HY000" set message_text = my_msg; \
end; \
end if; \
end
#else
#define ASSERT(C, T) begin end
#endif
cuando se compila con:
cpp -E location.src -o location.sql
se obtiene el código que está buscando, con valores #define CPP expandir .
cuando se compila con:
cpp -E -DHAVE_DEBUG location.src -o location.sql
se obtiene el mismo, además de la macro ASSERT (publicado como un bono, para mostrar lo que podría hacerse).
Suponiendo una acumulación con HAVE_DEBUG desplegado en un entorno de pruebas (en 5.5 o posterior desde señal se utiliza), el resultado se parece a esto:
mysql> call AddLocation("Here");
+-----------+
| Hi there. |
+-----------+
| Hi there. |
+-----------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> call AddLocation("");
ERROR 1644 (HY000): Assert failed, file:location.src, line: 24, condition length(location) > 0, text: lost or something ?
Nótese cómo el nombre de archivo, número de línea, y los puntos de condición justo en el lugar en el código fuente en location.src donde se eleva la afirmación, gracias de nuevo al preprocesador C.
Ahora, sobre la extensión de archivo ".src":
- puede utilizar cualquier cosa.
- Tener una extensión de archivo diferente ayuda con makefiles, etc., y evita confusiones.
EDITAR: Originalmente publicado como .xql, renombrado como .src para mayor claridad. No hay nada relacionado con las consultas xml aquí.
Como con cualquier herramienta, usar cpp puede llevar a cosas buenas, y el caso de uso para mantener LOCATION_LEN de una manera portátil parece muy razonable. También puede llevar a cosas malas, con demasiados #include, #fdef hell anidados, macros, etc. que al final ofuscan el código, por lo que su kilometraje puede variar.
Con esta respuesta, se obtiene toda la cosa (#define
, #include
, #ifdef
, __FILE__
, __LINE__
, #C
, opciones de línea de comandos para construir), así que espero que debe cubrir todo.
declarar? http://dev.mysql.com/doc/refman/5.0/en/declare-local-variable.html –
Escribí algunos SW para hacer tal cosa, es gratis y aquí http: // mysql-pre- processor.batcave.net/. Solo ponga algunas cosas en el cubo de la organización benéfica de su elección –