114114-include_lib (" couch/include/couch_db.hrl" ).
115115-include (" couch_bt_engine.hrl" ).
116116
117+ % Commonly used header fields (used more than once in this module)
118+ -define (UPDATE_SEQ , update_seq ).
119+ -define (SECURITY_PTR , security_ptr ).
120+ -define (PROPS_PTR , props_ptr ).
121+ -define (REVS_LIMIT , revs_limit ).
122+ -define (PURGE_INFOS_LIMIT , purge_infos_limit ).
123+ -define (COMPACTED_SEQ , compacted_seq ).
124+
117125exists (FilePath ) ->
118126 case is_file (FilePath ) of
119127 true ->
@@ -211,7 +219,7 @@ monitored_by(St) ->
211219 end .
212220
213221get_compacted_seq (# st {header = Header }) ->
214- couch_bt_engine_header :get (Header , compacted_seq ).
222+ couch_bt_engine_header :get (Header , ? COMPACTED_SEQ ).
215223
216224get_del_doc_count (# st {} = St ) ->
217225 {ok , Reds } = couch_btree :full_reduce (St # st .id_tree ),
@@ -242,10 +250,10 @@ get_oldest_purge_seq(#st{purge_seq_tree = PurgeSeqTree}) ->
242250 PurgeSeq .
243251
244252get_purge_infos_limit (# st {header = Header }) ->
245- couch_bt_engine_header :get (Header , purge_infos_limit ).
253+ couch_bt_engine_header :get (Header , ? PURGE_INFOS_LIMIT ).
246254
247255get_revs_limit (# st {header = Header }) ->
248- couch_bt_engine_header :get (Header , revs_limit ).
256+ couch_bt_engine_header :get (Header , ? REVS_LIMIT ).
249257
250258get_size_info (# st {} = St ) ->
251259 {ok , FileSize } = couch_file :bytes (St # st .fd ),
@@ -305,34 +313,22 @@ get_partition_info(#st{} = St, Partition) ->
305313 ]}
306314 ].
307315
308- get_security (# st {header = Header } = St ) ->
309- case couch_bt_engine_header :get (Header , security_ptr ) of
310- undefined ->
311- [];
312- Pointer ->
313- {ok , SecProps } = couch_file :pread_term (St # st .fd , Pointer ),
314- SecProps
315- end .
316+ get_security (# st {} = St ) ->
317+ get_header_term (St , ? SECURITY_PTR , []).
316318
317- get_props (# st {header = Header } = St ) ->
318- case couch_bt_engine_header :get (Header , props_ptr ) of
319- undefined ->
320- [];
321- Pointer ->
322- {ok , Props } = couch_file :pread_term (St # st .fd , Pointer ),
323- Props
324- end .
319+ get_props (# st {} = St ) ->
320+ get_header_term (St , ? PROPS_PTR , []).
325321
326322get_update_seq (# st {header = Header }) ->
327- couch_bt_engine_header :get (Header , update_seq ).
323+ couch_bt_engine_header :get (Header , ? UPDATE_SEQ ).
328324
329325get_uuid (# st {header = Header }) ->
330326 couch_bt_engine_header :get (Header , uuid ).
331327
332328set_revs_limit (# st {header = Header } = St , RevsLimit ) ->
333329 NewSt = St # st {
334330 header = couch_bt_engine_header :set (Header , [
335- {revs_limit , RevsLimit }
331+ {? REVS_LIMIT , RevsLimit }
336332 ]),
337333 needs_commit = true
338334 },
@@ -341,33 +337,17 @@ set_revs_limit(#st{header = Header} = St, RevsLimit) ->
341337set_purge_infos_limit (# st {header = Header } = St , PurgeInfosLimit ) ->
342338 NewSt = St # st {
343339 header = couch_bt_engine_header :set (Header , [
344- {purge_infos_limit , PurgeInfosLimit }
340+ {? PURGE_INFOS_LIMIT , PurgeInfosLimit }
345341 ]),
346342 needs_commit = true
347343 },
348344 {ok , increment_update_seq (NewSt )}.
349345
350- set_security (# st {header = Header } = St , NewSecurity ) ->
351- Options = [{compression , St # st .compression }],
352- {ok , Ptr , _ } = couch_file :append_term (St # st .fd , NewSecurity , Options ),
353- NewSt = St # st {
354- header = couch_bt_engine_header :set (Header , [
355- {security_ptr , Ptr }
356- ]),
357- needs_commit = true
358- },
359- {ok , increment_update_seq (NewSt )}.
346+ set_security (# st {} = St , NewSecurity ) ->
347+ {ok , increment_update_seq (set_header_term (St , ? SECURITY_PTR , NewSecurity ))}.
360348
361- set_props (# st {header = Header } = St , Props ) ->
362- Options = [{compression , St # st .compression }],
363- {ok , Ptr , _ } = couch_file :append_term (St # st .fd , Props , Options ),
364- NewSt = St # st {
365- header = couch_bt_engine_header :set (Header , [
366- {props_ptr , Ptr }
367- ]),
368- needs_commit = true
369- },
370- {ok , increment_update_seq (NewSt )}.
349+ set_props (# st {} = St , Props ) ->
350+ {ok , increment_update_seq (set_header_term (St , ? PROPS_PTR , Props ))}.
371351
372352open_docs (# st {} = St , DocIds ) ->
373353 Results = couch_btree :lookup (St # st .id_tree , DocIds ),
@@ -487,7 +467,7 @@ write_doc_infos(#st{} = St, Pairs, LocalDocs) ->
487467 ),
488468
489469 NewHeader = couch_bt_engine_header :set (St # st .header , [
490- {update_seq , NewUpdateSeq }
470+ {? UPDATE_SEQ , NewUpdateSeq }
491471 ]),
492472
493473 {ok , St # st {
@@ -509,7 +489,7 @@ purge_docs(#st{} = St, Pairs, PurgeInfos) ->
509489 RemDocIds = [Old # full_doc_info .id || {Old , not_found } <- Pairs ],
510490 RemSeqs = [Old # full_doc_info .update_seq || {Old , _ } <- Pairs ],
511491 DocsToAdd = [New || {_ , New } <- Pairs , New /= not_found ],
512- CurrSeq = couch_bt_engine_header :get (St # st .header , update_seq ),
492+ CurrSeq = couch_bt_engine_header :get (St # st .header , ? UPDATE_SEQ ),
513493 Seqs = [FDI # full_doc_info .update_seq || FDI <- DocsToAdd ],
514494 NewSeq = lists :max ([CurrSeq | Seqs ]),
515495
@@ -522,7 +502,7 @@ purge_docs(#st{} = St, Pairs, PurgeInfos) ->
522502 false -> NewSeq
523503 end ,
524504 Header = couch_bt_engine_header :set (St # st .header , [
525- {update_seq , UpdateSeq }
505+ {? UPDATE_SEQ , UpdateSeq }
526506 ]),
527507
528508 {ok , IdTree2 } = couch_btree :add_remove (IdTree , DocsToAdd , RemDocIds ),
@@ -802,30 +782,16 @@ purge_tree_reduce(rereduce, Reds) ->
802782set_update_seq (# st {header = Header } = St , UpdateSeq ) ->
803783 {ok , St # st {
804784 header = couch_bt_engine_header :set (Header , [
805- {update_seq , UpdateSeq }
785+ {? UPDATE_SEQ , UpdateSeq }
806786 ]),
807787 needs_commit = true
808788 }}.
809789
810- copy_security (# st {header = Header } = St , SecProps ) ->
811- Options = [{compression , St # st .compression }],
812- {ok , Ptr , _ } = couch_file :append_term (St # st .fd , SecProps , Options ),
813- {ok , St # st {
814- header = couch_bt_engine_header :set (Header , [
815- {security_ptr , Ptr }
816- ]),
817- needs_commit = true
818- }}.
790+ copy_security (# st {} = St , SecProps ) ->
791+ {ok , set_header_term (St , ? SECURITY_PTR , SecProps )}.
819792
820- copy_props (# st {header = Header } = St , Props ) ->
821- Options = [{compression , St # st .compression }],
822- {ok , Ptr , _ } = couch_file :append_term (St # st .fd , Props , Options ),
823- {ok , St # st {
824- header = couch_bt_engine_header :set (Header , [
825- {props_ptr , Ptr }
826- ]),
827- needs_commit = true
828- }}.
793+ copy_props (# st {} = St , Props ) ->
794+ {ok , set_header_term (St , ? PROPS_PTR , Props )}.
829795
830796open_db_file (FilePath , Options ) ->
831797 case couch_file :open (FilePath , Options ) of
@@ -931,22 +897,20 @@ update_header(St, Header) ->
931897 ]).
932898
933899increment_update_seq (# st {header = Header } = St ) ->
934- UpdateSeq = couch_bt_engine_header :get (Header , update_seq ),
900+ UpdateSeq = couch_bt_engine_header :get (Header , ? UPDATE_SEQ ),
935901 St # st {
936902 header = couch_bt_engine_header :set (Header , [
937- {update_seq , UpdateSeq + 1 }
903+ {? UPDATE_SEQ , UpdateSeq + 1 }
938904 ])
939905 }.
940906
941907set_default_security_object (Fd , Header , Compression , Options ) ->
942- case couch_bt_engine_header :get (Header , security_ptr ) of
908+ case couch_bt_engine_header :get (Header , ? SECURITY_PTR ) of
943909 Pointer when is_integer (Pointer ) ->
944910 Header ;
945911 _ ->
946912 Default = couch_util :get_value (default_security_object , Options ),
947- AppendOpts = [{compression , Compression }],
948- {ok , Ptr , _ } = couch_file :append_term (Fd , Default , AppendOpts ),
949- couch_bt_engine_header :set (Header , security_ptr , Ptr )
913+ set_header_term (Fd , Header , ? SECURITY_PTR , Default , Compression )
950914 end .
951915
952916% This function is here, and not in couch_bt_engine_header
@@ -1013,9 +977,7 @@ init_set_props(Fd, Header, Options) ->
1013977 Header ;
1014978 InitialProps ->
1015979 Compression = couch_compress :get_compression_method (),
1016- AppendOpts = [{compression , Compression }],
1017- {ok , Ptr , _ } = couch_file :append_term (Fd , InitialProps , AppendOpts ),
1018- couch_bt_engine_header :set (Header , props_ptr , Ptr )
980+ set_header_term (Fd , Header , ? PROPS_PTR , InitialProps , Compression )
1019981 end .
1020982
1021983delete_compaction_files (FilePath ) ->
@@ -1188,9 +1150,9 @@ finish_compaction_int(#st{} = OldSt, #st{} = NewSt1) ->
11881150
11891151 {ok , NewSt2 } = commit_data (NewSt1 # st {
11901152 header = couch_bt_engine_header :set (Header , [
1191- {compacted_seq , get_update_seq (OldSt )},
1192- {revs_limit , get_revs_limit (OldSt )},
1193- {purge_infos_limit , get_purge_infos_limit (OldSt )}
1153+ {? COMPACTED_SEQ , get_update_seq (OldSt )},
1154+ {? REVS_LIMIT , get_revs_limit (OldSt )},
1155+ {? PURGE_INFOS_LIMIT , get_purge_infos_limit (OldSt )}
11941156 ]),
11951157 local_tree = NewLocal2
11961158 }),
@@ -1227,3 +1189,24 @@ is_file(Path) ->
12271189 {ok , # file_info {type = directory }} -> true ;
12281190 _ -> false
12291191 end .
1192+
1193+ get_header_term (# st {header = Header } = St , Key , Default ) when is_atom (Key ) ->
1194+ case couch_bt_engine_header :get (Header , Key ) of
1195+ undefined ->
1196+ Default ;
1197+ Pointer when is_integer (Pointer ) ->
1198+ {ok , Term } = couch_file :pread_term (St # st .fd , Pointer ),
1199+ Term
1200+ end .
1201+
1202+ set_header_term (# st {} = St , Key , Term ) when is_atom (Key ) ->
1203+ # st {fd = Fd , header = Header , compression = Compression } = St ,
1204+ St # st {
1205+ header = set_header_term (Fd , Header , Key , Term , Compression ),
1206+ needs_commit = true
1207+ }.
1208+
1209+ set_header_term (Fd , Header , Key , Term , Compression ) when is_atom (Key ) ->
1210+ TermOpts = [{compression , Compression }],
1211+ {ok , Ptr , _ } = couch_file :append_term (Fd , Term , TermOpts ),
1212+ couch_bt_engine_header :set (Header , Key , Ptr ).
0 commit comments