diff --git a/meta/mm_assigndirectlib.sas b/meta/mm_assigndirectlib.sas index 7ac378f..02139d5 100755 --- a/meta/mm_assigndirectlib.sas +++ b/meta/mm_assigndirectlib.sas @@ -1,461 +1,468 @@ /** - @file - @brief Assigns library directly using details from metadata - @details Queries metadata to get the libname definition then allocates the - library directly (ie, not using the META engine). - usage: + @file + @brief Assigns library directly using details from metadata + @details Queries metadata to get the libname definition then allocates the + library directly (ie, not using the META engine). + usage: - %mm_assignDirectLib(MyLib); - data x; set mylib.sometable; run; + %mm_assignDirectLib(MyLib); + data x; set mylib.sometable; run; - %mm_assignDirectLib(MyDB,open_passthrough=MyAlias); - create table MyTable as - select * from connection to MyAlias( select * from DBTable); - disconnect from MyAlias; - quit; + %mm_assignDirectLib(MyDB,open_passthrough=MyAlias); + create table MyTable as + select * from connection to MyAlias( select * from DBTable); + disconnect from MyAlias; + quit; -

SAS Macros

- @li mf_getengine.sas - @li mp_abort.sas +

SAS Macros

+ @li mf_getengine.sas + @li mp_abort.sas - @param [in] libref the libref (not name) of the metadata library - @param [in] open_passthrough= () Provide an alias to produce the CONNECT TO - statement for the relevant external database - @param [in] sql_options= () Add any options to add to proc sql statement, - eg outobs= (only valid for pass through) - @param [in] mDebug= (0) set to 1 to show debug messages in the log - @param [in] mAbort= (0) set to 1 to call %mp_abort(). + @param [in] libref the libref (not name) of the metadata library + @param [in] open_passthrough= () Provide an alias to produce the CONNECT TO + statement for the relevant external database + @param [in] sql_options= () Add any options to add to proc sql statement, + eg outobs= (only valid for pass through) + @param [in] mDebug= (0) set to 1 to show debug messages in the log + @param [in] mAbort= (0) set to 1 to call %mp_abort(). - @returns libname statement + @returns libname statement - @version 9.2 - @author Allan Bowe + @version 9.2 + @author Allan Bowe -**/ + **/ -%macro mm_assigndirectlib( - libref - ,open_passthrough= - ,sql_options= - ,mDebug=0 - ,mAbort=0 -)/*/STORE SOURCE*/; + %macro mm_assigndirectlib( + libref + ,open_passthrough= + ,sql_options= + ,mDebug=0 + ,mAbort=0 + )/*/STORE SOURCE*/; -%local mD; -%if &mDebug=1 %then %let mD=; -%else %let mD=%str(*); -%&mD.put Executing mm_assigndirectlib.sas; -%&mD.put _local_; + %local mD; + %if &mDebug=1 %then %let mD=; + %else %let mD=%str(*); + %&mD.put Executing mm_assigndirectlib.sas; + %&mD.put _local_; -%if &mAbort=1 %then %let mAbort=; -%else %let mAbort=%str(*); + %if &mAbort=1 %then %let mAbort=; + %else %let mAbort=%str(*); -%&mD.put NOTE: Creating direct (non META) connection to &libref library; + %&mD.put NOTE: Creating direct (non META) connection to &libref library; -%local cur_engine; -%let cur_engine=%mf_getengine(&libref); -%if &cur_engine ne META and &cur_engine ne %then %do; - %put NOTE: &libref already has a direct (&cur_engine) libname connection; - %return; -%end; -%else %if %upcase(&libref)=WORK %then %do; - %put NOTE: We already have a direct connection to WORK :-) ; - %return; -%end; + %local cur_engine; + %let cur_engine=%mf_getengine(&libref); + %if &cur_engine ne META and &cur_engine ne %then %do; + %put NOTE: &libref already has a direct (&cur_engine) libname connection; + %return; + %end; + %else %if %upcase(&libref)=WORK %then %do; + %put NOTE: We already have a direct connection to WORK :-) ; + %return; + %end; -/* need to determine the library ENGINE first */ -%local engine; -data _null_; - length lib_uri engine $256; - call missing (of _all_); - /* get URI for the particular library */ - rc1=metadata_getnobj("omsobj:SASLibrary?@Libref ='&libref'",1,lib_uri); - /* get the Engine attribute of the previous object */ - rc2=metadata_getattr(lib_uri,'Engine',engine); - putlog "mm_assigndirectlib for &libref:" rc1= lib_uri= rc2= engine=; - call symputx("liburi",lib_uri,'l'); - call symputx("engine",engine,'l'); -run; + /* need to determine the library ENGINE first */ + %local engine; + data _null_; + length lib_uri engine $256; + call missing (of _all_); + /* get URI for the particular library */ + rc1=metadata_getnobj("omsobj:SASLibrary?@Libref ='&libref'",1,lib_uri); + /* get the Engine attribute of the previous object */ + rc2=metadata_getattr(lib_uri,'Engine',engine); + putlog "mm_assigndirectlib for &libref:" rc1= lib_uri= rc2= engine=; + call symputx("liburi",lib_uri,'l'); + call symputx("engine",engine,'l'); + run; -/* now obtain engine specific connection details */ -%if &engine=BASE %then %do; - %&mD.put NOTE: Retrieving BASE library path; - data _null_; - length up_uri $256 path cat_path $1024; - retain cat_path; - call missing (of _all_); - /* get all the filepaths of the UsingPackages association */ - i=1; - rc3=metadata_getnasn("&liburi",'UsingPackages',i,up_uri); - do while (rc3>0); - /* get the DirectoryName attribute of the previous object */ - rc4=metadata_getattr(up_uri,'DirectoryName',path); - if i=1 then path = '("'!!trim(path)!!'" '; - else path =' "'!!trim(path)!!'" '; - cat_path = trim(cat_path) !! " " !! trim(path) ; - i+1; - rc3=metadata_getnasn("&liburi",'UsingPackages',i,up_uri); - end; - cat_path = trim(cat_path) !! ")"; - &mD.putlog "NOTE: Getting physical path for &libref library"; - &mD.putlog rc3= up_uri= rc4= cat_path= path=; - &mD.putlog "NOTE: Libname cmd will be:"; - &mD.putlog "libname &libref" cat_path; - call symputx("filepath",cat_path,'l'); - run; + /* now obtain engine specific connection details */ + %if &engine=BASE %then %do; + %&mD.put NOTE: Retrieving BASE library path; + data _null_; + length up_uri $256 path cat_path $1024; + retain cat_path; + call missing (of _all_); + /* get all the filepaths of the UsingPackages association */ + i=1; + rc3=metadata_getnasn("&liburi",'UsingPackages',i,up_uri); + do while (rc3>0); + /* get the DirectoryName attribute of the previous object */ + rc4=metadata_getattr(up_uri,'DirectoryName',path); + if i=1 then path = '("'!!trim(path)!!'" '; + else path =' "'!!trim(path)!!'" '; + cat_path = trim(cat_path) !! " " !! trim(path) ; + i+1; + rc3=metadata_getnasn("&liburi",'UsingPackages',i,up_uri); + end; + cat_path = trim(cat_path) !! ")"; + &mD.putlog "NOTE: Getting physical path for &libref library"; + &mD.putlog rc3= up_uri= rc4= cat_path= path=; + &mD.putlog "NOTE: Libname cmd will be:"; + &mD.putlog "libname &libref" cat_path; + call symputx("filepath",cat_path,'l'); + run; - %if %sysevalf(&sysver<9.4) %then %do; - libname &libref &filepath; - %end; - %else %do; - /* apply the new filelocks option to cater for temporary locks */ - libname &libref &filepath filelockwait=5; - %end; + %if %sysevalf(&sysver<9.4) %then %do; + libname &libref &filepath; + %end; + %else %do; + /* apply the new filelocks option to cater for temporary locks */ + libname &libref &filepath filelockwait=5; + %end; -%end; -%else %if &engine=REMOTE %then %do; - data x; - length rcCon rcProp rc k 3 uriCon uriProp PropertyValue PropertyName - Delimiter $256 properties $2048; - retain properties; - rcCon = metadata_getnasn("&liburi", "LibraryConnection", 1, uriCon); + %end; + %else %if &engine=REMOTE %then %do; + data x; + length rcCon rcProp rc k 3 uriCon uriProp PropertyValue PropertyName + Delimiter $256 properties $2048; + retain properties; + rcCon = metadata_getnasn("&liburi", "LibraryConnection", 1, uriCon); - rcProp = metadata_getnasn(uriCon, "Properties", 1, uriProp); + rcProp = metadata_getnasn(uriCon, "Properties", 1, uriProp); - k = 1; - rcProp = metadata_getnasn(uriCon, "Properties", k, uriProp); - do while (rcProp > 0); - rc = metadata_getattr(uriProp , "DefaultValue",PropertyValue); - rc = metadata_getattr(uriProp , "PropertyName",PropertyName); - rc = metadata_getattr(uriProp , "Delimiter",Delimiter); - properties = trim(properties) !! " " !! trim(PropertyName) - !! trim(Delimiter) !! trim(PropertyValue); - output; - k+1; - rcProp = metadata_getnasn(uriCon, "Properties", k, uriProp); - end; - %&mD.put NOTE: Getting properties for REMOTE SHARE &libref library; - &mD.put _all_; - %&mD.put NOTE: Libname cmd will be:; - %&mD.put libname &libref &engine &properties slibref=&libref; - call symputx ("properties",trim(properties),'l'); - run; + k = 1; + rcProp = metadata_getnasn(uriCon, "Properties", k, uriProp); + do while (rcProp > 0); + rc = metadata_getattr(uriProp , "DefaultValue",PropertyValue); + rc = metadata_getattr(uriProp , "PropertyName",PropertyName); + rc = metadata_getattr(uriProp , "Delimiter",Delimiter); + properties = trim(properties) !! " " !! trim(PropertyName) + !! trim(Delimiter) !! trim(PropertyValue); + output; + k+1; + rcProp = metadata_getnasn(uriCon, "Properties", k, uriProp); + end; + %&mD.put NOTE: Getting properties for REMOTE SHARE &libref library; + &mD.put _all_; + %&mD.put NOTE: Libname cmd will be:; + %&mD.put libname &libref &engine &properties slibref=&libref; + call symputx ("properties",trim(properties),'l'); + run; - libname &libref &engine &properties slibref=&libref; + libname &libref &engine &properties slibref=&libref; -%end; + %end; -%else %if &engine=OLEDB %then %do; - %&mD.put NOTE: Retrieving OLEDB connection details; - data _null_; - length domain datasource provider properties schema - connx_uri domain_uri conprop_uri lib_uri schema_uri value $256.; - call missing (of _all_); - /* get source connection ID */ - rc=metadata_getnasn("&liburi",'LibraryConnection',1,connx_uri); - /* get connection domain */ - rc1=metadata_getnasn(connx_uri,'Domain',1,domain_uri); - rc2=metadata_getattr(domain_uri,'Name',domain); - &mD.putlog / 'NOTE: ' // 'NOTE- connection id: ' connx_uri ; - &mD.putlog 'NOTE- domain: ' domain; - /* get DSN and PROVIDER from connection properties */ - i=0; - do until (rc<0); - i+1; - rc=metadata_getnasn(connx_uri,'Properties',i,conprop_uri); - rc2=metadata_getattr(conprop_uri,'Name',value); - if value='Connection.OLE.Property.DATASOURCE.Name.xmlKey.txt' then do; - rc3=metadata_getattr(conprop_uri,'DefaultValue',datasource); - end; - else if value='Connection.OLE.Property.PROVIDER.Name.xmlKey.txt' then do; - rc4=metadata_getattr(conprop_uri,'DefaultValue',provider); - end; - else if value='Connection.OLE.Property.PROPERTIES.Name.xmlKey.txt' then - do; - rc5=metadata_getattr(conprop_uri,'DefaultValue',properties); - end; - end; - &mD.putlog 'NOTE- dsn/provider/properties: ' / - datasource provider properties; - &mD.putlog 'NOTE- schema: ' schema // 'NOTE-'; + %else %if &engine=OLEDB %then %do; + %&mD.put NOTE: Retrieving OLEDB connection details; + data _null_; + length domain datasource provider properties schema + connx_uri domain_uri conprop_uri lib_uri schema_uri value $256.; + call missing (of _all_); + /* get source connection ID */ + rc=metadata_getnasn("&liburi",'LibraryConnection',1,connx_uri); + /* get connection domain */ + rc1=metadata_getnasn(connx_uri,'Domain',1,domain_uri); + rc2=metadata_getattr(domain_uri,'Name',domain); + &mD.putlog / 'NOTE: ' // 'NOTE- connection id: ' connx_uri ; + &mD.putlog 'NOTE- domain: ' domain; + /* get DSN and PROVIDER from connection properties */ + i=0; + do until (rc<0); + i+1; + rc=metadata_getnasn(connx_uri,'Properties',i,conprop_uri); + rc2=metadata_getattr(conprop_uri,'Name',value); + if value='Connection.OLE.Property.DATASOURCE.Name.xmlKey.txt' then do; + rc3=metadata_getattr(conprop_uri,'DefaultValue',datasource); + end; + else if value='Connection.OLE.Property.PROVIDER.Name.xmlKey.txt' then do; + rc4=metadata_getattr(conprop_uri,'DefaultValue',provider); + end; + else if value='Connection.OLE.Property.PROPERTIES.Name.xmlKey.txt' then + do; + rc5=metadata_getattr(conprop_uri,'DefaultValue',properties); + end; + end; + &mD.putlog 'NOTE- dsn/provider/properties: ' / + datasource provider properties; + &mD.putlog 'NOTE- schema: ' schema // 'NOTE-'; - /* get SCHEMA */ - rc6=metadata_getnasn("&liburi",'UsingPackages',1,lib_uri); - rc7=metadata_getattr(lib_uri,'SchemaName',schema); - call symputx('SQL_domain',domain,'l'); - call symputx('SQL_dsn',datasource,'l'); - call symputx('SQL_provider',provider,'l'); - call symputx('SQL_properties',properties,'l'); - call symputx('SQL_schema',schema,'l'); - run; + /* get SCHEMA */ + rc6=metadata_getnasn("&liburi",'UsingPackages',1,lib_uri); + rc7=metadata_getattr(lib_uri,'SchemaName',schema); + call symputx('SQL_domain',domain,'l'); + call symputx('SQL_dsn',datasource,'l'); + call symputx('SQL_provider',provider,'l'); + call symputx('SQL_properties',properties,'l'); + call symputx('SQL_schema',schema,'l'); + run; - %if %length(&open_passthrough)>0 %then %do; - proc sql &sql_options; - connect to OLEDB as &open_passthrough(INSERT_SQL=YES - /* need additional properties to make this work */ - properties=('Integrated Security'=SSPI - 'Persist Security Info'=True - %sysfunc(compress(%str(&SQL_properties),%str(()))) - ) - DATASOURCE=&sql_dsn PROMPT=NO - PROVIDER=&sql_provider SCHEMA=&sql_schema CONNECTION = GLOBAL); - %end; - %else %do; - LIBNAME &libref OLEDB PROPERTIES=&sql_properties - DATASOURCE=&sql_dsn PROVIDER=&sql_provider SCHEMA=&sql_schema - %if %length(&sql_domain)>0 %then %do; - authdomain="&sql_domain" - %end; - connection=shared; - %end; -%end; -%else %if &engine=ODBC %then %do; - &mD.%put NOTE: Retrieving ODBC connection details; - data _null_; - length connx_uri conprop_uri value datasource up_uri schema $256.; - call missing (of _all_); - /* get source connection ID */ - rc=metadata_getnasn("&liburi",'LibraryConnection',1,connx_uri); - /* get connection properties */ - i=0; - do until (rc2<0); - i+1; - rc2=metadata_getnasn(connx_uri,'Properties',i,conprop_uri); - rc3=metadata_getattr(conprop_uri,'Name',value); - if value='Connection.ODBC.Property.DATASRC.Name.xmlKey.txt' then do; - rc4=metadata_getattr(conprop_uri,'DefaultValue',datasource); - rc2=-1; - end; - end; - /* get SCHEMA */ - rc6=metadata_getnasn("&liburi",'UsingPackages',1,up_uri); - rc7=metadata_getattr(up_uri,'SchemaName',schema); - &mD.put rc= connx_uri= rc2= conprop_uri= rc3= value= rc4= datasource= - rc6= up_uri= rc7= schema=; + %if %length(&open_passthrough)>0 %then %do; + proc sql &sql_options; + connect to OLEDB as &open_passthrough(INSERT_SQL=YES + /* need additional properties to make this work */ + properties=('Integrated Security'=SSPI + 'Persist Security Info'=True + %sysfunc(compress(%str(&SQL_properties),%str(()))) + ) + DATASOURCE=&sql_dsn PROMPT=NO + PROVIDER=&sql_provider SCHEMA=&sql_schema CONNECTION = GLOBAL); + %end; + %else %do; + LIBNAME &libref OLEDB PROPERTIES=&sql_properties + DATASOURCE=&sql_dsn PROVIDER=&sql_provider SCHEMA=&sql_schema + %if %length(&sql_domain)>0 %then %do; + authdomain="&sql_domain" + %end; + connection=shared; + %end; + %end; + %else %if &engine=ODBC %then %do; + &mD.%put NOTE: Retrieving ODBC connection details; + data _null_; + length domprop_uri authdomain connx_uri conprop_uri value datasource up_uri schema $256.; + call missing (of _all_); + /* get source connection ID */ + rc=metadata_getnasn("&liburi",'LibraryConnection',1,connx_uri); + /* get connection properties */ + i=0; + do until (rc2<0); + i+1; + rc2=metadata_getnasn(connx_uri,'Properties',i,conprop_uri); + rc3=metadata_getattr(conprop_uri,'Name',value); + if value='Connection.ODBC.Property.DATASRC.Name.xmlKey.txt' then do; + rc4=metadata_getattr(conprop_uri,'DefaultValue',datasource); + rc2=-1; + end; - call symputx('SQL_schema',schema,'l'); - call symputx('SQL_dsn',datasource,'l'); - run; - - %if %length(&open_passthrough)>0 %then %do; - proc sql &sql_options; - connect to ODBC as &open_passthrough - (INSERT_SQL=YES DATASRC=&sql_dsn. CONNECTION=global); - %end; - %else %do; - libname &libref ODBC DATASRC=&sql_dsn SCHEMA=&sql_schema; - %end; -%end; -%else %if &engine=POSTGRES %then %do; - %put NOTE: Obtaining POSTGRES library details; - data _null_; - length database ignore_read_only_columns direct_exe preserve_col_names - preserve_tab_names server schema authdomain user password - prop name value uri urisrc $256.; - call missing (of _all_); - /* get database value */ - prop='Connection.DBMS.Property.DB.Name.xmlKey.txt'; - rc=metadata_getprop("&liburi",prop,database,""); - if database^='' then database='database='!!quote(trim(database)); - call symputx('database',database,'l'); - - /* get IGNORE_READ_ONLY_COLUMNS value */ - prop='Library.DBMS.Property.DBIROC.Name.xmlKey.txt'; - rc=metadata_getprop("&liburi",prop,ignore_read_only_columns,""); - if ignore_read_only_columns^='' then ignore_read_only_columns= - 'ignore_read_only_columns='!!ignore_read_only_columns; - call symputx('ignore_read_only_columns',ignore_read_only_columns,'l'); - - /* get DIRECT_EXE value */ - prop='Library.DBMS.Property.DirectExe.Name.xmlKey.txt'; - rc=metadata_getprop("&liburi",prop,direct_exe,""); - if direct_exe^='' then direct_exe='direct_exe='!!direct_exe; - call symputx('direct_exe',direct_exe,'l'); - - /* get PRESERVE_COL_NAMES value */ - prop='Library.DBMS.Property.PreserveColNames.Name.xmlKey.txt'; - rc=metadata_getprop("&liburi",prop,preserve_col_names,""); - if preserve_col_names^='' then preserve_col_names= - 'preserve_col_names='!!preserve_col_names; - call symputx('preserve_col_names',preserve_col_names,'l'); - - /* get PRESERVE_TAB_NAMES value */ - /* be careful with PRESERVE_TAB_NAMES=YES - it will mean your table will - become case sensitive!! */ - prop='Library.DBMS.Property.PreserveTabNames.Name.xmlKey.txt'; - rc=metadata_getprop("&liburi",prop,preserve_tab_names,""); - if preserve_tab_names^='' then preserve_tab_names= - 'preserve_tab_names='!!preserve_tab_names; - call symputx('preserve_tab_names',preserve_tab_names,'l'); - - /* get SERVER value */ - if metadata_getnasn("&liburi","LibraryConnection",1,uri)>0 then do; - prop='Connection.DBMS.Property.SERVER.Name.xmlKey.txt'; - rc=metadata_getprop(uri,prop,server,""); - end; - if server^='' then server='server='!!quote(cats(server)); - call symputx('server',server,'l'); - - /* get SCHEMA value */ - if metadata_getnasn("&liburi","UsingPackages",1,uri)>0 then do; - rc=metadata_getattr(uri,"SchemaName",schema); - end; - if schema^='' then schema='schema='!!schema; - call symputx('schema',schema,'l'); - - /* get AUTHDOMAIN value */ - /* this is only useful if the user account contains that auth domain - if metadata_getnasn("&liburi","DefaultLogin",1,uri)>0 then do; - rc=metadata_getnasn(uri,"Domain",1,urisrc); - rc=metadata_getattr(urisrc,"Name",authdomain); - end; - if authdomain^='' then authdomain='authdomain='!!quote(trim(authdomain)); - */ - call symputx('authdomain',authdomain,'l'); - - /* get user & pass */ - if authdomain='' & metadata_getnasn("&liburi","DefaultLogin",1,uri)>0 then - do; - rc=metadata_getattr(uri,"UserID",user); - rc=metadata_getattr(uri,"Password",password); - end; - if user^='' then do; - user='user='!!quote(trim(user)); - password='password='!!quote(trim(password)); - end; - call symputx('user',user,'l'); - call symputx('password',password,'l'); - - &md.put _all_; - run; - - %if %length(&open_passthrough)>0 %then %do; - %put %str(WARN)ING: Passthrough option for postgres not yet supported; - %return; - %end; - %else %do; - %if &mdebug=1 %then %do; - %put NOTE: Executing the following:/; - %put NOTE- libname &libref POSTGRES &database &ignore_read_only_columns; - %put NOTE- &direct_exe &preserve_col_names &preserve_tab_names; - %put NOTE- &server &schema &authdomain &user &password //; - %end; - libname &libref POSTGRES &database &ignore_read_only_columns &direct_exe - &preserve_col_names &preserve_tab_names &server &schema &authdomain - &user &password; - %end; -%end; -%else %if &engine=ORACLE %then %do; - %put NOTE: Obtaining &engine library details; - data _null_; - length assocuri1 assocuri2 assocuri3 authdomain path schema $256; - call missing (of _all_); + end; /* get auth domain */ - rc=metadata_getnasn("&liburi",'LibraryConnection',1,assocuri1); - rc=metadata_getnasn(assocuri1,'Domain',1,assocuri2); - rc=metadata_getattr(assocuri2,"Name",authdomain); + autrc=metadata_getnasn(connx_uri,"Domain",1,domprop_uri); + arc=metadata_getattr(domprop_uri,"Name",authdomain); call symputx('authdomain',authdomain,'l'); - /* path */ - rc=metadata_getprop(assocuri1, - 'Connection.Oracle.Property.PATH.Name.xmlKey.txt',path); - call symputx('path',path,'l'); + /* get SCHEMA */ + rc6=metadata_getnasn("&liburi",'UsingPackages',1,up_uri); + rc7=metadata_getattr(up_uri,'SchemaName',schema); + &mD.put rc= connx_uri= rc2= conprop_uri= rc3= value= rc4= autrc= arc= datasource= + rc6= up_uri= rc7= schema=; - /* schema */ - rc=metadata_getnasn("&liburi",'UsingPackages',1,assocuri3); - rc=metadata_getattr(assocuri3,'SchemaName',schema); - call symputx('schema',schema,'l'); - run; - %put NOTE: Executing the following:/; %put NOTE-; - %put NOTE- libname &libref ORACLE path=&path schema=&schema; - %put NOTE- authdomain=&authdomain; - %put NOTE-; - libname &libref ORACLE path=&path schema=&schema authdomain=&authdomain; -%end; -%else %if &engine=SQLSVR %then %do; - %put NOTE: Obtaining &engine library details; - data _null; - length assocuri1 assocuri2 assocuri3 authdomain path schema userid - passwd $256; - call missing (of _all_); + call symputx('SQL_schema',schema,'l'); + call symputx('SQL_dsn',datasource,'l'); + run; - rc=metadata_getnasn("&liburi",'DefaultLogin',1,assocuri1); - rc=metadata_getattr(assocuri1,"UserID",userid); - rc=metadata_getattr(assocuri1,"Password",passwd); - call symputx('user',userid,'l'); - call symputx('pass',passwd,'l'); + %if %length(&open_passthrough)>0 %then %do; + proc sql &sql_options; + connect to ODBC as &open_passthrough + (INSERT_SQL=YES DATASRC=&sql_dsn. CONNECTION=global); + %end; + %else %do; + libname &libref ODBC DATASRC=&sql_dsn SCHEMA=&sql_schema AUTHDOMAIN=&authdomain; + %end; + %end; + %else %if &engine=POSTGRES %then %do; + %put NOTE: Obtaining POSTGRES library details; + data _null_; + length database ignore_read_only_columns direct_exe preserve_col_names + preserve_tab_names server schema authdomain user password + prop name value uri urisrc $256.; + call missing (of _all_); + /* get database value */ + prop='Connection.DBMS.Property.DB.Name.xmlKey.txt'; + rc=metadata_getprop("&liburi",prop,database,""); + if database^='' then database='database='!!quote(trim(database)); + call symputx('database',database,'l'); - /* path */ - rc=metadata_getnasn("&liburi",'LibraryConnection',1,assocuri2); - rc=metadata_getprop(assocuri2, - 'Connection.SQL.Property.Datasrc.Name.xmlKey.txt',path); - call symputx('path',path,'l'); + /* get IGNORE_READ_ONLY_COLUMNS value */ + prop='Library.DBMS.Property.DBIROC.Name.xmlKey.txt'; + rc=metadata_getprop("&liburi",prop,ignore_read_only_columns,""); + if ignore_read_only_columns^='' then ignore_read_only_columns= + 'ignore_read_only_columns='!!ignore_read_only_columns; + call symputx('ignore_read_only_columns',ignore_read_only_columns,'l'); - /* schema */ - rc=metadata_getnasn("&liburi",'UsingPackages',1,assocuri3); - rc=metadata_getattr(assocuri3,'SchemaName',schema); - call symputx('schema',schema,'l'); - run; + /* get DIRECT_EXE value */ + prop='Library.DBMS.Property.DirectExe.Name.xmlKey.txt'; + rc=metadata_getprop("&liburi",prop,direct_exe,""); + if direct_exe^='' then direct_exe='direct_exe='!!direct_exe; + call symputx('direct_exe',direct_exe,'l'); - %put NOTE: Executing the following:/; %put NOTE-; - %put NOTE- libname &libref SQLSVR datasrc=&path schema=&schema ; - %put NOTE- user="&user" pass="XXX"; - %put NOTE-; + /* get PRESERVE_COL_NAMES value */ + prop='Library.DBMS.Property.PreserveColNames.Name.xmlKey.txt'; + rc=metadata_getprop("&liburi",prop,preserve_col_names,""); + if preserve_col_names^='' then preserve_col_names= + 'preserve_col_names='!!preserve_col_names; + call symputx('preserve_col_names',preserve_col_names,'l'); - libname &libref SQLSVR datasrc=&path schema=&schema user="&user" pass="&pass"; -%end; -%else %if &engine=TERADATA %then %do; - %put NOTE: Obtaining &engine library details; - data _null; - length assocuri1 assocuri2 assocuri3 authdomain path schema userid - passwd $256; - call missing (of _all_); + /* get PRESERVE_TAB_NAMES value */ + /* be careful with PRESERVE_TAB_NAMES=YES - it will mean your table will + become case sensitive!! */ + prop='Library.DBMS.Property.PreserveTabNames.Name.xmlKey.txt'; + rc=metadata_getprop("&liburi",prop,preserve_tab_names,""); + if preserve_tab_names^='' then preserve_tab_names= + 'preserve_tab_names='!!preserve_tab_names; + call symputx('preserve_tab_names',preserve_tab_names,'l'); - /* get auth domain */ - rc=metadata_getnasn("&liburi",'LibraryConnection',1,assocuri1); - rc=metadata_getnasn(assocuri1,'Domain',1,assocuri2); - rc=metadata_getattr(assocuri2,"Name",authdomain); - call symputx('authdomain',authdomain,'l'); + /* get SERVER value */ + if metadata_getnasn("&liburi","LibraryConnection",1,uri)>0 then do; + prop='Connection.DBMS.Property.SERVER.Name.xmlKey.txt'; + rc=metadata_getprop(uri,prop,server,""); + end; + if server^='' then server='server='!!quote(cats(server)); + call symputx('server',server,'l'); - /* - rc=metadata_getnasn("&liburi",'DefaultLogin',1,assocuri1); - rc=metadata_getattr(assocuri1,"UserID",userid); - rc=metadata_getattr(assocuri1,"Password",passwd); - call symputx('user',userid,'l'); - call symputx('pass',passwd,'l'); - */ + /* get SCHEMA value */ + if metadata_getnasn("&liburi","UsingPackages",1,uri)>0 then do; + rc=metadata_getattr(uri,"SchemaName",schema); + end; + if schema^='' then schema='schema='!!schema; + call symputx('schema',schema,'l'); - /* path */ - rc=metadata_getnasn("&liburi",'LibraryConnection',1,assocuri2); - rc=metadata_getprop(assocuri2, - 'Connection.Teradata.Property.SERVER.Name.xmlKey.txt',path); - call symputx('path',path,'l'); + /* get AUTHDOMAIN value */ + /* this is only useful if the user account contains that auth domain + if metadata_getnasn("&liburi","DefaultLogin",1,uri)>0 then do; + rc=metadata_getnasn(uri,"Domain",1,urisrc); + rc=metadata_getattr(urisrc,"Name",authdomain); + end; + if authdomain^='' then authdomain='authdomain='!!quote(trim(authdomain)); + */ + call symputx('authdomain',authdomain,'l'); - /* schema */ - rc=metadata_getnasn("&liburi",'UsingPackages',1,assocuri3); - rc=metadata_getattr(assocuri3,'SchemaName',schema); - call symputx('schema',schema,'l'); - run; + /* get user & pass */ + if authdomain='' & metadata_getnasn("&liburi","DefaultLogin",1,uri)>0 then + do; + rc=metadata_getattr(uri,"UserID",user); + rc=metadata_getattr(uri,"Password",password); + end; + if user^='' then do; + user='user='!!quote(trim(user)); + password='password='!!quote(trim(password)); + end; + call symputx('user',user,'l'); + call symputx('password',password,'l'); - %put NOTE: Executing the following:/; %put NOTE-; - %put NOTE- libname &libref TERADATA server="&path" schema=&schema ; - %put NOTe- authdomain=&authdomain; - %put NOTE-; + &md.put _all_; + run; - libname &libref TERADATA server="&path" schema=&schema authdomain=&authdomain; -%end; -%else %if &engine= %then %do; - %put NOTE: Libref &libref is not registered in metadata; - %&mAbort.mp_abort( - msg=%str(ERR)OR: Libref &libref is not registered in metadata - ,mac=mm_assigndirectlib.sas); - %return; -%end; -%else %do; - %put %str(WARN)ING: Engine &engine is currently unsupported; - %put %str(WARN)ING- Please contact your support team.; - %return; -%end; + %if %length(&open_passthrough)>0 %then %do; + %put %str(WARN)ING: Passthrough option for postgres not yet supported; + %return; + %end; + %else %do; + %if &mdebug=1 %then %do; + %put NOTE: Executing the following:/; + %put NOTE- libname &libref POSTGRES &database &ignore_read_only_columns; + %put NOTE- &direct_exe &preserve_col_names &preserve_tab_names; + %put NOTE- &server &schema &authdomain &user &password //; + %end; + libname &libref POSTGRES &database &ignore_read_only_columns &direct_exe + &preserve_col_names &preserve_tab_names &server &schema &authdomain + &user &password; + %end; + %end; + %else %if &engine=ORACLE %then %do; + %put NOTE: Obtaining &engine library details; + data _null_; + length assocuri1 assocuri2 assocuri3 authdomain path schema $256; + call missing (of _all_); -%mend mm_assigndirectlib; + /* get auth domain */ + rc=metadata_getnasn("&liburi",'LibraryConnection',1,assocuri1); + rc=metadata_getnasn(assocuri1,'Domain',1,assocuri2); + rc=metadata_getattr(assocuri2,"Name",authdomain); + call symputx('authdomain',authdomain,'l'); + + /* path */ + rc=metadata_getprop(assocuri1, + 'Connection.Oracle.Property.PATH.Name.xmlKey.txt',path); + call symputx('path',path,'l'); + + /* schema */ + rc=metadata_getnasn("&liburi",'UsingPackages',1,assocuri3); + rc=metadata_getattr(assocuri3,'SchemaName',schema); + call symputx('schema',schema,'l'); + run; + %put NOTE: Executing the following:/; %put NOTE-; + %put NOTE- libname &libref ORACLE path=&path schema=&schema; + %put NOTE- authdomain=&authdomain; + %put NOTE-; + libname &libref ORACLE path=&path schema=&schema authdomain=&authdomain; + %end; + %else %if &engine=SQLSVR %then %do; + %put NOTE: Obtaining &engine library details; + data _null; + length assocuri1 assocuri2 assocuri3 authdomain path schema userid + passwd $256; + call missing (of _all_); + + rc=metadata_getnasn("&liburi",'DefaultLogin',1,assocuri1); + rc=metadata_getattr(assocuri1,"UserID",userid); + rc=metadata_getattr(assocuri1,"Password",passwd); + call symputx('user',userid,'l'); + call symputx('pass',passwd,'l'); + + /* path */ + rc=metadata_getnasn("&liburi",'LibraryConnection',1,assocuri2); + rc=metadata_getprop(assocuri2, + 'Connection.SQL.Property.Datasrc.Name.xmlKey.txt',path); + call symputx('path',path,'l'); + + /* schema */ + rc=metadata_getnasn("&liburi",'UsingPackages',1,assocuri3); + rc=metadata_getattr(assocuri3,'SchemaName',schema); + call symputx('schema',schema,'l'); + run; + + %put NOTE: Executing the following:/; %put NOTE-; + %put NOTE- libname &libref SQLSVR datasrc=&path schema=&schema ; + %put NOTE- user="&user" pass="XXX"; + %put NOTE-; + + libname &libref SQLSVR datasrc=&path schema=&schema user="&user" pass="&pass"; + %end; + %else %if &engine=TERADATA %then %do; + %put NOTE: Obtaining &engine library details; + data _null; + length assocuri1 assocuri2 assocuri3 authdomain path schema userid + passwd $256; + call missing (of _all_); + + /* get auth domain */ + rc=metadata_getnasn("&liburi",'LibraryConnection',1,assocuri1); + rc=metadata_getnasn(assocuri1,'Domain',1,assocuri2); + rc=metadata_getattr(assocuri2,"Name",authdomain); + call symputx('authdomain',authdomain,'l'); + + /* + rc=metadata_getnasn("&liburi",'DefaultLogin',1,assocuri1); + rc=metadata_getattr(assocuri1,"UserID",userid); + rc=metadata_getattr(assocuri1,"Password",passwd); + call symputx('user',userid,'l'); + call symputx('pass',passwd,'l'); + */ + + /* path */ + rc=metadata_getnasn("&liburi",'LibraryConnection',1,assocuri2); + rc=metadata_getprop(assocuri2, + 'Connection.Teradata.Property.SERVER.Name.xmlKey.txt',path); + call symputx('path',path,'l'); + + /* schema */ + rc=metadata_getnasn("&liburi",'UsingPackages',1,assocuri3); + rc=metadata_getattr(assocuri3,'SchemaName',schema); + call symputx('schema',schema,'l'); + run; + + %put NOTE: Executing the following:/; %put NOTE-; + %put NOTE- libname &libref TERADATA server="&path" schema=&schema ; + %put NOTe- authdomain=&authdomain; + %put NOTE-; + + libname &libref TERADATA server="&path" schema=&schema authdomain=&authdomain; + %end; + %else %if &engine= %then %do; + %put NOTE: Libref &libref is not registered in metadata; + %&mAbort.mp_abort( + msg=%str(ERR)OR: Libref &libref is not registered in metadata + ,mac=mm_assigndirectlib.sas); + %return; + %end; + %else %do; + %put %str(WARN)ING: Engine &engine is currently unsupported; + %put %str(WARN)ING- Please contact your support team.; + %return; + %end; + + %mend mm_assigndirectlib; \ No newline at end of file