Re: c4_Bytes.Modify() mangling data

Jean-Claude Wippler <[email protected]>
Newsgroups gmane.comp.db.metakit
Message-ID <[email protected]>
Brian Kelley wrote:

> I was inserting strings of length 2 which was why it worked for me.
> Yours were larger.  It turns out that you can't cross the end boundary
> when using modify.  So if you are inserting a string of length 10, you
> can't insert it into a string of length 9.  Also, if you are inserting
> it into a string of length 12, you can only insert at 0 or 1!

Whoa.  Good catch and analysis!

The attached change ought to fix this issue.  I'll verify this later, 
but it'll let you proceed for now (or you can use the Python 
workaround, of course).

-jcw

Index: viewx.cpp
===================================================================
RCS file: /home/cvs/metakit/src/viewx.cpp,v
retrieving revision 1.11
diff -u -p -u -r1.11 viewx.cpp
--- viewx.cpp   23 Nov 2003 01:42:51 -0000      1.11
+++ viewx.cpp   23 Sep 2004 17:49:15 -0000
@@ -581,21 +581,15 @@ bool c4_BytesRef::Modify(const c4_Bytes&
      c4_Handler& h = _cursor._seq->NthHandler(colNum);
      const int n = buf_.Size();
      const t4_i32 limit = off_ + n; // past changed bytes
-    const t4_i32 overshoot = limit - h.ItemSize(_cursor._index);
-
-    if (diff_ < overshoot)
-      diff_ = overshoot;

+      // get rid of an optimization, it was wrong  (2004-09-23)
      c4_Column* col = h.GetNthMemoCol(_cursor._index, true);
      if (col != 0)
      {
        if (diff_ < 0)
          col->Shrink(limit, - diff_);
        else if (diff_ > 0)
-          // insert bytes in the highest possible spot
-          // if a gap is created, it will contain garbage
-        col->Grow(overshoot > 0 ? col->ColSize() :
-               diff_ > n ? off_ : limit - diff_, diff_);
+        col->Grow(off_, diff_);

        col->StoreBytes(off_, buf_);
      }

_____________________________________________
Metakit mailing list  -  [email protected]
http://www.equi4.com/mailman/listinfo/metakit
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.