⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 PB 熟悉的哥们希望大家可以互相学习一下
💻 C
📖 第 1 页 / 共 2 页
字号:

    rc = mco_trans_start(db, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t);
    if (MCO_S_OK != rc)
    {
        printf("\nError starting trn\n");
        return rc;
    }

    rc = Rec_new(t, &rec);
    if (rc)
    {
        goto Err;
    }

    rc = Rec_key_put(&rec, key);
    if (rc)
    {
        goto Err;
    }

    vl = rand2(1, MAX_VECT_LEN);
    if ((rc = Rec_valuev_alloc(&rec, vl)))
    {
        goto Err;
    }

    for (i = 0; i < vl; i++)
    {

        if ((rc = Rec_valuev_put(&rec, i, &sv)))
        {
            goto Err;
        }
        if ((rc = Svalue_tm_put(&sv, i + idx)))
        {
            goto Err;
        }
        if ((rc = Svalue_u4_put(&sv, i + idx)))
        {
            goto Err;
        }
        str = get_random_string();
        len = (uint2)strlen(str);
        rc = Svalue_bytes_put(&sv, str, len);
    }

    sprintf(buf, "str %d", key);
    buflen = (uint2)strlen(buf);
    Rec_str_put(&rec, buf, buflen);

    //  recsum = record_checksum(key, buf, buflen);
    recsum = record_checksum_byhandle(&rec);

    chk->checksum_before_commit = chk->checksum_after_commit ^ recsum;

    rc = mco_trans_commit(t);
    if (rc == MCO_S_OK)
    {
        chk->checksum_after_commit = chk->checksum_before_commit;
    }
    if (rc)
    {
        i++;
    }
    idx += 0x123456;
    return rc;
    Err: mco_trans_rollback(t);
    idx += 0x123456;
    return rc;
}


static MCO_RET deleteTrn(mco_db_h db)
{
    MCO_RET rc;
    mco_trans_h t;
    Rec rec;
    CheckSums* chk = (CheckSums*)CHECKSUM_ADDR;
    int recsum;
    mco_cursor_t csr;

    // Delete first record

    rc = mco_trans_start(db, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t);
    if (MCO_S_OK != rc)
    {
        printf("\nError starting trn\n");
        return rc;
    }

    Rec_tkey_index_cursor(t, &csr);
    rc = mco_cursor_first(t, &csr);
    if (rc != MCO_S_OK)
    {
        // no records
        goto Err;
    }
    rc = Rec_from_cursor(t, &csr, &rec);
    if (rc)
    {
        goto Err;
    }

    recsum = record_checksum_byhandle(&rec);

    rc = Rec_delete(&rec);
    if (rc)
    {
        goto Err;
    }
    chk->checksum_before_commit = chk->checksum_after_commit ^ recsum;
    rc = mco_trans_commit(t);
    if (rc == MCO_S_OK)
    {
        chk->checksum_after_commit = chk->checksum_before_commit;
    }
    return rc;

    Err: mco_trans_rollback(t);
    return rc;
}

/****************************************************
 *          "Check Resources" thread 
 ****************************************************/

THREAD_PROC_DEFINE(CheckResources, arg)
{
    mco_db_h db = 0;
    unsigned wdt_state = 0;

    THREAD_PROC_MODE();

    printf("check time %ld\n", CheckTime);
    Sleep(CheckTime);

    for (;;)
    {

        if (stopflag)
        {
            l10: stopflag--;
            printf("CheckResources thread complete\n");
            if (db != 0)
            {
                mco_db_disconnect(db);
            }
            return ;
        }

        Sleep(CheckTime);
        if (stopflag)
        {
            goto l10;
        }

        if (!startflag)
        {
            continue;
        }

        if (!mco_db_check_resources(dbName, &db, 40000, &wdt_state))
        {
            printf("\n*** recovery was done ***\n");
        }
    }

}


/****************************************************
 *          "Working" thread 
 ****************************************************/

THREAD_PROC_DEFINE(Working, par)
{
    int creating_db = 0; //1;
    MCO_RET rc;
    int cnt = 0;

    int ndeletes = 0, nfailed_deletes = 0, ninserts = 0, nfailedinserts = 0;

    THREAD_PROC_MODE();

    startflag = 0;
    Sleep(100);

    printf("\n****** Thread started ******\n");

    startflag++;

    creating_db = starting_create_new_db(&db);

    if (creating_db)
    {
        printf("\nCreating DB for the first time\n");
    }
    else
    {
        printf("\nRecovering DB after power off\n");
    }

    Sleep(500);

    rc = connect_to_db(&db, creating_db);

    if (rc)
    {
        printf("\nDb connecting error\n");
        for (;;)
            ;
    }

    printf("\nStarting cycle of inserts and deletes\n");

    for (cnt = 0; !stopflag; cnt++)
    // just creating & deleting records, updating checksum, until interrupted
    {
        int n;

        n = nRecords(db);

        count++;

        if (n > (20+cnt % 10))
        {
            ndeletes++;
            rc = deleteTrn(db);
            if (rc)
            {
                nfailed_deletes++;
            }
        }
        else
        {
            ninserts++;
            rc = insertTrn(db);

            if (rc)
            {
                nfailedinserts++;
            }
        }

        if (cnt % LOG_PERIOD == 0)
        {
            CheckSums* chk = (CheckSums*)CHECKSUM_ADDR;
            classStat(db);
            printf("\nCurrent Checksum = %d (%d)\n", chk->checksum_after_commit, chk->checksum_before_commit);

            printf("\n ndeletes=%d, nfailed_deletes=%d, ninserts=%d, nfailedinserts=%d\n", ndeletes, nfailed_deletes,
                   ninserts, nfailedinserts);
            Sleep(100);
        }

    }
    printf("\nWorking thread complete\n");
    if (db != 0)
    {
        mco_db_disconnect(db);
    }

    stopflag--;
}


void PowerOff()
{
    int i, j;

    startflag = 0;

    THREAD_CANCEL(thWorkThread);

    Sleep(100);

    printf("\n**************** RESTART *******************\n");
    printf("\n**************** RESTART *******************\n");
    printf("\n**************** RESTART *******************\n");

    for (i = 0; i < 100; i++)
    {
        if (stopflag)
        {
            goto l10;
        }
        j = count;
        Sleep(100);
        printf("\n*** Wait stopping working thread ***\n");
        if (count == j)
        {
            break;
        }
        count = 0;
    }
    printf("\n*** Restart working thread ***\n");

    THREAD_PROC_START(Working, 0, &thWorkThread);

    l10: ;
}

/* parsing command line */

int parse_cmd(int argc, char** argv)
{
    int i;
    char* p;
    int flag = 1;

    if (argc < 2)
    {
        return 1;
    }

    for (i = 1; i < argc; i++)
    {

        p = argv[i];

        if (strstr(p, "--test"))
        {
            test_Mode = 1;
            continue;
        }
        if ((p[0] == '/') || (p[0] == '-'))
        {
            if (p[1] == 'h')
            {
                help();
                return 0;
            }
            if (p[1] == 't')
            {
                flag++;
                if ((CheckTime = atoi((const char*) &p[2])) == 0)
                {
                    CheckTime = 1000;
                }
            }
        }
    }
    return flag;
}

#ifndef WIN32_WCE
    int main(int argc, char** argv)
#else 
    int __cdecl main(int argc, char** argv)
#endif 
{
    int i;
    FILE* f = stdin;
    char s[256];

    pdb = &db;

    PROCESS_MASKS(); // for LINUX, QNX, SOLARIS

    #if defined(_LINUX) || defined(_QNX) || defined(_SOLARIS) 
        sigdelset(&set, SIGALRM);
        sigprocmask(SIG_SETMASK, &set, 0);
    #endif 

    s[0] = 0;

    {
        mco_runtime_info_t info;

        mco_get_runtime_info(&info);

        if (!info.mco_recovery_supported)
        {
            printf("\n\n Recovery support is not configured! \n");
            PROG_EXIT(0);
        }
    }

    if (parse_cmd(argc, argv) == 0)
    {
        #ifdef _WIN32_WCE
            char str[128];
            printf("\npress ENTER to exit\n");
            gets(str);
        #endif 
        PROG_EXIT(0);
    }

    _SH_();

    mco_runtime_start();

    mco_error_set_handler(&errhandler);

    mco_runtime_setoption(MCO_RT_OPTION_ZMUTEX_NR1,  // loop  waiting the resource
    long_loop  // the loop value
    );

    make_strings();

    if (CheckTime)
    {
        THREAD_PROC_START(CheckResources, 0, &thCheckRes); /* run "Check Resources" thread */
    }

    THREAD_PROC_START(Working, 0, &thWorkThread);

    Sleep(1000);

    for (;;)
    {
        #ifdef _VXWORKS
            i = 0;
            while (i == 0)
            {
                ioctl(f->_file, FIONREAD, (int) &i);
                Sleep(100);
            }
        #endif 
        if (test_Mode == 1)
        {
            Sleep(5000);
        }

        if ((fgets(s, 256, stdin)) == 0)
        {
            continue;
        }
        if (s[0] == 0)
        {
            continue;
        }
        i = atoi(s);
        if (i == 343)
        {
            EXIT(1);
        }
        if (s[0] == 'e')
        {
            stopflag = 2;
            break;
        }

        PowerOff();
    }

    Printf("\n\nApplication interrupted by keystroke\n");
    Printf("Wait for the completion of working threads\n");

    for (i = 0; i < 30; i++)
    {

        if (!stopflag)
        {
            break;
        }

        //      Printf("%d running threads lost\n", stopflag);
        Sleep(100); /* wait for terminating of working threads */
    }


    //    mco_db_disconnect(db);
    mco_db_close(dbName);

    mco_runtime_stop();

    printf("program termination\n");

    PROG_EXIT(0);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -