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; }
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; }
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; }
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); }
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; }
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; } }
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); }
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; }
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; } }