如何使用 FairCom c-treeACE CTDB API 创建索引



这是我基于 CTDB 教程的代码。

#include <stdio.h>
#include <tchar.h>
#include "ctdbsdk.h" /* c-tree headers */
#define END_OF_FILE INOT_ERR  /* INOT_ERR is ctree's 101 error. See cterrc.h */
CTHANDLE hSession;
CTHANDLE hDatabase;
CTHANDLE hTable;
CTHANDLE hRecord;

VOID Handle_Error(CTSTRING errmsg)
{
    printf("nERROR: [%d] - %s n", ctdbGetError(hSession), errmsg);
    printf("*** Execution aborted *** n");
    printf("Press <ENTER> key to exit...");
    ctdbLogout(hSession);
    ctdbFreeRecord(hRecord);
    ctdbFreeTable(hTable);
    ctdbFreeSession(hSession);
    getchar();
    exit(1);
}

// Open the table, if it exists. Otherwise create and open the table
VOID Define(VOID)
{
    CTHANDLE hField1, hField2, hField3, hField4;
    CTHANDLE hField5, hField6, hField7;
    printf("DEFINEn");
    /* allocate a table handle */
    if ((hTable = ctdbAllocTable(hDatabase)) == NULL)
        Handle_Error("Define(); ctdbAllocTable()");
    /* open table */
    printf("tOpen table...n");
    if (ctdbOpenTable(hTable, "custmast", CTOPEN_NORMAL)) {
        /* define table fields */
        printf("tAdd fields...n");
        hField1 = ctdbAddField(hTable, "cm_custnumb", CT_INT8U, 0);
        hField2 = ctdbAddField(hTable, "cm_custzipc", CT_FSTRING, 9);
        hField3 = ctdbAddField(hTable, "cm_custstat", CT_FSTRING, 2);
        hField4 = ctdbAddField(hTable, "cm_custratg", CT_FSTRING, 1);
        hField5 = ctdbAddField(hTable, "cm_custname", CT_STRING, 47);
        hField6 = ctdbAddField(hTable, "cm_custaddr", CT_STRING, 47);
        hField7 = ctdbAddField(hTable, "cm_custcity", CT_STRING, 47);
        if (!hField1 || !hField2 || !hField3 || !hField4 ||
            !hField5 || !hField6 || !hField7)
            Handle_Error("Define(); ctdbAddField()");
        /* create table */
        printf("tCreate table...n");
        if (ctdbCreateTable(hTable, "custmast", CTCREATE_NORMAL))
            Handle_Error("Define(); ctdbCreateTable()");
        if (ctdbOpenTable(hTable, "custmast", CTOPEN_NORMAL))
            Handle_Error("Define(); ctdbOpenTable()");
    }
}

NINT main(NINT argc, pTEXT argv[])
{
    CTDBRET  retval;
    printf("INITn");
    if ((hSession = ctdbAllocSession(CTSESSION_CTDB)) == NULL) /* allocate session handle */
        Handle_Error("Initialize(): ctdbAllocSession()");
    printf("tLogon to server...n");
    if (ctdbLogon(hSession, "FAIRCOMS", "ADMIN", "ADMIN")) /* connect to server */
        Handle_Error("Initialize(): ctdbLogon()");
    hDatabase = ctdbAllocDatabase(hSession);
    if (ctdbConnect(hDatabase, "FTS") == CTDBRET_OK) {
        printf("Connected to DBn");
    } else {
        printf("Creating DBn");
        if (ctdbCreateDatabase(hSession, "FTS", "")) {
            Handle_Error(hSession, "ctdbCreateDatabase()");
        }
        ctdbConnect(hDatabase, "FTS");
    }

    Define();
    printf("tClose table...n");
    if (ctdbCloseTable(hTable))
        Handle_Error("Done(): ctdbCloseTable()");
    printf("tLogout...n");
    if (ctdbLogout(hSession))
        Handle_Error("Done(): ctdbLogout()");
    ctdbFreeRecord(hRecord);
    ctdbFreeTable(hTable);
    ctdbFreeDatabase(hDatabase);
    ctdbFreeSession(hSession);
    printf("nPress <ENTER> key to exit . . .n");
    getchar();
    return(0);
}

只需在调用 ctdbCreateTable 之前添加以下内容:

    CTHANDLE hIndex;
    if ((hIndex = ctdbAddIndex(hTable, "cm_custnumb_idx", CTINDEX_FIXED, NO, NO)) == NULL)
        Handle_Error("Define(); ctdbAddIndex()");
    CTHANDLE hSeg;
    if ((hSeg = ctdbAddSegment(hIndex, hField1, CTSEG_SCHSEG)) == NULL)
        Handle_Error("Define(); ctdbAddSegment()");

最新更新