static void LogIndexString (const char* const what, TRI_index_t const* idx, char const* collectionName) { TRI_string_buffer_t* buffer = TRI_CreateStringBuffer(TRI_UNKNOWN_MEM_ZONE); size_t i; if (buffer == NULL) { return; } for (i = 0; i < idx->_fields._length; i++) { if (i > 0) { TRI_AppendStringStringBuffer(buffer, ", "); } TRI_AppendStringStringBuffer(buffer, idx->_fields._buffer[i]); } LOG_TRACE("%s %s index (%s) for '%s'", what, TRI_TypeNameIndex(idx->_type), buffer->_buffer, collectionName); TRI_FreeStringBuffer(TRI_UNKNOWN_MEM_ZONE, buffer); }
static char* makeWindowsArgs (TRI_external_t* external) { TRI_string_buffer_t* buf; size_t i; int err = TRI_ERROR_NO_ERROR; char* res; buf = TRI_CreateStringBuffer(TRI_UNKNOWN_MEM_ZONE); if (buf == NULL) { return NULL; } TRI_ReserveStringBuffer(buf, 1024); err = appendQuotedArg(buf, external->_executable); if (err != TRI_ERROR_NO_ERROR) { TRI_FreeStringBuffer(TRI_UNKNOWN_MEM_ZONE, buf); return NULL; } for (i = 1;i < external->_numberArguments;i++) { err = TRI_AppendCharStringBuffer(buf, ' '); if (err != TRI_ERROR_NO_ERROR) { TRI_FreeStringBuffer(TRI_UNKNOWN_MEM_ZONE, buf); return NULL; } err = appendQuotedArg(buf, external->_arguments[i]); } res = TRI_StealStringBuffer(buf); TRI_FreeStringBuffer(TRI_UNKNOWN_MEM_ZONE, buf); return res; }
static TRI_string_buffer_t* FcallCode (const char* const name, const TRI_aql_node_t* const args) { TRI_string_buffer_t* buffer = TRI_CreateStringBuffer(TRI_UNKNOWN_MEM_ZONE); size_t i; size_t n; if (!buffer) { return NULL; } if (TRI_AppendStringStringBuffer(buffer, "(function(){return AHUACATL_FCALL(") != TRI_ERROR_NO_ERROR) { TRI_FreeStringBuffer(TRI_UNKNOWN_MEM_ZONE, buffer); return NULL; } if (TRI_AppendStringStringBuffer(buffer, name) != TRI_ERROR_NO_ERROR) { TRI_FreeStringBuffer(TRI_UNKNOWN_MEM_ZONE, buffer); return NULL; } if (TRI_AppendStringStringBuffer(buffer, ",[") != TRI_ERROR_NO_ERROR) { TRI_FreeStringBuffer(TRI_UNKNOWN_MEM_ZONE, buffer); return NULL; } n = args->_members._length; for (i = 0; i < n; ++i) { TRI_aql_node_t* arg = (TRI_aql_node_t*) args->_members._buffer[i]; if (i > 0) { if (TRI_AppendCharStringBuffer(buffer, ',') != TRI_ERROR_NO_ERROR) { TRI_FreeStringBuffer(TRI_UNKNOWN_MEM_ZONE, buffer); return NULL; } } if (!TRI_NodeJavascriptAql(buffer, arg)) { TRI_FreeStringBuffer(TRI_UNKNOWN_MEM_ZONE, buffer); return NULL; } } if (TRI_AppendStringStringBuffer(buffer, "]);})") != TRI_ERROR_NO_ERROR) { TRI_FreeStringBuffer(TRI_UNKNOWN_MEM_ZONE, buffer); return NULL; } return buffer; }
static TRI_string_buffer_t* RelationCode (const char* const name, const TRI_aql_node_t* const lhs, const TRI_aql_node_t* const rhs) { TRI_string_buffer_t* buffer = TRI_CreateStringBuffer(TRI_UNKNOWN_MEM_ZONE); if (!lhs || !rhs) { return NULL; } if (TRI_AppendStringStringBuffer(buffer, "(function(){return AHUACATL_RELATIONAL_") != TRI_ERROR_NO_ERROR) { TRI_FreeStringBuffer(TRI_UNKNOWN_MEM_ZONE, buffer); return NULL; } if (TRI_AppendStringStringBuffer(buffer, name) != TRI_ERROR_NO_ERROR) { TRI_FreeStringBuffer(TRI_UNKNOWN_MEM_ZONE, buffer); return NULL; } if (TRI_AppendStringStringBuffer(buffer, "(") != TRI_ERROR_NO_ERROR) { TRI_FreeStringBuffer(TRI_UNKNOWN_MEM_ZONE, buffer); return NULL; } if (!TRI_NodeJavascriptAql(buffer, lhs)) { TRI_FreeStringBuffer(TRI_UNKNOWN_MEM_ZONE, buffer); return NULL; } if (TRI_AppendCharStringBuffer(buffer, ',') != TRI_ERROR_NO_ERROR) { TRI_FreeStringBuffer(TRI_UNKNOWN_MEM_ZONE, buffer); return NULL; } if (!TRI_NodeJavascriptAql(buffer, rhs)) { TRI_FreeStringBuffer(TRI_UNKNOWN_MEM_ZONE, buffer); return NULL; } if (TRI_AppendStringStringBuffer(buffer, ");})") != TRI_ERROR_NO_ERROR) { TRI_FreeStringBuffer(TRI_UNKNOWN_MEM_ZONE, buffer); return NULL; } return buffer; }
TRI_json_t* TRI_GetJsonCollectionHintAql (TRI_aql_collection_hint_t* const hint) { TRI_json_t* result; if (hint == NULL) { return NULL; } result = TRI_CreateArrayJson(TRI_UNKNOWN_MEM_ZONE); if (result == NULL) { return NULL; } if (hint->_index == NULL) { // full table scan TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, result, "accessType", TRI_CreateStringCopyJson(TRI_UNKNOWN_MEM_ZONE, "all")); } else { // index usage TRI_index_t* idx = hint->_index->_idx; TRI_json_t* indexDescription; TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, result, "accessType", TRI_CreateStringCopyJson(TRI_UNKNOWN_MEM_ZONE, "index")); indexDescription = TRI_CreateArrayJson(TRI_UNKNOWN_MEM_ZONE); if (indexDescription != NULL) { TRI_string_buffer_t* buffer; char* idString = GetIndexIdString(hint); // index id if (idString != NULL) { TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, indexDescription, "id", TRI_CreateStringCopyJson(TRI_UNKNOWN_MEM_ZONE, idString)); TRI_FreeString(TRI_UNKNOWN_MEM_ZONE, idString); } // index type TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, indexDescription, "type", TRI_CreateStringCopyJson(TRI_UNKNOWN_MEM_ZONE, idx->typeName(idx))); // index attributes buffer = TRI_CreateStringBuffer(TRI_UNKNOWN_MEM_ZONE); if (buffer != NULL) { size_t i; for (i = 0; i < idx->_fields._length; i++) { if (i > 0) { TRI_AppendStringStringBuffer(buffer, ", "); } TRI_AppendStringStringBuffer(buffer, idx->_fields._buffer[i]); } TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, indexDescription, "attributes", TRI_CreateStringCopyJson(TRI_UNKNOWN_MEM_ZONE, buffer->_buffer)); TRI_FreeStringBuffer(TRI_UNKNOWN_MEM_ZONE, buffer); } } TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, result, "index", indexDescription); } if (hint->_limit._status == TRI_AQL_LIMIT_USE) { TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, result, "limit", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, (double) hint->_limit._offset + (double) hint->_limit._limit)); } return result; }