| Sample Metadata API Code |
* Sample Read Metadata Program * for SAS/Warehouse Administrator */ length primary_repos_id $ 8; length sec_repos_id $ 8; init: /* * Create an instance of the metadata API. */ i_api=instance(loadclass ('SASHELP.METAAPI.METAAPI.CLASS')); l_rc=0; /* * Access the SAS/Warehouse Administrator * Sample repository. */ path="!SASROOT\whouse\dwdemo\_master"; repos_type='WHDWENV'; /* * Insert the Location information into the * metadata list with * a name of LIBRARY. */ l_inmeta=makelist(); l_lib=makelist(); l_inmeta=insertl(l_inmeta,l_lib,-1,'LIBRARY'); /* * Use the default Libname Engine to * access a Local Path. */ l_lib=insertc(l_lib,' ',-1,'ENGINE'); l_path=makelist(); l_lib=insertl(l_lib,l_path,-1,'PATH'); l_opts=makelist(); l_lib=insertl(l_lib,l_opts,-1,'OPTIONS'); l_path=insertc(l_path,path,-1); /* * Set the primary repository. If a bad * return code is returned, * then we can't continue. */ call send(i_api,'_SET_PRIMARY_REPOSITORY_', l_rc,l_inmeta, repos_type,primary_repos_id,l_meta); l_inmeta=dellist(l_inmeta,'Y'); if l_rc = 0 then do; /* * We were able to access the primary repository * correctly. */ /* * Get the list of available secondary repositories * under this primary repository. * */ l_reps=makelist(); l_meta=setniteml(l_meta,l_reps,'REPOSITORIES'); call send(i_api,'_GET_METADATA_',l_rc,l_meta); if l_rc = 0 then do; num_reps=listlen(l_reps); if num_reps > 0 then do; /* * If any secondary repositories, select one to set as * the active one. */ l_sec_rep=getiteml(l_reps,1); call send(i_api,'_SET_SECONDARY_REPOSITORY_',l_rc, l_sec_rep,sec_repos_id); /* * If l_rc = 0 then sec_repos_id contains the 8 * character repository id of this repository. This * id is used as the first part of any identifiers that are used * to access metadata in this secondary repository. */ if l_rc = 0 then do; /* * Get the List of Detail Tables in the secondary * repository. */ of_type=sec_repos_id||'.'||'WHDETAIL'; l_tables=makelist(); call send(i_api,'_GET_METADATA_OBJECTS_',l_rc, of_type,l_tables); num_tables=listlen(l_tables); if num_tables > 0 and l_rc = 0 then do; table_id=nameitem(l_tables,1); table_name=getitemc(l_tables,1); put 'Processing Table: ' table_name; /* * Get the metadata about the Load Process that created * this table. Note that this is an example of a * selective query, for example preformat the input list with * only the properties desired. */ get_all=0; expand=0; l_table_meta=makelist(); l_table_meta=insertc(l_table_meta,table_id,-1,'ID'); l_table_meta=insertl(l_table_meta,0,-1,'PROCESS'); call send(i_api,'_GET_METADATA_',l_rc,l_table_meta); if l_rc = 0 then do; l_process_meta=getniteml(l_table_meta,'PROCESS'); /* * It is possible that the process has not yet been * defined for this table. If this is the case, an * empty list will be returned. */ if listlen(l_process_meta) > 0 then do; /* * Get all metadata known about this process by * issuing a _GET_METADATA_ with the get_all * parameter as 1. */ get_all=1; expand=0; call send(i_api,'_GET_METADATA_',l_rc, l_process_meta,get_all,expand); if l_rc = 0 then do; /* * Perform some processing on the returned * metadata list. */ end; /* if */ else do; msg=getnitemc(l_rc,'MSG'); rc=getnitemn(l_rc,'RC'); put msg; put 'RC=' rc; end; /* else */ end; /* if */ end; /* if */ else do; msg=getnitemc(l_rc,'MSG'); rc=getnitemn(l_rc,'RC'); put msg; put 'RC=' rc; end; /* else */ /* * Delete the table metadata list and all of its * sublists. * * NOTE: Be extremely careful when using the DELLIST * with the 'Y' option. */ l_table_meta=dellist(l_table_meta,'Y'); end; /* if */ else do; if l_rc = 0 then do; put 'No detail tables found.'; end; /* if */ else do; msg=getnitemc(l_rc,'MSG'); rc=getnitemn(l_rc,'RC'); put msg; put 'RC=' rc; end; /* else */ end; /* else */ l_tables=dellist(l_tables); end; /* if */ else do; msg=getnitemc(l_rc,'MSG'); rc=getnitemn(l_rc,'RC'); put msg; put 'RC=' rc; end; /* else */ end; /* if */ end; /* if */ else do; msg=getnitemc(l_rc,'MSG'); rc=getnitemn(l_rc,'RC'); put msg; put 'RC=' rc; end; /* else */ end; /* if */ else do; end; /* else */ return; term: /* * Make sure to _TERM_ the api object * so that an orderly clean up * is performed. */ call send(i_api,'_TERM_'); return;
Copyright © 2012 by SAS Institute Inc., Cary, NC, USA. All rights reserved.