const char * CouchbaseRowBuilder::nextField(const RtlFieldInfo * field) { m_fieldsProcessedCount++; if (!m_oResultRow) failx("Missing result row data"); const char * fieldname = field->name->queryStr(); if (!fieldname || !*fieldname) failx("Missing result column metadata (name)"); if (!m_oResultRow->hasProp(fieldname)) { VStringBuffer nxpath("locationData/%s", fieldname); if (m_oNestedField) { if (!m_oNestedField->hasProp(fieldname)) { StringBuffer xml; toXML(m_oResultRow, xml); failx("Result row does not contain field: %s: %s", fieldname, xml.str()); } return m_oNestedField->queryProp(fieldname); } } return m_oResultRow->queryProp(fieldname); }
void bindRealParam(double value, const RtlFieldInfo * field, Couchbase::QueryCommand * pQcmd) { VStringBuffer cbPlaceholder("$%s", field->name->queryStr()); if (pQcmd) { StringBuffer serialized; TokenSerializer tokenSerializer; tokenSerializer.serialize(value, serialized); auto status = pQcmd->named_param(cbPlaceholder.str(), serialized.str()); if (!status.success()) failx("Could not bind Param: %s val: %s", cbPlaceholder.str(), serialized.str()); } else failx("Internal error: detected invalid CouchbaseQueryCommand while attempting to bind to field: %s", cbPlaceholder.str()); }
void bindUnicodeParam(unsigned chars, const UChar *value, const RtlFieldInfo * field, Couchbase::QueryCommand * pQcmd) { VStringBuffer cbPlaceholder("$%s", field->name->queryStr()); if (pQcmd) { size32_t utf8chars; char *utf8; rtlUnicodeToUtf8X(utf8chars, utf8, chars, value); auto status = pQcmd->named_param(cbPlaceholder.str(), utf8); if (!status.success()) failx("Could not bind Param: %s val: %s", cbPlaceholder.str(), utf8); } else failx("Internal error: detected invalid CouchbaseQueryCommand while attempting to bind to field: %s", cbPlaceholder.str()); }
void bindDataParam(unsigned len, const void *value, const RtlFieldInfo * field, Couchbase::QueryCommand * pQcmd) { VStringBuffer cbPlaceholder("$%s", field->name->queryStr()); if (pQcmd) { size32_t bytes; void *data; rtlStrToDataX(bytes, data, len, value); auto status = pQcmd->named_param(cbPlaceholder.str(), (char *)data); if (!status.success()) failx("Could not bind Param: %s val: %s", cbPlaceholder.str(), (char *)data); } else failx("Internal error: detected invalid CouchbaseQueryCommand while attempting to bind to field: %s", cbPlaceholder.str()); }
static int svstatus_get(void) { if ((fd = open_write("supervise/ok")) == -1) { if (errno == ENODEV) { *acts == 'x' ? ok("runsv not running") : failx("runsv not running"); return 0; } warn_cannot("open supervise/ok"); return -1; } close(fd); if ((fd = open_read("supervise/status")) == -1) { warn_cannot("open supervise/status"); return -1; } r = read(fd, svstatus, 20); close(fd); switch (r) { case 20: break; case -1: warn_cannot("read supervise/status"); return -1; default: warnx_cannot("read supervise/status: bad format"); return -1; } return 1; }
Couchbase::Query * CouchbaseConnection::query(Couchbase::QueryCommand * qcommand) { Couchbase::Status queryStatus; Couchbase::Query * pQuery = new Couchbase::Query(*m_pCouchbaseClient, *qcommand, queryStatus); if (!queryStatus) failx("Couldn't issue query: %s", queryStatus.description()); if (!pQuery->status()) failx("Couldn't execute query, reason: %s\nBody is: ", pQuery->meta().body().data()); if (pQuery->meta().status().errcode() != LCB_SUCCESS )//rows.length() == 0) failx("Query execution error: %s", m_pQuery->meta().body().data()); return pQuery; }
void CouchbaseEmbedFunctionContext::execute() { if (m_oInputStream) m_oInputStream->executeAll(m_oCBConnection); else { m_pQuery = m_oCBConnection->query(m_pQcmd); if (m_pQuery->meta().status().errcode() != LCB_SUCCESS )//rows.length() == 0) failx("Query execution error: %s", m_pQuery->meta().body().to_string().c_str()); if (m_pQuery->status().errcode()) failx("Query error: %s", m_pQuery->status().description()); //consider parsing json result if (strstr(m_pQuery->meta().body().to_string().c_str(), "\"status\": \"errors\"")) failx("Err: %s", m_pQuery->meta().body().data()); } }
CouchbaseEmbedFunctionContext::CouchbaseEmbedFunctionContext(const IContextLogger &_logctx, const char *options, unsigned _flags) : logctx(_logctx), m_NextRow(), m_nextParam(0), m_numParams(0), m_scriptFlags(_flags) { cbQueryIterator = NULL; m_pCouchbaseClient = nullptr; m_pQuery = nullptr; m_pQcmd = nullptr; const char *server = "localhost"; const char *user = ""; const char *password = ""; const char *bucketname = "default"; unsigned port = 8093; bool useSSL = false; StringBuffer connectionOptions; StringArray inputOptions; inputOptions.appendList(options, ","); ForEachItemIn(idx, inputOptions) { const char *opt = inputOptions.item(idx); const char *val = strchr(opt, '='); if (val) { StringBuffer optName(val-opt, opt); val++; if (stricmp(optName, "server")==0) server = val; // Note that lifetime of val is adequate for this to be safe else if (stricmp(optName, "port")==0) port = atoi(val); else if (stricmp(optName, "user")==0) user = val; else if (stricmp(optName, "password")==0) password = val; else if (stricmp(optName, "bucket")==0) bucketname = val; else if (stricmp(optName, "useSSL")==0) useSSL = clipStrToBool(val); //Connection String options else if (stricmp(optName, "detailed_errcodes")==0 || stricmp(optName, "operation_timeout")==0 || stricmp(optName, "config_total_timeout")==0 || stricmp(optName, "http_poolsize")==0 || stricmp(optName, "detailed_errcodes")==0) connectionOptions.appendf("%s%s=%s", connectionOptions.length() == 0 ? "?" : "&", optName.str(), val); else failx("Unknown option %s", optName.str()); } } m_oCBConnection.setown(new CouchbaseConnection(useSSL, server, port, bucketname, user, password, connectionOptions.str())); m_oCBConnection->connect(); }
void CouchbaseEmbedFunctionContext::bindUnicodeParam(const char *name, size32_t chars, const UChar *val) { checkNextParam(name); VStringBuffer cbPlaceholder("$%s", name); size32_t utf8chars; char *utf8; rtlUnicodeToUtf8X(utf8chars, utf8, chars, val); auto status = m_pQcmd->named_param(cbPlaceholder.str(), utf8); if (!status.success()) failx("Could not bind Param: %s val: %s", cbPlaceholder.str(), utf8); }
const MYSQL_BIND &nextField(const RtlFieldInfo * field) { if (colIdx < resultInfo.numColumns()) colIdx++; else fail("Too many fields in ECL output row"); const MYSQL_BIND &column = resultInfo.queryColumn(colIdx); if (*column.error) failx("Error fetching column %s", field->name->queryStr()); return column; }
void CouchbaseEmbedFunctionContext::bindRealParam(const char *name, double val) { checkNextParam(name); StringBuffer serialized; m_tokenSerializer.serialize(val, serialized); VStringBuffer cbPlaceholder("$%s", name); auto status = m_pQcmd->named_param(cbPlaceholder.str(), serialized.str()); if (!status.success()) failx("Could not bind Param: %s val: %s", cbPlaceholder.str(), serialized.str()); }
CouchbaseRowStream::CouchbaseRowStream(IEngineRowAllocator* resultAllocator, Couchbase::Query * cbaseQuery) : m_CouchBaseQuery(cbaseQuery), m_resultAllocator(resultAllocator) { m_currentRow = 0; m_shouldRead = true; //iterating over result rows and copying them to stringarray //is there a way to independently step through original result rows? for (auto cbrow : *m_CouchBaseQuery) m_Rows.append(cbrow.json().to_string().c_str()); if (m_CouchBaseQuery->meta().status().errcode() != LCB_SUCCESS )//rows.length() == 0) failx("Embedded couchbase error: %s", m_CouchBaseQuery->meta().body().data()); else if (m_Rows.length() == 0) // Query errors not reported in meta.status, lets check for errors in meta body { if (strstr(m_CouchBaseQuery->meta().body().data(), "\"status\": \"errors\"")) failx("Err: %s", m_CouchBaseQuery->meta().body().data()); } }
void CouchbaseEmbedFunctionContext::bindDataParam(const char *name, size32_t len, const void *val) { checkNextParam(name); VStringBuffer cbPlaceholder("$%s", name); size32_t bytes; void *data; rtlStrToDataX(bytes, data, len, val); auto status = m_pQcmd->named_param(cbPlaceholder.str(), (char *)data); if (!status.success()) failx("Could not bind Param: %s val: %s", cbPlaceholder.str(), (char *)data); }
const char * CouchbaseEmbedFunctionContext::nextResultScalar() { auto resultrow = nextResultRowIterator(); if (resultrow) { resultrow->first(); if(resultrow->isValid() == true) { if (resultrow->query().hasChildren()) typeError("scalar", ""); return resultrow->query().queryProp(""); } else failx("Could not fetch next result column."); } else failx("Could not fetch next result row."); return nullptr; }
/* Create a POSIX thread with error checking. */ static pthread_t xcreate(void (*entry)(void)) { int err; pthread_t thread; err = pthread_create(&thread, NULL, thread_entry, entry); if (err != 0) failx(err, "unable to create a POSIX thread"); return thread; }
IPropertyTreeIterator * CouchbaseEmbedFunctionContext::nextResultRowIterator() { for (auto cbrow : *m_pQuery) { auto json = cbrow.json().to_string(); Owned<IPropertyTree> contentTree = createPTreeFromJSONString(json.c_str()); if (contentTree) return contentTree->getElements("./*"); failx("Could not fetch next result row."); break; } return nullptr; }
void CouchbaseEmbedFunctionContext::compileEmbeddedScript(size32_t chars, const char *script) { if (script && *script) { m_pQcmd = new Couchbase::QueryCommand(script); if ((m_scriptFlags & EFnoparams) == 0) m_numParams = countParameterPlaceholders(script); else m_numParams = 0; } else failx("Empty N1QL query detected"); }
static int control(char *a) { if (svstatus_get() <= 0) return -1; if (svstatus[17] == *a) return 0; if ((fd = open_write("supervise/control")) == -1) { if (errno != ENODEV) warn_cannot("open supervise/control"); else *a == 'x' ? ok("runsv not running") : failx("runsv not running"); return -1; } r = write(fd, a, strlen(a)); close(fd); if (r != strlen(a)) { warn_cannot("write to supervise/control"); return -1; } return 1; }
int control(char *a) { if (svstatus_get() <= 0) return(-1); if (svstatus[17] == *a) if (*a != 'd' || svstatus[18] == 1) return(0); /* once w/o term */ if ((fd =open_write("supervise/control")) == -1) { if (errno != error_nodevice) warn("unable to open supervise/control"); else *a == 'x' ? ok("runsv not running") : failx("runsv not running"); return(-1); } r =write(fd, a, str_len(a)); close(fd); if (r != str_len(a)) { warn("unable to write to supervise/control"); return(-1); } return(1); }
const void * CouchbaseRowStream::nextRow() { const void * result = NULL; if (m_shouldRead && m_currentRow < m_Rows.length()) { auto json = m_Rows.item(m_currentRow++); Owned<IPropertyTree> contentTree = createPTreeFromJSONString(json,ipt_caseInsensitive); if (contentTree) { CouchbaseRowBuilder * cbRowBuilder = new CouchbaseRowBuilder(contentTree); RtlDynamicRowBuilder rowBuilder(m_resultAllocator); const RtlTypeInfo *typeInfo = m_resultAllocator->queryOutputMeta()->queryTypeInfo(); assertex(typeInfo); RtlFieldStrInfo dummyField("<row>", NULL, typeInfo); size32_t len = typeInfo->build(rowBuilder, 0, &dummyField, *cbRowBuilder); return rowBuilder.finalizeRowClear(len); } else failx("Error processing result row"); } return result; }
static void ipdivert_bind(const char *test, int s, u_short port, int expect) { struct sockaddr_in sin; int err; bzero(&sin, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_ANY); sin.sin_port = htons(port); err = bind(s, (struct sockaddr *)&sin, sizeof(sin)); if (err < 0) { if (expect == 0) fail(test, "bind"); if (errno != expect) fail(test, "bind"); } else { if (expect != 0) failx(test, "bind"); } }
int svstatus_get() { if ((fd =open_write("supervise/ok")) == -1) { if (errno == error_nodevice) { *acts == 'x' ? ok("runsv not running") : failx("runsv not running"); return(0); } warn("unable to open supervise/ok"); return(-1); } close(fd); if ((fd =open_read("supervise/status")) == -1) { warn("unable to open supervise/status"); return(-1); } r =read(fd, svstatus, 20); close(fd); switch(r) { case 20: break; case -1: warn("unable to read supervise/status"); return(-1); default: warnx("unable to read supervise/status: bad format"); return(-1); } return(1); }
unsigned CouchbaseEmbedFunctionContext::checkNextParam(const char *name) { if (m_nextParam == m_numParams) failx("Too many parameters supplied: No matching $<name> placeholder for parameter %s", name); return m_nextParam++; }