Пример #1
0
/////////////////////////////////////////////////////////////////
// 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;
}
Пример #2
0
//////////////////////////////////////////
// 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));
}
Пример #3
0
///////////////////////////////////////////
// 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;
}
Пример #4
0
//////////////////////////////////////////
// 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;
}