Chương trình sinh tự động mã trigger

Một phần của tài liệu Xây dựng mô đun sinh tự động mã nguồn trigger trên ngôn ngữ c phục vụ cập nhật gia tăng, đồng bộ các khung nhìn thực (Trang 46 - 50)

6. Cấu trúc của luận văn

3.2.2. Chương trình sinh tự động mã trigger

3.2.2.1. Mã cố định

Phần này được tổng hợp dựa trên các quy tắc lập trình C, các quy ước khi lập trình hàm trigger bằng ngôn ngữ C chạy trong PostgreSQL và dựa trên việc quan sát các mã nguồn trigger có sẵn, từ đó trích xuất các phần giống nhau thành bộ khung chung, bao gồm một số dòng mã thực hiện các việc như sau:

- Khai báo các thư viện.

- Khai báo các biến điều khiển.

- Thực thi các thủ tục, macro được quy ước khi khai báo hàm ngôn

ngữ C chạy trong PostgreSQL (kiểm tra lời gọi hàm, dòng dữ liệu NULL, giá trị trả về…).

3.2.2.2. Mã tùy biến

So sánh mã nguồn của các trigger, ta có thể dễ dàng nhận thấy, các trigger trên cùng một BG thì danh sách biến và đoạn mã kiểm tra điều kiện sơ bộ thay đổi dữ liệu có liên quan đến KNT hay không là giống nhau. Các trigger cho cùng một loại sự kiện thì sẽ có các thao tác giống nhau dựa trên thuật toán CNGT KNT. Do vậy, trước tiên ta cần phải phân tách truy vấn thành các thành phần S, F, J, W, G. Sau đó, thực hiện phân tích các thông tin như danh sách các trường khóa, kiểu dữ liệu của từng trường, vị trí của trường trong BG… (nhờ vào SPI). Từ đó, xác định các biến dữ liệu và biểu thức điều kiện ban đầu cho từng bảng tham gia vào truy vấn, rồi áp dụng những khuôn mẫu CNGT từ thuật toán đã đề cập để sinh mã trigger cho từng sự kiện trên mỗi BG.

Danh sách biến dữ liệu, một biến dữ liệu chỉ tương ứng với duy nhất một cột nhất định và có kiểu dữ liệu trong ngôn ngữ C tương đồng với kiểu dữ liệu của cột đó trong CSDL. Danh sách biến bao gồm các biến chứa giá trị trường trong KNT và các biến tương ứng với danh sách trường trong BG.

Điều kiện xác định sơ bộ thay đổi dữ liệu có liên quan đến KNT hay không.

Điều kiện này giúp kiểm tra ngay từ ban đầu xem một sự thay đổi trên BG có cần thiết để cập nhật KNT hay không. Để sinh mã kiểm tra điều kiện này, ta cần chọn ra các biểu thức logic ở các mệnh đề J và W thỏa điều kiện là các biểu thức đó chỉ gồm các cột ở cùng một BG đang xét, sau đó dùng toán tử logic AND nối các biểu thức đã được chọn tạo thành một biểu thức logic. Biểu thức này được đưa vào phần điều kiện của câu lệnh “if”, quyết định có thực hiện tiếp hay thoát khỏi hàm trigger.

Các khuôn mẫu CNGT cho từng sự kiện

Điều quan trọng trong việc dùng trigger để CNGT là phải xác định được thời điểm gọi trigger cho từng sự kiện tương ứng. Đối với sự kiện insert, trigger phải được gọi sau khi sự kiện xảy ra; đối với sự kiện delete, trigger phải được gọi trước khi sự kiện xảy ra (và có thể được gọi lại sau khi sự kiện xảy ra đối với trường hợp truy vấn bao gồm hàm

thống kê MIN hoặc MAX theo thuật toán CNGT đồng bộ KNT). Tuy nhiên, đối với sự kiện update, do thuật toán CNGT xem sự kiện này như hai thao tác delete rồi insert riêng biệt, nên trigger cho sự kiện update phải được gọi cả trước và sau khi sự kiện này xảy ra. Để đặt thời điểm gọi trigger cho từng sự kiện tương ứng, ta có thể:

- Xây dựng mã trigger cho tất cả các sự kiện trong một hàm duy nhất, khai báo gọi hàm đó như trigger cho trước và sau tất cả các sự kiện trên BG. Trong thân hàm, ta sẽ xác định thời điểm gọi trigger để thực thi đoạn mã tương ứng.

- Xây dựng riêng lẻ một hàm cho mỗi trigger, sau đó xác định thời

điểm, sự kiện gọi nó ở phần khai báo trigger trong CSDL.

Việc xác định thời điểm gọi trigger là để đảm bảo tính đúng đắn của bước thực thi truy vấn xuất phát từ thuật toán CNGT KNT, là một phần trong thuật toán CNGT KNT. Ở đây cần phân biệt giữa bước này và phương pháp cập nhật hoàn toàn ở chỗ, đối với bước truy vấn lại của thuật toán CNGT đồng bộ KNT đang xét, mệnh đề W của truy vấn được xác định thêm các điều kiện là các trường khóa của dòng dữ liệu đang xảy ra sự kiện với dữ liệu cụ thể. Bước này nhằm mục đích:

- Nối bảng đang xảy ra sự kiện với các bảng khác trong tập các BG

để lấy thông tin các trường khác trong KNT.

- Lấy các dữ liệu liên quan thay đổi trên BG để cập nhật lại vào KNT.

- Kiểm tra lại các điều kiện khác trong mệnh đề J và W nếu có.

Dựa theo các thông tin đã phân tích được và thuật toán CNGT KNT đã đề cập, giả sử phần khung mã cứng đã có, đối với từng sự kiện ta sinh mã tuỳ biến như sau.

i) Sự kiện insert

B1.Khai báo biến dữ liệu.

B2.Gán giá trị cho biến ứng với các cột ở bản ghi thêm mới.

B3.Kiểm tra biểu thức điều kiện thay đổi dữ liệu liên quan KNT hay không.

B4.Chạy lại truy vấn với W có thêm vào các trường khóa với các giá trị dữ liệu cụ thể thuộc về bản ghi hiện tại.

B5.Cấp phát bộ nhớ và lưu kết quả truy vấn ở B4, với mỗi bản ghi đã lưu, thực hiện B6.

B6.Truy vấn đến bảng KNT lấy giá trị trường COUNT(*). Nếu truy vấn không trả về dòng kết quả nào, tức giá trị của nhóm dữ liệu vẫn chưa xuất hiện trong KNT, thực hiện thêm mới bản ghitương ứng vào KNT với COUNT(*) có giá trị là 1. Ngược lại, nếu truy vấn trả về ít nhất 1 dòng kết quả, thực hiện B7.

B7.Thực hiện cập nhật KNT, các trường có chứa các biểu thức thống kê cần được cập nhật giá trị phù hợp với thuật toán CNGT, trường COUNT(*) được cập nhật tăng lên 1.

ii) Sự kiện delete

B1.Khai báo biến dữ liệu.

B2.Gán giá trị cho biến ứng với các cột ở bản ghi đang xóa.

B3.Kiểm tra biểu thức điều kiện thay đổi dữ liệu liên quan KNT hay không.

B4.Đối với trường hợp không có hàm thống kê MIN và/hoặc MAX, thực hiện sinh mã từ B5 đến B8. Ngược lại, nếu có, thực hiện sinh mã từ B5 đến B8 với thời điểm gọi trigger trước khi sự kiện xảy ra, thực hiện sinh mã từ B9 đến B11 với thời điểm gọi trigger sau khi sự kiện xảy ra.

B5.Thực thi lại truy vấn với W có thêm vào các trường khóa với dữ liệu cụ thể.

B6.Cấp phát bộ nhớ và lưu kết quả truy vấn ở B5, với mỗi bản ghi, thực hiện B6.

B7.Truy vấn đến bảng KNT lấy giá trị trường COUNT(*). Trong trường hợp delete, xem như luôn có dòng dữ liệu trong KNT, so sánh trường đếm COUNT(*) trong KNT, gọi là x và giá trị trường đếm ở B5 gọi là y, nếu x = y thì thực hiện xóa dòng dữ liệu đó trong KNT, nếu x>y thì thực hiện B8.

B8.Thực hiện cập nhật KNT, các trường có chứa các biểu thức thống kê cần được cập nhật giá trị phù hợp với thuật toán CNGT, trường đếm COUNT(*) trong KNT được cập nhật x = x-y.

B9.Thực hiện lại truy vấn với mệnh đề W được thêm vào các cặp điều kiện trường – giá trị thỏa điều kiện: Trường được thêm vào phải có mặt trong BG và mệnh đề G của truy vấn.

B10.Cấp phát bộ nhớ và lưu kết quả truy vấn ở B9, với mỗi bản ghi, thực hiện B11.

B11.Cập nhật lại các trường thống kê MIN/MAX từ kết quả truy vấn

đã có.

iii) Sự kiện update

B1.Khai báo các biến dữ liệu.

B2.Kiểm tra thời điểm gọi trigger, nếu trigger được gọi trước sự kiện update thì thực hiện B3, nếu trigger được gọi sau sự kiện update thì thực hiện B4.

B3.Trigger gọi trước: Thực hiện tương tự như cho trường hợp delete đã đề cập ở trên từ B2 trở đi.

B4.Trigger gọi sau: Thực hiện tương tự như cho trường hợp insert đã đề cập ở trên từ B2 trở đi (và có thể cùng với một phần của trigger delete nếu có xuất hiện hàm thống kê MIN/MAX. Phần này, nếu có, sẽ được đặt trước đoạn mã trigger cho sự kiện insert).

Một phần của tài liệu Xây dựng mô đun sinh tự động mã nguồn trigger trên ngôn ngữ c phục vụ cập nhật gia tăng, đồng bộ các khung nhìn thực (Trang 46 - 50)

Tải bản đầy đủ (PDF)

(92 trang)