void sg_client__bind_vtable(SG_context* pCtx, SG_client * pClient) { char* psz_protocol = NULL; SG_NULLARGCHECK_RETURN(pClient); SG_NULLARGCHECK_RETURN(pClient->psz_remote_repo_spec); if (pClient->p_vtable) // can only be bound once SG_ERR_THROW2_RETURN(SG_ERR_INVALIDARG, (pCtx, "vtable already bound")); // Select the vtable based on pClient's destination repo specification. if (strlen(pClient->psz_remote_repo_spec) > 6) { SG_ERR_CHECK( SG_ascii__substring(pCtx, pClient->psz_remote_repo_spec, 0, 7, &psz_protocol) ); if (SG_stricmp("http://", (const char*)psz_protocol) == 0) pClient->p_vtable = &s_client_vtable__http; } if (!pClient->p_vtable) pClient->p_vtable = &s_client_vtable__c; // fall through fail: SG_NULLFREE(pCtx, psz_protocol); }
static void _set_up_logging( SG_context * pCtx, SG_log_console__data * pcLogStdData, SG_log_text__data * pcLogFileData, SG_log_text__writer__daily_path__data * pcLogFileWriterData) { // Code coppied from _my_main() in sg.c char * szLogLevel = NULL; char * szLogPath = NULL; SG_uint32 logFileFlags = SG_LOG__FLAG__HANDLER_TYPE__ALL; // find the appropriate log path SG_ERR_CHECK( SG_localsettings__get__sz(pCtx, SG_LOCALSETTING__LOG_PATH, NULL, &szLogPath, NULL) ); // get the configured log level SG_ERR_CHECK( SG_localsettings__get__sz(pCtx, SG_LOCALSETTING__LOG_LEVEL, NULL, &szLogLevel, NULL) ); // register the stdout logger SG_ERR_CHECK( SG_log_console__set_defaults(pCtx, pcLogStdData) ); SG_ERR_CHECK( SG_log_console__register(pCtx, pcLogStdData, NULL, SG_LOG__FLAG__HANDLER_TYPE__NORMAL) ); // register the file logger SG_ERR_CHECK( SG_log_text__set_defaults(pCtx, pcLogFileData) ); pcLogFileData->fWriter = SG_log_text__writer__daily_path; pcLogFileData->pWriterData = pcLogFileWriterData; pcLogFileData->szRegisterMessage = NULL; pcLogFileData->szUnregisterMessage = NULL; if (szLogLevel != NULL) { if (SG_stricmp(szLogLevel, "quiet") == 0) { logFileFlags = SG_LOG__FLAG__HANDLER_TYPE__QUIET; pcLogFileData->bLogVerboseOperations = SG_FALSE; pcLogFileData->bLogVerboseValues = SG_FALSE; pcLogFileData->szVerboseFormat = NULL; pcLogFileData->szInfoFormat = NULL; } else if (SG_stricmp(szLogLevel, "normal") == 0) { logFileFlags = SG_LOG__FLAG__HANDLER_TYPE__NORMAL; pcLogFileData->bLogVerboseOperations = SG_FALSE; pcLogFileData->bLogVerboseValues = SG_FALSE; pcLogFileData->szVerboseFormat = NULL; } else if (SG_stricmp(szLogLevel, "verbose") == 0) { logFileFlags = SG_LOG__FLAG__HANDLER_TYPE__ALL; pcLogFileData->szRegisterMessage = "---- vscript started logging ----"; pcLogFileData->szUnregisterMessage = "---- vscript stopped logging ----"; } } logFileFlags |= SG_LOG__FLAG__DETAILED_MESSAGES; SG_ERR_CHECK( SG_log_text__writer__daily_path__set_defaults(pCtx, pcLogFileWriterData) ); pcLogFileWriterData->bReopen = SG_FALSE; pcLogFileWriterData->ePermissions = 0666; if (szLogPath != NULL) SG_ERR_CHECK( SG_PATHNAME__ALLOC__SZ(pCtx, &pcLogFileWriterData->pBasePath, szLogPath) ); else SG_ERR_CHECK( SG_PATHNAME__ALLOC__LOG_DIRECTORY(pCtx, &pcLogFileWriterData->pBasePath) ); pcLogFileWriterData->szFilenameFormat = "vscript-%d-%02d-%02d.log"; SG_ERR_CHECK( SG_log_text__register(pCtx, pcLogFileData, NULL, logFileFlags) ); fail: SG_context__err_reset(pCtx); SG_NULLFREE(pCtx, szLogPath); SG_NULLFREE(pCtx, szLogLevel); }