Phần nội dung (thân - body) của thư điện tử là một tài liệu XML, cho phép truy cập cơ sở dư liệu. Nó cần phải chứa thông tin được đánh dấu dưới dạng các thẻ xml. Các thẻ này sẽ được xử lý trong chương trình dbrobot đê trích ra phần dữ liệu cần thiết sau đó cập nhật vào CSDL.
Dưới đây là lược đồ DTD của tài liệu XML, nội dung thông điệp email mà NSD gửi đến cho chương trình xử lí tự động.
Ý nghĩa cùa các thành phần và phân tích tích thiết kế chi tiết xin xem tài liệu "Thiết kế lược đồ XML đê cập nhật cơ sơ dữ liệu (ừ xa qua E-maiỉ ứng dụmỊ trong GỈS".
4.1 Lươc đồ DTD
Dưới đây là đặc tá tài liệu XML bằng lược đồ DTD
<!DOCTYPE dbmaiỉ [
<! ELEMENT dbmail (sql+, comment? )> <! ELEMENT sq] (where?, dbtab)> <!ELEMENT where (#PCDATA)>
<!ATTLIST sql action (slc| ins I upd I del I attach) #REQUIRED>
<!ELEMENT comment (#PCDATAt)> <! ELEMENT dbtab (dbcoi+)>
<!ATTLIST dbtab name CDATA #REQUIRED> <!ATTLIST dbtab ncol CDATA #IMPLIED> <!ELEMENT dbcol (#PCDATA)>
<!ATTLIST dbcol name CDATA #REQUIRED> <!ATTLIST dbcol type CDATA #REQUIRED>
Hình 2.5: lược đồ DTD cua thông điệp email
Giải thích ý nghĩa
Dưới đây là giải thích ý nghĩa và cách sủ dụng
- Điều khoản WHERE xác đinh bởi cặp thẻ <vvhere> </where> “biểu thức điều kiện” cần viết chính xác như trong câu lệnh SQL.
- Khi thực hiện hành động INSERT thì điều khoan Where không được sử dụng (không có ý nghĩa gì)
- Điều khoản Where chỉ có tác dụng với UPDATE, SELECT, DELETE hay ATTACH
- Các ACTION thể hiện câu vấn tin loại gì. Có thể nhận một trong các giá trị sau
sic = select ins = insert
upd = update del = delete
attach : khi gửi tệp đính kèm vào CSDL
- Phần tử DBTAB chứa các dữ liệu đặc tả chung cho cả bảng CSDL sẽ truy cập. Nó cũng chứa từ một đến nhiều phân tử con là DBCOL. mỗi phần tử DBCOL ứng với 1 cột trong bảng, các thành phần <DBCOL> là giông nhau trong các câu lệnh SQL
- Với INSERT thuộc tính NAME (tên cột) không sử dụng. Câu lệnh INSERT sẽ không có phần danh sách tên cột mà có dạng sau
INSERT INTO <tên bảng> VALUES (giá trị 1, giá trị 2,...)
Các giá trị dữ liệu (giá trị ỉ, giá trị 2,...) sẽ được chèn thêm vào một dòng mới, theo đúng thứ tự vổn có của các cột trong bảng, kế từ cột đầu tiên. Số lượng giá trị trong danh sách VALUES có thể nhỏ hơn hay bằng số cột, nhưng không được vượt quá so cột của bảng.
- Thuộc tính kiểu dữ liêu của cột TYPE là cần thiết trong các câu lệnh INSERT, UPDATE. Hiện chì phân biệt 2 kiểu : STRING và NUM tươne ứng với 2 trường hợp : giá trị cúa cột kiểu string phai nằm trong cặp dấu nháy đơn (') còn giá trị kiểu sổ thì không nằm trong cặp dấu nháy đơn.
- Với câu lệnh UPDATE thì thuộc tính NAME của thành phần DBCOL là quan trọng vì cần chi rõ thay đôi cột nào: SET <tên cộp- = <value>.
- Số cột được thay đổi giá trị trong một câu lênh update là tuỳ ý, tất nhiên không được vượt quá số cột cúa bảng. Chỉ cần viết thành phần DBCOL tương ứng. Giá trị cũ sẽ được thay bàng giá trị mới cung câp.
- Chương trình phân tích (parser) cho phép linh hoạt trong sô lượng dấu cách sừ dụng đề tách biệt các yếu tố XML khác nhau. Có thê tách biệt các yếu tố chi bằng đúng một dấu cách hoặc nhiều hơn.
4.2 Một thông điệp XML vói các vấn tin
Trong phần ứình bày về sử dụng chương trình sẽ có nhiều ví dụ cụ thể
Dưới đây là ví dụ minh hoạ một thông điệp email mà người sử dụng gửi tới hệ thống.
Phần đầu của nội dung thông điệp yêu cầu chèn thêm một dòng vào bảng reservoirs, bắt đầu từ thè mở < s q l a c t ì o n = " i n s " > cho đến thẻ đóng
< / s q l >
Phần tiếp theo của nội dung thông điệp yêu cầu cập nhật lại bán ghi có mã số “rid 01" trong bàng reservoirs. Trường location được nhận giá trị mới là Hanoi. Phần này bắt đầu từ thẻ mở < sqi a c tio n ^ "upđ"> cho đến thẻ đóng < /sq i> tiếp theo.
< ? x m l v e r s í o n = " 1 . 0 " ? > < ! D O C T Y P E d a t a b a s e S Y S T E M " w a t e r1 1s . d t d " > < d b m a i l > < s q l a c t i o n = " ì n s " > < w h e r e > ' < / w h e r e > < d b t a b n a m e = " r e s e r v o i r s " n c o l s = " 1 0 " > < d b c o l n a m e = " r í d " t y p e = " s t r i n g " > r i d 0 9 < / d b c o l > < d b c o l n a m e = " n a m e " t y p e = ” s t r i n g " > H o a B i n h r e s e r v o i r < / d b c o l > < d b c o l n a m e = " r a a x s t o r a g e " t y p e = " n u m " > 5 0 Ũ Ũ 0 Ũ 0 < / d b c o l > < d b c o l n a m e = " m a x d i s c h a r g e " t ỵ p e = " n u m " > 2 1 0 0 < / d b c o l > < / d b t a b > < / s q l > < s q l a c t i o n = " u p d " > < w h e r e > r i d = ' n d 0 1 ' < / w h e r e > < d b t a b n a m e = " r e s e r v o i r s " n c o l s = " 1 0 " > < d b c o l n a m e = " l o c a t i o n " t y p e = " s t r i n g " > - 4 9 -
Hanoi </dbcol> </dbtab> </sql>
< /dbmai1>
4.3 T rường hợp gửi tệp đính kèm vào CSDL
Một tính năng cần nhấn mạnh của chương trinh là cho phép gứi tệp đính kèm vào CSDL. Điều này là cần thiết vì các đổi tượng GIS có thề kèm theo ảnh, biếu đồ.
Chi tiết về triển khai chức năng này xin xem phẩn “Gí/7 tệp đính kèm thư điện tử vào CSDL và ứng dụng trong hệ thông tin địa lí"
Dưới đây tình bày tóm tắt một vài điểm đáng lưu ý.
Các dữ liệu đính kèm nói chung liên quan đến 2 báng, bang của đối tượng - bảng chính - và bảng chứa các BLOB - bảng được tham chiếu. Gửi tệp đính kèm vào CSDL phải truy cập 2 bảng. Chúng tôi lựa chọn giải pháp không họp nhất gắn liền quá trình xử lí mà phân tách thành 2 bước đế có tính linh hoạt cao trong ứng dụng sau này.
Bước 1 thực hiện công đoạn nhập khâu BLOB và cập nhật bảng dữ liệu BLOB. Bước 2 thực hiện câp nhật báng chính bằng câu lệnh update. Liên kết RÌừa cột tham chiếu trong bảng chính và cột đuợc tham chiếu (cột oid) trong bảng dữ liệu BLOB được thiết lập trong bước này.
Cần bồ xung một phần từ XML phục vụ cho việc thực hiện 2 bước công việc trên. Giao dịch này gọi là attach.
Phần tứ XML thực hiện giao dịch attach được thiết kế theo khuôn mẫu chung tương tự như cho các trường họp insert, update, select. Nên đặt phần tử XML ứng với tiiao dịch attach ờ cuối thông điệp XML đê tiện việc xu lí.
»
Dưới đây là một số lưu ý trong trường hợp giao dịch attach.
1- Phần tử Where có nội dung chính là điều khoản Where trong câu lệnh SQL để xác định dòng nào trong bảng chính sẽ được cập nhật. Điểm này cần đặc biệt nhấn mạnh vì dễ gây lầm lẫn. Các phần tứ XML ứng với các cột
*
của bảng dữ liệu multimedia nhung phần tử Where lại liên quan đến bảng tham chiếu.
2- Nếu phần tử Where là rỗng thì sẽ không thực hiện bước 2, tức là cập nhật bảng tham chiếu. Chỉ có bước 1 của giao dịch attach được thực hiện.
5. Sử dụng chương trình dbrobot
Người sử dụng gứi yêu cầu truy cập CSDL qua thư điện tử bất kì nơi nào đến địa chỉ của chương trình robot, ví dụ địa chí nhận thư là dbmail(ai,gis-
iti.vnu.edu.vn. Nội dung thư là tệp XML được điền đúng khuôn mẫu. Hệ
thống tiếp nhận yêu cầu thực hiện truy vấn CSDL và gửi báo cáo kết quá tra lại cho người gửi.
5.1 Thêm bản ghi
Dưới đây là nội dung yêu cầu chèn thêm một bản ghi vào bang reservoirs. < d b m a i l > < s q l a c t i o n = " i n s " > < w h e r e > < / w h e r e > < d b t a b n a m e = " r e s e r v o i r s " n c o l s = " 1 0 " > < d b c o l n a m e = " r i d " t y p e = " s t r i n g " > r i d 01 < / d b c o l > < d b c o l n a m e = " n a m e " t y p e = " s t n n g " > H o a B i n h r e s e r v o i r ^ / d b c o l > < d b c o l n a m e = " m a x s t o r a g e " t y p e = " n u m " > 5 0 0 0 0 0 0 < / d b c o l > - 51 -
<dbcol name= " m a x d i s c h a r g e " t y p e = "num''> 2 1 0 0 </dbcol> </dbtab> </sql> </dbmail>
Hĩnh 2.6: thông điệp email yêu câu thêm bàn ghi
Lưu ý rằng bản ghi mới chi có 4 cột được gán trị. Các cột khác nhận giá trị NULL.
Nếu thực hiện thành công, hệ thống gửi trả về một email thông báo.
One row inserted to the table reservoirs.
Neu that bại hệ thong sẽ gứi các báo lỗi chuẩn.
t gaaaaEaaaaaagsgaaasg: ĩ TJzstm td kagSi fc Ft ii: ' nxi.íí *t J J ri •; - •••_ _• ►__ ■ J r ’ ' 1 >-> ■ » ■'** >3 - > >*■'' '..»■>»;«. 1« ■ A.. J ' ■ y ^ H O O ? Mail . : M: _ ! ii U L_ —I V? h e a n d t!* 5 0 £ ify a h o 1?' c o m : ; ị ■ H-.- •• C o l o r a n d G r a p h i c s ' GEEiZli ,J ‘i,Kti
L .ãẺ ':.* ÌííJíri< .5 i 01 V t* i ...W i.r i'lii CcrrtM iĩ To irJLl-lil! JMji: ll Mi'i K'. •
Cc :... ... ” Bcc ... Subject ;|, A t t a c h m e n t s ' r 1 £ H t »J '*■ <? Mrrtl version“ “ 1 Ũ" ?> v d b m a i h ’ <sql 3cbon=,'ins"> 'where > * A'.'here
-dbtab nam e = ‘ reserv/off'' n c o ls -"10“'
cclbcol nam©="nd“ type-'string” > nd 0 1 </dbcolv
'.dbcol narnes ’Yiam e“ types*stnng“» HoaBinh reservoir "-/dbcol*
- d b t o l n a rn ô = "riv e rlìaíTvê" tv p « = 's itin g ''-H o rig H a river
MIII-, cj ;;ic ' ‘ 'm* N
Hình 2. 7 Trang email săn sàng gin đi
5.2 C ập nhật bảng
Dưới đây là nội dung yêu cầu cập nhật bảng.
<dbmail> < s q l a c t i o n = " u p d " > < w h e r e > r i d = ' r i d 0 1 ' < / w h e r e > < d b t a b n a m e = " r e s e r v o i r s " n c o l s = " 1 0 " > < d b c o l n a r a e = " l o c a t i o n " t y p e = " s t n n g " > H a n o i < / d b c o l > < / d b t a b > < / d b m a i l > .
Hĩnh 2.8: thông điệp email yêu cầu cập nhật ban ghi
Lưu ý: - thuộc tính action nhậ giá trị upd. - Phải có điều kiện where.
Neu thực hiện thành công, hệ thống gửi trả về một email thông báo.
n row updated in the table reservoirs.
Nếu thất bại hệ thống sẽ gửi các báo lỗi chuẩn.
5.3 Vấn tin select
Một ví dụ vấn tin select như sau.
< d b m a i l > < s q l a c t i o n = " s l c " > < w h e r e > n d = ' r i d 0 9 ' < / w h e r e > < d b t a b n a m e = " r e s e r v o i r s " n c o l s = " 1 0 " > < d b c o l n a m e = " r i d " t y p e = " s t r m g " > < / d b c o l > < d b : - o l n a m e = " n a m e " t y p e = " s t r i n g " ) < / d b c o l > < d b c o ] n a m e = " l o c a t i o n " t y p e = " s t r i n g " > < / d b c o l > - 5 3 -
<dbcol name= "maxstorage" type= "num"> </dbcol>
<dbcol narae= "maxdischarge" type= "num"> </dbcol>
< /d btab >
</sql> < / d b m a i l > .
Hình 2.9: thông điệp email yêu cầu trích xuất dữ liệu
Nếu thực hiện thành công, hệ thống gửi trả kết quá bàng email như sau
1 row selected 5 fields selected rid: rid 09
name: Hoa Birth reservoir location: Hoa Binh province
m axstorage: 5000000
maxdischage: 2100 mt
>• Li: v-e*. I«fe »I
' -I'. V aH O O ? Mail j.. hoandlWOQyahoo com t rtlijf jj! ’ • .Aii': . • I ■ hr f : !*'* f - I \ih_ M-- - -1 I] - Ĩ A I5- - , »■ - r h I- K J A r t r - n • F.rtf Credit CG: . dwell SuMfc!- Inỉỉtnntlv1 IM1*
Hình 2 .10 : Trang em ail với kết quả dữ liệu được trích xuất tra về
5.4 G iử ảnh đính kèm đối tượng vào CSDL
Để gửi ảnh đính kèm hay các tệp dính kèm nói chung như biểu đồ, bản vẽ, việc xử lí chia làm hai bước. Bước 1, đưa tài liệu đính kèm như một BLOB vào bảng và bước 2 cập nhật lại bảng chứa đối tượng sớ hữu tệp đính kèm này.
Trong ví dụ, ta xét việc đính kèm ảnh. CSDL có một bảng tên là images
chứa mã định danh đối tượng OID của các tệp ảnh và một số cột khác. Bảng chính của các đối tượng là báng reservoirs chứa cột image j d , chính là mã dinh danh này.
Hai cột khác trong bảng images là reftab, chứa tên bảng chính tham chiếu đến ảnh và refcol chứa tên cột trong bàng chính là foreign key tương ứng. Hai cột này cần thiết để thực hiện liên kết ảnh với đối tượng nào.
Dươi đây là yêu cầu thêm một bản ghi vào bảng reservoirs có kèm ảnh.
< d b m a i l > < s q l a c t i o n = " i n s " > < w h e r e > < / w h e r e > < d b t a b n a m e = " r e s e r v o i r s " n c o l s = " 1 0 " > < d b c o l i - . ame= " r i d " t y p e = " s t r i n g " ) r i d 0 1 < / d b c o l > < d b c o l n a m e = " n a m e " t y p e = " s t r m g " > H o a B i n h < / d b c o l > < d b c o l n a m e = " r a a x s t o r a g e " t y p e = " n u m " > 5 0 0 0 0 0 0 < / d b c o l > < d b c o l n a m e = " m a x s d i s c h a r g e " t ỵ p e = " n u m " > 2100 < / d b c o l > < / d b t a b >
< / s q l >
< s q l a c tio n = ” a tta c h " >
<where> r i d = ' r i d 01' </where>
< d b t a b n a m e = " i m a g e s " n c o l s = "4">
<dbcol name= "descriptions" type = "string">
t h i s i s t h e i m a g e o f r i d 0 1 < / d b c o l > < d b c o l n a m e = " r e f t a b " t y p e = " s t n n g " > r e s e r v o i r s < / d b c o l > < d b c o l n a r a e = " r e f c o l " t y p e = ” s t r i n g " > i m a g e _ i d < / d b c o l > < / d b t a b > < / s q l > < / d b m a i l >
Hình 2.11: thông điệp email đê chèn thêm bun hi, có tệp anh đính kèm
Lưu ý: c ầ n nhận thấy rằng cần có hai phần tử sql thực hiện hai hành động. Trước hết là action = "ins” để thêm bản ghi vào báng reservois như thông thường, chưa xét đến ảnh. Hành động tiếp theo là action - "attach ” thực hiện đưa ảnh vào CSDL và liên kết nó với bàn ghi vừa chèn thêm vào báng reservois.
Nếu như bản ghi trong bảng reservoirs đã có sẵn, ta chì bổ xung thêm ánh cho nó thì chí cần một phần tử sql với action = "attach " như dưới đây.
< d b m a i l > < s q l a c t i o n = " a t t a c h " > < w h e r e > r i d = ' r i d 0 1 ' < / w h e r e > < d b t a b n a m e = " i m a g e s " n c o l s = " 4 " > < d b c o l n a m e = " d e s c r i p t i o n s " t y p e = ” s t r i n g " > t h : s i s t h e i m a g e o f r i d 01 < / d b c o l > < d b c o l n a m e = " r e f t a b " t y p e = " s t n n g ' ' > r e s e r v o i r s < / d b c o l > - 5 6 -
<dbcol name= "refcol" typ e = " s t r in g " > im a g e _ id
</dbcol> </dbtab>
</sql>
# < / d b m a i1>
Hĩnh 2.12: thông điệp email đế gắn thêm tệp ánh vào đối tượng
Ket quả thực hiện yêu cầu thành công hay thất bại cũng được báo cáo cho người gửi.
5.5 Trang W eb hiển thị dữ liệu
Một thành phần khác của hệ thống là trang Web hiền thị dữ liệu từ CSDL. Nó phục vụ cho việc xuất thông tin lên Internet, đồng thời cũng đề kiểm tra hoạt động cùa hệ thống một cách dễ dàng.
Trang Web được viết bang ngôn ngữ php.
V '
W A T E R RESOURCES INVENTORY SYSTEM
HpjtBlnh
ị\) rtcfr»I
Restivoir ruin it. IIoaBuih K r a - (.»11
K i v c r H r tt i c : H tN iiiH íi II'-CI L o c a t i o n U o . ì U i t i h P r o v i n c e
Opưaũon Aoilioi ilv tii» K"tfRiiíi!j hvi1rv>ckcínc
Ho Híi Kr re^rviũt'
ĨD liu *J-
R(.>ciiv*ir itHiiíC. Ho KỉiRv. ri-Lii'« 11 íí rver nainc kyt'u iự ttvtr
Loí iẩiun Bat Cati Prov mt t I )pcratir»n Amlwvnrv (11C llwrhH JVC All II»MTV'«I| [D I id 05> Í fictn • on s i l v o n i i f c i u A - 1 “ 5 0 0 J 1