diff options
author | Mike Buland <mike@xagasoft.com> | 2024-09-18 13:24:38 -0700 |
---|---|---|
committer | Mike Buland <mike@xagasoft.com> | 2024-09-18 13:24:38 -0700 |
commit | 81378d71401f39ced7d275777a6813db0ff04117 (patch) | |
tree | 8fc51856439e0782cfc5b3bcbb29e33faf1546b5 | |
parent | cad3e4d5d87dd713e27779d1f4a20821485b9de2 (diff) | |
download | libbu++-81378d71401f39ced7d275777a6813db0ff04117.tar.gz libbu++-81378d71401f39ced7d275777a6813db0ff04117.tar.bz2 libbu++-81378d71401f39ced7d275777a6813db0ff04117.tar.xz libbu++-81378d71401f39ced7d275777a6813db0ff04117.zip |
Open is more complete now. It's not fully tested.
It should allow you to open and create arbitrary stream ids, truncate,
exclusive mode, etc.
-rw-r--r-- | src/stable/myriad.cpp | 40 |
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, | |||
80 | Bu::MyriadStream Bu::Myriad::open( Bu::Myriad::StreamId iStream, | 80 | Bu::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 | ||
100 | void Bu::Myriad::erase( Bu::Myriad::StreamId /*iStream*/ ) | 132 | void 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 | ||
466 | int32_t Bu::Myriad::__calcHeaderSize() | 499 | int32_t Bu::Myriad::__calcHeaderSize() |
@@ -506,6 +539,7 @@ int32_t Bu::Myriad::allocateBlock() | |||
506 | 539 | ||
507 | int32_t Bu::Myriad::__allocateBlock() | 540 | int32_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 | ||
529 | void Bu::Myriad::__releaseBlock( int32_t iBlockId, bool bBlank ) | 563 | void 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 | ||