El ejemplo siguiente ilustra cómo utilizar un número seleccionado de funciones de la API de DB2 Everyplace Sync Client para crear una aplicación. Puede encontrar más ejemplos de código fuente en \DB2e\Clients\clientapisample\C_API.
/******************************************************************/ /** * Esta función define la función de escucha de la sincronización. * Vea isyncore.h para obtener más información. * parámetro: listenerData, datos personales del usuario. * parámetro: suceso, objeto de suceso * parámetro: pExtraInfo (reservado) * devolución: entero, si el tipo de suceso es ISCEVTTYPE_Retry: * . ISCRTNCB_ReplyYes : reintentar menos de 3 veces * . ISCRTNCB_ReplyNo : reintentar 3 o más veces * si el tipo de suceso es ISCEVTTYPE_Info: * . ISCRTNCB_Done * si tipo suceso es ISCEVTTYPE_Query y código suceso es ISCEVT_QueLogin: * . ISCRTNCB_Done : nombusuario y contraseña entrados correctamente * . ISCRTNCB_Default : nombusuario y contraseña no entrados * otros (ISCEVTTYPE_Fatal, ISCEVTTYPE_Error, ISCEVTTYPE_Query * e ISCEVTTYPE_Conflict) * . ISCRTNCB_Default : emprender la acción por omisión **/ static isy_INT32 syncListener( isy_UINT32 listenerData, ISCEVT *event, isy_VOID *pExtraInfo) { // appEventCodeToMessage es alguna función de usuario para correlacionar // un suceso con algún mensaje descriptivo del suceso char *statusMsg = appEventCodeToMessage(event); int timesRetried; switch (event->type) { case ISCEVTTYPE_Fatal: case ISCEVTTYPE_Error: printf("Error: %s\n", statusMsg); return ISCRTNCB_Default ; case ISCEVTTYPE_Retry: timesRetried = event->retry; if (timesRetried >= 3) return ISCRTNCB_ReplyNo; else { char ans; printf("%s [Y/N] ", statusMsg); ans = getchar(); getchar(); if(tolower(ans) == 'y') return ISCRTNCB_ReplyYes; else return ISCRTNCB_ReplyNo; } case ISCEVTTYPE_Info: switch (event->code) { case ISCEVT_InfSucceeded: case ISCEVT_InfFailed: case ISCEVT_InfCanceled: printf("Conclusion: %s\n", statusMsg); break; case ISCEVT_InfGeneral: case ISCEVT_InfCancelingSync: case ISCEVT_InfPrepMsg: case ISCEVT_InfSendMsg: case ISCEVT_InfWaitMsg: case ISCEVT_InfApplyMsg: printf("Status: %s\n", statusMsg); break; default: // ignorar otro código de suceso break; } // switch (event->code) return ISCRTNCB_Done; case ISCEVTTYPE_Query: if (event->code == ISCEVT_QueLogin) { ISCLISTENARG *args = event->info; isy_TCHAR *target = args->argv[0]; // Es sólo un ejemplo, no pretende estar libre de fugas de memoria. isy_TCHAR *username = (isy_TCHAR *) calloc(18, sizeof(isy_TCHAR)); isy_TCHAR *password = (isy_TCHAR *) calloc(254, sizeof(isy_TCHAR)); char c; int i; printf("Query on target data(%s): %s ...\n", target, statusMsg); // Solicitar el nombre de usuario printf("Username: "); for(i = 0; (c = getchar()) != '\n'; i++) username[i] = c; username[i] = '\0'; if (i == 0) return ISCRTNCB_Default; // nombusuario no entrado // Solicitar la contraseña printf("Password: "); for(i = 0; (c = getchar()) != '\n'; i++) password[i] = c; password[i] = '\0'; args->argv[1] = username; args->argv[2] = password; return ISCRTNCB_Done; } return ISCRTNCB_Default; // todos los otros tipos de suceso no importan default: return ISCRTNCB_Default; } // switch (event->type) } // Ejemplo de SyncClient main() { isy_TCHAR user[] = isy_T("usuario1"); isy_TCHAR password[] = isy_T("contraeña"); HISCSERV hServ; HISCCONF hConf; HISCENG hEngine; isy_INT32 rc; rc = iscConfigOpen(hServ, isy_T(".\isyncPath"), &hConf;); rc = iscEngineOpen(hConf, &hEngine;); iscEngineSetListener(hEngine, syncListener, NULL); iscEngineSyncConfig(hEngine); // obtener primero la configuración iscConfigEnableSubsSet(hConf, NULL); // habilitar todos conj. suscripción rc = iscEngineSync(hEngine); // sincronizar config + conjuntos suscripción if (rc == ISCRTN_Failed) { HISCCSR hCursor; isy_TCHAR id[ISCLEN_SubsSetID]; isy_TCHAR name[ISCLEN_SubsSetName]; isy_INT32 enabled; iscConfigOpenCursor(hConf, &hCursor;); while (iscConfigGetNextSubsSet(hConf, hCursor, id, name) == ISCRTN_Succeeded) { enabled = iscConfigSubsSetIsEnable(hConf, id); if (enabled != ISCRTN_True) continue; // olvidar los que se han // inhabilitado rc = iscConfigGetSubsSetStatus(hConf, id); if (rc != ISCRTN_Succeeded) // En ese caso, la aplicación puede tener cierto código que // procese los conjuntos de suscripción no satisfactorios aquí. // Para inhabilitar el conjunto de suscripciones, llame a: iscConfigDisableSubsSet(hConf, id); } iscConfigCloseCursor(hConf, hCursor); rc = iscEngineSync(hEngine); // sincronizar config + conjuntos suscripción } // cerrar todos los descriptores iscEngineClose(hEngine); iscConfigClose(hConf); iscServiceClose(hServ); } // principal
Tareas relacionadas
Consulta relacionada