コード例 #1
0
long epicsShareAPI dbla(const char *pmask)
{
    DBENTRY dbentry;
    DBENTRY *pdbentry = &dbentry;
    long status;

    if (!pdbbase) {
        printf("No database loaded\n");
        return 0;
    }

    dbInitEntry(pdbbase, pdbentry);
    status = dbFirstRecordType(pdbentry);
    while (!status) {
        for (status = dbFirstRecord(pdbentry); !status;
             status = dbNextRecord(pdbentry)) {
            char *palias;

            if (!dbIsAlias(pdbentry))
                continue;

            palias = dbGetRecordName(pdbentry);
            if (pmask && *pmask && !epicsStrGlobMatch(palias, pmask))
                continue;
            dbFindField(pdbentry, "NAME");
            printf("%s -> %s\n", palias, dbGetString(pdbentry));
        }
        status = dbNextRecordType(pdbentry);
    }

    dbFinishEntry(pdbentry);
    return 0;
}
コード例 #2
0
ファイル: asTestLib.c プロジェクト: ukaea/epics
static
int checkGetString(DBENTRY *pent, const char *expect)
{
    dbCommon *prec = pent->precnode->precord;
    const char *actual = dbGetString(pent);
    int ret = strcmp(actual, expect);
    testOk(ret==0, "dbGetString(\"%s.%s\") -> '%s' == '%s'", prec->name,
           pent->pflddes->name, actual, expect);
    return ret;
}
コード例 #3
0
ファイル: dbAccess.c プロジェクト: T-A-R-L-A/EPICS-Base
long epicsShareAPI dbGetField(DBADDR *paddr,short dbrType,
    void *pbuffer, long *options, long *nRequest, void *pflin)
{
    short dbfType = paddr->field_type;
    dbCommon *precord = paddr->precord;
    long status = 0;

    dbScanLock(precord);
    if (dbfType >= DBF_INLINK && dbfType <= DBF_FWDLINK) {
        DBENTRY dbEntry;
        dbFldDes *pfldDes = paddr->pfldDes;
        char *rtnString;
        char *pbuf = (char *)pbuffer;
        int maxlen;

        if (options && (*options))
            getOptions(paddr, &pbuf, options, pflin);
        if (nRequest && *nRequest == 0) goto done;

        switch (dbrType) {
        case DBR_STRING:
            maxlen = MAX_STRING_SIZE - 1;
            if (nRequest && *nRequest > 1) *nRequest = 1;
            break;

        case DBR_CHAR:
        case DBR_UCHAR:
            if (nRequest && *nRequest > 0) {
                maxlen = *nRequest - 1;
                break;
            }
            /* else fall through ... */
        default:
            status = S_db_badDbrtype;
            goto done;
        }

        dbInitEntry(pdbbase, &dbEntry);
        status = dbFindRecord(&dbEntry, precord->name);
        if (!status) status = dbFindField(&dbEntry, pfldDes->name);
        if (!status) {
            rtnString = dbGetString(&dbEntry);
            strncpy(pbuf, rtnString, maxlen);
            pbuf[maxlen] = 0;
        }
        dbFinishEntry(&dbEntry);
    } else {
        status = dbGet(paddr, dbrType, pbuffer, options, nRequest, pflin);
    }
done:
    dbScanUnlock(precord);
    return status;
}
コード例 #4
0
ファイル: bc_user.c プロジェクト: BackupTheBerlios/bag
void getuseracl_handler(int argc,char**argv,int bloblen,void*blob)
{
        dbResult*res;
        char*acl;
        struct dynbuf_s*buf;
        if(!checkGlobalACL(ACL_ADMUSER)){
                bc_hdl->sockwriter(bc_hdl,E_PERM,strlen(E_PERM));
                return;
        }
        /*invalid argc*/
        if(argc!=2){
                bc_hdl->sockwriter(bc_hdl,E_SYNTAX,strlen(E_SYNTAX));
                return;
        }
        res=query(bc_con,SQL_GETMAINACL,argv[1]);
        if(!res){
                bc_hdl->sockwriter(bc_hdl,E_DATABASE,strlen(E_DATABASE));
                return;
        }
        if(dbNumRows(res)!=1){
                bc_hdl->sockwriter(bc_hdl,E_NOUSER,strlen(E_NOUSER));
                dbFree(res);
                return;
        }
        buf=dynbuf_new();
        if(!buf){
                bc_hdl->sockwriter(bc_hdl,E_ALLOCATION,strlen(E_ALLOCATION));
                dbFree(res);
                return;
        }
        acl=dbGetString(res,0,0);
        if(!acl)acl="";

        if(strchr(acl,ACL_ADMIN))dynbuf_addstr(buf," admin");
        if(strchr(acl,ACL_READ))dynbuf_addstr(buf," read");
        if(strchr(acl,ACL_WRITE))dynbuf_addstr(buf," write");
        if(strchr(acl,ACL_CONFIG))dynbuf_addstr(buf," config");
        if(strchr(acl,ACL_ADMUSER))dynbuf_addstr(buf," crateUsers");
        if(strchr(acl,ACL_ADMPROJECT))dynbuf_addstr(buf,"createProjects");

        dbFree(res);

        dynbuf_addstr(buf,"\n");

        bc_hdl->sockwriter(bc_hdl,"+0",2);
        bc_hdl->sockwriter(bc_hdl,buf->buffer,buf->len);
        dynbuf_free(buf);
}
コード例 #5
0
ファイル: dbAccess.c プロジェクト: ukaea/epics
static long getLinkValue(DBADDR *paddr, short dbrType,
    char *pbuf, long *nRequest)
{
    dbCommon *precord = paddr->precord;
    dbFldDes *pfldDes = paddr->pfldDes;
    int maxlen;
    DBENTRY dbEntry;
    long status;

    switch (dbrType) {
    case DBR_STRING:
        maxlen = MAX_STRING_SIZE - 1;
        if (nRequest && *nRequest > 1) *nRequest = 1;
        break;

    case DBR_DOUBLE:    /* Needed for dbCa links */
        if (nRequest && *nRequest) *nRequest = 1;
        *(double *)pbuf = epicsNAN;
        return 0;

    case DBR_CHAR:
    case DBR_UCHAR:
            if (nRequest && *nRequest > 0) {
            maxlen = *nRequest - 1;
            break;
        }
        /* else fall through ... */
    default:
        return S_db_badDbrtype;
    }

    dbInitEntry(pdbbase, &dbEntry);
    status = dbFindRecord(&dbEntry, precord->name);
    if (!status) status = dbFindField(&dbEntry, pfldDes->name);
    if (!status) {
        char *rtnString = dbGetString(&dbEntry);

        strncpy(pbuf, rtnString, --maxlen);
        pbuf[maxlen] = 0;
    }
    dbFinishEntry(&dbEntry);
    return status;
}
コード例 #6
0
ファイル: bc_user.c プロジェクト: BackupTheBerlios/bag
int checkGlobalACL(char cap)
{
        dbResult *res;
        char *acl;

        res=query(bc_con,SQL_GETMAINACL,username);

        if(!res)return 0;
        if(dbNumRows(res)!=1){
                dbFree(res);
                return 0;
        }

        acl=dbGetString(res,0,0);
        if(!acl)acl="";

        if(strchr(acl,cap)||strchr(acl,'A')){
                dbFree(res);
                return 1;
        }else{
                dbFree(res);
                return 0;
        }
}
コード例 #7
0
static int dbpr_report(
    const char *pname, DBADDR *paddr, int interest_level,
    TAB_BUFFER *pMsgBuff, int tab_size)
{
    char        *pmsg;
    dbFldDes    *pdbFldDes = paddr->pfldDes;
    dbRecordType *pdbRecordType = pdbFldDes->pdbRecordType;
    short       n2;
    void        *pfield;
    char        *pfield_name;
    char        *pfield_value;
    DBENTRY     dbentry;
    DBENTRY     *pdbentry = &dbentry;
    long        status;

    dbInitEntry(pdbbase,pdbentry);
    status = dbFindRecord(pdbentry,pname);
    if (status) {
        errMessage(status,pname);
        return -1;
    }

    pmsg = pMsgBuff->message;
    for (n2 = 0; n2 <= pdbRecordType->no_fields - 1; n2++) {
        pdbFldDes = pdbRecordType->papFldDes[pdbRecordType->sortFldInd[n2]];
        pfield_name = pdbFldDes->name;
        pfield = ((char *)paddr->precord) + pdbFldDes->offset;
        if (pdbFldDes->interest > interest_level )
            continue;

        switch (pdbFldDes->field_type) {
        case DBF_STRING:
        case DBF_USHORT:
        case DBF_ENUM:
        case DBF_FLOAT:
        case DBF_CHAR:
        case DBF_UCHAR:
        case DBF_SHORT:
        case DBF_LONG:
        case DBF_ULONG:
        case DBF_DOUBLE:
        case DBF_MENU:
        case DBF_DEVICE:
            status = dbFindField(pdbentry,pfield_name);
            pfield_value = dbGetString(pdbentry);
            sprintf(pmsg, "%s: %s", pfield_name,
                (pfield_value ? pfield_value : "<nil>"));
            dbpr_msgOut(pMsgBuff, tab_size);
            break;

        case DBF_INLINK:
        case DBF_OUTLINK:
        case DBF_FWDLINK: {
                DBLINK  *plink = (DBLINK *)pfield;
                int     ind;

                status = dbFindField(pdbentry,pfield_name);
                for (ind=0; ind<LINK_NTYPES; ind++) {
                    if (pamaplinkType[ind].value == plink->type)
                        break;
                }
                if (ind>=LINK_NTYPES) {
                    sprintf(pmsg,"%s: Illegal Link Type", pfield_name);
                }
                else {
                    sprintf(pmsg,"%s:%s %s", pfield_name,
                        pamaplinkType[ind].strvalue,dbGetString(pdbentry));
                }
                dbpr_msgOut(pMsgBuff, tab_size);
            }
            break;

        case DBF_NOACCESS:
            if (pfield == (void *)&paddr->precord->time) {
                /* Special for the TIME field, make it human-readable */
                char time_buf[40];
                epicsTimeToStrftime(time_buf, 40, "%Y-%m-%d %H:%M:%S.%09f",
                    &paddr->precord->time);
                sprintf(pmsg, "%s: %s", pfield_name, time_buf);
                dbpr_msgOut(pMsgBuff, tab_size);
            }
            else if (pdbFldDes->size == sizeof(void *) &&
                strchr(pdbFldDes->extra, '*')) {
                /* Special for pointers, needed on little-endian CPUs */
                sprintf(pmsg, "%s: %p", pfield_name, *(void **)pfield);
                dbpr_msgOut(pMsgBuff, tab_size);
            }
            else { /* just print field as hex bytes */
                unsigned char *pchar = (unsigned char *)pfield;
                char   temp_buf[61];
                char *ptemp_buf = &temp_buf[0];
                short n = pdbFldDes->size;
                short i;
                unsigned int value;

                if (n > sizeof(temp_buf)/3) n = sizeof(temp_buf)/3;
                for (i=0; i<n; i++, ptemp_buf += 3, pchar++) {
                        value = (unsigned int)*pchar;
                        sprintf(ptemp_buf, "%02x ", value);
                }
                sprintf(pmsg, "%s: %s", pfield_name,temp_buf);
                dbpr_msgOut(pMsgBuff, tab_size);
            }
            break;

        default:
            sprintf(pmsg, "%s: dbpr: Unknown field_type", pfield_name);
            dbpr_msgOut(pMsgBuff, tab_size);
            break;
        }
    }
    pmsg[0] = '\0';
    dbpr_msgOut(pMsgBuff, tab_size);
    dbFinishEntry(pdbentry);
    return (0);
}
コード例 #8
0
long epicsShareAPI dbl(const char *precordTypename, const char *fields)
{
    DBENTRY dbentry;
    DBENTRY *pdbentry=&dbentry;
    long status;
    int nfields = 0;
    int ifield;
    char *fieldnames = 0;
    char **papfields = 0;

    if (!pdbbase) {
        printf("No database loaded\n");
        return 0;
    }

    if (precordTypename &&
        ((*precordTypename == '\0') || !strcmp(precordTypename,"*")))
        precordTypename = NULL;
    if (fields && (*fields == '\0'))
        fields = NULL;
    if (fields) {
        char *pnext;

        fieldnames = epicsStrDup(fields);
        nfields = 1;
        pnext = fieldnames;
        while (*pnext && (pnext = strchr(pnext,' '))) {
            nfields++;
            while (*pnext == ' ') pnext++;
        }
        papfields = dbCalloc(nfields,sizeof(char *));
        pnext = fieldnames;
        for (ifield = 0; ifield < nfields; ifield++) {
            papfields[ifield] = pnext;
            if (ifield < nfields - 1) {
                pnext = strchr(pnext, ' ');
                *pnext++ = 0;
                while (*pnext == ' ') pnext++;
            }
        }
    }
    dbInitEntry(pdbbase, pdbentry);
    if (!precordTypename)
        status = dbFirstRecordType(pdbentry);
    else
        status = dbFindRecordType(pdbentry,precordTypename);
    if (status) {
        printf("No record type\n");
    }

    while (!status) {
        status = dbFirstRecord(pdbentry);
        while (!status) {
            printf("%s", dbGetRecordName(pdbentry));
            for (ifield = 0; ifield < nfields; ifield++) {
                char *pvalue;
                status = dbFindField(pdbentry, papfields[ifield]);
                if (status) {
                    if (!strcmp(papfields[ifield], "recordType")) {
                        pvalue = dbGetRecordTypeName(pdbentry);
                    }
                    else {
                        printf(", ");
                        continue;
                    }
                }
                else {
                    pvalue = dbGetString(pdbentry);
                }
                printf(", \"%s\"", pvalue ? pvalue : "");
            }
            printf("\n");
            status = dbNextRecord(pdbentry);
        }
        if (precordTypename)
            break;

        status = dbNextRecordType(pdbentry);
    }
    if (nfields > 0) {
        free((void *)papfields);
        free((void *)fieldnames);
    }
    dbFinishEntry(pdbentry);
    return 0;
}
コード例 #9
0
ファイル: bc_user.c プロジェクト: BackupTheBerlios/bag
void config_handler(int argc,char**argv,int bloblen,void*blob)
{
        dbResult*res;
        int i,l,l2,n;
        char*blob2;
        /*check ACL*/
        if(!checkGlobalACL(ACL_CONFIG)){
                bc_hdl->sockwriter(bc_hdl,E_PERM,strlen(E_PERM));
                return;
        }
        /*invalid argc*/
        if(argc>3){
                bc_hdl->sockwriter(bc_hdl,E_SYNTAX,strlen(E_SYNTAX));
                return;
        }
        /*query*/
        if(argc==1){
                /*query*/
                res=query(bc_con,SQL_GETOPTIONS,servername);
                /*create blob*/
                if(!res){
                        bc_hdl->sockwriter(bc_hdl,E_DATABASE,strlen(E_DATABASE));
                        return;
                }
                l=dbNumRows(res);
                n=dbGetFieldIndex(res,"okey");
                for(l2=i=0;i<l;i++){
                        l2+=strlen(dbGetString(res,i,n))+1;
                }
                blob2=malloc(l2+64);/*64 should be enough for the text*/
                if(!blob2){
                        dbFree(res);
                        bc_hdl->sockwriter(bc_hdl,E_ALLOCATION,strlen(E_ALLOCATION));
                        return;
                }
                *blob2=0;
                sprintf(blob2,"+%i Options:\n",l2);
                for(i=0;i<l;i++)
                        strcat(strcat(blob2,strchr(dbGetString(res,i,n),':')+1),"\n");
                dbFree(res);
                /*send*/
                bc_hdl->sockwriter(bc_hdl,blob2,strlen(blob2));
                /*free*/
                free(blob2);
                return;
        }
        if(argc==2){
                res=query(bc_con,SQL_GETOPTION,servername,argv[1]);
                if(!res){
                        bc_hdl->sockwriter(bc_hdl,E_DATABASE,strlen(E_DATABASE));
                        return;
                }
                if(dbNumRows(res)){
                        char buf[64];
                        sprintf(buf,"+0 %s\n",dbGetStringByname(res,0,"oval"));
                        bc_hdl->sockwriter(bc_hdl,buf,strlen(buf));
                }else{
                        bc_hdl->sockwriter(bc_hdl,E_NOOPT,strlen(E_NOOPT));
                }
                dbFree(res);
                return;
        }
        /*set*/
        if(argc==3){
                /*FIXME: this is not transaction safe, unfortunately I know no safe way*/
                /*try update*/
                res=query(bc_con,SQL_UPDATEOPTION,argv[2],servername,argv[1]);
                if(!res){
                        bc_hdl->sockwriter(bc_hdl,E_DATABASE,strlen(E_DATABASE));
                        return;
                }
                if(dbAffectedRows(res)<=0){
                        dbFree(res);
                        /*try insert*/
                        res=query(bc_con,SQL_INSERTOPTION,argv[2],servername,argv[1]);
                }
                if(!dbUpdateOK(res)){
                        bc_hdl->sockwriter(bc_hdl,E_DATABASE,strlen(E_DATABASE));
                }else{
                        bc_hdl->sockwriter(bc_hdl,E_OK,strlen(E_OK));
                }
                if(res)dbFree(res);
                return;
        }
}