void SetVariableCommand::execute(Args &args, Environment &env)
{
	if(args.size() < 2) {
		throw CommandException("Wrong number of arguments");
	}
	
	if(env.verbose()) cout << "Setting $" << args[1] << " =";

	XmlResults results = env.db().createResults();

	if(args.size() > 2) {
		for(unsigned int arg = 2; arg < args.size(); ++arg) {
			if(env.verbose()) cout << " " << args[arg];
			results.add(args[arg]);
		}
	} else {
		if(env.verbose()) cout << " <previous results>";
		env.testResults();
		env.results()->reset();
		XmlValue value;
		while(env.results()->next(value)) {
			if(env.sigBlock().isInterrupted()) {
				env.sigBlock().reset();
				throw CommandException("setVariable interrupted");
			}

			results.add(value);
		}
	}

	if(env.verbose()) cout << endl;

	env.context().setVariableValue(args[1], results);
}
Example #2
0
void ContextItemQueryCommand::execute(Args &args, Environment &env)
{
    if(args.size() != 2) {
        throw CommandException("Wrong number of arguments");
    }
    env.testResults();
    XmlResults newResults = env.db().createResults();
    env.results()->reset();

    u_int32_t flags = DBXML_LAZY_DOCS;
    if(env.documentProjection())
        flags |= DBXML_DOCUMENT_PROJECTION;

    if(env.txn()) {
        XmlQueryExpression expr = env.db().prepare(*env.txn(), args[1], env.context());

        XmlValue value;
        while(env.results()->next(value)) {
            XmlResults tmpResults = expr.execute(*env.txn(), value, env.context(), flags);

            XmlValue tmpValue;
            while(tmpResults.next(tmpValue)) {
                newResults.add(tmpValue);
            }
        }
    } else {
        XmlQueryExpression expr = env.db().prepare(args[1], env.context());

        XmlValue value;
        while(env.results()->next(value)) {
            XmlResults tmpResults = expr.execute(value, env.context(), flags);

            XmlValue tmpValue;
            while(tmpResults.next(tmpValue)) {
                newResults.add(tmpValue);
            }
        }
    }

    env.deleteResults();
    env.results() = new XmlResults(newResults);

    if(env.verbose())
        cout << (unsigned int)env.results()->size()
             << " objects returned for expression '"
             << args[1] << "'\n" << endl;
}
Example #3
0
  bool resolveCollection(XmlTransaction *txn, XmlManager &mgr, const std::string &uri, XmlResults &result)
  {
    bool status = false;
    TSRMLS_FETCH();
DEBUG();
    zval *argv[2], *retval, *func;
    MAKE_STD_ZVAL(func);
    MAKE_STD_ZVAL(retval);
    MAKE_STD_ZVAL(argv[0]);
    MAKE_STD_ZVAL(argv[1]);
    
    ZVAL_STRING(func, "resolveCollection", (int)1);
    ZVAL_STRINGL(argv[0], (char*)uri.data(), (int)uri.length(), 1);

    if (SUCCESS == call_user_function(EG(function_table),
        &m_userspace, func, retval, 2, argv TSRMLS_CC)) {

      if (Z_TYPE_P(retval) == IS_ARRAY) {
        /* convert argv[1] to an XmlResult collection */
        zval **datum;
        zend_hash_internal_pointer_reset(Z_ARRVAL_P(retval));
        while (SUCCESS == zend_hash_get_current_data(Z_ARRVAL_P(retval), (void**)&datum)) {
          result.add(php_dbxml_wrap_zval(*datum));
          zend_hash_move_forward(Z_ARRVAL_P(retval));
        }
        status = true;
      }
    }

    zval_ptr_dtor(&func);
    zval_ptr_dtor(&retval);
    zval_ptr_dtor(&argv[0]);
    zval_ptr_dtor(&argv[1]);
    
    return status;
  }
void AddDocumentCommand::execute(Args &args, Environment &env)
{
	if ((args.size() < 3) || (args.size() > 4)){
		throw CommandException("Wrong number of arguments");
	}
	env.testContainer();
	env.deleteResults();

	if ((args.size() == 4) && (args[3] == "q")) {
		if(env.txn()) {
			XmlTransaction myTxn = env.childTransaction();
			env.results() = new XmlResults(
				env.db().query(myTxn, args[2], env.context()));

			XmlValue value;
			while(env.results()->next(value)) {
				string v = value.asString();
				string name = env.container()->
					putDocument(myTxn, args[1], v, env.uc(),
						    DBXML_GEN_NAME);
				if(env.verbose())
					cout << "Document added, name = " << name << endl;
			}

			myTxn.commit();
		} else {
			env.results() = new XmlResults(env.db().query(args[2],
								      env.context()));
			XmlValue value;
			while(env.results()->next(value)) {
				string v = value.asString();
				string name = env.container()->
					putDocument(args[1], v, env.uc(), DBXML_GEN_NAME);
				if(env.verbose())
					cout << "Document added, name = " << name << endl;
			}

		}
	} else {
		// by string or by file
		bool byString = true;
		if (args.size() == 4 && args[3] == "f")
			byString = false;
		XmlDocument doc = env.db().createDocument();
		doc.setName(args[1]);
		if (byString)
			doc.setContent(args[2]);
		else {
			XmlInputStream *is = env.db().createLocalFileInputStream(args[2]);
			doc.setContentAsXmlInputStream(is);
		}
		if(env.txn()) {
			XmlTransaction myTxn = env.childTransaction();
			env.container()->putDocument(myTxn, doc, env.uc());
			myTxn.commit();
		} else {
			env.container()->putDocument(doc, env.uc());
		}

		// put doc content in last results
		XmlResults res = env.db().createResults();
		res.add(XmlValue(doc));
		env.results() = new XmlResults(res);

		if(env.verbose())
			cout << "Document added, name = " << args[1] << endl;
	}
}