| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.server -> Re: Seeking Testing Volunteers W2K MTS/DTC to VMS DECdtm Distributed 2PC Transactions
Here's the DEMO code that I promised for the VMS side. It simply doesn't get
any easier than this!
Everything except the two T3$ services is *standard* VMS code.
Enjoy!
Cheers Richard Maher.
$!
$ server_user = f$getjpi(0,"username")
$ home_dir = f$trnlnm("sys$login","lnm$job")
$ set default 'home_dir
$!
$ create demo_tip_auxs.cob
****************************************************************************
perform open_socket.
perform read_socket.
perform until msg_type = "99"
evaluate msg_type
when "20" perform insert_employee_push
when other display "Unknow message type: ",
msg_type
call "lib$stop" using by value ss$_abort
end-evaluate
perform read_socket
end-perform.
perform close_socket.
stop run.
*
open_socket section.
00.
call "sys$assign"
using by descriptor "sys$net:"
by reference inet_chan
by value 0, 0, 0
giving sys_status.
call "sys$qiow"
using by value 0, inet_chan, io$_setmode
by reference iosb
by value 0, 0
by reference create_socket
by value 0, 0, 0, 0, 0
giving sys_status.
call "sys$qiow"
using by value 0, inet_chan, io$_readvblk
by reference iosb
by value 0, 0
by reference msg_buff
by value 512, 0, 0, 0, 0
giving sys_status.
display "Rec = *", insert_employee_msg(1:msg_size), "*".
*
write_socket section.
00.
call "sys$qiow"
using by value 0, inet_chan, io$_writevblk
by reference iosb
by value 0, 0, reply_addr, reply_len, 0, 0, 0, 0
giving sys_status.
call "sys$qiow"
using by value 0, inet_chan, io$_deaccess
by reference iosb
by value 0, 0, 0, 0, 0, 0, 0, 0
giving sys_status.
call "sys$dassgn" using by value inet_chan giving sys_status.
if sys_status not = ss$_normal call "lib$stop" using by value
sys_status.
*
insert_employee_push section.
00.
move function upper-case (BirthDate) to BirthDate.
call "sys$bintim"
using by descriptor BirthDate
by reference bintim
giving sys_status.
call "t3$tip_url_to_tid"
using by descriptor tip_txn_url of insert_employee_msg
(1:(msg_size - function
length(employee_msg)))
by reference tip_tid, tip_bid
giving sys_status.
call "sys$start_branchw"
using by value 0, 0
by reference dtm_iosb
by value 0, 0
by reference tip_tid
by descriptor local_node(1:local_node_len)
by reference tip_bid
giving sys_status.
move tip_tid to db_tid.
perform the_insert.
*
set reply_addr to reference comp_status.
move 3 to reply_len.
perform write_socket.
if commit_flag = "Y"
perform commit_trans
else perform abort_trans.
*
fini.
*
the_insert section.
00.
call "set_trans_rw" using sqlcode, sql_ctx. if rdb$lu_status not = ss$_normal
call "sys$putmsg" using rdb$message_vector
call "lib$stop" using by value ss$_abort.
call "insert_employee"
using sqlcode,
EmployeeId(6:5),
LastName,
FirstName,
Bintim,
line1,
line2,
City,
Region,
PostalCode,
sql_ctx.
if rdb$lu_status not = ss$_normal
move "N" to commit_flag
call "sys$putmsg"
using by reference rdb$message_vector
by value out_msg, 0
by reference inet_chan
giving sys_status
if sys_status not = ss$_normal
call "lib$stop" using by value sys_status
end-if
else
move "Y" to commit_flag.
call "sys$end_branchw"
using by value 0, 0
by reference dtm_iosb
by value 0, 0
by reference tip_tid, tip_bid
giving sys_status.
if dtm_iosb_status = ss$_abort
display "Couldn't commit - " no advancing
if reason_code not = zeros
call "sys$getmsg"
using by value reason_code
by reference out_len
by descriptor abort_msg
by value 0,0
giving sys_status
if sys_status not = ss$_normal
call "lib$stop" using by value sys_status
end-if
display abort_msg (1:out_len)
else
display "and don't know why"
else
if dtm_iosb_status not = ss$_normal
call "lib$stop" using by value dtm_iosb_status.
call "sys$abort_transw"
using by value 0, ddtm$m_nowait
by reference dtm_iosb
by value 0, 0
by reference tip_tid
by value ddtm$_aborted
by reference tip_bid
giving sys_status.
01 ss$_normal pic 9(9) comp value external ss$_normal. 01 sys_status pic 9(9) comp.
03 cond_val pic s9(4) comp.
03 pic x(6).
*
01 reply_addr pointer.
01 reply_len pic 9(4) comp.
03 error_id pic xx value "88".
03 error_len pic 9(3).
03 msg_len pic 9(4) comp.
03 msg_class pic 9(4) comp.
03 msg_addr pointer.
*
01 inet_chan pic 9(4) comp.
using msg_desc,
inet_chan
giving ss$_normal.
move function length(reply_hdr) to reply_len.
move msg_len to error_len.
set reply_addr to reference reply_hdr.
perform write_socket.
move msg_len to reply_len.
move msg_addr to reply_addr.
perform write_socket.
*
fini.
exit program.
*
write_socket.
*
call "sys$qiow"
using by value 0, inet_chan, io$_writevblk
by reference iosb
by value 0, 0, reply_addr, reply_len, 0, 0, 0, 0
giving sys_status.
$!
$ cobol/lis demo_tip_auxs.cob
$!
$ create demo_tip_auxs_def.mar
.title DEMO_TIP_AUXS_DEF Demo example TIP external data
;+
; area if one does not already exist:-
;
; $library/create/macro inet.mlb sys$library:ucx$inetdef
;
; .library "sys$login:inet"
;
; $inetsymdef GLOBAL
; $siocdef GLOBAL
; $inetacpfsymdef GLOBAL
; $inetacpsymdef GLOBAL
; $ineterrdef GLOBAL
;-
$ddtmdef GLOBAL
$ddtmmsgdef GLOBAL
ucx$c_auxs == 127
ucx$c_af_inet == 2
ucx$c_tcp == 6
auxs_def == <ucx$c_auxs * 256 + ucx$c_af_inet>
.end
$ macro/lis demo_tip_auxs_def.mar
module dist_sql
language cobol
parameter colons
declare pers alias filename mf_personnel
procedure set_trans_rw
sqlcode;
set transaction read write
reserving pers.employees for shared write;
procedure insert_employee
sqlcode,
:employee_id char(5),
:last_name char(20),
:first_name char(10),
:birthday date vms,
:address_data_1 char(30),
:address_data_2 char(30),
:city char(15),
:state char(15),
:postal_code char(10)
;
insert into pers.employees
(
employee_id,
last_name,
first_name,
birthday,
address_data_1,
address_data_2,
city,
state,
postal_code,
middle_initial,
sex,
status_code
)
values
(
:employee_id,
:last_name,
:first_name,
:birthday,
:address_data_1,
:address_data_2,
:city,
:state,
:postal_code,
' ',
'?',
'N'
)
;
$!
$! $ define/nolog lnk$library sys$library:t3$user $ link
$!
$ create demo_tip_auxs_input.com
$ deck
$! define mf_personnel to_where_it_lives
$ run sys$login:demo_tip_auxs
$ exit
$ eod
$!
$ ucx set service tip_inetd -
/port = 303 -
/protocol = tcp -
/process = tip_auxs -
/user_name = 'server_user' -
/file = 'home_dir'demo_tip_auxs_input
$!
$ ucx enable service tip_inetd
![]() |
![]() |