#if defined _WIN32 || defined _WINDOWS #include <windows.h> #endif #include <string.h> #include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <assert.h> #include <time.h> #if defined _WIN32 || defined _WINDOWS #pragma pack(push,localid,1) #endif #include <essapi.h> #if defined _WIN32 || defined _WINDOWS #pragma pack(pop,localid) #endif ESS_HINST_T hInst; ESS_HCTX_T hCtx; #define MAXQRYLEN 65536 ESS_CHAR_T qry[MAXQRYLEN]; ESS_STR_T AppName = "Sample"; ESS_STR_T DbName = "Basic"; static ESS_CHAR_T *axisnames[] = { "COLUMNS", "ROWS", "PAGES", "CHAPTERS", "SECTIONS" }; void ESS_Init() { ESS_STS_T sts; ESS_INIT_T InitStruct = {ESS_API_VERSION, NULL, 0L, 255, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0L }; if ((sts = EssInit(&InitStruct, &hInst)) != ESS_STS_NOERR) { printf("EssInit failure: %ld\n", sts); exit ((int) sts); } printf("EssInit sts: %ld\n", sts); } void ESS_Login () { ESS_STS_T sts = ESS_STS_NOERR; ESS_USHORT_T Items; ESS_PAPPDB_T pAppsDbs = NULL; ESS_CHAR_T SvrName[ESS_SVRNAMELEN]; ESS_CHAR_T UserName[ESS_USERNAMELEN]; ESS_CHAR_T Password[ESS_PASSWORDLEN]; /* Initialize parameters */ strcpy(SvrName,"localhost"); strcpy(UserName,"essexer"); strcpy(Password,"password"); sts = EssLogin(hInst, SvrName, UserName, Password, &Items, &pAppsDbs, &hCtx); if ( (sts != 0) && (sts != 1051093L) && (sts != 1051090L) ) { printf("EssLogin failure: %ld\n", sts); exit ((int) sts); } printf("EssLogin sts: %ld\n", sts); } void ESS_MdxAxis(ESS_MDX_QRYHDL_T hQry, ESS_MDX_AXISHDL_T hAxis, ESS_STR_T pszAxisName ) { ESS_STS_T sts; ESS_ULONG_T ulNAxisDims, ulAxisSize; ESS_ULONG_T ulNClusters, ulClusterSize, ulNClusterDims; ESS_ULONG_T ulAxisDimCnt, ulIndex, ulPropCnt; ESS_ULONG_T ulClusterCnt, ulClusterDimCnt; ESS_PULONG_T ulaDimSizes; ESS_MDX_PCLUSTERHDL_T haClusters; ESS_MDX_CLUSTERHDL_T hCluster; ESS_MDX_PDIMHDL_T haDims; ESS_STR_T pszDimName, pszMbrIdentifier, pszPropName; ESS_MDX_PMBRHDL_T haMbrs; ESS_PULONG_T ulaNProps = NULL; ESS_MDX_PPPROPHDL_T haaProps = NULL; ESS_MDX_PPROPHDL_T haProps; ESS_MDX_PROPHDL_T hProp; ESS_MDX_PROPTYPE_T propType; ESS_MDX_PROPVALUE_T propval; if ((sts = EssMdxGetAxisInfo(hAxis, &ulAxisSize, &ulNAxisDims, &haDims)) != ESS_STS_NOERR) { printf("EssMdxGetAxisInfo failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxGetAxisInfo sts: %ld\n", sts); printf("%s Size %ld Num dims %ld\n", pszAxisName, ulAxisSize, ulNAxisDims); if (ulAxisSize == 0) { return; } if ((sts = EssAlloc(hInst, ulNAxisDims * sizeof(ESS_ULONG_T), (ESS_PPVOID_T) &ulaNProps)) != ESS_STS_NOERR) { printf("EssAlloc failure: %ld\n", sts); exit ((int) sts); } printf("EssAlloc sts: %ld\n", sts); if ((sts = EssAlloc(hInst, ulNAxisDims * sizeof(ESS_MDX_PPROPHDL_T), (ESS_PPVOID_T) &haaProps)) != ESS_STS_NOERR) { printf("EssAlloc failure: %ld\n", sts); exit ((int) sts); } printf("EssAlloc sts: %ld\n", sts); for (ulAxisDimCnt = 0; ulAxisDimCnt < ulNAxisDims; ulAxisDimCnt++) { if ((sts = EssMdxGetDimInfo(haDims[ulAxisDimCnt], &pszDimName, &ulaNProps[ulAxisDimCnt], &haaProps[ulAxisDimCnt])) != ESS_STS_NOERR) { printf("EssMdxGetDimInfo failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxGetDimInfo sts: %ld\n", sts); printf("Dim %ld name %s #props %ld\n", ulAxisDimCnt, pszDimName, ulaNProps[ulAxisDimCnt]); haProps = haaProps[ulAxisDimCnt]; for (ulPropCnt = 0; ulPropCnt < ulaNProps[ulAxisDimCnt]; ulPropCnt++) { hProp = haProps[ulPropCnt]; if ((sts = EssMdxGetPropertyInfo(hProp, &pszPropName, &propType)) != ESS_STS_NOERR) { printf("EssMdxGetPropertyInfo failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxGetPropertyInfo sts: %ld\n", sts); printf("Property %ld type %ld name %s\n", ulPropCnt, propType, pszPropName); } } if ((sts = EssMdxGetClusters(hAxis, &ulNClusters, &haClusters)) != ESS_STS_NOERR) { printf("EssMdxGetClusters failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxGetClusters sts: %ld\n", sts); printf("Num clusters %ld\n", ulNClusters); for (ulClusterCnt = 0; ulClusterCnt < ulNClusters; ulClusterCnt++) { hCluster = haClusters[ulClusterCnt]; if ((sts = EssMdxGetClusterInfo(hCluster, &ulClusterSize, &ulNClusterDims, &ulaDimSizes)) != ESS_STS_NOERR) { printf("EssMdxGetClusterInfo failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxGetClusterInfo sts: %ld\n", sts); printf("Cluster %ld Size %ld\n", ulClusterCnt, ulClusterSize); for (ulClusterDimCnt = 0; ulClusterDimCnt < ulNClusterDims; ulClusterDimCnt++) { printf("Cluster Dim %ld Size %ld\n", ulClusterDimCnt, ulaDimSizes[ulClusterDimCnt]); } for (ulIndex = 0; ulIndex < ulClusterSize; ulIndex++) { if ((sts = EssMdxGetClusterMembers(hCluster, ulIndex, &haMbrs)) != ESS_STS_NOERR) { printf("EssMdxGetClusterMembers failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxGetClusterMembers sts: %ld\n", sts); for (ulClusterDimCnt = 0; ulClusterDimCnt < ulNClusterDims; ulClusterDimCnt++) { if ((sts = EssMdxGetMbrIdentifier(haMbrs[ulClusterDimCnt], &pszMbrIdentifier)) != ESS_STS_NOERR) { printf("EssMdxGetMbrIdentifier failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxGetMbrIdentifier sts: %ld\n", sts); printf("Mbr %ld identifier %s\n", ulClusterDimCnt, pszMbrIdentifier); haProps = haaProps[ulClusterDimCnt]; for (ulPropCnt = 0; ulPropCnt < ulaNProps[ulClusterDimCnt]; ulPropCnt++) { if ((sts = EssMdxGetMbrProperty(haMbrs[ulClusterDimCnt], haProps[ulPropCnt], &propval)) != ESS_STS_NOERR) { printf("EssMdxGetMbrProperty failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxGetMbrProperty sts: %ld\n", sts); printf("Property %ld Type ", ulPropCnt); switch (propval.ulPropType) { case ESS_MDX_PROPTYPE_ULONG: { printf("Ulong Value: %ld\n", propval.value.ulData); break; } case ESS_MDX_PROPTYPE_STRING: { printf("String Value: %s\n", propval.value.strData); break; } case ESS_MDX_PROPTYPE_BOOL: { printf("Bool Value: %s\n", propval.value.bData ? "TRUE" : "FALSE"); break; } case ESS_MDX_PROPTYPE_DOUBLE: { printf("Double Value: %lf\n", propval.value.dblData); break; } case ESS_MDX_PROPTYPE_DATETIME: { ESS_CHAR_T tmpbuf[80]; struct tm* pTime; pTime = gmtime((time_t*)&(propval.value.dtData)); sprintf(tmpbuf, "%02i-%02i-%04i", pTime->tm_mon+1, pTime->tm_mday,pTime->tm_year+1900); printf("DateTime Value: %s\n", tmpbuf); break; } case ESS_MDX_PROPTYPE_NONE: { printf("NULL Value\n"); break; } } } } if ((sts = EssFree(hInst, (ESS_PVOID_T) haMbrs)) != ESS_STS_NOERR) { printf("EssFree failure: %ld\n", sts); exit ((int) sts); } printf("EssFree sts: %ld\n", sts); } for (ulClusterDimCnt = 0; ulClusterDimCnt < ulNClusterDims; ulClusterDimCnt++) { if ((sts = EssMdxGetClusterDimMembers(hCluster, ulClusterDimCnt, &haMbrs)) != ESS_STS_NOERR) { printf("EssMdxGetClusterDimMembers failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxGetClusterDimMembers sts: %ld\n", sts); for (ulIndex = 0; ulIndex < ulaDimSizes[ulClusterDimCnt]; ulIndex++) { if ((sts = EssMdxGetMbrIdentifier(haMbrs[ulIndex], &pszMbrIdentifier)) != ESS_STS_NOERR) { printf("EssMdxGetMbrIdentifier failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxGetMbrIdentifier sts: %ld\n", sts); printf("Dim %ld Mbr %ld identifier %s\n", ulClusterDimCnt, ulIndex, pszMbrIdentifier); } } } for (ulIndex = 0; ulIndex < ulAxisSize; ulIndex++) { if ((sts = EssMdxGetAxisMembers(hAxis, ulIndex, &haMbrs)) != ESS_STS_NOERR) { printf("EssMdxGetAxisMembers failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxGetAxisMembers sts: %ld\n", sts); for (ulAxisDimCnt = 0; ulAxisDimCnt < ulNAxisDims; ulAxisDimCnt++) { if ((sts = EssMdxGetMbrIdentifier(haMbrs[ulAxisDimCnt], &pszMbrIdentifier)) != ESS_STS_NOERR) { printf("EssMdxGetMbrIdentifier failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxGetMbrIdentifier sts: %ld\n", sts); printf("Mbr %ld identifier %s\n", ulAxisDimCnt, pszMbrIdentifier); haProps = haaProps[ulAxisDimCnt]; for (ulPropCnt = 0; ulPropCnt < ulaNProps[ulAxisDimCnt]; ulPropCnt++) { hProp = haProps[ulPropCnt]; if ((sts = EssMdxGetPropertyInfo(hProp, &pszPropName, &propType)) != ESS_STS_NOERR) { printf("EssMdxGetPropertyInfo failure: %ld\n", sts); exit ((int) sts); } if ((sts = EssMdxGetMbrProperty(haMbrs[ulAxisDimCnt], hProp, &propval)) != ESS_STS_NOERR) { printf("EssMdxGetMbrProperty failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxGetMbrProperty sts: %ld\n", sts); printf("Property %ld Type ", ulPropCnt); switch (propval.ulPropType) { case ESS_MDX_PROPTYPE_ULONG: { printf("Ulong Value: %ld\n", propval.value.ulData); break; } case ESS_MDX_PROPTYPE_STRING: { printf("String Value: %s\n", propval.value.strData); break; } case ESS_MDX_PROPTYPE_BOOL: { printf("Bool Value: %s\n", propval.value.bData ? "TRUE" : "FALSE"); break; } case ESS_MDX_PROPTYPE_DOUBLE: { printf("Double Value: %lf\n", propval.value.dblData); break; } case ESS_MDX_PROPTYPE_DATETIME: { ESS_CHAR_T tmpbuf[80]; struct tm* pTime; pTime = gmtime((time_t*)&(propval.value.dtData)); sprintf(tmpbuf, "%02i-%02i-%04i", pTime->tm_mon+1, pTime->tm_mday,pTime->tm_year+1900); printf("DateTime Value: %s\n", tmpbuf); break; } case ESS_MDX_PROPTYPE_NONE: { printf("NULL Value\n"); break; } } } } if ((sts = EssFree(hInst, (ESS_PVOID_T) haMbrs)) != ESS_STS_NOERR) { printf("EssFree failure: %ld\n", sts); exit ((int) sts); } printf("EssFree sts: %ld\n", sts); } if ((sts = EssFree(hInst, (ESS_PVOID_T) ulaNProps)) != ESS_STS_NOERR) { printf("EssFree failure: %ld\n", sts); exit ((int) sts); } printf("EssFree sts: %ld\n", sts); if ((sts = EssFree(hInst, (ESS_PVOID_T) haaProps)) != ESS_STS_NOERR) { printf("EssFree failure: %ld\n", sts); exit ((int) sts); } printf("EssFree sts: %ld\n", sts); } void ESS_MdxQry() { ESS_STS_T sts; ESS_MDX_QRYHDL_T hQry; ESS_ULONG_T ulNAxes, ulNAxisDims, ulAxisSize, ulResultSize; ESS_ULONG_T ulNClusters, ulClusterSize, ulNClusterDims; ESS_ULONG_T ulAxisCnt, ulAxisDimCnt, ulIndex, ulPropCnt; ESS_ULONG_T ulCellOffset, ulClusterCnt, ulClusterDimCnt; ESS_MDX_CELLSTATUS_T ulCellStatus; ESS_PULONG_T ulaDimSizes; ESS_MDX_PCLUSTERHDL_T haClusters; ESS_MDX_CLUSTERHDL_T hCluster; ESS_MDX_PAXISHDL_T haAxes; ESS_MDX_PDIMHDL_T haDims; ESS_STR_T pszDimName, pszMbrIdentifier, pszPropName; ESS_MDX_AXISHDL_T hAxis, hSlicerAxis; ESS_MDX_PMBRHDL_T haMbrs; ESS_MDX_CELLHDL_T hCell; ESS_DOUBLE_T dValue; ESS_BOOL_T bIsMissing, bNoAccess; ESS_PULONG_T ulaNProps; ESS_MDX_PPPROPHDL_T haaProps; ESS_MDX_PPROPHDL_T haProps; ESS_MDX_PROPHDL_T hProp; ESS_MDX_PROPTYPE_T propType; ESS_MDX_PROPVALUE_T propval; if ((sts = EssMdxNewQuery(hCtx, qry, &hQry)) != ESS_STS_NOERR) { printf("EssMdxNewQuery failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxNewQuery sts: %ld\n", sts); if ((sts = EssMdxSetMbrIdType(hQry, ESS_MDX_MEMBERIDTYPE_ALIAS)) != ESS_STS_NOERR) { printf("EssMdxSetMbrIdType failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxSetMbrIdType sts: %ld\n", sts); if ((sts = EssMdxSetNeedCellStatus(hQry)) != ESS_STS_NOERR) { printf("EssMdxSetNeedCellStatus failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxSetNeedCellStatus sts: %ld\n", sts); if ((sts = EssMdxExecuteQuery(hQry)) != ESS_STS_NOERR) { printf("EssMdxExecuteQuery failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxExecuteQuery sts: %ld\n", sts); if ((sts = EssMdxGetAxes(hQry, &ulNAxes, &haAxes, &hSlicerAxis)) != ESS_STS_NOERR) { printf("EssMdxGetAxes failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxGetAxes sts: %ld\n", sts); printf("Number of axes: %ld\n", ulNAxes); ulResultSize = 1; for (ulAxisCnt = 0; ulAxisCnt < ulNAxes; ulAxisCnt++) { hAxis = haAxes[ulAxisCnt]; if ((sts = EssMdxGetAxisInfo(hAxis, &ulAxisSize, &ulNAxisDims, &haDims)) != ESS_STS_NOERR) { printf("EssMdxGetAxisInfo failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxGetAxisInfo sts: %ld\n", sts); printf("Axis %ld Size %ld Num dims %ld\n", ulAxisCnt, ulAxisSize, ulNAxisDims); ulResultSize *= ulAxisSize; } if (hSlicerAxis) { ESS_MdxAxis(hQry, hSlicerAxis, "SLICER"); } else { printf("Slicer Axis is empty\n"); } for (ulAxisCnt = 0; ulAxisCnt < ulNAxes; ulAxisCnt++) { hAxis = haAxes[ulAxisCnt]; ESS_MdxAxis(hQry, hAxis, axisnames[ulAxisCnt]); } for (ulCellOffset = 0; ulCellOffset < ulResultSize; ulCellOffset++) { if ((sts = EssMdxGetCellAtOffset(hQry, ulCellOffset, &hCell)) != ESS_STS_NOERR) { printf("EssMdxGetCellAtOffset failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxGetCellAtOffset sts: %ld\n", sts); if ((sts = EssMdxGetValue(hCell, &bIsMissing, &bNoAccess, &dValue)) != ESS_STS_NOERR) { printf("EssMdxGetValue failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxGetValue sts: %ld\n", sts); if (bIsMissing) { printf("CellOffset %ld Value #Missing\n", ulCellOffset); } else if (bNoAccess) { printf("CellOffset %ld Value #NoAccess\n", ulCellOffset); } else { printf("CellOffset %ld Value %lf\n", ulCellOffset, dValue); } if (!bNoAccess) { if ((sts = EssMdxGetCellStatus(hQry, hCell, &ulCellStatus)) != ESS_STS_NOERR) { printf("EssMdxGetCellStatus failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxGetCellStatus sts: %ld\n", sts); if (ulCellStatus & ESS_MDX_CELLSTATUS_LINKEDOBJS) { printf("Cell status: LINKEDOBJS\n"); } if (ulCellStatus & ESS_MDX_CELLSTATUS_DYNCALC) { printf("Cell status: DYNCALC\n"); } if (ulCellStatus & ESS_MDX_CELLSTATUS_CALCEDMBR) { printf("Cell status: CALCEDMBR\n"); } if (ulCellStatus & ESS_MDX_CELLSTATUS_READONLY) { printf("Cell status: READONLY\n"); } } } if ((sts = EssMdxFreeQuery(hQry)) != ESS_STS_NOERR) { printf("EssMdxFreeQuery failure: %ld\n", sts); exit ((int) sts); } printf("EssMdxFreeQuery sts: %ld\n", sts); } void ESS_Term() { ESS_STS_T sts = ESS_STS_NOERR; if ((sts = EssTerm(hInst)) != ESS_STS_NOERR) { /* error terminating API */ exit((ESS_USHORT_T) sts); } printf("EssTerm sts: %ld\n", sts); } void ESS_Logout() { ESS_STS_T sts = ESS_STS_NOERR; sts = EssLogout(hCtx); printf("\n\nEssLogout sts: %ld\n",sts); } void ESS_SetActive() { ESS_STS_T sts = ESS_STS_NOERR; ESS_ACCESS_T Access; sts = EssSetActive(hCtx, AppName, DbName, &Access); printf("EssSetActive sts: %ld\n",sts); } int main(int argc, char *argv[]) { FILE *f; char *s, *sout; int n, l, e; assert(argc > 1); f = fopen(argv[1], "r"); assert(f != NULL); s = qry; n = MAXQRYLEN; while (n > 0 && !feof(f) && fgets(s, n, f) != NULL) { l = strlen(s); s += l; n -= l; } if ((e = ferror(f)) != 0) { printf("fgets error %d\n", e); exit((int) e); } fclose(f); printf("The query is\n%s\n", qry); if (argc > 2) { AppName = argv[2]; } if (argc > 3) { DbName = argv[3]; } ESS_Init(); ESS_Login(); ESS_SetActive(); ESS_MdxQry(); ESS_Logout(); ESS_Term(); return 0; }