Matthias Brantner has proposed merging lp:~zorba-coders/zorba/bug-fixing into 
lp:zorba.

Requested reviews:
  Nicolae Brinza (nbrinza)
  William Candillon (wcandillon)
Related bugs:
  Bug #898064 in Zorba: "Stringstream error"
  https://bugs.launchpad.net/zorba/+bug/898064
  Bug #898208 in Zorba: "building xqdoc on cmake < 2.8"
  https://bugs.launchpad.net/zorba/+bug/898208

For more details, see:
https://code.launchpad.net/~zorba-coders/zorba/bug-fixing/+merge/83992

fix for bug #898064
-- 
https://code.launchpad.net/~zorba-coders/zorba/bug-fixing/+merge/83992
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'src/api/serialization/serializer.cpp'
--- src/api/serialization/serializer.cpp	2011-11-11 07:44:01 +0000
+++ src/api/serialization/serializer.cpp	2011-11-30 18:40:31 +0000
@@ -1682,14 +1682,18 @@
   std::streambuf *  pbuf;
   std::streamsize   read_bytes;
   std::istream& is = item->getStream();
-
-  // prepare the stream
+  std::streampos pos;
   std::ios::iostate const old_exceptions = is.exceptions();
-  is.exceptions( std::ios::badbit | std::ios::failbit );
-  std::streampos const pos = is.tellg();
-  if (pos)
-    is.seekg(0, std::ios::beg);
-  is.exceptions(is.exceptions() & ~std::ios::failbit);
+
+  if (item->isSeekable())
+  {
+    // prepare the stream
+    is.exceptions( std::ios::badbit | std::ios::failbit );
+    pos = is.tellg();
+    if (pos)
+      is.seekg(0, std::ios::beg);
+    is.exceptions(is.exceptions() & ~std::ios::failbit);
+  }
 
   // read bytes and do string expansion
   do
@@ -1703,12 +1707,15 @@
 
   // restore stream's state
   is.clear();                   // clear eofbit
-  if (pos)
+  if (item->isSeekable())
   {
-    is.exceptions(is.exceptions() | std::ios::failbit);
-    is.seekg(pos, std::ios::beg);
+    if (pos != 0 && pos != -1)
+    {
+      is.exceptions(is.exceptions() | std::ios::failbit);
+      is.seekg(pos, std::ios::beg);
+    }
+    is.exceptions(old_exceptions);
   }
-  is.exceptions(old_exceptions);
 }
 
 

=== modified file 'src/store/api/item.h'
--- src/store/api/item.h	2011-10-15 10:41:19 +0000
+++ src/store/api/item.h	2011-11-30 18:40:31 +0000
@@ -807,6 +807,14 @@
   virtual bool isStreamable() const;
 
   /**
+   * Checks whether the item's content is streamable
+   * and the underlying stream is seekable
+   *
+   * @return true only if it is.
+   */
+  virtual bool isSeekable() const;
+
+  /**
    * Gets an istream for the item's content.
    *
    * @return the stream.

=== modified file 'src/store/naive/item.cpp'
--- src/store/naive/item.cpp	2011-10-15 10:41:19 +0000
+++ src/store/naive/item.cpp	2011-11-30 18:40:31 +0000
@@ -1291,6 +1291,11 @@
   return false;
 }
 
+bool Item::isSeekable() const
+{
+  return false;
+}
+
 std::istream& Item::getStream()
 {
   throw ZORBA_EXCEPTION(

-- 
Mailing list: https://launchpad.net/~zorba-coders
Post to     : zorba-coders@lists.launchpad.net
Unsubscribe : https://launchpad.net/~zorba-coders
More help   : https://help.launchpad.net/ListHelp

Reply via email to