コード例 #1
0
ファイル: extenddb.c プロジェクト: sscreation/eXTendDB
XTDBError
XTDBInitHandle(const char* dbName,const char* dir,XTDBHandle** out) {
    XTDBError rv;
    XTDBHandle* h = malloc(sizeof(XTDBHandle));
    int rc;
    //InitQueryModule();
    if (!h) {
        return XTDB_NO_MEM;
    }
    memset(h,0,sizeof(*h));
    StrInit(&h->dbName);
    if (StrAppend(&h->dbName,dbName)) {
        rv = XTDB_NO_MEM;
        goto error;
    }
    StrInit(&h->dataDir);
    if (StrAppend(&h->dataDir,dir)) {
        rv = XTDB_NO_MEM;
        goto error;
    }
    StrInit(&h->descName);
    if (StrAppendFmt(&h->descName,"%s/%s.desc",dir,dbName)) {
        rv = XTDB_NO_MEM;
        goto error;
    }
    StrInit(&h->mainDbFileName);
    if (StrAppendFmt(&h->mainDbFileName,"%s/%s.main.data",dir,dbName)) {
        rv = XTDB_NO_MEM;
        goto error;
    }

    h->indexes = tcmapnew2(23);
    if (!h->indexes) {
        rv = XTDB_NO_MEM;
        goto error;
    }
    //h->indexes = hash_table_new(stringhash,string_equal);
    //hash_table_register_free_functions(h->indexes,free,NULL);
    if (!(h->mainDB = DBInit(h->mainDbFileName.ptr,BDBOCREAT|BDBOWRITER))) {
        rv = XTDB_NO_MEM;
        goto error;
    }

    if (!(rc=DBOpen(h->mainDB,BDBOCREAT|BDBOWRITER))) {
        rv = DBGetLastError(h->mainDB);
        goto error;
    }

    if (!XTDBLoadIndexes(h)) {
        rv = h->error;
        goto error;
    }
    *out = h;
    return XTDB_OK;

error:
    XTDBFreeHandle(h);
    *out = NULL;
    return rv;
}
コード例 #2
0
ファイル: modsample.c プロジェクト: sajonoso/jual
int myfunc(jual_xapi *JXAPI)
{
    void *L = JXAPI->LS;
    // Map functions as required
    defGetNumber *GetNumber = (defGetNumber *)JXAPI->fnGetNumber;
    defGetString *GetString = (defGetString *)JXAPI->fnGetString;
    defGetObject *GetObject = (defGetObject *)JXAPI->fnGetObject;
    
    defNumberPush *NumberPush = (defNumberPush *)JXAPI->fnNumberPush;
    defStrInit *StrInit = (defStrInit *)JXAPI->fnStrInit;
    defStrAppend *StrAppend = (defStrAppend *)JXAPI->fnStrAppend;
    defStrPush *StrPush = (defStrPush *)JXAPI->fnStrPush;

    int iNum = GetNumber(L, 1);
    
    size_t tSize;
    const char *szParm2 = GetString(L, 2, &tSize);

    printf("you entered %d %s %d\n", iNum, szParm2, tSize);

    char strBuffer[JXAPI->STRBUFFER_SIZE];
    char *cResult = StrInit(L, strBuffer, 16);

    const char text[]="Hello from the C language";
    StrAppend(strBuffer, text, sizeof(text)-1);

    const char text2[]="More greeting from the C language";
    StrAppend(strBuffer, text2, sizeof(text2)-1);

    StrPush(strBuffer);

    return 1;
}
コード例 #3
0
ファイル: HString.c プロジェクト: phpxin/datastruct
int StrAssign(HString *hstr, const char *str)
{
    int slen = strlen(str);

    StrInit(hstr, slen);

    memcpy(hstr->ch, str, slen);
    return 1;
}
コード例 #4
0
ファイル: HString.c プロジェクト: phpxin/datastruct
int StrCopy(HString *dst, HString *src)
{
    if(StrEmpty(src)){ 
        ClearString(dst);
        return 1; 
    }
    
    StrInit(dst, src->len);

    memcpy(dst->ch, src->ch, src->len);
    return 1;
}
コード例 #5
0
ファイル: HString.c プロジェクト: phpxin/datastruct
int SubString(HString *sub, HString *src, int pos, int len)
{
    if(pos>=src->len || pos+len>src->len)   return 0;

    StrInit(sub, len);

    int i = 0, j = 0;
    for(i=pos,j=0; j<len; i++,j++){
        *(sub->ch+j) = *(src->ch+i);
    }

    return 1;
}
コード例 #6
0
ファイル: HString.c プロジェクト: phpxin/datastruct
//添加字符串到尾部
int StrAppend(HString *hs, const char *_str) {
    int _len = strlen(_str);
    if(StrEmpty(hs)){
        StrInit(hs, _len);
    }

    int _s_len = StrLength(hs);
    
    hs->ch = (char *)realloc(hs->ch, _s_len + _len);

    strncpy(hs->ch+_s_len, _str, _len);

    hs->len += _len ;

    return 1;
}
コード例 #7
0
ファイル: HString.c プロジェクト: phpxin/datastruct
int Concat(HString *dst,HString *hstr1,HString *hstr2){
    int _len = hstr1->len + hstr2->len;

    StrInit(dst, _len);

    int i=0;
    if(!StrEmpty(hstr1)){
        for(i=0; i<hstr1->len; i++){
            *( dst->ch + i ) = *( hstr1->ch + i ) ;
        }
    }
    if(!StrEmpty(hstr2)){
        for(i=0; i<hstr2->len; i++){
            *( dst->ch + hstr1->len + i ) = *( hstr2->ch + i ) ;
        }
    }

    return 1;
}
コード例 #8
0
ファイル: modsample.c プロジェクト: sajonoso/jual
function friendlyCall(num,str){return ffi_call(ffi_func1,num,str)};\n\
";

// **
// init function name must always be in the format of <module name>_init
// the init function must always return 0
// **
int modsample_init(jual_xapi *JXAPI) {
    void *L = JXAPI->LS;
    defStrInit *StrInit = (defStrInit *)JXAPI->fnStrInit;
    defStrAppend *StrAppend = (defStrAppend *)JXAPI->fnStrAppend;
    defStrPush *StrPush = (defStrPush *)JXAPI->fnStrPush;

    char strBuffer[JXAPI->STRBUFFER_SIZE];
    char *cResult = StrInit(L, strBuffer, 32);
    StrAppend(strBuffer, initString, sizeof(initString)-1);
    StrPush(strBuffer);

    return 0;
}
コード例 #9
0
ファイル: extenddb.c プロジェクト: sscreation/eXTendDB
uint8_t
XTDBDropIndex(XTDBHandle* handle,char* fieldName) {
    //void * iter = DBIter(handle->descDB);
    uint8_t deleted=False;
    String descKey,idxDBName;
    BinaryStr key,value;
    DataBaseBE* idxDB;

    idxDB = XTDBGetIndex(handle,fieldName);
    if (!idxDB) {
        handle->error = XTDB_NO_ENTRY;
        return False;
    }
    StrInit(&descKey);
    if (StrAppendFmt(&descKey,"index.value.%s",fieldName)) {
        handle->error = XTDB_NO_MEM;
        return False;
    }
    StrToBStr(IDXFIELDNAME,&key);
    StrToBStr(fieldName,&value);
    DBDeleteKeyVal(handle->descDB,&key,&value);
    DBClose(idxDB);

    if (!XTDBRemoveIndex(handle,fieldName)) {
        return False;
    }

    DBFree(idxDB);
    StrToBStr(descKey.ptr,&key);
    DBDelete(handle->descDB,&key);
    if (GetIndexDBName(handle,fieldName,&idxDBName)) {
        handle->error = XTDB_NO_MEM;
        return False;
    }
    unlink(STR(&idxDBName));
    StrFree(&descKey);
    StrFree(&idxDBName);
    return True;
}
コード例 #10
0
ファイル: extenddb.c プロジェクト: sscreation/eXTendDB
// XXX revisit after DB eror
uint8_t
XTDBCreateIndex(XTDBHandle* handle,char* fieldName) {
    String idxDBName;
    String descKey;
    bson idxDesc;
    BinaryStr key,value,data;
    DataBaseBE* db;
    int rc;

    StrInit(&descKey);
    if(StrAppendFmt(&descKey,"index.value.%s",fieldName)) {
        handle->error = XTDB_NO_MEM;
        return False;
    }
    StrToBStr(descKey.ptr,&key);
    if (DBGet(handle->descDB,&key,&value)) {
        // Index already exists
        printf("Index already exists.\n");
        StrFree(&descKey);
        BinaryStrFree(&value);
        handle->error= XTDB_INDEX_EXISTS;
        return False;
    }
    bson_init(&idxDesc);
    if (bson_append_string(&idxDesc,"name",fieldName)) {
        handle->error = XTDB_NO_MEM;
        bson_destroy(&idxDesc);
        StrFree(&descKey);
        return False;
    }
    if (bson_finish(&idxDesc)) {
        handle->error = XTDB_NO_MEM;
        bson_destroy(&idxDesc);
        StrFree(&descKey);
        return False;
    }

    BsonToBStr(&idxDesc,&value);
    if (!DBSet(handle->descDB,&key,&value,False)) {
        printf("Error Adding to index names list\n");
        handle->error = DBGetLastError(handle->descDB);
        bson_destroy(&idxDesc);
        StrFree(&descKey);
        return False;
    }
    StrFree(&descKey);
    StrToBStr(IDXFIELDNAME,&key);
    StrToBStr(fieldName,&value);
    if (!DBSet(handle->descDB,&key,&value,True)) {
        //printf("Error Adding to index names list\n");
        handle->error = DBGetLastError(handle->descDB);
        //handle->error = XTDB_IO_ERR;
        bson_destroy(&idxDesc);
        return False;
    }
    bson_destroy(&idxDesc);

    if (GetIndexDBName(handle,fieldName,&idxDBName)) {
        handle->error = XTDB_NO_MEM;
        return False;
    }

    db = DBInit(STR(&idxDBName),BDBOWRITER | BDBOCREAT);
    StrFree(&idxDBName);
    if (!db) {
        handle->error = XTDB_NO_MEM;
        return False;
    }

    rc = DBOpen(db,BDBOCREAT|BDBOWRITER);
    if (!rc) {
        handle->error = DBGetLastError(db);
        DBFree(db);
        return False;
    }
    DBClose(db);
    DBFree(db);
    if (!XTDBAddIndex(handle,fieldName)) {
        // AddIndex failed return
        printf("Error Adding to index names list\n");
        return False;
    }
    assert(XTDBGetIndex(handle,fieldName));
    void* iter = DBIter(handle->mainDB);
    while (DBIterCur(handle->mainDB,iter,&key,&data)) {
        //printf("Adding value to index\n");
        bson obj;
        BStrToBson(&data,&obj);
        if (!XTDBInsertToIndex(handle,&key,&data)) {
            return False;
        }
        BinaryStrFree(&key);
        BinaryStrFree(&data);
        DBIterNext(handle->mainDB,iter);
    }
    DBIterFree(handle->mainDB,iter);
    return True;
}
コード例 #11
0
ファイル: extenddb.c プロジェクト: sscreation/eXTendDB
int
GetIndexDBName(XTDBHandle* h,
               const char* field,String* out) {
    StrInit(out);
    return StrAppendFmt(out,"%s/%s.%s.idx",h->dataDir.ptr,h->dbName.ptr,field);
}
コード例 #12
0
ファイル: parse.c プロジェクト: PoCTo/yamsh
Str* ParseLex(char* s,Err* err,int* i){
    int len=0;
    static char op='\0';
    Str* S=NULL;
    S=StrInit();
    int noStep=0;
    char c;
    ParseLexStates prevstate,state=BLANK;
    
    if (s!=NULL) len=strlen(s); else return NULL;
    while ((*i)<len && s[*i]==' ') (*i)++;
    for (;(state!=ERROR && (*i)<=len);){
        c=s[*i];
        prevstate=state;
        switch (state){
            case BLANK:
                if (c=='"') state=QUOTE;
                else if (CharOp(c)) {
                    if (S->len==0 && CharDoubleOp(c)){
                        if ((*i)<len-1 && s[(*i)+1]==c){
                            StrPutChar(S,c); StrPutChar(S,c); 
                            StrPutChar(S,'\0');
                            (*i)+=2;
                            state=END;
                        } else {
                          StrPutChar(S,c); StrPutChar(S,'\0');
                          (*i)++;
                          state=END;
                        }
                    }
                    if (S->len==0 && CharSimpleOp(c)){
                        StrPutChar(S,c); StrPutChar(S,'\0');
                        state=END;
                        (*i)++;
                    }
                } else if (c==' ' || c=='\0') state=BLANK;
                else {
                    StrPutChar(S,c);
                    state=WORD;
                }
                break;
            case QUOTE:
                if (c!='"') StrPutChar(S,c);
                if (c=='"') {
                    StrPutChar(S,'\0');
                    state=END;
                    (*i)++;
                } else if ((*i)==len-1) state=ERROR;
                break;
            case OPERATOR:
                if (c==op && CharDoubleOp(c)){
                    StrPutChar(S,c);StrPutChar(S,c); StrPutChar(S,'\0');
                    state=END;
                    (*i)++;
                } else {
                    StrPutChar(S,c);
                    StrPutChar(S,'\0');
                    state=END;
                }
                break;
            case WORD:
                if (c=='"') state=WORD;
                else if (c==' '){
                    /*StrPutChar(S,' ');*/
                    state=END;
                } else if (CharOp(c)) {
                    state=END;
                    op=c;
                }
                else {
                    StrPutChar(S,c);
                }
                break;
            default:
                break;
        }
        if (state==END ) {
            if (StrLast(S)!='\0') StrPutChar(S,'\0');

            /*printf("%d\n",*i);*/
            return S;
        }
        if (!noStep) (*i)++;
        if (state==ERROR){
            if (prevstate==QUOTE) {
                err->pres=1;
                (err->err)=myrealloc(err->err,50);
                strcpy(err->err,"Unfinished Quote\0");
            }
            i=NULL;
            return NULL;
        }
        if ((*i)>=len){
            if (state==BLANK) return NULL;
            if (state!=BLANK) {
                if (StrLast(S)!='\0') StrPutChar(S,'\0');
                return S;
            }
        }
    }
    i=NULL;
    return S;
}