C Pre Processor (cpp) là lịch sử gắn liền với C (vì vậy tên), nhưng nó thực sự là một bộ xử lý văn bản chung mà có thể được sử dụng (hoặc bị lạm dụng) cho cái gì khác.
Hãy xem tệp này, có tên location.src (xem thêm về sau).
// 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 ;
và tập tin debug.src, được bao gồm:
#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
Khi biên soạn với:
cpp -E location.src -o location.sql
bạn lấy mã bạn đang tìm kiếm, với cpp mở rộng giá trị #define .
Khi biên soạn với:
cpp -E -DHAVE_DEBUG location.src -o location.sql
bạn nhận được như nhau, cộng với vĩ mô ASSERT (được đăng như một phần thưởng, để hiển thị những gì thể được thực hiện).
Giả sử một xây dựng với HAVE_DEBUG triển khai trong một môi trường thử nghiệm (trong 5.5 hoặc mới hơn kể từ SIGNAL được sử dụng), kết quả sẽ như thế này:
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 ?
Lưu ý cách tên tập tin, số dòng, và các điểm điều kiện ngay tại vị trí trong mã nguồn trong location.src, nơi khẳng định được nâng lên, cảm ơn một lần nữa đến bộ xử lý trước C.
Bây giờ, về phần mở rộng ".src" file:
- bạn có thể sử dụng bất cứ điều gì.
- Có một phần mở rộng tệp khác sẽ giúp với các tệp makefiles, v.v. và ngăn sự nhầm lẫn.
EDIT: Được đăng dưới dạng .xql, được đổi tên thành .src để làm rõ. Không có gì liên quan đến truy vấn xml tại đây.
Như với bất kỳ công cụ nào, sử dụng cpp có thể dẫn đến những điều tốt đẹp và trường hợp sử dụng để duy trì LOCATION_LEN theo cách di động có vẻ rất hợp lý. Nó cũng có thể dẫn đến những điều xấu, với quá nhiều #include, lồng nhau #ifdef địa ngục, macro, vv mà ở cuối obfuscate mã, do đó, mileage của bạn có thể khác nhau.
Với câu trả lời này, bạn sẽ có được toàn bộ điều (#define
, #include
, #ifdef
, __FILE__
, __LINE__
, #C
, tùy chọn dòng lệnh để xây dựng), vì vậy tôi hy vọng nó nên bao gồm tất cả.
khai báo? http://dev.mysql.com/doc/refman/5.0/en/declare-local-variable.html –
Tôi đã viết một số SW để làm một điều như vậy - nó là miễn phí và nó ở đây http: // mysql-pre- processor.batcave.net/. Chỉ cần đặt một vài thứ vào xô của tổ chức từ thiện của sự lựa chọn của bạn –