2
* $Id: blobsql.elf 73460 2002-02-21 14:13:28Z taras $
4
* Copyright (C) 1997 Cygnus Solutions, Inc.
7
* A sample program written in ELF.
16
DEFINE XSQL#IMAGE#TABLE "xsql_image"
17
DEFINE XSQL#IMAGE#ID "id"
18
DEFINE XSQL#IMAGE#FILE "filename"
19
DEFINE XSQL#IMAGE#HOST "host"
20
DEFINE XSQL#IMAGE#DATE "created"
21
DEFINE XSQL#IMAGE#OWNER "author"
22
DEFINE XSQL#IMAGE#SIZE "length"
23
DEFINE XSQL#IMAGE#PIC "pic"
25
FUNCTION xsql_store_blob(channel,id_val,fname,rdbms_type)
35
IF NOT (rdbms_type = SQL#ORACLE OR
36
rdbms_type = SQL#SYBASE)
38
INFO_MESSAGE@("Only Oracle & Sybase are supported")
42
host = SHELL_COMMAND@("uname -n")
44
IF rdbms_type = SQL#ORACLE
45
date_value = "SYSDATE"
47
IF rdbms_type = SQL#SYBASE
48
date_value = "'10/10/93'"
50
bobj = READ_BINARY_FILE@(fname)
51
sql_write(channel,"send_blob " ++ BINARY_SIZE@(bobj))
53
cmd = BINARY_TO_ARRAY@(bobj,ELF_SOCKET_SIZE)
54
FOR cou=0 TO (ARRAY_SIZE@(cmd)-1)
55
bin = ARRAY_TO_BINARY@(cmd[cou])
56
SOCKET_WRITE_BINARY@(channel,bin)
57
ack = SOCKET_READ_BINARY@(channel,-1,1) ' Acknowledgement
60
ans = sql_read(channel,-1) ' Send blob answer
62
sql_write(channel,"delete from " ++ XSQL#IMAGE#TABLE ++
63
" where " ++ XSQL#IMAGE#ID ++ "=" ++ id_val)
65
ans = sql_read(channel,-1) ' Delete answer
67
sql_write(channel,"insert into " ++ XSQL#IMAGE#TABLE ++
68
" (" ++ XSQL#IMAGE#ID ++ "," ++ XSQL#IMAGE#FILE ++
69
"," ++ XSQL#IMAGE#HOST ++ "," ++ XSQL#IMAGE#DATE ++ "," ++
70
XSQL#IMAGE#OWNER ++ "," ++ XSQL#IMAGE#SIZE ++ ")" ++
71
" values (" ++ id_val ++ ",'" ++ fname ++ "','"
74
date_value ++ ",'" ++ xsql_elf_user_name() ++ "' " ++
75
"," ++ BINARY_SIZE@(bobj) ++ ")")
78
ans = sql_read(channel,-1)
80
IF ans.errcode <> 0 '[01]
81
INFO_MESSAGE@(ans.errstr ++ "\n\n" ++ ans.errcmd)
84
IF rdbms_type = SQL#ORACLE
86
sql_write(channel,"update " ++ XSQL#IMAGE#TABLE ++
87
" set " ++ XSQL#IMAGE#PIC ++ "=:" ++ XSQL#IMAGE#PIC ++
88
" where " ++ XSQL#IMAGE#ID ++ "=" ++ id_val)
90
IF rdbms_type = SQL#SYBASE
92
sql_write(channel,"store_blob " ++
93
XSQL#IMAGE#TABLE ++ " " ++
94
XSQL#IMAGE#PIC ++ " " ++
95
XSQL#IMAGE#ID ++ " " ++
99
ans = sql_read(channel,-1) ' Update answer
102
INFO_MESSAGE@(ans.errstr ++ "\n\n" ++ ans.errcmd)
105
sql_write(channel,"commit")
106
ans = sql_read(channel,-1)
107
INFO_MESSAGE@("Image Saved")
112
FUNCTION xsql_store_file
113
VAR FORMAT sql_pars sqlp
124
pathname = OPEN_PROMPT@(NULL,NULL,"*",
125
"Store file into RDBMS")
130
PARSE_PATHNAME@(pathname,dir,file)
131
off = STRING_INDEX@(file,".")
133
file = SUBSTRING@(file,1,off - 1)
135
sqlp = sql_connect(FALSE)
137
xsql_store_blob(sqlp.channel,
138
"'" ++ file ++ "'",pathname,sqlp.rdbms_type)
141
IF NOT IS_NULL@(sqlp.channel)
142
sql_disconnect(sqlp.channel)
145
DEFINE XSQL#FETCH#LIST "id_list"
146
DEFINE XSQL#FETCH#OPEN "open"
147
DEFINE XSQL#FETCH#SEARCH "search"
151
DEFINE FETCH#NAME#ASC "name_asc"
152
DEFINE FETCH#NAME#DESC "name_desc"
153
DEFINE FETCH#DATE#ASC "date_asc"
154
DEFINE FETCH#DATE#DESC "date_desc"
156
DEFINE FETCH#VIEW#ID "view_id"
157
DEFINE FETCH#VIEW#FNAME "view_fname"
158
DEFINE FETCH#VIEW#HOST "view_host"
159
DEFINE FETCH#VIEW#DATE "view_date"
160
DEFINE FETCH#VIEW#OWNER "view_owner"
161
DEFINE FETCH#VIEW#SIZE "view_size"
163
FUNCTION xsql_fetch_file
164
VAR FORMAT sql_pars sqlp
192
order_field = XSQL#IMAGE#ID
193
file_operation = MENUSTAT#DIMMED
194
sqlp = sql_connect(FALSE)
196
fetch_query = "select " ++ XSQL#IMAGE#ID ++ "," ++ XSQL#IMAGE#FILE ++
197
"," ++ XSQL#IMAGE#HOST ++ "," ++ XSQL#IMAGE#DATE ++ "," ++
199
"," ++ XSQL#IMAGE#SIZE ++ " from " ++ XSQL#IMAGE#TABLE ++
200
" order by " ++ order_field
202
dbox = DB_LOAD@("xsql/fetch_file")
203
menu_str = xsql_fetch_doc_menu()
204
SET_SELECTIONS@(SQL#MENU#ID,menu_str)
205
DB_MENU_BAR@(dbox,SQL#MENU#ID)
207
DB_ICON@(dbox,XSQL#BITMAP)
208
DB_OWNERLESS@(dbox,TRUE)
210
DB_CTRL_HORIZ_SCROLL@(dbox,XSQL#FETCH#LIST,TRUE)
211
DB_CTRL_PICK_DEFAULT@(dbox,XSQL#FETCH#LIST,TRUE)
212
DB_CTRL_MONOSPACE@(dbox,XSQL#FETCH#LIST,TRUE)
213
DB_CTRL_RETURN_ON_CHANGE@(dbox,XSQL#FETCH#LIST,TRUE)
215
list = xsql_exec_fetch_query(sqlp.channel,ans,fetch_query)
216
DB_CTRL_STRINGS@(dbox,XSQL#FETCH#LIST,list)
217
DB_CTRL_VALUE@(dbox,XSQL#FETCH#LIST,0)
219
DB_WINDOW_REMAIN@(dbox,TRUE)
220
DB_CTRL_DEFAULT_BUTTON@(dbox,XSQL#FETCH#OPEN,TRUE)
222
DB_CTRL_GRAYED@(dbox,XSQL#FETCH#OPEN,TRUE)
224
fetch_name_asc = MENUSTAT#RADIO_ON
225
fetch_name_desc = MENUSTAT#RADIO_OFF
226
fetch_date_asc = MENUSTAT#RADIO_OFF
227
fetch_date_desc = MENUSTAT#RADIO_OFF
229
DB_MENU_STATUS@(dbox,FETCH#VIEW#ID,MENUSTAT#TOGGLE_ON)
230
DB_MENU_STATUS@(dbox,FETCH#VIEW#FNAME,MENUSTAT#TOGGLE_ON)
231
DB_MENU_STATUS@(dbox,FETCH#VIEW#HOST,MENUSTAT#TOGGLE_ON)
232
DB_MENU_STATUS@(dbox,FETCH#VIEW#DATE,MENUSTAT#TOGGLE_ON)
233
DB_MENU_STATUS@(dbox,FETCH#VIEW#OWNER,MENUSTAT#TOGGLE_ON)
234
DB_MENU_STATUS@(dbox,FETCH#VIEW#SIZE,MENUSTAT#TOGGLE_ON)
237
DB_MENU_STATUS@(dbox,FETCH#NAME#ASC,fetch_name_asc)
238
DB_MENU_STATUS@(dbox,FETCH#NAME#DESC,fetch_name_desc)
239
DB_MENU_STATUS@(dbox,FETCH#DATE#ASC,fetch_date_asc)
240
DB_MENU_STATUS@(dbox,FETCH#DATE#DESC,fetch_date_desc)
242
DB_MENU_STATUS@(dbox,COPY#MARKED#FIELDS,file_operation)
243
DB_MENU_STATUS@(dbox,EDIT#CUT#CMD,file_operation)
244
DB_MENU_STATUS@(dbox,EDIT#DEL#CMD,file_operation)
247
DB_MENU_STATUS@(dbox,FETCH#DATE#ASC,MENUSTAT#RADIO_ON)
249
exiter = DB_EXIT_CTRL@(dbox)
253
cmd = DB_MENU_BAR_WORD@(dbox)
256
NEW_TASK@("WP_APPLICATION_DLG@")
259
ELSE IF cmd = START#GR
261
NEW_TASK@("GR_APPLICATION_DLG@")
264
ELSE IF cmd = START#SS
266
NEW_TASK@("SS_APPLICATION_DLG@")
269
ELSE IF cmd = START#INBOX
271
NEW_TASK@("INBOX_DLG@")
274
ELSE IF cmd = START#MAIL
276
NEW_TASK@("MAIL_DLG@")
279
ELSE IF cmd = START#DD
281
NEW_TASK@("DD_DIRECTORY_DISPLAY@")
284
ELSE IF cmd = START#ME
286
NEW_TASK@("ME_APPLICATION_DLG@")
289
ELSE IF cmd = START#MAIN
291
NEW_TASK@("MAIN_DBOX@")
294
ELSE IF cmd = RUN#MACRO
296
NEW_TASK@("RUN_MACRO_DLG@")
299
ELSE IF cmd = CUST#LOOK#FEEL
301
NEW_TASK@("X_PREFS_DLG@")
304
ELSE IF cmd = CUST#MENU#BAR
306
file = USER_DIR@() ++ "/" ++ FETCH#SQL#MB
308
cmd[0] = FETCH#SQL#MB
309
WRITE_DATA_FILE@(file,menu_str)
310
PEND_FOR_NEW_TASK@("xsql_customize",cmd)
311
menu_str = READ_DATA_FILE@(cmd)
312
SET_SELECTIONS@(SQL#MENU#ID,menu_str)
313
DB_MENU_BAR@(dbox,SQL#MENU#ID)
316
ELSE IF cmd = START#ISQL
318
cmd = sqlp.host,sqlp.rdbms_name,sqlp.rdbms_type,
319
sqlp.user,sqlp.passwd
320
NEW_TASK@("ISQL",cmd)
323
ELSE IF cmd = START#SQL#RUN#FORM
326
cmd[1] = CREATE_TEMP_FILE@("/tmp/xsql-frm%%%%%%")
327
WRITE_DATA_FILE@(cmd[1],sqlp)
328
NEW_TASK@("sqlrunform",cmd)
331
ELSE IF cmd = START#SQL#FORMS
333
cmd = sqlp.host,sqlp.rdbms_name,sqlp.rdbms_type,
334
sqlp.user,sqlp.passwd
335
NEW_TASK@("SQLFORMS",cmd)
338
ELSE IF cmd = EXIT#FUNC
340
IF update_flag = TRUE
342
cmd = YES_NO_CANCEL_PROMPT@("Do you want to save your changes ?")
348
sql_write(sqlp.channel,"commit")
349
ans = sql_read(sqlp.channel,-1)
355
ELSE IF cmd = COPY#MARKED#FIELDS OR cmd = EDIT#DEL#CMD OR
358
cou = DB_CTRL_GET_VALUE@(dbox,XSQL#FETCH#LIST) - 1
360
IF cmd = COPY#MARKED#FIELDS OR cmd = EDIT#CUT#CMD
362
sql_write(sqlp.channel,fetch_cmd)
364
blb = sql_read(sqlp.channel,-1)
367
INFO_MESSAGE@(blb.errstr)
371
xsql_save_file_as(ans.records[cou][1],
372
blb.records[0][0],NULL,2)
374
IF cmd = EDIT#DEL#CMD OR cmd = EDIT#CUT#CMD
376
sql_write(sqlp.channel,"delete from " ++
378
" where " ++ XSQL#IMAGE#ID ++ "='" ++
379
ans.records[cou][0] ++ "'")
381
blb = sql_read(sqlp.channel,-1) ' Delete answer
383
INFO_MESSAGE@(blb.errstr)
387
list = xsql_exec_fetch_query(sqlp.channel,ans,
389
DB_CTRL_STRINGS@(dbox,XSQL#FETCH#LIST,list)
390
DB_CTRL_VALUE@(dbox,XSQL#FETCH#LIST,0)
391
DB_CTRL_GRAYED@(dbox,XSQL#FETCH#OPEN,TRUE)
396
ELSE IF cmd FETCH#NAME#ASC
397
DB_MENU_STATUS@(dbox,FETCH#NAME#ASC,fetch_name_asc)
398
DB_MENU_STATUS@(dbox,FETCH#NAME#DESC,fetch_name_desc)
399
DB_MENU_STATUS@(dbox,FETCH#DATE#ASC,fetch_date_asc)
400
DB_MENU_STATUS@(dbox,FETCH#DATE#DESC,fetch_date_desc)
401
' ELSE IF cmd = EXIT#FUNC
404
ELSE IF exiter = XSQL#FETCH#OPEN
406
cou = DB_CTRL_GET_VALUE@(dbox,XSQL#FETCH#LIST) - 1
408
IF sqlp.rdbms_type = SQL#SYBASE
410
sql_write(sqlp.channel,"set TEXTSIZE 1000000")
412
blb = sql_read(sqlp.channel,-1)
416
sql_write(sqlp.channel,fetch_cmd)
418
blb = sql_read(sqlp.channel,-1)
421
INFO_MESSAGE@(blb.errstr)
425
xsql_blob_doc_type(ans.records[cou][1],extension)
427
IF NOT IS_NULL@(extension)
429
file = CREATE_TEMP_FILE@("/tmp/" ++
430
SUBSTRING@(ans.records[cou][0],1,5) ++ "%%%%%%" ++
433
WRITE_BINARY_FILE@(file,blb.records[0][0])
438
GR_APPLICATION_DLG@()
452
ELSE IF exiter = XSQL#FETCH#LIST
454
cou = DB_CTRL_GET_VALUE@(dbox,XSQL#FETCH#LIST) - 1
455
IF IS_NULL@(cou) OR cou < 0
457
DB_CTRL_GRAYED@(dbox,XSQL#FETCH#OPEN,TRUE)
458
file_operation = MENUSTAT#DIMMED
462
fetch_cmd = "fetch_blob select " ++ XSQL#IMAGE#PIC ++ " from " ++
463
XSQL#IMAGE#TABLE ++ " where " ++ XSQL#IMAGE#ID ++ "=" ++
464
"'" ++ ans.records[cou][0] ++ "'"
466
file_operation = MENUSTAT#NORMAL
468
xsql_blob_doc_type(ans.records[cou][1],extension)
470
IF IS_NULL@(extension)
472
DB_CTRL_GRAYED@(dbox,XSQL#FETCH#OPEN,TRUE)
476
DB_CTRL_GRAYED@(dbox,XSQL#FETCH#OPEN,FALSE)
479
ELSE IF exiter = XSQL#FETCH#SEARCH
481
list = xsql_exec_fetch_query(sqlp.channel,ans,
483
DB_CTRL_STRINGS@(dbox,XSQL#FETCH#LIST,list)
484
DB_CTRL_VALUE@(dbox,XSQL#FETCH#LIST,0)
485
DB_CTRL_GRAYED@(dbox,XSQL#FETCH#OPEN,TRUE)
490
IF NOT IS_NULL@(sqlp.channel)
491
sql_disconnect(sqlp.channel)
495
FUNCTION xsql_blob_doc_type(pathname,ext)
501
def = "\\i(file-16x16)"
504
PARSE_PATHNAME@(pathname,dir,file)
506
off = STRING_INDEX@(file,".")
510
ext = SUBSTRING@(file,off)
513
RETURN("\\i(5-16x16)")
516
RETURN("\\i(ge-16x16)")
519
RETURN("\\i(dc-16x16)")
522
RETURN("\\i(ss-16x16)")
525
RETURN("\\i(4-16x16)")
528
RETURN("\\i(xsql/voice)")
535
FUNCTION xsql_fetch_doc_menu
542
mainm = xsql_main_menu_opt()
544
file[0] = "Copy...",COPY#MARKED#FIELDS,
545
"F4",NULL,NULL,NULL,NULL,NULL,"C"
547
file[1] = "Move...",EDIT#CUT#CMD,
548
"F3",NULL,NULL,NULL,NULL,NULL,"M"
550
file[2] = "Delete...",EDIT#DEL#CMD,
551
"^D",NULL,NULL,NULL,NULL,NULL,"D"
553
file[3] = "Exit",EXIT#FUNC,
554
"^E",NULL,NULL,NULL,NULL,NULL,"E"
556
order_by[0] = "Name Ascending",FETCH#NAME#ASC,
557
NULL,NULL,NULL,NULL,NULL,NULL,"N"
559
order_by[1] = "Name Descending",FETCH#NAME#DESC,
560
NULL,NULL,NULL,NULL,NULL,NULL,"m"
562
order_by[2] = "Date Ascending",FETCH#DATE#ASC,
563
NULL,NULL,NULL,NULL,NULL,NULL,"t"
565
order_by[3] = "Date Descending",FETCH#DATE#DESC,
566
NULL,NULL,NULL,NULL,NULL,NULL,"e"
568
view[0] = "Id",FETCH#VIEW#ID,
569
NULL,NULL,NULL,NULL,NULL,NULL,"I"
571
view[1] = "Filename",FETCH#VIEW#FNAME,
572
NULL,NULL,NULL,NULL,NULL,NULL,"F"
574
view[2] = "Host",FETCH#VIEW#HOST,
575
NULL,NULL,NULL,NULL,NULL,NULL,"H"
577
view[3] = "Date",FETCH#VIEW#DATE,
578
NULL,NULL,NULL,NULL,NULL,NULL,"e"
580
view[4] = "Owner",FETCH#VIEW#OWNER,
581
NULL,NULL,NULL,NULL,NULL,NULL,"O"
583
view[5] = "Size",FETCH#VIEW#SIZE,
584
NULL,NULL,NULL,NULL,NULL,NULL,"S"
586
menu_bar[0] = "*",mainm
588
menu_bar[1] = "File",file,
589
NULL,NULL,NULL,NULL,NULL,NULL,"F"
591
menu_bar[2] = "View",view,
592
NULL,NULL,NULL,NULL,NULL,NULL,"V"
594
menu_bar[3] = "Order By",order_by,
595
NULL,NULL,NULL,NULL,NULL,NULL,"O"
601
FUNCTION xsql_exec_fetch_query(channel,FORMAT sql ans,cmd)
607
sql_write(channel,cmd)
608
ans = sql_read(channel,-1)
611
INFO_MESSAGE@(ans.errstr ++ "\n\n" ++ ans.errcmd)
616
raw_list = xsql_create_output(NULL,NULL,TRUE,ans)
618
list[0] = "\\i(xsql/emt-16x16)" ++ raw_list[0]
619
FOR cou=0 TO (ARRAY_SIZE@(ans.records)-1)
620
list[cou + 1] = xsql_blob_doc_type(ans.records[cou][1],
621
extension) ++ raw_list[cou + 1]