Thursday, March 15, 2018

CompileCIL and Refresh Services using X++

Refhttps://krishhdax.blogspot.in/2017/04/ax2012-compilecil-and-refresh-services.html 

static void CompileCILRefresh(Args _args)
{
    #AviFiles
    #File

    #define.fileName('AxTime.txt')

    TextIo                  file;
    FileIoPermission        permission;
    SysOperationProgress    progress;
    container               fileContainer;

    int                     i;

    Dialog                  dialog;

    DialogField             dlgCompile;
    DialogField             dlgCIL;
    DialogField             dlgIncCIL;
    DialogField             dlgRefreshService;

    int                     timeStarted[2];
    int                     timeAverage[4]; //1:FUllCompileTime,2:FULLCILCompileTime,3:IncrementalCILTime,4:RefreshServicesTime
    int                     timeExpected;

    Filename                filename
    ;

    void getAverageTime()
    {
        filename = WinAPI::getCurrentDirectory() + '\\' + fileName;

        permission = new FileIoPermission(filename, #io_read+#io_write);
        permission.assert();

        if(WinAPI::fileExists(filename))
        {
            file        = new TextIo(filename, #io_read);
            fileContainer   = file.read();
            timeAverage[1]  = str2int(conPeek(fileContainer,1));
            timeAverage[2]  = str2int(conPeek(fileContainer,2));
            timeAverage[3]  = str2int(conPeek(fileContainer,3));
            timeAverage[4]  = str2int(conPeek(fileContainer,4));
            file = null;
        }

        CodeAccessPermission::revertAssert();
    }

    void setAverageTime()
    {
        permission = new FileIoPermission(filename, #io_write);
        permission.assert();

        fileContainer = conNull();
        fileContainer = conIns(fileContainer,1,int2str(timeAverage[1]));
        fileContainer = conIns(fileContainer,2,int2str(timeAverage[2]));
        fileContainer = conIns(fileContainer,3,int2str(timeAverage[3]));
        fileContainer = conIns(fileContainer,4,int2str(timeAverage[4]));

        file = new TextIo(filename, #io_write);
        file.write(fileContainer);
        file.finalize();

        file = null;

        CodeAccessPermission::revertAssert();
        permission = null;
    }

    dialog  = new Dialog("Compile/CIl/Refresh");

    dialog.addInfoImage();
    dialog.addText("Please select actions needed and please be aware that all are time consuming processes");

    dialog.addGroup("Compile application");
    dlgCompile  = dialog.addFieldValue(extendedTypeStr(NoYesId),NoYes::No,"AOT Compile");

    dialog.addGroup("Compile CIL");
    dlgCIL      = dialog.addFieldValue(extendedTypeStr(NoYesId), NoYes::No, "FULL");
    dlgIncCIL   = dialog.addFieldValue(extendedTypeStr(NoYesId), NoYes::No, "Incemental");

    dialog.addGroup("Other");
    dlgRefreshService   = dialog.addFieldValue(extendedTypeStr(NoYesId),NoYes::No,"Refresh Services");

    if (!dialog.run())
        throw error("Operation aborted");

    filename        = #fileName;

    timeAverage[1]  = 3600; // 60:00 min
    timeAverage[2]  = 1800; // 30:00 min
    timeAverage[3]  = 900;  // 15:00 min
    timeAverage[4]  = 300;  // 5:00 min

    getAverageTime();

    timeExpected += dlgCompile.value()          ? timeAverage[1] : 0;
    timeExpected += dlgCIL.value()              ? timeAverage[2] : 0;
    timeExpected += dlgIncCIL.value()           ? timeAverage[3] : 0;
    timeExpected += dlgRefreshService.value()   ? timeAverage[4] : 0;

    progress = new SysOperationProgress();
    progress.updateInterval(0);
    progress.setAnimation(#AviStopwatch);

    progress.setTotal(1 + dlgCompile.value() + (dlgCIL.value() || dlgIncCIL.value()) + dlgRefreshService.value());

    timeStarted[1] = timeNow();

    info(strFmt("Process stared by %1",curUserId()));

    //Compile the application
    startLengthyOperation();
    sleep(3);

    //AOT Compile
    if (dlgCompile.value())
    {
        progress.incCount();
        progress.setText(strfmt("AOT Compile compiling | Start time : %1 ETA : %2",time2str(timeNow(),1,1),time2str(timeAverage[1] + timeNow(),1,1)));

        //Do function
        timeStarted[2] = timeNow();

        SysCompileAll::flushClient();
        SysCompileAll::compile();

        SysCheckList::finished(classnum(SysCheckListItem_Compile));
        SysCheckList::finished(classnum(SysCheckListItem_CompileUpgrade));
        SysCheckList::finished(className2Id(classStr(SysCheckListItem_CompileServ)));
        SysCheckList::finished(classnum(SysCheckListItem_SysUpdateCodeCompilInit));

        timeAverage[1] = ((timeNow()-timeStarted[2]) + timeAverage[1])/2;
        info(strFmt("AOT Compile toke : %1*",time2str(timeAverage[1],1,1)));
    }

    //Incremntal CIL
    if (dlgIncCIL.value())
    {
        progress.incCount();
        progress.setText(strfmt("Incremental CIL Compiling | Start time : %1 ETA : %2",time2str(timeNow(),1,1),time2str(timeAverage[3] + timeNow(),1,1)));

        //Do function
        timeStarted[2] = timeNow();
        SysCompileIL::generateIncrementalIL();

        timeAverage[3] = ((timeNow()-timeStarted[2]) + timeAverage[3])/2;
        info(strFmt("Increment CIL toke : %1*",time2str(timeAverage[3],1,1)));
    }
    //Full CIL
    else if (dlgCIL.value())
    {
        progress.incCount();
        progress.setText(strfmt("FULL CIL Compiling | Start time : %1 ETA : %2",time2str(timeNow(),1,1),time2str(timeAverage[2] + timeNow(),1,1)));

        //Do function
        timeStarted[2] = timeNow();
        SysCompileIL::generateIL();
        timeAverage[2] = ((timeNow()-timeStarted[2]) + timeAverage[2])/2;
        info(strFmt("FULL CIL toke : %1*",time2str(timeAverage[2],1,1)));
    }

    // Refresh services
    if (dlgRefreshService.value())
    {
        progress.setText(strfmt("Refresh Services | Start time : %1 ETA : %2",time2str(timeNow(),1,1),time2str(timeAverage[4] + timeNow(),1,1)));
        progress.incCount();

        timeStarted[2] = timeNow();

        AifServiceGenerationManager::registerServices();

        timeAverage[4] = ((timeNow()-timeStarted[2]) + timeAverage[4])/2;
        info(strFmt("Refresh Services toke : %1*",time2str(timeAverage[4],1,1)));
    }

    setAverageTime();

    endLengthyOperation();

    //Flush all
    sysFlushAOD::main(_args);
    sysFlushData::main(_args);
    sysFlushDictionary::main(_args);
    info(strFmt("*Averagetime"));
    info(strFmt("Total time spendt : %1",time2str(timeNow()-timeStarted[1],1,1)));
}

No comments:

Post a Comment

Convert Call stack to readable format in D365FO X++

//Input --container _xppCallStack = xSession::xppCallStack();  Public static str POL_formatXppCallStack(container _xppCallStack, int _skipFr...