summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/fabric/src/fabric.erl26
1 files changed, 25 insertions, 1 deletions
diff --git a/apps/fabric/src/fabric.erl b/apps/fabric/src/fabric.erl
index b3bf3b15..d620b985 100644
--- a/apps/fabric/src/fabric.erl
+++ b/apps/fabric/src/fabric.erl
@@ -31,7 +31,8 @@
get_view_group_info/2]).
% miscellany
--export([design_docs/1, reset_validation_funs/1]).
+-export([design_docs/1, reset_validation_funs/1, cleanup_index_files/0,
+ cleanup_index_files/1]).
-include("fabric.hrl").
@@ -167,6 +168,29 @@ reset_validation_funs(DbName) ->
[rexi:cast(Node, {fabric_rpc, reset_validation_funs, [Name]}) ||
#shard{node=Node, name=Name} <- mem3:shards(DbName)].
+cleanup_index_files() ->
+ {ok, DbNames} = fabric:all_dbs(),
+ [cleanup_index_files(Name) || Name <- DbNames].
+
+cleanup_index_files(DbName) ->
+ {ok, DesignDocs} = fabric:design_docs(DbName),
+
+ ActiveSigs = lists:map(fun(#doc{id = GroupId}) ->
+ {ok, Info} = fabric:get_view_group_info(DbName, GroupId),
+ binary_to_list(couch_util:get_value(signature, Info))
+ end, [couch_doc:from_json_obj(DD) || DD <- DesignDocs]),
+
+ FileList = filelib:wildcard([couch_config:get("couchdb", "view_index_dir"),
+ "/.shards/*/", couch_util:to_list(DbName), "_design/*"]),
+
+ DeleteFiles = if ActiveSigs =:= [] -> FileList; true ->
+ {ok, RegExp} = re:compile([$(, string:join(ActiveSigs, "|"), $)]),
+ lists:filter(fun(FilePath) ->
+ re:run(FilePath, RegExp, [{capture, none}]) == nomatch
+ end, FileList)
+ end,
+ [file:delete(File) || File <- DeleteFiles].
+
%% some simple type validation and transcoding
dbname(DbName) when is_list(DbName) ->