¶
14.7.10. Blog Hooks - Customizing the Blog Server
Virtuoso provides the default system for blogging using one of the supported . Virtuoso provides several PL hooks to customize the blog server. The following hooks are available for definition:
authenticate_<appkey> (in req blogRequest) |
newPost_<appkey> (in req blogRequest) |
editPost_<appkey> (in req blogRequest) |
deletePost_<appkey> (in req blogRequest) |
getPost_<appkey> (in req blogRequest) |
getRecentPosts_<appkey> (in req blogRequest, in numberOfPosts int) |
See Also: | |
---|---|
blogRequest is a UDT defined as follows:
create type "blogPost" as ( "content" varchar, -- message "dateCreated" datetime, -- timestamp "postid" varchar, -- message ID "userid" int -- creator ) temporary self as ref ; create type "blogRequest" under "blogPost" as ( user_name varchar, -- user name passwd varchar, -- credentials appkey varchar, -- application key blogid varchar, -- web log ID postId varchar, -- message ID auth_userid integer, -- user ID publish smallint, -- not used, but still in API struct DB.DBA.MWeblogPost -- used in WebMetaLog ) temporary self as ref constructor method blogRequest ( appkey varchar, blogid varchar, postId varchar, user_name varchar, passwd varchar ) ;
Example 14.61. Customizing the BLOG Server
-- SIMPLE BLOG APPLICATION -- application key: 0123456789 -- -- the following UDTs are used in API calls -- -- single message -- create type "blogPost" as ( -- "content" varchar, -- "dateCreated" datetime, -- "postid" varchar, -- "userid" int -- ) temporary self as ref -- -- -- a blog request -- create type "blogRequest" under "blogPost" -- as -- ( -- user_name varchar, -- passwd varchar, -- appkey varchar, -- blogid varchar, -- postId varchar, -- auth_userid integer, -- publish smallint -- ) temporary self as ref -- -- as metaWeblog API not not have appkey, we are assuming 'META_WEBLOG' for it. drop table BLOG; create table BLOG ( B_APPKEY varchar, BLOG_ID varchar, B_CONTENT long varchar, B_POST_ID varchar, B_TS timestamp, B_USER_ID integer, primary key (B_APPKEY, BLOG_ID, B_POST_ID) ); -- APPLICATION LEVEL HOOKS create procedure authenticate_app (inout req blogRequest) { declare pwd varchar; declare id int; dbg_obj_print ('auth'); whenever not found goto nf; select U_PWD, U_ID into pwd, id from WS.WS.SYS_DAV_USER where U_NAME = req.user_name; if (isstring (pwd)) { if ((pwd[0] = 0 and pwd_magic_calc (req.user_name, req.passwd) = pwd) or (pwd[0] <> 0 and pwd = req.passwd)) { req.auth_userid := id; return; } } nf: signal ('42000', 'Access denied'); } ; create procedure authenticate_0123456789 (in req blogRequest) { authenticate_app (req); } ; create procedure newPost_0123456789 (in req blogRequest) { req.postId := cast (sequence_next ('blogger.postid') as varchar); insert into BLOG (B_APPKEY, BLOG_ID, B_CONTENT, B_POST_ID, B_USER_ID) values (req.appkey, req.blogid, req.content, req.postId, req.auth_userid); } ; create procedure editPost_0123456789 (in req blogRequest) { update BLOG set B_CONTENT = req.content where B_APPKEY = req.appkey and B_POST_ID = req.postId; } ; create procedure deletePost_0123456789 (in req blogRequest) { delete from BLOG where B_APPKEY = req.appkey and B_POST_ID = req.postId; } ; create procedure getPost_0123456789 (in req blogRequest) { declare content, datecreated, userid any; declare post blogPost; whenever not found goto nf; select sprintf ('%V', blob_to_string (B_CONTENT)), B_TS, B_USER_ID into content, datecreated, userid from BLOG where B_APPKEY = req.appkey and B_POST_ID = req.postId; post := new blogPost (); post."content" := content; post."dateCreated" := datecreated; post."postid" := req.postId; post."userid" := userid; dbg_obj_print ('getPost', post); return post; nf: signal ('22023', 'Cannot find a post with Id = ' || req.postId); } ; create procedure getRecentPosts_0123456789 (in req blogRequest, in numberOfPosts int) { declare ret, elm any; declare post blogPost; ret := vector (); for select sprintf ('%V', blob_to_string (B_CONTENT)) as B_CONTENT, B_TS, B_USER_ID, B_POST_ID from BLOG where B_APPKEY = req.appkey and BLOG_ID = req.blogId order by B_TS desc do { post := new blogPost (); post."content" := B_CONTENT; post."dateCreated" := B_TS; post."postid" := B_POST_ID; post."userid" := B_USER_ID; ret := vector_concat (ret, vector (post)); numberOfPosts := numberOfPosts - 1; if (numberOfPosts <= 0) goto endg; } endg: return ret; } ;