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

How do I create an index using the 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("DEFINE\n");

    /* 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("INIT\n");

    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 DB\n");
    } else {
        printf("Creating DB\n");
        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()");