///////////////////////////////////////////////////////////////// // attempt a parse and call // if query succeed, copy vars values to v[] (up to nv elements) // you must guarantee that nv >= 'num of vars in src' // IIFTYPE(int) IAFX_QueryString(const char *src, EngHandle h, Term **var_val, kstr_list *var_ids) { int rc = -1; // if some error occurs IntlogExec *ile = GetEngines()->HtoD(h); if (ile != 0) { // prepare input source stream IntlogParser* parser = GetEngines()->get_parser(); istringstream srcstream(src); // save status parser->SetSource(&srcstream, "QueryString", var_ids); // submit source line: if parse ok, query if (parser->getinput() == IntlogParser::NewClause) { Term tparsed = parser->parsed; int nv = var_ids->numel(); if (nv > 0) *var_val = new Term[nv]; rc = runquery(ile, tparsed, var_ids, *var_val, var_ids->numel()); tparsed.Destroy(); } } // some error occurred return rc; }
////////////////////////////////////////// // i_create(i_name, HandleEngine) // create a new running interface (+, -) // BtFImpl(i_create, t, p) { ASSERT(all_engines); ArgIdArityList i(t.getarg(0), p, "i_create"); if (!p->eval_term(t.getarg(1)).type(f_NOTERM)) { p->BtErr(BTERR_INVALID_ARG_TYPE); return 0; } EngHandle h = GetEngines()->create(p->get_db()); if (h == EH_NULL) { p->BtErr(BTERR_CANT_CREATE_ENG); return 0; } IntlogExec *pExec = GetEngines()->HtoD(h); DbIntlog *engdb = pExec->get_db(), *dbi; // scan all interfaces names int errc = 0; while (i.next()) { // search for declared interface (from current to root) if ((dbi = findint(p->get_db(), i.funct)) == 0) errc = BTERR_CANT_FIND_DB; else if (!engdb->InheritInterface(dbi)) errc = BTERR_CANT_INHERIT; if (errc) { // on error signal and reset p->BtErr(errc, CCP(i.funct)); all_engines->destroy(h); return 0; } } return p->unify(p->save(Term(new EngineObj(h))), t.getarg(1)); }
/////////////////////////////////////////// // start definition of new local interface // DbIntlog *DbIntlog::BeginInterface(kstring id) { #ifdef _DEBUG CCP tstring = id; #endif // check redefinition if (IsLocalInterface(id)) return 0; // insert as local type DbIntlog *db = GetEngines()->makeDb(id, this); m_types.append(db); return db; }
////////////////////////////////////////// // run query with some interface handling // IIFTYPE(int) IAFX_QueryTerm(Term toQuery, EngHandle h, Term *v, kstr_list *vars) { IntlogExec *ile = GetEngines()->HtoD(h); return ile? runquery(ile, toQuery, vars, v, vars->numel()) : -1; }