MCPcopy Create free account
hub / github.com/KentBeck/BPlusTree3 / node_insert_branch

Function node_insert_branch

python/bplustree_c_src/tree_ops.c:135–220  ·  view source on GitHub ↗

Insert into branch node */

Source from the content-addressed store, hash-verified

133
134/* Insert into branch node */
135int node_insert_branch(BPlusNode *node, PyObject *key, BPlusNode *right_child,
136 BPlusNode **new_node, PyObject **split_key) {
137 int pos = node_find_position(node, key);
138 if (pos < 0) return -1;
139
140 /* Check if split is needed */
141 if (node->num_keys >= node->capacity) {
142 /* Create new node */
143 *new_node = node_create(NODE_BRANCH, node->capacity);
144 if (!*new_node) return -1;
145
146 /* Temporary arrays for redistribution */
147 PyObject **temp_keys = PyMem_Malloc((node->capacity + 1) * sizeof(PyObject*));
148 BPlusNode **temp_children = PyMem_Malloc((node->capacity + 2) * sizeof(BPlusNode*));
149 if (!temp_keys || !temp_children) {
150 PyMem_Free(temp_keys);
151 PyMem_Free(temp_children);
152 node_destroy(*new_node);
153 PyErr_NoMemory();
154 return -1;
155 }
156
157 /* Copy existing + new into temp arrays */
158 temp_children[0] = node_get_child(node, 0);
159
160 int j = 0;
161 for (int i = 0; i < pos; i++) {
162 temp_keys[j] = node_get_key(node, i);
163 temp_children[j + 1] = node_get_child(node, i + 1);
164 j++;
165 }
166 temp_keys[j] = key;
167 temp_children[j + 1] = right_child;
168 j++;
169 for (int i = pos; i < node->num_keys; i++) {
170 temp_keys[j] = node_get_key(node, i);
171 temp_children[j + 1] = node_get_child(node, i + 1);
172 j++;
173 }
174
175 /* Split at midpoint */
176 int mid = node->capacity / 2;
177 *split_key = temp_keys[mid];
178 Py_INCREF(*split_key);
179
180 /* Keep first half in current node */
181 node->num_keys = mid;
182 for (int i = 0; i < mid; i++) {
183 Py_INCREF(temp_keys[i]);
184 node_set_key(node, i, temp_keys[i]);
185 }
186 for (int i = 0; i <= mid; i++) {
187 node_set_child(node, i, temp_children[i]);
188 }
189
190 /* Move second half to new node */
191 (*new_node)->num_keys = node->capacity - mid;
192 for (int i = 0; i < (*new_node)->num_keys; i++) {

Callers 1

tree_insert_recursiveFunction · 0.85

Calls 7

node_find_positionFunction · 0.85
node_createFunction · 0.85
node_destroyFunction · 0.85
node_get_childFunction · 0.85
node_get_keyFunction · 0.85
node_set_keyFunction · 0.85
node_set_childFunction · 0.85

Tested by

no test coverage detected