aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/stable/myriad.cpp40
1 files changed, 37 insertions, 3 deletions
diff --git a/src/stable/myriad.cpp b/src/stable/myriad.cpp
index 4edd004..1bf2301 100644
--- a/src/stable/myriad.cpp
+++ b/src/stable/myriad.cpp
@@ -80,7 +80,31 @@ Bu::MyriadStream Bu::Myriad::create( Bu::Myriad::Mode eMode,
80Bu::MyriadStream Bu::Myriad::open( Bu::Myriad::StreamId iStream, 80Bu::MyriadStream Bu::Myriad::open( Bu::Myriad::StreamId iStream,
81 Bu::Myriad::Mode eMode ) 81 Bu::Myriad::Mode eMode )
82{ 82{
83 Stream *pStream = NULL;
83 Bu::MutexLocker l( mhStream ); 84 Bu::MutexLocker l( mhStream );
85 if( (eMode&Create) )
86 {
87 if( !hStream.has( iStream ) )
88 {
89 if( (eMode&Exclusive) )
90 {
91 throw Bu::MyriadException( MyriadException::noSuchStream,
92 "Stream exists.");
93 }
94 }
95 else
96 {
97 Bu::MutexLocker l( mAccess );
98 if( iStream >= iLastUsedIndex )
99 {
100 iLastUsedIndex = iStream;
101 }
102 pStream = new Stream( *this, iStream, 0 );
103 pStream->aBlocks.append( __allocateBlock() );
104 hStream.insert( pStream->iStream, pStream );
105 bStructureChanged = true;
106 }
107 }
84 if( !hStream.has( iStream ) ) 108 if( !hStream.has( iStream ) )
85 { 109 {
86 throw Bu::MyriadException( MyriadException::noSuchStream, 110 throw Bu::MyriadException( MyriadException::noSuchStream,
@@ -94,7 +118,15 @@ Bu::MyriadStream Bu::Myriad::open( Bu::Myriad::StreamId iStream,
94 "Backing stream does not support writing."); 118 "Backing stream does not support writing.");
95 } 119 }
96 } 120 }
97 return Bu::MyriadStream( *this, hStream.get( iStream ), eMode ); 121 if( pStream == NULL )
122 {
123 pStream = hStream.get( iStream );
124 }
125 if( (eMode&Truncate) )
126 {
127 pStream->setSize( 0 );
128 }
129 return Bu::MyriadStream( *this, pStream, eMode );
98} 130}
99 131
100void Bu::Myriad::erase( Bu::Myriad::StreamId /*iStream*/ ) 132void Bu::Myriad::erase( Bu::Myriad::StreamId /*iStream*/ )
@@ -461,6 +493,7 @@ void Bu::Myriad::writeHeader()
461 493
462 Bu::MyriadStream sHeader( *this, hStream.get( 0 ), Bu::Myriad::Write ); 494 Bu::MyriadStream sHeader( *this, hStream.get( 0 ), Bu::Myriad::Write );
463 sHeader.write( mbHeader.getString() ); 495 sHeader.write( mbHeader.getString() );
496 bStructureChanged = false;
464} 497}
465 498
466int32_t Bu::Myriad::__calcHeaderSize() 499int32_t Bu::Myriad::__calcHeaderSize()
@@ -506,6 +539,7 @@ int32_t Bu::Myriad::allocateBlock()
506 539
507int32_t Bu::Myriad::__allocateBlock() 540int32_t Bu::Myriad::__allocateBlock()
508{ 541{
542 bStructureChanged = true;
509 if( lFreeBlocks.isEmpty() ) 543 if( lFreeBlocks.isEmpty() )
510 { 544 {
511 // Increase the size of the backing stream 545 // Increase the size of the backing stream
@@ -528,6 +562,7 @@ void Bu::Myriad::releaseBlock( int32_t iBlockId, bool bBlank )
528 562
529void Bu::Myriad::__releaseBlock( int32_t iBlockId, bool bBlank ) 563void Bu::Myriad::__releaseBlock( int32_t iBlockId, bool bBlank )
530{ 564{
565 bStructureChanged = true;
531 lFreeBlocks.append( iBlockId ); 566 lFreeBlocks.append( iBlockId );
532 if( bBlank ) 567 if( bBlank )
533 { 568 {
@@ -602,8 +637,7 @@ Bu::Myriad::Stream::Stream( Bu::Myriad &rParent, Bu::Myriad::StreamId iStream,
602 rParent( rParent ), 637 rParent( rParent ),
603 iStream( iStream ), 638 iStream( iStream ),
604 iSize( iSize ), 639 iSize( iSize ),
605 iOpenCount( 0 ), 640 iOpenCount( 0 )
606 bStructureChanged( false )
607{ 641{
608} 642}
609 643