diff options
-rw-r--r-- | src/cache.h | 38 | ||||
-rw-r--r-- | src/cachestore.h | 3 | ||||
-rw-r--r-- | src/cachestorenids.h | 21 | ||||
-rw-r--r-- | src/cryptohash.h | 2 | ||||
-rw-r--r-- | src/md5.cpp | 4 | ||||
-rw-r--r-- | src/md5.h | 2 | ||||
-rw-r--r-- | src/nids.cpp | 7 | ||||
-rw-r--r-- | src/nids.h | 6 | ||||
-rw-r--r-- | src/tests/md5.cpp | 6 | ||||
-rw-r--r-- | src/url.cpp | 29 | ||||
-rw-r--r-- | src/url.h | 20 |
11 files changed, 123 insertions, 15 deletions
diff --git a/src/cache.h b/src/cache.h index ccc4966..036ceb4 100644 --- a/src/cache.h +++ b/src/cache.h | |||
@@ -100,6 +100,13 @@ namespace Bu | |||
100 | return kId; | 100 | return kId; |
101 | } | 101 | } |
102 | 102 | ||
103 | void unbind() | ||
104 | { | ||
105 | if( pCache && pData ) | ||
106 | pCache->decRef( kId ); | ||
107 | pData = NULL; | ||
108 | } | ||
109 | |||
103 | Ptr &operator=( const Ptr &rRhs ) | 110 | Ptr &operator=( const Ptr &rRhs ) |
104 | { | 111 | { |
105 | if( pCache && pData ) | 112 | if( pCache && pData ) |
@@ -186,6 +193,11 @@ namespace Bu | |||
186 | return Ptr( this, pData, k ); | 193 | return Ptr( this, pData, k ); |
187 | } | 194 | } |
188 | 195 | ||
196 | bool has( const keytype &cId ) | ||
197 | { | ||
198 | return hEnt.has( cId ) || pStore->has( cId ); | ||
199 | } | ||
200 | |||
189 | Ptr get( const keytype &cId ) | 201 | Ptr get( const keytype &cId ) |
190 | { | 202 | { |
191 | TRACE( cId ); | 203 | TRACE( cId ); |
@@ -260,6 +272,32 @@ namespace Bu | |||
260 | return pStore->getKeys(); | 272 | return pStore->getKeys(); |
261 | } | 273 | } |
262 | 274 | ||
275 | /** | ||
276 | * Make sure all currently loaded but not-in-use objects are synced to | ||
277 | * the store. | ||
278 | */ | ||
279 | void sync() | ||
280 | { | ||
281 | TRACE(); | ||
282 | int iSynced = 0; | ||
283 | for( typename CidHash::iterator i = hEnt.begin(); | ||
284 | i != hEnt.end(); i++ ) | ||
285 | { | ||
286 | if( i.getValue().iRefs == 0 ) | ||
287 | { | ||
288 | pStore->sync( | ||
289 | i.getValue().pData, | ||
290 | i.getKey() | ||
291 | ); | ||
292 | iSynced++; | ||
293 | } | ||
294 | } | ||
295 | if( iSynced > 0 ) | ||
296 | { | ||
297 | pStore->sync(); | ||
298 | } | ||
299 | } | ||
300 | |||
263 | private: | 301 | private: |
264 | void incRef( const keytype &cId ) | 302 | void incRef( const keytype &cId ) |
265 | { | 303 | { |
diff --git a/src/cachestore.h b/src/cachestore.h index 97f02af..437b3d3 100644 --- a/src/cachestore.h +++ b/src/cachestore.h | |||
@@ -24,7 +24,10 @@ namespace Bu | |||
24 | virtual obtype *load( const keytype &key )=0; | 24 | virtual obtype *load( const keytype &key )=0; |
25 | virtual void unload( obtype *pObj, const keytype &key )=0; | 25 | virtual void unload( obtype *pObj, const keytype &key )=0; |
26 | virtual keytype create( obtype *pSrc )=0; | 26 | virtual keytype create( obtype *pSrc )=0; |
27 | virtual void sync()=0; | ||
28 | virtual void sync( obtype *pObj, const keytype &key )=0; | ||
27 | virtual void destroy( obtype *pObj, const keytype &key )=0; | 29 | virtual void destroy( obtype *pObj, const keytype &key )=0; |
30 | virtual bool has( const keytype &key )=0; | ||
28 | virtual Bu::List<keytype> getKeys() { return Bu::List<keytype>(); } | 31 | virtual Bu::List<keytype> getKeys() { return Bu::List<keytype>(); } |
29 | 32 | ||
30 | private: | 33 | private: |
diff --git a/src/cachestorenids.h b/src/cachestorenids.h index 40213cd..c6a00ce 100644 --- a/src/cachestorenids.h +++ b/src/cachestorenids.h | |||
@@ -97,6 +97,22 @@ namespace Bu | |||
97 | return key; | 97 | return key; |
98 | } | 98 | } |
99 | 99 | ||
100 | virtual void sync() | ||
101 | { | ||
102 | NidsStream ns = nStore.openStream( 0 ); | ||
103 | Bu::Archive ar( ns, Bu::Archive::save ); | ||
104 | ar << hId; | ||
105 | |||
106 | nStore.sync(); | ||
107 | } | ||
108 | |||
109 | virtual void sync( obtype *pSrc, const keytype &key ) | ||
110 | { | ||
111 | int iStream = hId.get( key ); | ||
112 | NidsStream ns = nStore.openStream( iStream ); | ||
113 | __cacheStoreNidsStore<obtype, keytype>( ns, *pSrc, key ); | ||
114 | } | ||
115 | |||
100 | virtual void destroy( obtype *pObj, const keytype &key ) | 116 | virtual void destroy( obtype *pObj, const keytype &key ) |
101 | { | 117 | { |
102 | int iStream = hId.get( key ); | 118 | int iStream = hId.get( key ); |
@@ -105,6 +121,11 @@ namespace Bu | |||
105 | delete pObj; | 121 | delete pObj; |
106 | } | 122 | } |
107 | 123 | ||
124 | virtual bool has( const keytype &key ) | ||
125 | { | ||
126 | return hId.has( key ); | ||
127 | } | ||
128 | |||
108 | virtual Bu::List<keytype> getKeys() | 129 | virtual Bu::List<keytype> getKeys() |
109 | { | 130 | { |
110 | return hId.getKeys(); | 131 | return hId.getKeys(); |
diff --git a/src/cryptohash.h b/src/cryptohash.h index 01d4634..ed8d9ec 100644 --- a/src/cryptohash.h +++ b/src/cryptohash.h | |||
@@ -13,7 +13,7 @@ namespace Bu | |||
13 | 13 | ||
14 | virtual void reset() = 0; | 14 | virtual void reset() = 0; |
15 | virtual void setSalt( const Bu::FString &sSalt ) = 0; | 15 | virtual void setSalt( const Bu::FString &sSalt ) = 0; |
16 | virtual void addData( const char *sData, int iSize ) = 0; | 16 | virtual void addData( const void *sData, int iSize ) = 0; |
17 | virtual void addData( const Bu::FString &sData ); | 17 | virtual void addData( const Bu::FString &sData ); |
18 | virtual FString getResult() = 0; | 18 | virtual FString getResult() = 0; |
19 | }; | 19 | }; |
diff --git a/src/md5.cpp b/src/md5.cpp index aa965ed..44e8519 100644 --- a/src/md5.cpp +++ b/src/md5.cpp | |||
@@ -55,8 +55,10 @@ void Bu::Md5::setSalt( const Bu::FString & /*sSalt*/ ) | |||
55 | { | 55 | { |
56 | } | 56 | } |
57 | 57 | ||
58 | void Bu::Md5::addData( const char *sData, int iSize ) | 58 | void Bu::Md5::addData( const void *sVData, int iSize ) |
59 | { | 59 | { |
60 | const char *sData = (const char *)sVData; | ||
61 | |||
60 | int iInPos = 0; | 62 | int iInPos = 0; |
61 | for(;;) | 63 | for(;;) |
62 | { | 64 | { |
@@ -20,7 +20,7 @@ namespace Bu | |||
20 | 20 | ||
21 | virtual void reset(); | 21 | virtual void reset(); |
22 | virtual void setSalt( const Bu::FString &sSalt ); | 22 | virtual void setSalt( const Bu::FString &sSalt ); |
23 | virtual void addData( const char *sData, int iSize ); | 23 | virtual void addData( const void *sData, int iSize ); |
24 | using Bu::CryptoHash::addData; | 24 | using Bu::CryptoHash::addData; |
25 | virtual FString getResult(); | 25 | virtual FString getResult(); |
26 | 26 | ||
diff --git a/src/nids.cpp b/src/nids.cpp index 26a7964..0bec952 100644 --- a/src/nids.cpp +++ b/src/nids.cpp | |||
@@ -31,6 +31,13 @@ Bu::Nids::~Nids() | |||
31 | updateHeader(); | 31 | updateHeader(); |
32 | } | 32 | } |
33 | 33 | ||
34 | void Bu::Nids::sync() | ||
35 | { | ||
36 | updateHeader(); | ||
37 | |||
38 | // Later, also flush all caches. | ||
39 | } | ||
40 | |||
34 | void Bu::Nids::initialize() | 41 | void Bu::Nids::initialize() |
35 | { | 42 | { |
36 | unsigned char buf[4]; | 43 | unsigned char buf[4]; |
@@ -70,6 +70,12 @@ namespace Bu | |||
70 | int getBlockStart(); | 70 | int getBlockStart(); |
71 | int getBlockOverhead(); | 71 | int getBlockOverhead(); |
72 | 72 | ||
73 | /** | ||
74 | * Syncronize the header data, etc. with the storage stream. It's not | ||
75 | * a bad idea to call this periodically. | ||
76 | */ | ||
77 | void sync(); | ||
78 | |||
73 | private: | 79 | private: |
74 | typedef struct Block | 80 | typedef struct Block |
75 | { | 81 | { |
diff --git a/src/tests/md5.cpp b/src/tests/md5.cpp index dea957b..2e9c318 100644 --- a/src/tests/md5.cpp +++ b/src/tests/md5.cpp | |||
@@ -12,12 +12,12 @@ int main( int argc, char *argv[] ) | |||
12 | Bu::File fIn( *argv, Bu::File::Read ); | 12 | Bu::File fIn( *argv, Bu::File::Read ); |
13 | Bu::Md5 m; | 13 | Bu::Md5 m; |
14 | 14 | ||
15 | char buf[1000]; | 15 | char buf[100000]; |
16 | for(;;) | 16 | for(;;) |
17 | { | 17 | { |
18 | int iRead = fIn.read( buf, 1000 ); | 18 | int iRead = fIn.read( buf, 100000 ); |
19 | m.addData( buf, iRead ); | 19 | m.addData( buf, iRead ); |
20 | if( iRead < 1000 ) | 20 | if( iRead < 100000 ) |
21 | break; | 21 | break; |
22 | } | 22 | } |
23 | 23 | ||
diff --git a/src/url.cpp b/src/url.cpp index 7cc4263..e4d2f55 100644 --- a/src/url.cpp +++ b/src/url.cpp | |||
@@ -235,3 +235,32 @@ void Bu::Url::clear() | |||
235 | iPort.clear(); | 235 | iPort.clear(); |
236 | } | 236 | } |
237 | 237 | ||
238 | Bu::FString Bu::Url::getFullPath() const | ||
239 | { | ||
240 | Bu::FString sBuf = sPath; | ||
241 | if( !lParam.isEmpty() ) | ||
242 | { | ||
243 | for( ParamList::const_iterator i = lParam.begin(); i; i++ ) | ||
244 | { | ||
245 | if( i == lParam.begin() ) | ||
246 | sBuf += "?"; | ||
247 | else | ||
248 | sBuf += "&"; | ||
249 | |||
250 | sBuf += encode( (*i).sName ); | ||
251 | if( !(*i).sValue.isEmpty() ) | ||
252 | { | ||
253 | sBuf += "=" + encode( (*i).sValue ); | ||
254 | } | ||
255 | } | ||
256 | } | ||
257 | |||
258 | return sBuf; | ||
259 | } | ||
260 | |||
261 | Bu::FString Bu::Url::getUrl() const | ||
262 | { | ||
263 | Bu::FString sBuf = sProtocol + "://" + sHost + getFullPath(); | ||
264 | return sBuf; | ||
265 | } | ||
266 | |||
@@ -29,15 +29,17 @@ namespace Bu | |||
29 | void parseParams( Bu::FString::const_iterator &i ); | 29 | void parseParams( Bu::FString::const_iterator &i ); |
30 | void clear(); | 30 | void clear(); |
31 | 31 | ||
32 | Bu::FString getUrl(); | 32 | Bu::FString getUrl() const; |
33 | Bu::FString getFullPath() const; | ||
33 | 34 | ||
34 | const Bu::FString &getProtocol() { return sProtocol; } | 35 | const Bu::FString &getProtocol() const { return sProtocol; } |
35 | const Bu::FString &getUser() { return sUser; } | 36 | const Bu::FString &getUser() const { return sUser; } |
36 | const Bu::FString &getPass() { return sPass; } | 37 | const Bu::FString &getPass() const { return sPass; } |
37 | const Bu::FString &getHost() { return sHost; } | 38 | const Bu::FString &getHost() const { return sHost; } |
38 | const Bu::FString &getPath() { return sPath; } | 39 | const Bu::FString &getPath() const { return sPath; } |
39 | int getPort() { return iPort; } | 40 | int getPort() const { return iPort; } |
40 | ParamList::const_iterator getParamBegin() { return lParam.begin(); } | 41 | ParamList::const_iterator getParamBegin() const |
42 | { return lParam.begin(); } | ||
41 | 43 | ||
42 | void setProtocol( const Bu::FString &sNewHost, bool bAutoSetPort=true ); | 44 | void setProtocol( const Bu::FString &sNewHost, bool bAutoSetPort=true ); |
43 | void setUser( const Bu::FString &s ) { sUser = s; } | 45 | void setUser( const Bu::FString &s ) { sUser = s; } |
@@ -47,7 +49,7 @@ namespace Bu | |||
47 | void setPort( int i ) { iPort = i; } | 49 | void setPort( int i ) { iPort = i; } |
48 | void addParam( const Bu::FString &n, const Bu::FString &v ); | 50 | void addParam( const Bu::FString &n, const Bu::FString &v ); |
49 | 51 | ||
50 | bool hasPort() { return iPort.has(); } | 52 | bool hasPort() const { return iPort.has(); } |
51 | 53 | ||
52 | static Bu::FString decode( const Bu::FString &sStr ); | 54 | static Bu::FString decode( const Bu::FString &sStr ); |
53 | static Bu::FString encode( const Bu::FString &sStr ); | 55 | static Bu::FString encode( const Bu::FString &sStr ); |