@@ -40,53 +40,62 @@ if [ ! -f "$ODBC_64BIT" ]; then
4040 exit 1
4141fi
4242
43- case " $( uname) " in
44- Linux)
45- SYSTEM_ODBCINST_FILE=" /etc/odbcinst.ini"
46- ;;
47- * )
48- # macOS
49- SYSTEM_ODBCINST_FILE=" /Library/ODBC/odbcinst.ini"
50- mkdir -p /Library/ODBC
51- ;;
52- esac
53-
5443DRIVER_NAME=" Apache Arrow Flight SQL ODBC Driver"
5544
56- touch " $SYSTEM_ODBCINST_FILE "
45+ if [ " $( uname) " = " Darwin" ]; then
46+ # macOS uses iODBC, which reads from /Library/ODBC/odbcinst.ini.
47+ # odbcinst targets a different odbcinst.ini, so we need edit the correct file directly.
48+ SYSTEM_ODBCINST_FILE=" /Library/ODBC/odbcinst.ini"
49+ mkdir -p /Library/ODBC
50+ touch " $SYSTEM_ODBCINST_FILE "
51+
52+ if grep -q " ^\[$DRIVER_NAME \]" " $SYSTEM_ODBCINST_FILE " ; then
53+ echo " Driver [$DRIVER_NAME ] already exists in odbcinst.ini"
54+ else
55+ echo " Adding [$DRIVER_NAME ] to odbcinst.ini..."
56+ printf ' \n[%s]\nDescription=An ODBC Driver for Apache Arrow Flight SQL\nDriver=%s\n' \
57+ " $DRIVER_NAME " " $ODBC_64BIT " >> " $SYSTEM_ODBCINST_FILE "
58+ fi
5759
58- if grep -q " ^\[$DRIVER_NAME \]" " $SYSTEM_ODBCINST_FILE " ; then
59- echo " Driver [$DRIVER_NAME ] already exists in odbcinst.ini"
60+ if grep -q ' ^\[ODBC Drivers\]' " $SYSTEM_ODBCINST_FILE " ; then
61+ if ! grep -q " ^${DRIVER_NAME} =" " $SYSTEM_ODBCINST_FILE " ; then
62+ awk -v driver=" $DRIVER_NAME " '
63+ $0 ~ /^\[ODBC Drivers\]/ && !inserted {
64+ print
65+ print driver "=Installed"
66+ inserted=1
67+ next
68+ }
69+ { print }
70+ ' " $SYSTEM_ODBCINST_FILE " > " ${SYSTEM_ODBCINST_FILE} .tmp" && mv " ${SYSTEM_ODBCINST_FILE} .tmp" " $SYSTEM_ODBCINST_FILE "
71+ fi
72+ else
73+ {
74+ echo " "
75+ echo " [ODBC Drivers]"
76+ echo " ${DRIVER_NAME} =Installed"
77+ } >> " $SYSTEM_ODBCINST_FILE "
78+ fi
6079else
61- echo " Adding [$DRIVER_NAME ] to odbcinst.ini..."
62- echo "
80+ # Linux uses unixODBC.
81+ # Register the driver via odbcinst rather than editing /etc/odbcinst.ini directly.
82+ if ! command -v odbcinst > /dev/null 2>&1 ; then
83+ echo " error: odbcinst not found. Please install unixODBC first."
84+ exit 1
85+ fi
86+
87+ TEMPLATE_FILE=$( mktemp /tmp/arrow_odbc_XXXXXX.ini)
88+ trap ' rm -f "$TEMPLATE_FILE"' EXIT
89+
90+ cat > " $TEMPLATE_FILE " << EOF
91+ [ODBC Drivers]
92+ ${DRIVER_NAME} =Installed
93+
6394[$DRIVER_NAME ]
6495Description=An ODBC Driver for Apache Arrow Flight SQL
6596Driver=$ODBC_64BIT
66- " >> " $SYSTEM_ODBCINST_FILE "
67- fi
97+ EOF
6898
69- # Check if [ODBC Drivers] section exists
70- if grep -q ' ^\[ODBC Drivers\]' " $SYSTEM_ODBCINST_FILE " ; then
71- # Section exists: check if driver entry exists
72- if ! grep -q " ^${DRIVER_NAME} =" " $SYSTEM_ODBCINST_FILE " ; then
73- # Driver entry does not exist, add under [ODBC Drivers]
74-
75- awk -v driver=" $DRIVER_NAME " '
76- $0 ~ /^\[ODBC Drivers\]/ && !inserted {
77- print
78- print driver "=Installed"
79- inserted=1
80- next
81- }
82- { print }
83- ' " $SYSTEM_ODBCINST_FILE " > " ${SYSTEM_ODBCINST_FILE} .tmp" && mv " ${SYSTEM_ODBCINST_FILE} .tmp" " $SYSTEM_ODBCINST_FILE "
84- fi
85- else
86- # Section doesn't exist, append both section and driver entry at end
87- {
88- echo " "
89- echo " [ODBC Drivers]"
90- echo " ${DRIVER_NAME} =Installed"
91- } >> " $SYSTEM_ODBCINST_FILE "
99+ echo " Registering [$DRIVER_NAME ] via odbcinst..."
100+ odbcinst -i -d -f " $TEMPLATE_FILE "
92101fi
0 commit comments