;; NAME:
;;
;; 	dbService.pro
;;
;; AUTHOR:
;;  Gopakumar Padmanabhan (Gopa)
;;
;; PURPOSE:
;;	IDL functions for accessing the SEC Data Bridge Service
;;
;; COPYRIGHT:
;;  NOAA-SEC
;;
;; MODIFICATION HISTORY:
;;	Written Sept, 2002 Gopakumar Padmanabhan (GKP)
;;


;; FUNCTION: LIB_NAME
;;		returns the correct shared library name
;;
FUNCTION LIB_NAME,name_arg
    name = name_arg
    ON_ERROR,2
    prefix = ''
    CASE !VERSION.OS_FAMILY OF
    'unix'  :BEGIN
         CASE !VERSION.OS OF
         'hp-ux': lib_ext = 'sl'
         'AIX': begin
            ;AIX won't find a shared lib in the current dir
            ; unless the name is preceded with a ./
            lib_ext = 'a'
            prefix = './'
          end
	 'sunos': begin
	    lib_ext = 'so'
	    if (!version.memory_bits eq 64) then name = name + '_64'
	  end
         else: lib_ext = 'so'
         ENDCASE
    END
    'vms'   :  lib_ext = 'EXE'
    'Windows' : lib_ext = 'DLL'
    'MacOS' : lib_ext = 'shlb'
    ELSE: MESSAGE,"Don't know what to do with: " + !VERSION.OS_FAMILY
    ENDCASE
    return,prefix + name + '.' + lib_ext
END

;; FUNCTION: DBSInit
;;		Initializes connection to SEC Data Bridge Service
;;		using configuration in the XML file:'configFileName'
;;
;; RETURN VALUE:
;;		0 : connect OK
;;		1 : failure
FUNCTION DBSInit,configFileName
    ON_ERROR,2
	retVal = 0
	IF (CALL_EXTERNAL(lib_name('dbSrvClientDLL'),'CLIB_DBSInit',/PORTABLE,$
                     configFileName) EQ 0) then BEGIN
		retVal = 0
	ENDIF ELSE BEGIN
		MESSAGE,'DataBridge Service connection failed'
		retVal = 1
	ENDELSE
    return, retVal
END


;; FUNCTION: assignStructFromCDFString
;;		Assigns a structure from a comma delimited string
;;
;; RETURN VALUE:
;;		Assigned structure
;; AUTHOR:
;;  Gopakumar Padmanabhan (Gopa)
;;
;; MODIFICATION HISTORY:
;;	Written Sept, 2002 Gopakumar Padmanabhan (GKP)


FUNCTION assignStructFromCDFString, structA, cdfStr
	ON_ERROR,2

	;; split the array on delimiter
	arr1 = strtok(cdfStr, ",", /extract, /preserve_null)
	arrSize = size(arr1, /structure)
	tags = tag_names(structA)
	IF(n_tags(structA) NE arrSize.N_ELEMENTS) THEN BEGIN
		MESSAGE, 'structure / CDF string data size mismatch, struct:' $
			+ STRING(n_tags(structA)) + ', cdf:' + STRING(arrSize.N_ELEMENTS)
	ENDIF

	FOR i = 0, n_tags(structA) - 1 DO BEGIN
		varType = size(structA.(i), /structure)
		;; print, varType.type
		CASE varType.type OF
			(1 or 2 or 12 or 13) : structA.(i) = FIX(arr1[i])
			(4 or 5) : structA.(i) = FLOAT(arr1[i])
			ELSE: structA.(i) = arr1[i]
		ENDCASE
	ENDFOR
	RETURN, structA
END

;; FUNCTION: DBSShutdown
;;		Closes connection to SEC Data Bridge Service
;;
;; RETURN VALUE:
;;		0 : connect OK
;;		1 : failure
FUNCTION DBSShutdown
    ON_ERROR,2
	retVal = 0
	IF (CALL_EXTERNAL(lib_name('dbSrvClientDLL'),'CLIB_DBSShutdown',/PORTABLE $
                     ) EQ 0) then BEGIN
		retVal = 0
	ENDIF ELSE BEGIN
		MESSAGE,'DataBridge Service disconnect failed'
		retVal = 1
	ENDELSE
    return, retVal
END

;; FUNCTION: DBS_executeAPI
;;		Executes SECDataBridgeService API 'apiname' and returns data as
;;
;; RETURN VALUE:
;;		Array of Strings
function DBS_executeAPI, apiname, inXML
	ON_ERROR,2

	; set-up return value buffers
	resultSetHandle		= BYTARR(255)
	dataItemMaxSize		= BYTARR(255)
	numDataItems		= BYTARR(255)

	IF (CALL_EXTERNAL(lib_name('dbSrvClientDLL'),'CLIB_DBS_executeAPI', $
		/PORTABLE,apiname, inXML, resultSetHandle, dataItemMaxSize, $
		numDataItems ) EQ 0) then BEGIN
		; PRINT,	'resultSetHandle:' + STRING(resultSetHandle) + $
		;		' dataItemMaxSize:' + STRING(dataItemMaxSize) + $
		;		' numDataItems:' + STRING(numDataItems)
	ENDIF ELSE BEGIN
		MESSAGE,'CLIB_DBS_executeAPI() failed'
	ENDELSE

	retArr = STRARR(FIX(STRING(numDataItems)))

	numDataItemsRemaining	= BYTARR(255)
	data = BYTARR(FIX(STRING(dataItemMaxSize)));

	FOR K = 1, FIX(STRING(numDataItems)) DO BEGIN
		IF (CALL_EXTERNAL(lib_name('dbSrvClientDLL'),'CLIB_DBS_getNext',/PORTABLE,$
                    STRING(resultSetHandle), numDataItemsRemaining, $
					data ) EQ 0) then BEGIN
			; PRINT,	STRING(numDataItemsRemaining) + ':' + STRING(data)
			retArr[K-1] = STRING(data)
		ENDIF ELSE BEGIN
			MESSAGE,'CLIB_DBS_getNext() failed'
		ENDELSE
	ENDFOR

	IF (CALL_EXTERNAL(lib_name('dbSrvClientDLL'),'CLIB_DBS_Close',/PORTABLE,$
                   STRING(resultSetHandle) ) EQ 0) then BEGIN
		; PRINT,	'resultSetHandle:' + STRING(resultSetHandle) + ' closed'
	ENDIF ELSE BEGIN
		MESSAGE,'CLIB_DBS_Close() failed'
	ENDELSE
	arrPtr = ptr_new(retArr)
    return, arrPtr
END

;; Dummy pro to get the file compiled
PRO dbService, ha
;help,ha
END
