From 5f520737e65857a67dee733dbb28e339d9ce9df6 Mon Sep 17 00:00:00 2001 From: Dimitri Fontaine Date: Wed, 7 Jan 2015 22:21:55 +0100 Subject: [PATCH] Improve loading of external libs, fixes #142. Loading external libs at application startup time is not convenient as it forces users to install freetds everywhere even when they don't need it. This patch makes it so that freetds is only loaded when pgloader is asked to load from a MS SQL database source. Note that we could have done the same for SSL if it wasn't possibly used to connect to PostgreSQL, which isn't optional in current pgloader implementation. --- src/hooks.lisp | 27 +++++++++++++++------------ src/parsers/command-mssql.lisp | 4 ++++ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/hooks.lisp b/src/hooks.lisp index 9c949a5..b5c191b 100644 --- a/src/hooks.lisp +++ b/src/hooks.lisp @@ -11,18 +11,21 @@ (in-package #:cl-user) -#+ccl -(progn - (push (lambda () (cffi:close-foreign-library 'CL+SSL::LIBSSL)) - *save-exit-functions*) +(defun close-foreign-libs () + "Close Foreign libs in use by pgloader at application save time." + (let ((sb-ext:*muffled-warnings* 'style-warning)) + (mapc #'cffi:close-foreign-library '(cl+ssl::libssl + mssql::sybdb)))) - (push (lambda () (cffi:load-foreign-library 'CL+SSL::LIBSSL)) - *lisp-startup-functions*)) +(defun open-foreign-libs () + "Open Foreign libs in use by pgloader at application start time." + (let ((sb-ext:*muffled-warnings* 'style-warning)) + ;; we specifically don't load mssql::sybdb eagerly, it's getting loaded + ;; in only when the data source is a MS SQL database. + (cffi:load-foreign-library 'cl+ssl::libssl))) -#+sbcl -(progn - (push (lambda () (cffi:close-foreign-library 'CL+SSL::LIBSSL)) - sb-ext:*save-hooks*) +#+ccl (push #'open-foreign-libs *lisp-startup-functions*) +#+sbcl (push #'open-foreign-libs sb-ext:*save-hooks*) - (push (lambda () (cffi:load-foreign-library 'CL+SSL::LIBSSL)) - sb-ext:*init-hooks*)) +#+ccl (push #'close-foreign-libs *save-exit-functions*) +#+sbcl (push #'close-foreign-libs sb-ext:*init-hooks*) diff --git a/src/parsers/command-mssql.lisp b/src/parsers/command-mssql.lisp index c2efb57..88b0960 100644 --- a/src/parsers/command-mssql.lisp +++ b/src/parsers/command-mssql.lisp @@ -116,6 +116,10 @@ (including) (excluding)) `(lambda () + ;; now is the time to load the CFFI lib we need (freetds) + (let ((sb-ext:*muffled-warnings* 'style-warning)) + (cffi:load-foreign-library 'mssql::sybdb)) + (let* ((state-before (pgloader.utils:make-pgstate)) (*state* (or *state* (pgloader.utils:make-pgstate))) (state-idx (pgloader.utils:make-pgstate))