X-Git-Url: http://git.kpe.io/?p=clsql.git;a=blobdiff_plain;f=db-odbc%2Fodbc-api.lisp;h=c032fd3ce6fd7ee6c9295444d1b1afc9be4756c6;hp=a15d628f8c3c82120ed7cbf7e91f00ba5f6465b2;hb=53d82f855034e08c128c1f29ac905c0897a01480;hpb=a3e1cd20eec3903790c6e8f126345558904488f4 diff --git a/db-odbc/odbc-api.lisp b/db-odbc/odbc-api.lisp index a15d628..c032fd3 100644 --- a/db-odbc/odbc-api.lisp +++ b/db-odbc/odbc-api.lisp @@ -939,3 +939,34 @@ as possible second argument) to the desired representation of date/time/timestam (defun %list-tables (hstmt) (with-error-handling (:hstmt hstmt) (SQLTables hstmt +null-ptr+ 0 +null-ptr+ 0 +null-ptr+ 0 +null-ptr+ 0))) + +(defun %list-data-sources (henv) + (let ((dsn (allocate-foreign-string (1+ $SQL_MAX_DSN_LENGTH))) + (desc (allocate-foreign-string 256)) + (results nil)) + (unwind-protect + (with-foreign-objects ((dsn-len :short) + (desc-len :short)) + (with-error-handling (:henv henv) + (let ((res + (SQLDataSources henv $SQL_FETCH_FIRST dsn + (1+ $SQL_MAX_DSN_LENGTH) + dsn-len desc 256 desc-len))) + (when (or (eql res $SQL_SUCCESS) + (eql res $SQL_SUCCESS_WITH_INFO)) + (push (convert-from-foreign-string dsn) results)) + + (do ((res (SQLDataSources henv $SQL_FETCH_NEXT dsn + (1+ $SQL_MAX_DSN_LENGTH) + dsn-len desc 256 desc-len) + (SQLDataSources henv $SQL_FETCH_NEXT dsn + (1+ $SQL_MAX_DSN_LENGTH) + dsn-len desc 256 desc-len))) + ((not (or (eql res $SQL_SUCCESS) + (eql res $SQL_SUCCESS_WITH_INFO)))) + (push (convert-from-foreign-string dsn) results))))) + (progn + (free-foreign-object dsn) + (free-foreign-object desc))) + (nreverse results))) +