C Pre Processor (cpp) är historiskt förknippad med C (därav namnet), men det är verkligen en generisk textprocessor som kan användas (eller missbrukas) för något annat.
Tänk på den här filen, som heter location.src (mer om det senare).
// 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 ;
och filen debug.src, som ingår:
#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
När den kompileras med:
cpp -E location.src -o location.sql
du får koden du letar efter, med cpp expanderande #define values.
När den kompileras med:
cpp -E -DHAVE_DEBUG location.src -o location.sql
du får samma, plus ASSERT-makrot (läggs upp som en bonus, för att visa vad kan göras).
Om man antar att ett bygge med HAVE_DEBUG installerat i en testmiljö (i 5.5 eller senare sedan SIGNAL används), ser resultatet ut så här:
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 ?
Notera hur filnamnet, radnumret och villkoret pekar precis på platsen i källkoden i location.src där bekräftelsen höjs, tack än en gång till C-förbehandlaren.
Nu om filtillägget ".src":
- du kan använda vad som helst.
- Att ha ett annat filtillägg hjälper till med make-filer, etc, och förhindrar förvirring.
EDIT:Ursprungligen postat som .xql, bytt namn till .src för tydlighetens skull. Inget relaterat till xml-frågor här.
Som med alla verktyg kan användning av cpp leda till bra saker, och användningsfallet för att underhålla LOCATION_LEN på ett portabelt sätt ser mycket rimligt ut. Det kan också leda till dåliga saker, med för många #include, kapslade #ifdef helvete, makron, etc. som i slutet fördunklar koden, så din körsträcka kan variera.
Med det här svaret får du hela grejen (#define
, #include
, #ifdef
, __FILE__
, __LINE__
, #C
, kommandoradsalternativ att bygga), så jag hoppas att det ska täcka allt.