PUBLIC MprList *getColumns(EdiRec *rec) { if (rec == 0) { if ((rec = getRec()) == 0) { return 0; } } return ediGetColumns(getDatabase(), rec->tableName); }
bool Collectiondb::isAdmin ( HttpRequest *r , TcpSocket *s ) { if ( r->getLong("admin",1) == 0 ) return false; if ( g_conf.isMasterAdmin ( s , r ) ) return true; char *c = r->getString ( "c" ); CollectionRec *cr = getRec ( c ); if ( ! cr ) return false; return g_users.hasPermission ( r , PAGE_SEARCH ); //return cr->hasPermission ( r , s ); }
PUBLIC void form(EdiRec *record, cchar *optionString) { HttpConn *conn; MprHash *options; cchar *action, *recid, *method, *uri, *token; conn = getConn(); if (record == 0) { record = getRec(); } else { conn->record = record; } options = httpGetOptions(optionString); recid = 0; /* If record provided, get the record id. Can be overridden using options.recid */ if (record) { if (record->id && !httpGetOption(options, "recid", 0)) { httpAddOption(options, "recid", record->id); } recid = httpGetOption(options, "recid", 0); emitFormErrors(conn, record, options); } if ((method = httpGetOption(options, "method", 0)) == 0) { method = (recid) ? "PUT" : "POST"; } if (!scaselessmatch(method, "GET") && !scaselessmatch(method, "POST")) { /* All methods use POST and tunnel method in data-method */ httpAddOption(options, EDATA("method"), method); method = "POST"; } if ((action = httpGetOption(options, "action", 0)) == 0) { action = (recid) ? "@update" : "@create"; } uri = httpUri(conn, action); if (smatch(httpGetOption(options, "remote", 0), "true")) { espRender(conn, "<form method='%s' " EDATA("remote") "='%s'%s >\r\n", method, uri, map(conn, options)); } else { espRender(conn, "<form method='%s' action='%s'%s >\r\n", method, uri, map(conn, options)); } if (recid) { espRender(conn, " <input name='recid' type='hidden' value='%s' />\r\n", recid); } if (!httpGetOption(options, "insecure", 0)) { if ((token = httpGetOption(options, "securityToken", 0)) == 0) { token = httpGetSecurityToken(conn, 0); } espRender(conn, " <input name='%s' type='hidden' value='%s' />\r\n", BIT_XSRF_PARAM, token); } }
PUBLIC void espRenderResult(HttpConn *conn, bool success) { EspReq *req; EdiRec *rec; req = conn->data; rec = getRec(); if (rec && rec->errors) { espRender(conn, "{\"error\": %d, \"feedback\": %s, \"fieldErrors\": %s}", !success, req->feedback ? mprSerialize(req->feedback, MPR_JSON_QUOTES) : "{}", mprSerialize(rec->errors, MPR_JSON_QUOTES)); } else { espRender(conn, "{\"error\": %d, \"feedback\": %s}", !success, req->feedback ? mprSerialize(req->feedback, MPR_JSON_QUOTES) : "{}"); } espFinalize(conn); }
int mysqlapi::getSysDate(char *pcSysdate) { now_operation = statement; if(!pcSysdate) return -1; TFieldList my_list; if(getRec((char *) "select now()", my_list)<0) return -1; int iPos = 0; if(!my_list[iPos].fieldValue().isNULL()) { return -1; } strcpy(pcSysdate, my_list[iPos].fieldValue().asDate()); return 0; }
PUBLIC cchar *getFieldError(cchar *field) { return mprLookupKey(getRec()->errors, field); }
// . get collectionRec from name // . returns NULL if not available CollectionRec *Collectiondb::getRec ( char *coll ) { if ( ! coll ) coll = ""; return getRec ( coll , gbstrlen(coll) ); }
// . reset a collection // . returns false if failed bool Collectiondb::resetColl ( char *coll , bool resetTurkdb ) { // ensure it's not NULL if ( ! coll ) { log(LOG_LOGIC,"admin: Collection name to delete is NULL."); return false; } // now must be "test" only for now if ( strcmp(coll,"test") ) { char *xx=NULL;*xx=0; } // no spiders can be out. they may be referencing the CollectionRec // in XmlDoc.cpp... quite likely. if ( g_conf.m_spideringEnabled || g_spiderLoop.m_numSpidersOut > 0 ) { log("admin: Can not delete collection while " "spiders are enabled or active."); return false; } // do not allow this if in repair mode if ( g_repairMode > 0 ) { log("admin: Can not delete collection while in repair mode."); return false; } // get the CollectionRec for "test" CollectionRec *cr = getRec ( "test" ); // must be there. if not, we create test i guess if ( ! cr ) { log("db: could not get test coll rec"); char *xx=NULL;*xx=0; } // make sure an update not in progress if ( cr->m_inProgress ) { char *xx=NULL;*xx=0; } CollectionRec tmp; // copy it to "tmp" long size = (char *)&(cr->m_END_COPY) - (char *)cr; // do not copy the hashtable crap since you will have to re-init it! memcpy ( &tmp , cr , size ); // sizeof(CollectionRec) ); // delete the test coll now if ( ! deleteRec ( "test" , resetTurkdb ) ) return log("admin: reset coll failed"); // make a collection called "test2" so that we copy "test"'s parms bool status = addRec ( "test" , NULL , 0 , true , // bool isNew , (collnum_t) -1 , // not a dump false , // do not save it! false ); // bail on error if ( ! status ) return log("admin: failed to add new coll for reset"); // get its rec CollectionRec *nr = getRec ( "test" ); // must be there if ( ! nr ) { char *xx=NULL;*xx=0; } // save this though, this might have changed! collnum_t cn = nr->m_collnum; // overwrite its rec memcpy ( nr , &tmp , size ) ; // sizeof(CollectionRec) ); // put that collnum back nr->m_collnum = cn; // set the flag m_needsSave = true; // save it again after copy nr->save(); // and clear the robots.txt cache in case we recently spidered a // robots.txt, we don't want to use it, we want to use the one we // have in the test-parser subdir so we are consistent RdbCache *robots = Msg13::getHttpCacheRobots(); RdbCache *others = Msg13::getHttpCacheOthers(); robots->clear ( cn ); others->clear ( cn ); //g_templateTable.reset(); //g_templateTable.save( g_hostdb.m_dir , "turkedtemplates.dat" ); // repopulate CollectionRec::m_sortByDateTable. should be empty // since we are resetting here. //initSortByDateTable ( coll ); // done return true; }
// . MDW: TODO: bring this back when we have a subdir for each collection // . add a new rec // . returns false and sets g_errno on error // . use a collnum_t of -1 if it is new bool Collectiondb::addRec ( char *coll , char *cpc , long cpclen , bool isNew , collnum_t collnum , bool isDump , bool saveIt ) { // sanity check if ( ( isNew && collnum >= 0) || (!isNew && collnum < 0) ) { log(LOG_LOGIC,"admin: Bad parms passed to addRec."); char *xx = NULL; *xx = 0; } // ensure coll name is legit char *p = coll; for ( ; *p ; p++ ) { if ( is_alnum_a(*p) ) continue; if ( *p == '-' ) continue; break; } if ( *p ) { g_errno = EBADENGINEER; log("admin: \"%s\" is a malformed collection name because it " "contains the '%c' character.",coll,*p); return false; } // . scan for holes // . i is also known as the collection id long i ; if ( collnum >= 0 ) i = (long)collnum; else for ( i = 0 ; i < m_numRecs ; i++ ) if ( ! m_recs[i] ) break; // ceiling? if ( i >= MAX_COLLS ) { g_errno = ENOBUFS; return log("admin: Limit of %li collection reached. " "Collection not created.",(long)MAX_COLLS); } // if empty... bail, no longer accepted, use "main" if ( ! coll || !coll[0] ) { g_errno = EBADENGINEER; return log("admin: Trying to create a new collection " "but no collection name provided. Use the \"c\" " "cgi parameter to specify it."); } // or if too big if ( gbstrlen(coll) > MAX_COLL_LEN ) { g_errno = ENOBUFS; return log("admin: Trying to create a new collection " "whose name \"%s\" of %i chars is longer than the " "max of %li chars.",coll,gbstrlen(coll), (long)MAX_COLL_LEN); } // ensure does not already exist in memory if ( getCollnum ( coll ) >= 0 ) { g_errno = EEXIST; return log("admin: Trying to create collection \"%s\" but " "already exists in memory.",coll); } // MDW: ensure not created on disk since time of last load char dname[512]; sprintf(dname, "%scoll.%s.%li/",g_hostdb.m_dir,coll,i); if ( isNew && opendir ( dname ) ) { g_errno = EEXIST; return log("admin: Trying to create collection %s but " "directory %s already exists on disk.",coll,dname); } //char fname[512]; // ending '/' is ALWAYS included in g_hostdb.m_dir //sprintf ( fname , "%s%li.%s.conf",g_hostdb.m_dir,i,coll); //File f; //f.set ( fname ); //if ( f.doesExist() ) { // g_errno = EEXIST; // return log("admin: Trying to create collection \"%s\" but " // "file %s already exists on disk.",coll,fname); //} // create the record in memory m_recs[i] = new (CollectionRec); if ( ! m_recs[i] ) return log("admin: Failed to allocated %li bytes for new " "collection record for \"%s\".", (long)sizeof(CollectionRec),coll); mnew ( m_recs[i] , sizeof(CollectionRec) , "CollectionRec" ); // get copy collection CollectionRec *cpcrec = NULL; if ( cpc && cpc[0] ) cpcrec = getRec ( cpc , cpclen ); if ( cpc && cpc[0] && ! cpcrec ) log("admin: Collection \"%s\" to copy config from does not " "exist.",cpc); // get the default.conf from working dir if there g_parms.setToDefault( (char *)m_recs[i] ); if ( isNew ) { // the default conf file char tmp1[1024]; sprintf ( tmp1 , "%sdefault.conf" , g_hostdb.m_dir ); // . set our parms from the file. // . accepts OBJ_COLLECTIONREC or OBJ_CONF g_parms.setFromFile ( m_recs[i] , NULL , tmp1 ); } // this will override all if ( cpcrec ) { // copy it, but not the timedb hashtable, etc. long size = (char *)&(cpcrec->m_END_COPY) - (char *)cpcrec; // JAB: bad memcpy - no donut! // this is not how objects are supposed to be copied!!! memcpy ( m_recs[i] , cpcrec , size);//sizeof(CollectionRec) ); // perform the cleanup that a copy constructor might do... //for (int rx = 0; rx < MAX_FILTERS; rx++) // m_recs[i]->m_pRegExParser[rx] = NULL; // don't NUKE the filters! // m_recs[i]->m_numRegExs = 0; // OK - done with cleaning up... // but never copy over the collection hostname, that is // problematic m_recs[i]->m_collectionHostname [0] = '\0'; m_recs[i]->m_collectionHostname1[0] = '\0'; m_recs[i]->m_collectionHostname2[0] = '\0'; } // set coll id and coll name for coll id #i strcpy ( m_recs[i]->m_coll , coll ); m_recs[i]->m_collLen = gbstrlen ( coll ); m_recs[i]->m_collnum = i; // point to this, so Rdb and RdbBase can reference it coll = m_recs[i]->m_coll; // . if has no password or ip add the default password, footbar // . no, just don't have any password, just use the 127.0.0.1 ip // that is the loopback /* if ( m_recs[i]->m_numAdminIps == 0 && m_recs[i]->m_numAdminPwds == 0 ) { m_recs[i]->m_numAdminIps = 1; m_recs[i]->m_adminIps[0] = atoip("0.0.0.0",7); //strcpy ( m_recs[i]->m_adminPwds[0] , "footbar23" ); //m_recs[i]->m_numAdminPwds = 1; //log("admin: Using default password for new collection of " // "'footbar23'."); } */ // collection name HACK for backwards compatibility //if ( strcmp ( coll , "main" ) == 0 ) { // m_recs[i]->m_coll[0] = '\0'; // m_recs[i]->m_collLen = 0; // //coll[0] = '\0'; //} // MDW: create the new directory if ( isNew ) { retry22: if ( ::mkdir ( dname , S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH ) ) { // valgrind? if ( errno == EINTR ) goto retry22; g_errno = errno; mdelete ( m_recs[i] , sizeof(CollectionRec) , "CollectionRec" ); delete ( m_recs[i]); m_recs[i] = NULL; return log("admin: Creating directory %s had error: " "%s.", dname,mstrerror(g_errno)); } // save it into this dir... might fail! if ( ! m_recs[i]->save() ) { mdelete ( m_recs[i] , sizeof(CollectionRec) , "CollectionRec" ); delete ( m_recs[i]); m_recs[i] = NULL; return log("admin: Failed to save file %s: %s", dname,mstrerror(g_errno)); } } // load if not new if ( ! isNew && ! m_recs[i]->load ( coll , i ) ) { mdelete ( m_recs[i], sizeof(CollectionRec), "CollectionRec" ); delete ( m_recs[i]); m_recs[i] = NULL; return log("admin: Failed to load conf for collection " "\"%s\".",coll); } // mark it as needing to be saved instead m_recs[i]->m_needsSave = false; // force this to off for now //m_recs[i]->m_queryExpansion = false; // reserve it if ( i >= m_numRecs ) m_numRecs = i + 1; // count it m_numRecsUsed++; // update the time updateTime(); // if we are doing a dump from the command line, skip this stuff if ( isDump ) return true; bool verify = true; if(isNew) verify = false; // tell rdbs to add one, too //if ( ! g_indexdb.addColl ( coll, verify ) ) goto hadError; if ( ! g_posdb.addColl ( coll, verify ) ) goto hadError; //if ( ! g_datedb.addColl ( coll, verify ) ) goto hadError; if ( ! g_titledb.addColl ( coll, verify ) ) goto hadError; //if ( ! g_revdb.addColl ( coll, verify ) ) goto hadError; //if ( ! g_sectiondb.addColl ( coll, verify ) ) goto hadError; if ( ! g_tagdb.addColl ( coll, verify ) ) goto hadError; //if ( ! g_catdb.addColl ( coll, verify ) ) goto hadError; //if ( ! g_checksumdb.addColl ( coll, verify ) ) goto hadError; if ( ! g_spiderdb.addColl ( coll, verify ) ) goto hadError; if ( ! g_doledb.addColl ( coll, verify ) ) goto hadError; //if ( ! g_tfndb.addColl ( coll, verify ) ) goto hadError; if ( ! g_clusterdb.addColl ( coll, verify ) ) goto hadError; if ( ! g_linkdb.addColl ( coll, verify ) ) goto hadError; // debug message log ( LOG_INFO, "admin: added collection \"%s\" (%li).",coll,(long)i); // tell SpiderCache about this collection, it will create a // SpiderCollection class for it. //g_spiderCache.reset1(); // . make it set is CollectionRec::m_sortByDateTable now // . everyone else uses setTimeOfDayInMilliseconds() in fctypes.cpp // to call this function once their clock is synced with host #0 //if ( g_hostdb.m_initialized && g_hostdb.m_hostId == 0 ) // initSortByDateTable(coll); //else if ( g_hostdb.m_initialized && isClockInSync() ) // initSortByDateTable(coll); // . do it for all regard-less // . once clock is in sync with host #0 we may do it again! //if ( g_hostdb.m_initialized ) // initSortByDateTable(coll); // success return true; hadError: log("admin: Had error adding new collection: %s.",mstrerror(g_errno)); // do not delete it, might have failed to add because not enough // memory to read in the tree *-saved.dat file on disk!! and if // you delete in then core the *-saved.dat file gets overwritten!!! return false; /* g_indexdb.getRdb()->delColl ( coll ); g_datedb.getRdb()->delColl ( coll ); g_timedb.getRdb()->delColl ( coll ); g_titledb.getRdb()->delColl ( coll ); g_revdb.getRdb()->delColl ( coll ); g_sectiondb.getRdb()->delColl ( coll ); g_placedb.getRdb()->delColl ( coll ); g_tagdb.getRdb()->delColl ( coll ); //g_catdb.getRdb()->delColl ( coll ); //g_checksumdb.getRdb()->delColl ( coll ); g_spiderdb.getRdb()->delColl ( coll ); g_doledb.getRdb()->delColl ( coll ); g_tfndb.getRdb()->delColl ( coll ); g_clusterdb.getRdb()->delColl ( coll ); g_linkdb.getRdb()->delColl ( coll ); deleteRec ( coll ); return false; */ }
PUBLIC cchar *getField(cchar *field) { return ediGetFieldValue(getRec(), field); }