📄 blobsql.elf
字号:
/* * $Id: blobsql.elf,v 1.1.1.1 2002/04/18 23:42:16 mdejong Exp $ * * Copyright (C) 1997 Cygnus Solutions, Inc. * * Description: * A sample program written in ELF. */INCLUDE "menubar_.am"INCLUDE "sql.h"INCLUDE "xsql.h"INCLUDE "wind.h"INCLUDE "multix.h"DEFINE XSQL#IMAGE#TABLE "xsql_image"DEFINE XSQL#IMAGE#ID "id"DEFINE XSQL#IMAGE#FILE "filename"DEFINE XSQL#IMAGE#HOST "host"DEFINE XSQL#IMAGE#DATE "created"DEFINE XSQL#IMAGE#OWNER "author"DEFINE XSQL#IMAGE#SIZE "length"DEFINE XSQL#IMAGE#PIC "pic"FUNCTION xsql_store_blob(channel,id_val,fname,rdbms_type) VAR bobj VAR cmd VAR bin VAR cou VAR ack VAR FORMAT sql ans VAR date_value VAR host IF NOT (rdbms_type = SQL#ORACLE OR rdbms_type = SQL#SYBASE) { INFO_MESSAGE@("Only Oracle & Sybase are supported") RETURN } host = SHELL_COMMAND@("uname -n") IF rdbms_type = SQL#ORACLE date_value = "SYSDATE" IF rdbms_type = SQL#SYBASE date_value = "'10/10/93'" bobj = READ_BINARY_FILE@(fname) sql_write(channel,"send_blob " ++ BINARY_SIZE@(bobj)) cmd = BINARY_TO_ARRAY@(bobj,ELF_SOCKET_SIZE) FOR cou=0 TO (ARRAY_SIZE@(cmd)-1) bin = ARRAY_TO_BINARY@(cmd[cou]) SOCKET_WRITE_BINARY@(channel,bin) ack = SOCKET_READ_BINARY@(channel,-1,1) ' Acknowledgement NEXT cou ans = sql_read(channel,-1) ' Send blob answer sql_write(channel,"delete from " ++ XSQL#IMAGE#TABLE ++ " where " ++ XSQL#IMAGE#ID ++ "=" ++ id_val) ans = sql_read(channel,-1) ' Delete answer sql_write(channel,"insert into " ++ XSQL#IMAGE#TABLE ++ " (" ++ XSQL#IMAGE#ID ++ "," ++ XSQL#IMAGE#FILE ++ "," ++ XSQL#IMAGE#HOST ++ "," ++ XSQL#IMAGE#DATE ++ "," ++ XSQL#IMAGE#OWNER ++ "," ++ XSQL#IMAGE#SIZE ++ ")" ++ " values (" ++ id_val ++ ",'" ++ fname ++ "','" ++ host[0] ++ "'," ++ date_value ++ ",'" ++ xsql_elf_user_name() ++ "' " ++ "," ++ BINARY_SIZE@(bobj) ++ ")") bobj = NULL ' Free it ans = sql_read(channel,-1) ' Insert answer IF ans.errcode <> 0 '[01] INFO_MESSAGE@(ans.errstr ++ "\n\n" ++ ans.errcmd) IF rdbms_type = SQL#ORACLE { sql_write(channel,"update " ++ XSQL#IMAGE#TABLE ++ " set " ++ XSQL#IMAGE#PIC ++ "=:" ++ XSQL#IMAGE#PIC ++ " where " ++ XSQL#IMAGE#ID ++ "=" ++ id_val) } IF rdbms_type = SQL#SYBASE { sql_write(channel,"store_blob " ++ XSQL#IMAGE#TABLE ++ " " ++ XSQL#IMAGE#PIC ++ " " ++ XSQL#IMAGE#ID ++ " " ++ id_val) } ans = sql_read(channel,-1) ' Update answer IF ans.errcode <> 0 INFO_MESSAGE@(ans.errstr ++ "\n\n" ++ ans.errcmd) ELSE { sql_write(channel,"commit") ans = sql_read(channel,-1) INFO_MESSAGE@("Image Saved") }ENDMACROFUNCTION xsql_store_file VAR FORMAT sql_pars sqlp VAR pathname VAR dir VAR file VAR off ON ERROR { ERROR_BOX@() GOTO quit } pathname = OPEN_PROMPT@(NULL,NULL,"*", "Store file into RDBMS") IF pathname = "" EXIT@() PARSE_PATHNAME@(pathname,dir,file) off = STRING_INDEX@(file,".") IF off > 0 file = SUBSTRING@(file,1,off - 1) sqlp = sql_connect(FALSE) xsql_store_blob(sqlp.channel, "'" ++ file ++ "'",pathname,sqlp.rdbms_type)quit: IF NOT IS_NULL@(sqlp.channel) sql_disconnect(sqlp.channel)ENDMACRODEFINE XSQL#FETCH#LIST "id_list"DEFINE XSQL#FETCH#OPEN "open"DEFINE XSQL#FETCH#SEARCH "search"/* * Menu events */DEFINE FETCH#NAME#ASC "name_asc"DEFINE FETCH#NAME#DESC "name_desc"DEFINE FETCH#DATE#ASC "date_asc"DEFINE FETCH#DATE#DESC "date_desc"DEFINE FETCH#VIEW#ID "view_id"DEFINE FETCH#VIEW#FNAME "view_fname"DEFINE FETCH#VIEW#HOST "view_host"DEFINE FETCH#VIEW#DATE "view_date"DEFINE FETCH#VIEW#OWNER "view_owner"DEFINE FETCH#VIEW#SIZE "view_size"FUNCTION xsql_fetch_file VAR FORMAT sql_pars sqlp VAR FORMAT sql ans VAR FORMAT sql blb VAR file VAR dbox VAR cou VAR exiter VAR extension VAR id VAR cmd VAR menu_str VAR list VAR file_operation VAR order_field VAR fetch_name_asc VAR fetch_name_desc VAR fetch_date_asc VAR fetch_date_desc VAR fetch_cmd VAR fetch_query VAR update_flag ON ERROR { ERROR_BOX@() GOTO quit } order_field = XSQL#IMAGE#ID file_operation = MENUSTAT#DIMMED sqlp = sql_connect(FALSE) fetch_query = "select " ++ XSQL#IMAGE#ID ++ "," ++ XSQL#IMAGE#FILE ++ "," ++ XSQL#IMAGE#HOST ++ "," ++ XSQL#IMAGE#DATE ++ "," ++ XSQL#IMAGE#OWNER ++ "," ++ XSQL#IMAGE#SIZE ++ " from " ++ XSQL#IMAGE#TABLE ++ " order by " ++ order_field dbox = DB_LOAD@("xsql/fetch_file") menu_str = xsql_fetch_doc_menu() SET_SELECTIONS@(SQL#MENU#ID,menu_str) DB_MENU_BAR@(dbox,SQL#MENU#ID) DB_ICON@(dbox,XSQL#BITMAP) DB_OWNERLESS@(dbox,TRUE) DB_CTRL_HORIZ_SCROLL@(dbox,XSQL#FETCH#LIST,TRUE) DB_CTRL_PICK_DEFAULT@(dbox,XSQL#FETCH#LIST,TRUE) DB_CTRL_MONOSPACE@(dbox,XSQL#FETCH#LIST,TRUE) DB_CTRL_RETURN_ON_CHANGE@(dbox,XSQL#FETCH#LIST,TRUE) list = xsql_exec_fetch_query(sqlp.channel,ans,fetch_query) DB_CTRL_STRINGS@(dbox,XSQL#FETCH#LIST,list) DB_CTRL_VALUE@(dbox,XSQL#FETCH#LIST,0) DB_WINDOW_REMAIN@(dbox,TRUE) DB_CTRL_DEFAULT_BUTTON@(dbox,XSQL#FETCH#OPEN,TRUE) DB_CTRL_GRAYED@(dbox,XSQL#FETCH#OPEN,TRUE) fetch_name_asc = MENUSTAT#RADIO_ON fetch_name_desc = MENUSTAT#RADIO_OFF fetch_date_asc = MENUSTAT#RADIO_OFF fetch_date_desc = MENUSTAT#RADIO_OFF DB_MENU_STATUS@(dbox,FETCH#VIEW#ID,MENUSTAT#TOGGLE_ON) DB_MENU_STATUS@(dbox,FETCH#VIEW#FNAME,MENUSTAT#TOGGLE_ON) DB_MENU_STATUS@(dbox,FETCH#VIEW#HOST,MENUSTAT#TOGGLE_ON) DB_MENU_STATUS@(dbox,FETCH#VIEW#DATE,MENUSTAT#TOGGLE_ON) DB_MENU_STATUS@(dbox,FETCH#VIEW#OWNER,MENUSTAT#TOGGLE_ON) DB_MENU_STATUS@(dbox,FETCH#VIEW#SIZE,MENUSTAT#TOGGLE_ON)again: DB_MENU_STATUS@(dbox,FETCH#NAME#ASC,fetch_name_asc) DB_MENU_STATUS@(dbox,FETCH#NAME#DESC,fetch_name_desc) DB_MENU_STATUS@(dbox,FETCH#DATE#ASC,fetch_date_asc) DB_MENU_STATUS@(dbox,FETCH#DATE#DESC,fetch_date_desc) DB_MENU_STATUS@(dbox,COPY#MARKED#FIELDS,file_operation) DB_MENU_STATUS@(dbox,EDIT#CUT#CMD,file_operation) DB_MENU_STATUS@(dbox,EDIT#DEL#CMD,file_operation) DB_DISPLAY@(dbox) DB_MENU_STATUS@(dbox,FETCH#DATE#ASC,MENUSTAT#RADIO_ON) exiter = DB_EXIT_CTRL@(dbox) IF exiter = MENU#EV { cmd = DB_MENU_BAR_WORD@(dbox) IF cmd = START#WP { NEW_TASK@("WP_APPLICATION_DLG@") GOTO again } ELSE IF cmd = START#GR { NEW_TASK@("GR_APPLICATION_DLG@") GOTO again } ELSE IF cmd = START#SS { NEW_TASK@("SS_APPLICATION_DLG@") GOTO again } ELSE IF cmd = START#INBOX { NEW_TASK@("INBOX_DLG@") GOTO again } ELSE IF cmd = START#MAIL { NEW_TASK@("MAIL_DLG@") GOTO again } ELSE IF cmd = START#DD { NEW_TASK@("DD_DIRECTORY_DISPLAY@") GOTO again } ELSE IF cmd = START#ME { NEW_TASK@("ME_APPLICATION_DLG@") GOTO again } ELSE IF cmd = START#MAIN { NEW_TASK@("MAIN_DBOX@") GOTO again } ELSE IF cmd = RUN#MACRO { NEW_TASK@("RUN_MACRO_DLG@") GOTO again } ELSE IF cmd = CUST#LOOK#FEEL { NEW_TASK@("X_PREFS_DLG@") GOTO again } ELSE IF cmd = CUST#MENU#BAR { file = USER_DIR@() ++ "/" ++ FETCH#SQL#MB cmd = NULL cmd[0] = FETCH#SQL#MB WRITE_DATA_FILE@(file,menu_str) PEND_FOR_NEW_TASK@("xsql_customize",cmd) menu_str = READ_DATA_FILE@(cmd) SET_SELECTIONS@(SQL#MENU#ID,menu_str) DB_MENU_BAR@(dbox,SQL#MENU#ID) GOTO again } ELSE IF cmd = START#ISQL { cmd = sqlp.host,sqlp.rdbms_name,sqlp.rdbms_type, sqlp.user,sqlp.passwd NEW_TASK@("ISQL",cmd) GOTO again } ELSE IF cmd = START#SQL#RUN#FORM { cmd = NULL cmd[1] = CREATE_TEMP_FILE@("/tmp/xsql-frm%%%%%%") WRITE_DATA_FILE@(cmd[1],sqlp) NEW_TASK@("sqlrunform",cmd) GOTO again } ELSE IF cmd = START#SQL#FORMS { cmd = sqlp.host,sqlp.rdbms_name,sqlp.rdbms_type, sqlp.user,sqlp.passwd NEW_TASK@("SQLFORMS",cmd) GOTO again } ELSE IF cmd = EXIT#FUNC { IF update_flag = TRUE { cmd = YES_NO_CANCEL_PROMPT@("Do you want to save your changes ?") IF IS_NULL@(cmd) GOTO again IF cmd = TRUE { sql_write(sqlp.channel,"commit") ans = sql_read(sqlp.channel,-1) } } GOTO quit } ELSE IF cmd = COPY#MARKED#FIELDS OR cmd = EDIT#DEL#CMD OR cmd = EDIT#CUT#CMD { cou = DB_CTRL_GET_VALUE@(dbox,XSQL#FETCH#LIST) - 1 IF cmd = COPY#MARKED#FIELDS OR cmd = EDIT#CUT#CMD { sql_write(sqlp.channel,fetch_cmd) blb = sql_read(sqlp.channel,-1) IF blb.errcode <> 0 { INFO_MESSAGE@(blb.errstr) GOTO again } xsql_save_file_as(ans.records[cou][1], blb.records[0][0],NULL,2) } IF cmd = EDIT#DEL#CMD OR cmd = EDIT#CUT#CMD { sql_write(sqlp.channel,"delete from " ++ XSQL#IMAGE#TABLE ++ " where " ++ XSQL#IMAGE#ID ++ "='" ++ ans.records[cou][0] ++ "'") blb = sql_read(sqlp.channel,-1) ' Delete answer IF blb.errcode <> 0 INFO_MESSAGE@(blb.errstr) ELSE { update_flag = TRUE list = xsql_exec_fetch_query(sqlp.channel,ans, fetch_query) DB_CTRL_STRINGS@(dbox,XSQL#FETCH#LIST,list) DB_CTRL_VALUE@(dbox,XSQL#FETCH#LIST,0) DB_CTRL_GRAYED@(dbox,XSQL#FETCH#OPEN,TRUE) } } }/* ELSE IF cmd FETCH#NAME#ASC DB_MENU_STATUS@(dbox,FETCH#NAME#ASC,fetch_name_asc) DB_MENU_STATUS@(dbox,FETCH#NAME#DESC,fetch_name_desc) DB_MENU_STATUS@(dbox,FETCH#DATE#ASC,fetch_date_asc) DB_MENU_STATUS@(dbox,FETCH#DATE#DESC,fetch_date_desc)' ELSE IF cmd = EXIT#FUNC*/ } ELSE IF exiter = XSQL#FETCH#OPEN { cou = DB_CTRL_GET_VALUE@(dbox,XSQL#FETCH#LIST) - 1 IF sqlp.rdbms_type = SQL#SYBASE { sql_write(sqlp.channel,"set TEXTSIZE 1000000") blb = sql_read(sqlp.channel,-1) } sql_write(sqlp.channel,fetch_cmd) blb = sql_read(sqlp.channel,-1) IF blb.errcode <> 0 { INFO_MESSAGE@(blb.errstr) GOTO again } xsql_blob_doc_type(ans.records[cou][1],extension) IF NOT IS_NULL@(extension) { file = CREATE_TEMP_FILE@("/tmp/" ++ SUBSTRING@(ans.records[cou][0],1,5) ++ "%%%%%%" ++ extension) WRITE_BINARY_FILE@(file,blb.records[0][0]) IF extension = ".im" { GR_APPLICATION_DLG@() GR_REVERT@() GR_SET_FOR_IMPORT@() GE_PASTE_IM@(file) } ELSE { OPEN_DOC@(file) } } } ELSE IF exiter = XSQL#FETCH#LIST { cou = DB_CTRL_GET_VALUE@(dbox,XSQL#FETCH#LIST) - 1 IF IS_NULL@(cou) OR cou < 0 { DB_CTRL_GRAYED@(dbox,XSQL#FETCH#OPEN,TRUE) file_operation = MENUSTAT#DIMMED GOTO again } fetch_cmd = "fetch_blob select " ++ XSQL#IMAGE#PIC ++ " from " ++ XSQL#IMAGE#TABLE ++ " where " ++ XSQL#IMAGE#ID ++ "=" ++ "'" ++ ans.records[cou][0] ++ "'" file_operation = MENUSTAT#NORMAL xsql_blob_doc_type(ans.records[cou][1],extension) IF IS_NULL@(extension) { DB_CTRL_GRAYED@(dbox,XSQL#FETCH#OPEN,TRUE) } ELSE { DB_CTRL_GRAYED@(dbox,XSQL#FETCH#OPEN,FALSE) } } ELSE IF exiter = XSQL#FETCH#SEARCH { list = xsql_exec_fetch_query(sqlp.channel,ans, fetch_query) DB_CTRL_STRINGS@(dbox,XSQL#FETCH#LIST,list) DB_CTRL_VALUE@(dbox,XSQL#FETCH#LIST,0) DB_CTRL_GRAYED@(dbox,XSQL#FETCH#OPEN,TRUE) } GOTO againquit: IF NOT IS_NULL@(sqlp.channel) sql_disconnect(sqlp.channel)ENDMACROFUNCTION xsql_blob_doc_type(pathname,ext) VAR dir VAR file VAR def VAR off def = "\\i(file-16x16)" ext = NULL PARSE_PATHNAME@(pathname,dir,file) off = STRING_INDEX@(file,".") IF off = 0 RETURN(def) ext = SUBSTRING@(file,off) IF ext = ".im" RETURN("\\i(5-16x16)") IF ext = ".ag" RETURN("\\i(ge-16x16)") IF ext = ".aw" RETURN("\\i(dc-16x16)") IF ext = ".as" RETURN("\\i(ss-16x16)") IF ext = ".am" RETURN("\\i(4-16x16)") IF ext = ".au" RETURN("\\i(xsql/voice)") ext = NULL RETURN(def)ENDMACROFUNCTION xsql_fetch_doc_menu VAR file VAR mainm VAR menu_bar VAR view VAR order_by mainm = xsql_main_menu_opt() file[0] = "Copy...",COPY#MARKED#FIELDS, "F4",NULL,NULL,NULL,NULL,NULL,"C" file[1] = "Move...",EDIT#CUT#CMD, "F3",NULL,NULL,NULL,NULL,NULL,"M" file[2] = "Delete...",EDIT#DEL#CMD, "^D",NULL,NULL,NULL,NULL,NULL,"D" file[3] = "Exit",EXIT#FUNC, "^E",NULL,NULL,NULL,NULL,NULL,"E" order_by[0] = "Name Ascending",FETCH#NAME#ASC, NULL,NULL,NULL,NULL,NULL,NULL,"N" order_by[1] = "Name Descending",FETCH#NAME#DESC, NULL,NULL,NULL,NULL,NULL,NULL,"m" order_by[2] = "Date Ascending",FETCH#DATE#ASC, NULL,NULL,NULL,NULL,NULL,NULL,"t" order_by[3] = "Date Descending",FETCH#DATE#DESC, NULL,NULL,NULL,NULL,NULL,NULL,"e" view[0] = "Id",FETCH#VIEW#ID, NULL,NULL,NULL,NULL,NULL,NULL,"I" view[1] = "Filename",FETCH#VIEW#FNAME, NULL,NULL,NULL,NULL,NULL,NULL,"F" view[2] = "Host",FETCH#VIEW#HOST, NULL,NULL,NULL,NULL,NULL,NULL,"H" view[3] = "Date",FETCH#VIEW#DATE, NULL,NULL,NULL,NULL,NULL,NULL,"e" view[4] = "Owner",FETCH#VIEW#OWNER, NULL,NULL,NULL,NULL,NULL,NULL,"O" view[5] = "Size",FETCH#VIEW#SIZE, NULL,NULL,NULL,NULL,NULL,NULL,"S" menu_bar[0] = "*",mainm menu_bar[1] = "File",file, NULL,NULL,NULL,NULL,NULL,NULL,"F" menu_bar[2] = "View",view, NULL,NULL,NULL,NULL,NULL,NULL,"V" menu_bar[3] = "Order By",order_by, NULL,NULL,NULL,NULL,NULL,NULL,"O" RETURN(menu_bar)ENDMACROFUNCTION xsql_exec_fetch_query(channel,FORMAT sql ans,cmd) VAR list VAR raw_list VAR cou VAR extension sql_write(channel,cmd) ans = sql_read(channel,-1) IF ans.errcode <> 0 { INFO_MESSAGE@(ans.errstr ++ "\n\n" ++ ans.errcmd) list[0] = NULL RETURN(list) } raw_list = xsql_create_output(NULL,NULL,TRUE,ans) list[0] = "\\i(xsql/emt-16x16)" ++ raw_list[0] FOR cou=0 TO (ARRAY_SIZE@(ans.records)-1) list[cou + 1] = xsql_blob_doc_type(ans.records[cou][1], extension) ++ raw_list[cou + 1] NEXT cou RETURN(list)ENDMACRO
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -