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); }
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; }
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; } }