static EdiRec *mdbCreateRec(Edi *edi, cchar *tableName) { Mdb *mdb; MdbTable *table; MdbCol *col; EdiRec *rec; EdiField *fp; int f, nfields; mdb = (Mdb*) edi; if ((table = lookupTable(mdb, tableName)) == 0) { return 0; } nfields = max(table->schema->ncols, 1); if ((rec = mprAllocMem(sizeof(EdiRec) + sizeof(EdiField) * nfields, MPR_ALLOC_MANAGER | MPR_ALLOC_ZERO)) == 0) { return 0; } mprSetManager(rec, ediManageEdiRec); rec->edi = edi; rec->tableName = table->name; rec->nfields = nfields; for (f = 0; f < nfields; f++) { col = getCol(table, f); fp = &rec->fields[f]; fp->type = col->type; fp->name = col->name; fp->flags = col->flags; } return rec; }
/* Create a free-standing record. Not saved to the database. The tableName parameter can be null. The fields are not initialized (no schema). */ EdiRec *ediCreateBareRec(Edi *edi, cchar *tableName, int nfields) { EdiRec *rec; if ((rec = mprAllocMem(sizeof(EdiRec) + sizeof(EdiField) * nfields, MPR_ALLOC_MANAGER | MPR_ALLOC_ZERO)) == 0) { return 0; } mprSetManager(rec, ediManageEdiRec); rec->edi = edi; rec->tableName = sclone(tableName); rec->nfields = nfields; return rec; }
/* Create a free-standing grid. Not saved to the database The edi and tableName parameters can be null */ EdiGrid *ediCreateBareGrid(Edi *edi, cchar *tableName, int nrows) { EdiGrid *grid; if ((grid = mprAllocMem(sizeof(EdiGrid) + sizeof(EdiRec*) * nrows, MPR_ALLOC_MANAGER | MPR_ALLOC_ZERO)) == 0) { return 0; } mprSetManager(grid, manageEdiGrid); grid->nrecords = nrows; grid->edi = edi; grid->tableName = sclone(tableName); return grid; }
PUBLIC void *ecCreateStream(EcCompiler *cp, ssize size, cchar *path, void *manager) { EcLocation *loc; EcStream *sp; if ((sp = mprAllocBlock(size, MPR_ALLOC_ZERO | MPR_ALLOC_MANAGER)) == 0) { return NULL; } mprSetManager(sp, manager); sp->compiler = cp; cp->stream = sp; loc = &sp->loc; loc->column = 0; loc->source = 0; loc->lineNumber = 1; loc->filename = sclone(path); cp->putback = NULL; return sp; }
/* Create and queue a new event for service. Period is used as the delay before running the event and as the period between events for continuous events. WARNING: this routine is unique in that it may be called from a non-MPR thread. This means it may run in parallel with the GC. So memory must be held until safely queued. */ PUBLIC MprEvent *mprCreateEvent(MprDispatcher *dispatcher, cchar *name, MprTicks period, void *proc, void *data, int flags) { MprEvent *event; /* Create and hold the event object (immune from GC for foreign threads) */ if ((event = mprAllocMem(sizeof(MprEvent), MPR_ALLOC_MANAGER | MPR_ALLOC_ZERO | MPR_ALLOC_HOLD)) == 0) { return 0; } mprSetManager(event, (MprManager) manageEvent); if (dispatcher == 0 || (dispatcher->flags & MPR_DISPATCHER_DESTROYED)) { dispatcher = (flags & MPR_EVENT_QUICK) ? MPR->nonBlock : MPR->dispatcher; } dispatcher->service->now = mprGetTicks(); event->name = name; event->timestamp = dispatcher->service->now; event->proc = proc; event->period = period; event->due = event->timestamp + period; event->data = data; event->dispatcher = dispatcher; event->next = event->prev = 0; event->flags = flags; if (!(flags & MPR_EVENT_DONT_QUEUE)) { mprQueueEvent(dispatcher, event); } /* Unset eternal */ if (!(flags & MPR_EVENT_HOLD)) { mprRelease(event); } /* Warning: if invoked from a foreign (non-mpr) thread, the event may be collected prior to return */ return event; }