~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/_btree_serializer_pyx.pyx

  • Committer: John Arbash Meinel
  • Date: 2009-10-12 19:50:25 UTC
  • mto: This revision was merged to the branch mainline in revision 4749.
  • Revision ID: john@arbash-meinel.com-20091012195025-hiwyvwgdgz1duqj3
A bit of tweaking to _flatten_node.

Show diffs side-by-side

added added

removed removed

Lines of Context:
351
351
    elif node_len < 3:
352
352
        raise ValueError('Without ref_lists, we need at least 3 entries not: %s'
353
353
            % len(node))
354
 
    # I don't expect that we can do faster than string.join()
355
 
    string_key = '\0'.join(node[1])# <object>PyTuple_GET_ITEM_ptr_object(node, 1))
 
354
    # TODO: We can probably do better than string.join(), namely
 
355
    #       when key has only 1 item, we can just grab that string
 
356
    #       And when there are 2 items, we could do a single malloc + len() + 1
 
357
    #       also, doing .join() requires a PyObject_GetAttrString call, which
 
358
    #       we could also avoid.
 
359
    string_key = '\0'.join(node[1])
356
360
 
357
361
    # TODO: instead of using string joins, precompute the final string length,
358
362
    #       and then malloc a single string and copy everything in.
369
373
    refs_len = 0
370
374
    if have_reference_lists:
371
375
        # Figure out how many bytes it will take to store the references
372
 
        ref_lists = node[3]# <object>PyTuple_GET_ITEM_ptr_object(node, 3)
 
376
        ref_lists = node[3]
373
377
        next_len = len(ref_lists) # TODO: use a Py function
374
378
        if next_len > 0:
375
379
            # If there are no nodes, we don't need to do any work
393
397
                            # We will need (len - 1) '\x00' characters to
394
398
                            # separate the reference key
395
399
                            refs_len = refs_len + (next_len - 1)
396
 
                            for i from 0 <= i < next_len:
397
 
                                ref_bit = reference[i]
 
400
                            for ref_bit in reference:
398
401
                                if not PyString_CheckExact(ref_bit):
399
402
                                    raise TypeError('We expect reference bits'
400
403
                                        ' to be strings not: %s'
403
406
 
404
407
    # So we have the (key NULL refs NULL value LF)
405
408
    key_len = PyString_Size(string_key)
406
 
    val = node[2] # PyTuple_GET_ITEM_ptr_object(node, 2)
 
409
    val = node[2]
407
410
    if not PyString_CheckExact(val):
408
411
        raise TypeError('Expected a plain str for value not: %s'
409
412
                        % type(val))
435
438
                    if i != 0:
436
439
                        out[0] = c'\x00'
437
440
                        out = out + 1
438
 
                    ref_bit = reference[i] #PyTuple_GET_ITEM_ptr_object(reference, i)
 
441
                    ref_bit = reference[i]
439
442
                    ref_bit_len = PyString_GET_SIZE(ref_bit)
440
443
                    memcpy(out, PyString_AS_STRING(ref_bit), ref_bit_len)
441
444
                    out = out + ref_bit_len