36%macro mm_assigndirectlib(
45%
if &mDebug=1 %then %let mD=;
47%&mD.put Executing mm_assigndirectlib.sas;
50%
if &mAbort=1 %then %let mAbort=;
51%
else %let mAbort=%str(*);
53%&mD.put NOTE: Creating direct (non META) connection to &libref library;
56%let cur_engine=%mf_getengine(&libref);
57%
if &cur_engine ne META and &cur_engine ne and %length(&open_passthrough)=0
59 %put NOTE: &libref already has a direct (&cur_engine) libname connection;
62%
else %
if %upcase(&libref)=WORK %then %
do;
63 %put NOTE: We already have a direct connection to WORK :-) ;
70 length lib_uri engine $256;
71 call missing (of _all_);
73 rc1=metadata_getnobj(
"omsobj:SASLibrary?@Libref ='&libref'",1,lib_uri);
75 rc2=metadata_getattr(lib_uri,
'Engine',engine);
76 putlog
"mm_assigndirectlib for &libref:" rc1= lib_uri= rc2= engine=;
77 call symputx(
"liburi",lib_uri,
'l');
78 call symputx(
"engine",engine,
'l');
82%
if &engine=BASE %then %
do;
83 %&mD.put NOTE: Retrieving BASE library path;
85 length up_uri $256 path cat_path $1024;
87 call missing (of _all_);
90 rc3=metadata_getnasn(
"&liburi",
'UsingPackages',i,up_uri);
93 rc4=metadata_getattr(up_uri,
'DirectoryName',path);
94 if i=1 then path =
'("'!!trim(path)!!
'" ';
95 else path =
' "'!!trim(path)!!
'" ';
96 cat_path = trim(cat_path) !!
" " !! trim(path) ;
98 rc3=metadata_getnasn(
"&liburi",
'UsingPackages',i,up_uri);
100 cat_path = trim(cat_path) !!
")";
101 &mD.putlog
"NOTE: Getting physical path for &libref library";
102 &mD.putlog rc3= up_uri= rc4= cat_path= path=;
103 &mD.putlog
"NOTE: Libname cmd will be:";
104 &mD.putlog
"libname &libref" cat_path;
105 call symputx(
"filepath",cat_path,
'l');
108 %
if %sysevalf(&sysver<9.4) %then %
do;
109 libname &libref &filepath;
113 libname &libref &filepath filelockwait=5;
117%
else %
if &engine=REMOTE %then %
do;
119 length rcCon rcProp rc k 3 uriCon uriProp PropertyValue PropertyName
120 Delimiter $256 properties $2048;
122 rcCon = metadata_getnasn(
"&liburi",
"LibraryConnection", 1, uriCon);
124 rcProp = metadata_getnasn(uriCon,
"Properties", 1, uriProp);
127 rcProp = metadata_getnasn(uriCon,
"Properties", k, uriProp);
128 do while (rcProp > 0);
129 rc = metadata_getattr(uriProp ,
"DefaultValue",PropertyValue);
130 rc = metadata_getattr(uriProp ,
"PropertyName",PropertyName);
131 rc = metadata_getattr(uriProp ,
"Delimiter",Delimiter);
132 properties = trim(properties) !!
" " !! trim(PropertyName)
133 !! trim(Delimiter) !! trim(PropertyValue);
136 rcProp = metadata_getnasn(uriCon,
"Properties", k, uriProp);
138 %&mD.put NOTE: Getting properties
for REMOTE SHARE &libref library;
140 %&mD.put NOTE: Libname cmd will be:;
141 %&mD.put libname &libref &engine &properties slibref=&libref;
142 call symputx (
"properties",trim(properties),
'l');
145 libname &libref &engine &properties slibref=&libref;
149%
else %
if &engine=OLEDB %then %
do;
150 %&mD.put NOTE: Retrieving OLEDB connection details;
152 length domain datasource provider properties schema
153 connx_uri domain_uri conprop_uri lib_uri schema_uri value $256.;
154 call missing (of _all_);
156 rc=metadata_getnasn(
"&liburi",
'LibraryConnection',1,connx_uri);
158 rc1=metadata_getnasn(connx_uri,
'Domain',1,domain_uri);
159 rc2=metadata_getattr(domain_uri,
'Name',domain);
160 &mD.putlog /
'NOTE: '
161 &mD.putlog
'NOTE- domain: ' domain;
166 rc=metadata_getnasn(connx_uri,
'Properties',i,conprop_uri);
167 rc2=metadata_getattr(conprop_uri,
'Name',value);
168 if value=
'Connection.OLE.Property.DATASOURCE.Name.xmlKey.txt' then
do;
169 rc3=metadata_getattr(conprop_uri,
'DefaultValue',datasource);
171 else if value=
'Connection.OLE.Property.PROVIDER.Name.xmlKey.txt' then
do;
172 rc4=metadata_getattr(conprop_uri,
'DefaultValue',provider);
174 else if value=
'Connection.OLE.Property.PROPERTIES.Name.xmlKey.txt' then
176 rc5=metadata_getattr(conprop_uri,
'DefaultValue',properties);
179 &mD.putlog
'NOTE- dsn/provider/properties: ' /
180 datasource provider properties;
181 &mD.putlog
'NOTE- schema: ' schema
184 rc6=metadata_getnasn(
"&liburi",
'UsingPackages',1,lib_uri);
185 rc7=metadata_getattr(lib_uri,
'SchemaName',schema);
186 call symputx(
'SQL_domain',domain,
'l');
187 call symputx(
'SQL_dsn',datasource,
'l');
188 call symputx(
'SQL_provider',provider,
'l');
189 call symputx(
'SQL_properties',properties,
'l');
190 call symputx(
'SQL_schema',schema,
'l');
193 %
if %length(&open_passthrough)>0 %then %
do;
194 proc sql &sql_options;
195 connect to OLEDB as &open_passthrough(INSERT_SQL=YES
197 properties=(
'Integrated Security'=SSPI
198 'Persist Security Info'=True
199 %sysfunc(compress(%str(&SQL_properties),%str(())))
201 DATASOURCE=&sql_dsn PROMPT=NO
202 PROVIDER=&sql_provider SCHEMA=&sql_schema CONNECTION = GLOBAL);
205 LIBNAME &libref OLEDB PROPERTIES=&sql_properties
206 DATASOURCE=&sql_dsn PROVIDER=&sql_provider SCHEMA=&sql_schema
207 %
if %length(&sql_domain)>0 %then %
do;
208 authdomain=
"&sql_domain"
213%
else %
if &engine=ODBC %then %
do;
214 %&mD.put NOTE: Retrieving ODBC connection details;
216 length connx_uri conprop_uri value datasource up_uri schema domprop_uri
218 call missing (of _all_);
220 rc=metadata_getnasn(
"&liburi",
'LibraryConnection',1,connx_uri);
225 rc2=metadata_getnasn(connx_uri,
'Properties',i,conprop_uri);
226 rc3=metadata_getattr(conprop_uri,
'Name',value);
227 if value=
'Connection.ODBC.Property.DATASRC.Name.xmlKey.txt' then
do;
228 rc4=metadata_getattr(conprop_uri,
'DefaultValue',datasource);
234 autrc=metadata_getnasn(connx_uri,
"Domain",1,domprop_uri);
235 arc=metadata_getattr(domprop_uri,
"Name",authdomain);
236 if not missing(authdomain) then authdomain=cats(
'AUTHDOMAIN=',authdomain);
237 call symputx(
'authdomain',authdomain,
'l');
240 rc6=metadata_getnasn(
"&liburi",
'UsingPackages',1,up_uri);
241 rc7=metadata_getattr(up_uri,
'SchemaName',schema);
242 &mD.put rc= connx_uri= rc2= conprop_uri= rc3= value= rc4= datasource=
243 rc6= up_uri= rc7= schema=;
245 call symputx(
'SQL_schema',schema,
'l');
246 call symputx(
'SQL_dsn',datasource,
'l');
249 %
if %length(&open_passthrough)>0 %then %
do;
250 proc sql &sql_options;
251 connect to ODBC as &open_passthrough
252 (INSERT_SQL=YES DATASRC=&sql_dsn. CONNECTION=global);
255 libname &libref ODBC DATASRC=&sql_dsn SCHEMA=&sql_schema &authdomain;
258%
else %
if &engine=POSTGRES %then %
do;
259 %put NOTE: Obtaining POSTGRES library details;
261 length database ignore_read_only_columns direct_exe preserve_col_names
262 preserve_tab_names server schema authdomain user password
263 prop name value uri urisrc $256.;
264 call missing (of _all_);
266 prop=
'Connection.DBMS.Property.DB.Name.xmlKey.txt';
267 rc=metadata_getprop(
"&liburi",prop,database,
"");
268 if database^=
'' then database=
'database='!!quote(trim(database));
269 call symputx(
'database',database,
'l');
272 prop=
'Library.DBMS.Property.DBIROC.Name.xmlKey.txt';
273 rc=metadata_getprop(
"&liburi",prop,ignore_read_only_columns,
"");
274 if ignore_read_only_columns^=
'' then ignore_read_only_columns=
275 'ignore_read_only_columns='!!ignore_read_only_columns;
276 call symputx(
'ignore_read_only_columns',ignore_read_only_columns,
'l');
279 prop=
'Library.DBMS.Property.DirectExe.Name.xmlKey.txt';
280 rc=metadata_getprop(
"&liburi",prop,direct_exe,
"");
281 if direct_exe^=
'' then direct_exe=
'direct_exe='!!direct_exe;
282 call symputx(
'direct_exe',direct_exe,
'l');
285 prop=
'Library.DBMS.Property.PreserveColNames.Name.xmlKey.txt';
286 rc=metadata_getprop(
"&liburi",prop,preserve_col_names,
"");
287 if preserve_col_names^=
'' then preserve_col_names=
288 'preserve_col_names='!!preserve_col_names;
289 call symputx(
'preserve_col_names',preserve_col_names,
'l');
294 prop=
'Library.DBMS.Property.PreserveTabNames.Name.xmlKey.txt';
295 rc=metadata_getprop(
"&liburi",prop,preserve_tab_names,
"");
296 if preserve_tab_names^=
'' then preserve_tab_names=
297 'preserve_tab_names='!!preserve_tab_names;
298 call symputx(
'preserve_tab_names',preserve_tab_names,
'l');
301 if metadata_getnasn(
"&liburi",
"LibraryConnection",1,uri)>0 then
do;
302 prop=
'Connection.DBMS.Property.SERVER.Name.xmlKey.txt';
303 rc=metadata_getprop(uri,prop,server,
"");
305 if server^=
'' then server=
'server='!!quote(cats(server));
306 call symputx(
'server',server,
'l');
309 if metadata_getnasn(
"&liburi",
"UsingPackages",1,uri)>0 then
do;
310 rc=metadata_getattr(uri,
"SchemaName",schema);
312 if schema^=
'' then schema=
'schema='!!schema;
313 call symputx(
'schema',schema,
'l');
323 call symputx(
'authdomain',authdomain,
'l');
326 if authdomain=
'' & metadata_getnasn(
"&liburi",
"DefaultLogin",1,uri)>0 then
328 rc=metadata_getattr(uri,
"UserID",user);
329 rc=metadata_getattr(uri,
"Password",password);
332 user=
'user='!!quote(trim(user));
333 password=
'password='!!quote(trim(password));
335 call symputx(
'user',user,
'l');
336 call symputx(
'password',password,
'l');
341 %
if %length(&open_passthrough)>0 %then %
do;
342 %put %str(WARN)ING: Passthrough option
for postgres not yet supported;
346 %
if &mdebug=1 %then %
do;
347 %put NOTE: Executing the following:/;
348 %put NOTE- libname &libref POSTGRES &database &ignore_read_only_columns;
349 %put NOTE- &direct_exe &preserve_col_names &preserve_tab_names;
350 %put NOTE- &server &schema &authdomain &user &password
352 libname &libref POSTGRES &database &ignore_read_only_columns &direct_exe
353 &preserve_col_names &preserve_tab_names &server &schema &authdomain
357%
else %
if &engine=ORACLE %then %
do;
358 %put NOTE: Obtaining &engine library details;
360 length assocuri1 assocuri2 assocuri3 authdomain path schema $256;
361 call missing (of _all_);
364 rc=metadata_getnasn(
"&liburi",
'LibraryConnection',1,assocuri1);
365 rc=metadata_getnasn(assocuri1,
'Domain',1,assocuri2);
366 rc=metadata_getattr(assocuri2,
"Name",authdomain);
367 call symputx(
'authdomain',authdomain,
'l');
370 rc=metadata_getprop(assocuri1,
371 'Connection.Oracle.Property.PATH.Name.xmlKey.txt',path);
372 call symputx(
'path',path,
'l');
375 rc=metadata_getnasn(
"&liburi",
'UsingPackages',1,assocuri3);
376 rc=metadata_getattr(assocuri3,
'SchemaName',schema);
377 call symputx(
'schema',schema,
'l');
379 %put NOTE: Executing the following:/; %put NOTE-;
380 %put NOTE- libname &libref ORACLE path=&path schema=&schema;
381 %put NOTE- authdomain=&authdomain;
383 libname &libref ORACLE path=&path schema=&schema authdomain=&authdomain;
385%
else %
if &engine=SQLSVR %then %
do;
386 %put NOTE: Obtaining &engine library details;
388 length assocuri1 assocuri2 assocuri3 authdomain path schema userid
390 call missing (of _all_);
392 rc=metadata_getnasn(
"&liburi",
'DefaultLogin',1,assocuri1);
393 rc=metadata_getattr(assocuri1,
"UserID",userid);
394 rc=metadata_getattr(assocuri1,
"Password",passwd);
395 call symputx(
'user',userid,
'l');
396 call symputx(
'pass',passwd,
'l');
399 rc=metadata_getnasn(
"&liburi",
'LibraryConnection',1,assocuri2);
400 rc=metadata_getprop(assocuri2,
401 'Connection.SQL.Property.Datasrc.Name.xmlKey.txt',path);
402 call symputx(
'path',path,
'l');
405 rc=metadata_getnasn(
"&liburi",
'UsingPackages',1,assocuri3);
406 rc=metadata_getattr(assocuri3,
'SchemaName',schema);
407 call symputx(
'schema',schema,
'l');
410 %put NOTE: Executing the following:/; %put NOTE-;
411 %put NOTE- libname &libref SQLSVR datasrc=&path schema=&schema ;
412 %put NOTE- user=
"&user" pass=
"XXX";
415 libname &libref SQLSVR datasrc=&path schema=&schema user=
"&user" pass=
"&pass";
417%
else %
if &engine=SASIOSNF or &engine=SNOW %then %
do;
418 %&mD.put NOTE: Retrieving SNOW connection details;
420 length connx_uri conprop_uri value server up_uri schema domprop_uri
421 authdomain database $256.;
422 call missing (of _all_);
424 rc=metadata_getnasn(
"&liburi",
'LibraryConnection',1,connx_uri);
429 rc2=metadata_getnasn(connx_uri,
'Properties',i,conprop_uri);
430 rc3=metadata_getattr(conprop_uri,
'Name',value);
431 if value=
'Connection.DBMS.Property.SERVER.Name.xmlKey.txt' then
do;
432 rc4=metadata_getattr(conprop_uri,
'DefaultValue',server);
438 autrc=metadata_getnasn(connx_uri,
"Domain",1,domprop_uri);
439 arc=metadata_getattr(domprop_uri,
"Name",authdomain);
440 if not missing(authdomain) then authdomain=cats(
'AUTHDOMAIN=',authdomain);
441 call symputx(
'authdomain',authdomain,
'l');
444 rc6=metadata_getnasn(
"&liburi",
'UsingPackages',1,up_uri);
445 rc7=metadata_getattr(up_uri,
'SchemaName',schema);
446 &mD.put rc= connx_uri= rc2= conprop_uri= rc3= value= rc4= server=
447 rc6= up_uri= rc7= schema=;
450 prop=
'Connection.DBMS.Property.DB.Name.xmlKey.txt';
451 rc=metadata_getprop(
"&liburi",prop,database,
"");
452 if database^=
'' then database=
'database='!!quote(trim(database));
453 call symputx(
'database',database,
'l');
455 call symputx(
'snow_schema',schema,
'l');
456 call symputx(
'snow_server',server,
'l');
459 libname &libref SNOW SERVER=
"&snow_server" SCHEMA=&snow_schema &authdomain
461 %
if %length(&open_passthrough)>0 %then %
do;
463 connect
using &libref as &open_passthrough;
466%
else %
if &engine=TERADATA %then %
do;
467 %put NOTE: Obtaining &engine library details;
469 length assocuri1 assocuri2 assocuri3 authdomain path schema userid
471 call missing (of _all_);
474 rc=metadata_getnasn(
"&liburi",
'LibraryConnection',1,assocuri1);
475 rc=metadata_getnasn(assocuri1,
'Domain',1,assocuri2);
476 rc=metadata_getattr(assocuri2,
"Name",authdomain);
477 call symputx(
'authdomain',authdomain,
'l');
488 rc=metadata_getnasn(
"&liburi",
'LibraryConnection',1,assocuri2);
489 rc=metadata_getprop(assocuri2,
490 'Connection.Teradata.Property.SERVER.Name.xmlKey.txt',path);
491 call symputx(
'path',path,
'l');
494 rc=metadata_getnasn(
"&liburi",
'UsingPackages',1,assocuri3);
495 rc=metadata_getattr(assocuri3,
'SchemaName',schema);
496 call symputx(
'schema',schema,
'l');
499 %put NOTE: Executing the following:/; %put NOTE-;
500 %put NOTE- libname &libref TERADATA server=
"&path" schema=&schema ;
501 %put NOTe- authdomain=&authdomain;
504 libname &libref TERADATA server=
"&path" schema=&schema authdomain=&authdomain;
506%
else %
if &engine= %then %
do;
507 %put NOTE: Libref &libref is not registered in metadata;
509 msg=%str(ERR)OR: Libref &libref is not registered in metadata
510 ,mac=mm_assigndirectlib.sas);
514 %put %str(WARN)ING: Engine &engine is currently unsupported;
515 %put %str(WARN)ING- Please contact your support team.;
519%mend mm_assigndirectlib;