Cプリプロセッサ(CPP)歴史的にC(したがって、その名前)と関連しているが、それは実際に使用することができ、一般的なテキストプロセッサですか、虐待された)。
location.srcという名前のファイルを考えてください(詳細は後で説明します)。
// 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 ;
と含まれているファイルdebug.src、:
#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
してコンパイルする場合:
cpp -E location.src -o location.sql
あなたはcppの拡大の#define値で、あなたが探しているコードを取得。
してコンパイル:
cpp -E -DHAVE_DEBUG location.src -o location.sql
をあなたが同じを取得し、プラスASSERTマクロは(が何ができるかを示すために、ボーナスとして掲載)。
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 ?
注意をどのようにファイル名、行番号、および条件ポイント:(SIGNALを使用しているので、5.5以降で)結果は次のようになり、テスト環境で展開HAVE_DEBUGとビルドを想定すると
アサートが発生したlocation.srcのソースコードの場所で、Cプリプロセッサに再度感謝します。今
、 ".SRC" ファイルの拡張子について:
- あなたが何かを使用することができます。
- ファイルの拡張子が異なると、makefileなどに役立ち、混乱を避けることができます。
EDIT:もともと.xqlとして公開されていますが、わかりやすくするため.srcに名前が変更されました。ここでxmlクエリに関連するものはありません。
どんなツールでも、cppを使うと良いものが得られ、LOCATION_LENを移植性のある方法で維持するためのユースケースは非常に合理的です。 #include、#ifdef hell、マクロなどが多すぎると、コードが難読化されることもありますので、マイレージが異なる場合があります。この答えを
は、あなたが(#define
、#include
、#ifdef
、__FILE__
、__LINE__
、#C
、コマンドラインオプション構築する)全体を取得するので、私はそれはそれをすべてをカバーする必要があります願っています。
興味があるものについては
宣言ですか? http://dev.mysql.com/doc/refman/5.0/en/declare-local-variable.html –
私はこのようなことをするためにいくつかのSWを書いた - それは無料でここにhttp:// mysql-pre- processor.batcave.net/。あなたの好きな慈善団体のバケツにいくつか入れてください –