También existe la posibilidad de que nuestra aplicación MTA tome como entrada un archivo de texto que contiene un flist y procese los objetos que están en dentro del archivo (tal como se puede hacer en el pin_bill_accts y/o pin_inv_accts).
Para procesar los objetos que están en el archivo, en el pin_mta_init_search solamente debemos indicar el nombre del archivo y la cantidad de campos que tiene cada PIN_FLD_RESULTS del flist.
El nombre del archivo va en el campo PIN_FLD_FILENAME y la cantidad de campos de cada PIN_FLD_RESULTS va en el campo PIN_FLD_COUNT.
Suponiendo que nuestro archivo de entrada se llama objetos.txt y que cada PIN_FLD_RESULTS tiene este formato:
0 PIN_FLD_RESULTS ARRAY [0] 1 PIN_FLD_ACCOUNT_OBJ POID [0] 0.0.0.1 /account 405532 0 1 PIN_FLD_POID POID [0] 0.0.0.1 /service 305533 0 1 PIN_FLD_PROFILE_OBJ POID [0] 0.0.0.1 /profile 98364 0El flist debe quedar así:
0 PIN_FLD_FILENAME STR [0] "objetos.txt" 0 PIN_FLD_COUNT INT [0] 3Ejemplo de programa MTA utilizando un archivo como entrada (basic_mta.c):
#ifndef lint static char Sccs_id[] = "@(#)%Portal Version: basic_mta.c 1.0 %"; #endif #include "pin_errs.h" #include "pinlog.h" #include "pin_mta.h" #include "pcm.h" /******************************************************************* * Usage information for the specific app. * Called prior MTA_USAGE policy opcode *******************************************************************/ PIN_EXPORT void pin_mta_usage( char *prog) { pin_errbuf_t ebuf; pin_flist_t *ext_flistp = NULL; char *usage_str = NULL; char *format = "\nModo de uso:\t %s -file archivo \n\t\t -file Archivo donde se encuentran los registros a procesar.\n"; PIN_ERRBUF_CLEAR (&ebuf); usage_str = (char*)pin_malloc( strlen(format) + strlen(prog) + 1 ); if (usage_str == NULL) { PIN_ERR_LOG_MSG(PIN_ERR_LEVEL_ERROR,"No Memory error"); return; } sprintf(usage_str, format ,prog); ext_flistp = pin_mta_global_flist_node_get_no_lock(PIN_FLD_EXTENDED_INFO, &ebuf); PIN_FLIST_FLD_SET (ext_flistp, PIN_FLD_DESCR, usage_str, &ebuf); printf("%s \n", usage_str); if (PIN_ERR_IS_ERR(&ebuf)) { PIN_ERR_LOG_EBUF(PIN_ERR_LEVEL_ERROR, "pin_mta_usage error", &ebuf); } pin_free(usage_str); } /******************************************************************* * Configuration of application * Called prior MTA_CONFIG policy opcode *******************************************************************/ PIN_EXPORT void pin_mta_config( pin_flist_t *param_flistp, pin_flist_t *app_flistp, pin_errbuf_t *ebufp) { pin_cookie_t prev_cookie = NULL; pin_cookie_t cookie = NULL; pin_flist_t *flistp = NULL; int32 mta_flags = 0; int32 rec_id = 0; char *option = NULL; void *vp = NULL; int parametros = 0; if (PIN_ERR_IS_ERR(ebufp)) { return; } //Muestro la version del programa en el log PIN_ERR_LOG_MSG(PIN_ERR_LEVEL_DEBUG, Sccs_id); PIN_ERR_LOG_FLIST (PIN_ERR_LEVEL_DEBUG, "pin_mta_config parameters flist", param_flistp); PIN_ERR_LOG_FLIST (PIN_ERR_LEVEL_DEBUG, "pin_mta_config application info flist", app_flistp); while((flistp = PIN_FLIST_ELEM_GET_NEXT(param_flistp, PIN_FLD_PARAMS, &rec_id, 1, &cookie, ebufp))!= NULL){ option = PIN_FLIST_FLD_GET (flistp, PIN_FLD_PARAM_NAME, 0, ebufp); if(option != NULL && strcmp(option, "-file") == 0){ PIN_FLIST_FLD_COPY(flistp, PIN_FLD_PARAM_VALUE, app_flistp, PIN_FLD_FILENAME, ebufp); PIN_FLIST_ELEM_DROP(param_flistp, PIN_FLD_PARAMS, rec_id, ebufp); cookie = prev_cookie; parametros++; } else { prev_cookie = cookie; } } vp = PIN_FLIST_FLD_GET (app_flistp, PIN_FLD_FLAGS, 0,ebufp); if(vp) mta_flags = *((int32*)vp); /*********************************************************** * The new flag MTA_FLAG_VERSION_NEW has been introduced to * differentiate between new mta & old mta applications as * only new applications have the ability to drop PIN_FLD_PARAMS * for valid parameters . It is only for new apps that * checking err_params_cnt is valid, otherwise for old applications * this check without a distincion for new applications would hamper * normal functioning. ***********************************************************/ mta_flags = mta_flags | MTA_FLAG_VERSION_NEW; mta_flags = mta_flags | MTA_FLAG_BATCH_MODE; if(parametros != 1){ mta_flags = mta_flags | MTA_FLAG_USAGE_MSG; } PIN_FLIST_FLD_SET (app_flistp, PIN_FLD_FLAGS, &mta_flags, ebufp); if (PIN_ERR_IS_ERR(ebufp)) { PIN_ERR_LOG_EBUF(PIN_ERR_LEVEL_ERROR, "pin_mta_config error", ebufp); } } /******************************************************************* * Application defined search criteria. * Called prior MTA_INIT_SEARCH policy opcode *******************************************************************/ PIN_EXPORT void pin_mta_init_search( pin_flist_t *app_flistp, pin_flist_t **s_flistpp, pin_errbuf_t *ebufp) { pin_flist_t *s_flistp = NULL; pin_flist_t *tmp_flistp = NULL; int32 count = 3; if (PIN_ERR_IS_ERR(ebufp)) { return; } PIN_ERR_LOG_FLIST (PIN_ERR_LEVEL_DEBUG, "pin_mta_init_search application info flist", app_flistp); s_flistp = PIN_FLIST_CREATE(ebufp); PIN_FLIST_FLD_COPY(app_flistp, PIN_FLD_FILENAME, s_flistp, PIN_FLD_FILENAME, ebufp); PIN_FLIST_FLD_SET(s_flistp, PIN_FLD_COUNT, &count, ebufp); if (PIN_ERR_IS_ERR(ebufp)) { PIN_ERR_LOG_EBUF(PIN_ERR_LEVEL_ERROR, "pin_mta_init_search error", ebufp); PIN_FLIST_DESTROY_EX (&s_flistp, NULL); *s_flistpp = NULL; }else{ *s_flistpp = s_flistp; PIN_ERR_LOG_FLIST (PIN_ERR_LEVEL_DEBUG, "pin_mta_init_search search flist", s_flistp); } } /******************************************************************* * Search results may be updated, modified or enriched * Called prior MTA_TUNE policy opcode *******************************************************************/ PIN_EXPORT void pin_mta_tune( pin_flist_t *app_flistp, pin_flist_t *srch_res_flistp, pin_errbuf_t *ebufp) { pin_const_poid_type_t type = NULL; pin_cookie_t s_cookie = NULL; pin_cookie_t m_cookie = NULL; pin_flist_t *multi_res_flistp = NULL; pin_flist_t *tmp_flistp = NULL; poid_t *pdp = NULL; poid_t *n_pdp = NULL; int64 db = 0; int64 id = 0; int32 i = 0; int32 s_rec_id = 0; int32 m_rec_id = 0; void *vp = NULL; if (PIN_ERR_IS_ERR(ebufp)) { return; } PIN_ERR_LOG_FLIST (PIN_ERR_LEVEL_DEBUG, "basic_mta application info flist", app_flistp); PIN_ERR_LOG_FLIST (PIN_ERR_LEVEL_DEBUG, "basic_mta search results flist", srch_res_flistp); vp = PIN_FLIST_FLD_GET (app_flistp, PIN_FLD_OPS_ERROR, MTA_OPTIONAL, ebufp); if(vp){ i = *((int32*)vp); } if (i) { while((multi_res_flistp = PIN_FLIST_ELEM_GET_NEXT(srch_res_flistp, PIN_FLD_MULTI_RESULTS, &s_rec_id, 1, &s_cookie, ebufp)) != NULL) { m_cookie = 0; while((tmp_flistp = PIN_FLIST_ELEM_GET_NEXT(multi_res_flistp, PIN_FLD_RESULTS, &m_rec_id, 1, &m_cookie, ebufp)) != NULL) { vp = PIN_FLIST_FLD_TAKE (tmp_flistp, PIN_FLD_POID, 0, ebufp); if(vp) { pdp = (poid_t*)vp; db = PIN_POID_GET_DB (pdp); id = PIN_POID_GET_ID (pdp); type = PIN_POID_GET_TYPE (pdp); id = id * i; n_pdp = PIN_POID_CREATE (db, type,id, ebufp); PIN_POID_DESTROY (pdp, ebufp); PIN_FLIST_FLD_PUT (tmp_flistp, PIN_FLD_POID, n_pdp, ebufp); } } } } if (PIN_ERR_IS_ERR(ebufp)) { PIN_ERR_LOG_EBUF(PIN_ERR_LEVEL_ERROR, "pin_mta_tune error", ebufp); } else { PIN_ERR_LOG_FLIST (PIN_ERR_LEVEL_DEBUG, "basic_mta search results flist salida", srch_res_flistp); } } /******************************************************************* * Function executed at application exit * Called prior MTA_EXIT policy opcode *******************************************************************/ PIN_EXPORT void pin_mta_exit( pin_flist_t *app_flistp, pin_errbuf_t *ebufp) { PIN_ERR_LOG_FLIST (PIN_ERR_LEVEL_DEBUG, "pin_mta_exit application info flist", app_flistp); if (PIN_ERR_IS_ERR(ebufp)) { PIN_ERR_LOG_EBUF(PIN_ERR_LEVEL_ERROR, "pin_mta_exit error", ebufp); printf("Error durante la ejecucion.\n"); } else { printf("Ejecucion exitosa.\n"); } } /******************************************************************* * Main application opcode is called here *******************************************************************/ PIN_EXPORT void pin_mta_worker_opcode( pcm_context_t *ctxp, pin_flist_t *srch_res_flistp, pin_flist_t *op_in_flistp, pin_flist_t **op_out_flistpp, pin_flist_t *ti_flistp, pin_errbuf_t *ebufp) { pin_cookie_t cookie = NULL; pin_flist_t *app_flistp = NULL; pin_flist_t *tmp_flistp = NULL; int32 mta_flags = 0; int32 elemid = 0; void *vp = NULL; if (PIN_ERR_IS_ERR(ebufp)) { PIN_ERR_LOG_EBUF(PIN_ERR_LEVEL_ERROR, "pin_mta_worker_opcode error entro con error, saliendo", ebufp); return; } app_flistp = pin_mta_global_flist_node_get_with_lock (PIN_FLD_APPLICATION_INFO, ebufp); vp = PIN_FLIST_FLD_GET (app_flistp, PIN_FLD_FLAGS, 0,ebufp); if(vp){ mta_flags = *((int32*)vp); } pin_mta_global_flist_node_release(PIN_FLD_APPLICATION_INFO, ebufp); while ((tmp_flistp = PIN_FLIST_ELEM_GET_NEXT(op_in_flistp, PIN_FLD_RESULTS, &elemid, 1, &cookie, ebufp)) != NULL) { //aqui se procesa cada PIN_FLD_RESULTS } if (PIN_ERR_IS_ERR(ebufp)) { PIN_ERR_LOG_EBUF(PIN_ERR_LEVEL_ERROR, "pin_mta_worker_opcode saliendo con error", ebufp); } }
Archivo de entrada para el ejemplo (objetos.txt):
0 PIN_FLD_RESULTS ARRAY [0] 1 PIN_FLD_ACCOUNT_OBJ POID [0] 0.0.0.1 /account 405532 0 1 PIN_FLD_POID POID [0] 0.0.0.1 /service 305533 0 1 PIN_FLD_PROFILE_OBJ POID [0] 0.0.0.1 /profile 98364 0 0 PIN_FLD_RESULTS ARRAY [1] 1 PIN_FLD_ACCOUNT_OBJ POID [0] 0.0.0.1 /account 401569 0 1 PIN_FLD_POID POID [0] 0.0.0.1 /service 501565 0 1 PIN_FLD_PROFILE_OBJ POID [0] 0.0.0.1 /profile 501565 0 0 PIN_FLD_RESULTS ARRAY [2] 1 PIN_FLD_ACCOUNT_OBJ POID [0] 0.0.0.1 /account 403491 0 1 PIN_FLD_POID POID [0] 0.0.0.1 /service 603496 0 1 PIN_FLD_PROFILE_OBJ POID [0] 0.0.0.1 /profile 603496 0 0 PIN_FLD_RESULTS ARRAY [3] 1 PIN_FLD_ACCOUNT_OBJ POID [0] 0.0.0.1 /account 9999 0 1 PIN_FLD_POID POID [0] 0.0.0.1 /service 8888 0 1 PIN_FLD_PROFILE_OBJ POID [0] 0.0.0.1 /profile 8888 0 0 PIN_FLD_RESULTS ARRAY [4] 1 PIN_FLD_ACCOUNT_OBJ POID [0] 0.0.0.1 /account 405532 0 1 PIN_FLD_POID POID [0] 0.0.0.1 /service 305533 0 1 PIN_FLD_PROFILE_OBJ POID [0] 0.0.0.1 /profile 305533 0 0 PIN_FLD_RESULTS ARRAY [5] 1 PIN_FLD_ACCOUNT_OBJ POID [0] 0.0.0.1 /account 401569 0 1 PIN_FLD_POID POID [0] 0.0.0.1 /service 501565 0 1 PIN_FLD_PROFILE_OBJ POID [0] 0.0.0.1 /profile 501565 0 0 PIN_FLD_RESULTS ARRAY [6] 1 PIN_FLD_ACCOUNT_OBJ POID [0] 0.0.0.1 /account 403491 0 1 PIN_FLD_POID POID [0] 0.0.0.1 /service 603496 0 1 PIN_FLD_PROFILE_OBJ POID [0] 0.0.0.1 /profile 603496 0 0 PIN_FLD_RESULTS ARRAY [7] 1 PIN_FLD_ACCOUNT_OBJ POID [0] 0.0.0.1 /account 9999 0 1 PIN_FLD_POID POID [0] 0.0.0.1 /service 8888 0 1 PIN_FLD_PROFILE_OBJ POID [0] 0.0.0.1 /profile 8888 0
Una vez que nuestra aplicación MTA está terminada podemos comprobar que no posea memory leaks.
Martín Falconi
No hay comentarios.:
Publicar un comentario