You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by da...@apache.org on 2009/07/18 01:23:03 UTC
svn commit: r795277 - in /couchdb/trunk/src/couchdb: couch_db.erl
couch_file.erl
Author: damien
Date: Fri Jul 17 23:23:03 2009
New Revision: 795277
URL: http://svn.apache.org/viewvc?rev=795277&view=rev
Log:
MD5 term checking by using leading bit in 32 bit length to indicate MD5 presence.
Modified:
couchdb/trunk/src/couchdb/couch_db.erl
couchdb/trunk/src/couchdb/couch_file.erl
Modified: couchdb/trunk/src/couchdb/couch_db.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_db.erl?rev=795277&r1=795276&r2=795277&view=diff
==============================================================================
--- couchdb/trunk/src/couchdb/couch_db.erl (original)
+++ couchdb/trunk/src/couchdb/couch_db.erl Fri Jul 17 23:23:03 2009
@@ -870,12 +870,8 @@
read_doc(#db{fd=Fd}, OldStreamPointer) when is_tuple(OldStreamPointer) ->
% 09 UPGRADE CODE
couch_stream:old_read_term(Fd, OldStreamPointer);
-read_doc(#db{header=#db_header{disk_version=Version},fd=Fd}, Pos)
- when Version == 3 ->
- % 09 UPGRADE CODE
- couch_file:pread_term(Fd, Pos);
read_doc(#db{fd=Fd}, Pos) ->
- couch_file:pread_term_md5(Fd, Pos).
+ couch_file:pread_term(Fd, Pos).
doc_to_tree(#doc{revs={Start, RevIds}}=Doc) ->
Modified: couchdb/trunk/src/couchdb/couch_file.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_file.erl?rev=795277&r1=795276&r2=795277&view=diff
==============================================================================
--- couchdb/trunk/src/couchdb/couch_file.erl (original)
+++ couchdb/trunk/src/couchdb/couch_file.erl Fri Jul 17 23:23:03 2009
@@ -25,8 +25,7 @@
-export([open/1, open/2, close/1, bytes/1, sync/1, append_binary/2,old_pread/3]).
-export([append_term/2, pread_term/2, pread_iolist/2, write_header/2]).
-export([pread_binary/2, read_header/1, truncate/2, upgrade_old_header/2]).
--export([append_term_md5/2, pread_iolist_md5/2, pread_binary_md5/2]).
--export([pread_term_md5/2]).
+-export([append_term_md5/2,append_binary_md5/2]).
-export([init/1, terminate/2, handle_call/3, handle_cast/2, code_change/3, handle_info/2]).
%%----------------------------------------------------------------------
@@ -84,12 +83,13 @@
append_binary(Fd, Bin) ->
Size = iolist_size(Bin),
- gen_server:call(Fd, {append_bin, [<<Size:32/integer>>, Bin]}, infinity).
+ gen_server:call(Fd, {append_bin,
+ [<<0:1/integer,Size:31/integer>>, Bin]}, infinity).
append_binary_md5(Fd, Bin) ->
Size = iolist_size(Bin),
gen_server:call(Fd, {append_bin,
- [<<Size:32/integer>>, erlang:md5(Bin), Bin]}, infinity).
+ [<<1:1/integer,Size:31/integer>>, erlang:md5(Bin), Bin]}, infinity).
%%----------------------------------------------------------------------
@@ -104,10 +104,6 @@
{ok, Bin} = pread_binary(Fd, Pos),
{ok, binary_to_term(Bin)}.
-pread_term_md5(Fd, Pos) ->
- {ok, Bin} = pread_binary_md5(Fd, Pos),
- {ok, binary_to_term(Bin)}.
-
%%----------------------------------------------------------------------
%% Purpose: Reads a binrary from a file that was written with append_binary
@@ -121,21 +117,26 @@
{ok, iolist_to_binary(L)}.
pread_iolist(Fd, Pos) ->
- {ok, LenIolist, NextPos} =read_raw_iolist(Fd, Pos, 4),
- <<Len:32/integer>> = iolist_to_binary(LenIolist),
- {ok, Iolist, _} = read_raw_iolist(Fd, NextPos, Len),
- {ok, Iolist}.
-
-pread_binary_md5(Fd, Pos) ->
- {ok, L} = pread_iolist_md5(Fd, Pos),
- {ok, iolist_to_binary(L)}.
-
-pread_iolist_md5(Fd, Pos) ->
{ok, LenIolist, NextPos} =read_raw_iolist(Fd, Pos, 20),
- <<Len:32/integer, Md5/binary>> = iolist_to_binary(LenIolist),
- {ok, Iolist, _} = read_raw_iolist(Fd, NextPos, Len),
- Md5 = erlang:md5(Iolist),
- {ok, Iolist}.
+ case iolist_to_binary(LenIolist) of
+ <<1:1/integer,Len:31/integer,Md5/binary>> ->
+ {ok, Iolist, _} = read_raw_iolist(Fd, NextPos, Len),
+ case erlang:md5(Iolist) of
+ Md5 -> ok;
+ _ -> throw(file_corruption)
+ end,
+ {ok, Iolist};
+ <<0:1/integer,Len:31/integer,First16Bytes/binary>> ->
+ if Len =< 16 ->
+ <<Final:Len/binary,_/binary>> = First16Bytes,
+ {ok, Final};
+ true ->
+ {ok, Iolist, _} = read_raw_iolist(Fd, NextPos, Len - 16),
+ {ok, [First16Bytes, Iolist]}
+ end
+ end.
+
+
read_raw_iolist(Fd, Pos, Len) ->
BlockOffset = Pos rem ?SIZE_BLOCK,