//-------------------------------------------------------------------------------------------------- le_result_t ni_GoToNode ( ni_IteratorRef_t iteratorRef, ///< [IN] The iterator object to access. const char* newPathPtr ///< [IN] Path to the new location in the tree to jump to. ) //-------------------------------------------------------------------------------------------------- { LE_ASSERT(iteratorRef != NULL); LE_ASSERT(le_pathIter_IsAbsolute(iteratorRef->pathIterRef) == true); le_result_t result = le_pathIter_Append(iteratorRef->pathIterRef, newPathPtr); if (result == LE_OK) { tdb_TreeRef_t treeRef = iteratorRef->treeRef; iteratorRef->currentNodeRef = tdb_GetNode(tdb_GetRootNode(treeRef), iteratorRef->pathIterRef); } return result; }
//-------------------------------------------------------------------------------------------------- tdb_NodeRef_t ni_GetNode ( ni_IteratorRef_t iteratorRef, ///< [IN] The iterator object to access. const char* subPathPtr ///< [IN] Optional, can be used to specify a node relative to the ///< current one. ) //-------------------------------------------------------------------------------------------------- { // Copy iterator's existing path, and append the new sub path to the copied path. Once // that's done, attempt to find the requested node in the tree. If the node still can not be // found, return NULL. le_pathIter_Ref_t newPathRef = NULL; if (CloneAndAppendPath(iteratorRef, subPathPtr, &newPathRef) != LE_OK) { return NULL; } tdb_NodeRef_t nodeRef = tdb_GetNode(tdb_GetRootNode(iteratorRef->treeRef), newPathRef); le_pathIter_Delete(newPathRef); return nodeRef; }
//-------------------------------------------------------------------------------------------------- ni_IteratorRef_t ni_CreateIterator ( le_msg_SessionRef_t sessionRef, ///< [IN] The user session this request occured on. tu_UserRef_t userRef, ///< [IN] Create the iterator for this user. tdb_TreeRef_t treeRef, ///< [IN] The tree to create the iterator with. ni_IteratorType_t type, ///< [IN] The type of iterator we are creating, read or write? const char* initialPathPtr ///< [IN] The node to move to in the specified tree. ) //-------------------------------------------------------------------------------------------------- { LE_ASSERT(treeRef != NULL); // Allocate the object and setup it's initial properties. ni_IteratorRef_t iteratorRef = le_mem_ForceAlloc(IteratorPoolRef); iteratorRef->creationTime = le_clk_GetRelativeTime(); iteratorRef->sessionRef = sessionRef; iteratorRef->userRef = userRef; iteratorRef->treeRef = treeRef; iteratorRef->type = type; iteratorRef->reference = NULL; iteratorRef->isClosed = false; iteratorRef->isTerminated = false; // Setup the timeout timer for this transaction, if it's been configured. time_t configTimeout = ic_GetTransactionTimeout(); if (configTimeout > 0) { le_clk_Time_t timeout = { configTimeout, 0 }; iteratorRef->timerRef = le_timer_Create("Transaction Timer"); LE_ASSERT(le_timer_SetInterval(iteratorRef->timerRef, timeout) == LE_OK); LE_ASSERT(le_timer_SetHandler(iteratorRef->timerRef, OnTransactionTimeout) == LE_OK); LE_ASSERT(le_timer_SetContextPtr(iteratorRef->timerRef, iteratorRef) == LE_OK); LE_ASSERT(le_timer_Start(iteratorRef->timerRef) == LE_OK); } else { iteratorRef->timerRef = NULL; } // If this is a write iterator, then shadow the tree instead of accessing it directly. if (iteratorRef->type == NI_WRITE) { iteratorRef->treeRef = tdb_ShadowTree(iteratorRef->treeRef); } // Get the root node of the requested tree, or if this is a write iterator... Get the shadowed // root node of the tree. iteratorRef->currentNodeRef = tdb_GetRootNode(iteratorRef->treeRef); iteratorRef->pathIterRef = le_pathIter_CreateForUnix("/"); LE_DEBUG("Created a new %s iterator object <%p> for user %u (%s) on tree %s.", TypeString(type), iteratorRef, tu_GetUserId(userRef), tu_GetUserName(userRef), tdb_GetTreeName(treeRef)); // If we were given an initial path, go to it now. Otherwise stay on the root node. if (initialPathPtr) { ni_GoToNode(iteratorRef, initialPathPtr); } // Update the tree so that it can keep track of this iterator. tdb_RegisterIterator(treeRef, iteratorRef); // All done. return iteratorRef; }