Get Oracle TNS Connection Names

From NSIS Wiki
Jump to navigationJump to search
Author: Iceman_K (talk, contrib)


Required Functions: GetDefaultOracleHomePath Trim

The Script

;
; Returns the list of Oracle TNS Connection Names separated by the 
; pipe ("|") symbol, suitable for setting the ListItems attribute 
; in an InstallOptions DropList.
;
; Requires: GetDefaultOracleHomePath
; Requires: Trim
;
; Usage:
;
;    Call GetOracleConnections
;    Pop $0
;
 
Function GetOracleConnections
    ClearErrors
    Push $R1 ;The connection list
    Push $R2 ;Line read from tnsnames.ora
    Push $R3 ;File handle
    Push $R4 ;Flag indicating whether connection name has been captured
    Push $R5 ;Parentheses count
    Push $R6 ;Current connection name
    Push $R7 ;Character being currently processed
    Push $R8 ;Temp var
 
    StrCpy $R1 ""
    Call GetOracleDefaultHomePath
    Pop $R2
    StrCmp $R2 "" done
 
    ; The path of the TNS names file
    StrCpy $R2 "$R2\network\admin\tnsnames.ora"
 
    ; Open the TNS names file
    StrCpy $R3 ""
    FileOpen $R3 $R2 "r"
    StrCmp $R3 "" fileerror
    ClearErrors
    StrCpy $R1 ""
reset:
    ; Reset variables
    StrCpy $R4 "0"
    StrCpy $R5 "0"
    StrCpy $R6 ""
read:
    ; Read a line from the file
    FileRead $R3 $R2
    StrCmp $R2 "" 0 loop
    IfErrors closefile read
 
    ; Loop through the characters in the line just read
loop:
    StrCpy $R7 $R2 1
    StrCmp $R7 "" read
    StrCpy $R2 $R2 "" 1
    StrCmp $R7 "#" comment
    StrCmp $R7 " " whitespace
    StrCmp $R7 "    " whitespace
    StrCmp $R7 "$\r" whitespace
    StrCmp $R7 "$\n" whitespace
    StrCmp $R7 "(" openparen
    StrCmp $R7 ")" closeparen
    StrCmp $R7 "=" equal
    StrCmp $R4 "1" loop
append:
    StrCmp $R6 "" blank
    StrCpy $R8 $R6 1 -1
    StrCmp $R8 " " syntaxerror
    StrCmp $R8 "    " syntaxerror
    StrCmp $R8 "$\r" syntaxerror
    StrCmp $R8 "$\n" syntaxerror
blank:
    StrCpy $R6 "$R6$R7"
    GoTo loop
comment:
    StrCmp $R6 "" read
    StrCmp $R4 "1" read syntaxerror
whitespace:
    StrCmp $R6 "" loop
    StrCmp $R4 "1" loop append
equal:
    StrCmp $R4 "1" loop
    StrCpy $R4 "1"
    GoTo loop
openparen:
    StrCmp $R4 "1" 0 syntaxerror
    IntOp $R5 $R5 + 1
    GoTo loop
closeparen:
    StrCmp $R4 "1" 0 syntaxerror
    IntOp $R5 $R5 - 1
    IntCmp $R5 0 0 syntaxerror loop
    Push $R1
    Call Trim
    Pop $R1
    StrCmp $R1 "" +2
    StrCpy $R1 "$R1|"
    StrCpy $R1 "$R1$R6"
    GoTo reset
closefile:
    FileClose $R3
    GoTo done
fileerror:
    MessageBox MB_OK "File access error: tnsnames.ora."
    StrCpy $R1 ""
    GoTo done
syntaxerror:
    MessageBox MB_OK "File syntax error: tnsnames.ora."
    StrCpy $R1 ""
    StrCmp $R3 "" +2
    FileClose $R3
done:
    Pop $R8
    Pop $R7
    Pop $R6
    Pop $R5
    Pop $R4
    Pop $R3
    Pop $R2
    Exch $R1
FunctionEnd