diff options
-rw-r--r-- | share/www/config.html | 84 | ||||
-rw-r--r-- | share/www/index.html | 1 | ||||
-rw-r--r-- | share/www/script/jquery.couch.js | 17 | ||||
-rw-r--r-- | share/www/style/layout.css | 12 | ||||
-rw-r--r-- | src/couchdb/couch_config.erl | 2 | ||||
-rw-r--r-- | src/couchdb/couch_httpd.erl | 24 |
6 files changed, 137 insertions, 3 deletions
diff --git a/share/www/config.html b/share/www/config.html new file mode 100644 index 00000000..d811fe1f --- /dev/null +++ b/share/www/config.html @@ -0,0 +1,84 @@ +<!DOCTYPE html> +<!-- + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the +specific language governing permissions and limitations under the License. + +--> +<html lang="en"> + <head> + <title>Configuration</title> + <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> + <link rel="stylesheet" href="style/layout.css?0.8.0" type="text/css"> + <script src="script/json2.js"></script> + <script src="script/jquery.js?1.2.6"></script> + <script src="script/jquery.couch.js?0.8.0"></script> + <script src="script/pprint.js?0.8.0"></script> + <script> + $(document).ready(function() { + if (window !== parent) parent.updateNavigation(); + + $(document.body).addClass("loading"); + $.couch.config({ + success: function(resp) { + var sections = []; + for (var sectionName in resp) { + sections.push(sectionName); + } + sections.sort(); + $.each(sections, function(idx, sectionName) { + var row = $("<tr><th></th></tr>") + .find("th").text(sectionName).end() + .appendTo("#config tbody.content"); + var section = resp[sectionName] + var options = []; + for (var option in section) { + options.push(option); + } + options = options.sort(); + var prev = null; + $.each(options, function(idx, optionName) { + var cur = idx == 0 ? row : $("<tr></tr>"); + $("<td class='name'></td>").text(optionName).appendTo(cur); + $("<td class='value'></td>").text(section[optionName]).appendTo(cur); + if (cur !== row) cur.insertAfter(prev); + prev = cur; + }); + row.find("th").attr("rowspan", options.length); + }); + $("#config tbody tr").removeClass("odd").filter(":odd").addClass("odd"); + $(document.body).removeClass("loading"); + } + }); + }); + </script> + </head> + <body> + <h1> + <a href="browse/index.html">Overview</a> + <strong>Configuration</strong> + </h1> + <div id="wrap"> + + <table id="config" class="listing"> + <caption>Configuration</caption> + <thead><tr> + <th>Section</th> + <th>Option</th> + <th>Value</th> + </tr></thead> + <tbody class="content"></tbody> + </table> + + </div> + <div id="dump"></div> + </body> +</html> diff --git a/share/www/index.html b/share/www/index.html index d0cc4786..54cc9e15 100644 --- a/share/www/index.html +++ b/share/www/index.html @@ -88,6 +88,7 @@ specific language governing permissions and limitations under the License. <li><span>Tools</span><ul> <li><a href="browse/index.html" target="content">Overview</a></li> <li><a href="replicator.html" target="content">Replicator</a></li> + <li><a href="config.html" target="content">Configuration</a></li> <li><a href="couch_tests.html" target="content">Test Suite</a></li> </ul></li> <li><span>Databases</span> diff --git a/share/www/script/jquery.couch.js b/share/www/script/jquery.couch.js index 2121cf0c..bd77bf80 100644 --- a/share/www/script/jquery.couch.js +++ b/share/www/script/jquery.couch.js @@ -32,6 +32,23 @@ }); }, + config: function(options, section, option, value) { + $.ajax({ + type: "GET", url: "/_config/", + complete: function(req) { + var resp = $.httpData(req, "json"); + if (req.status == 200) { + if (options.success) options.success(resp); + } else if (options.error) { + options.error(req.status, resp.error, resp.reason); + } else { + alert("An error occurred retrieving the server configuration: " + + resp.reason); + } + } + }); + }, + db: function(name) { return { name: name, diff --git a/share/www/style/layout.css b/share/www/style/layout.css index ec13b27d..7b0aeb04 100644 --- a/share/www/style/layout.css +++ b/share/www/style/layout.css @@ -459,6 +459,18 @@ ul.suggest-dropdown li.selected { cursor: pointer; background: Highlight; background-image: url(../image/test_failure.gif); color: #c00; } +/* Configuration */ + +table#config tbody th { background: #e6e6e6; border-right: none; + border-top: 1px solid #d9d9d9; +} +table#config tbody td.name { border-left: 1px solid #d9d9d9; color: #333; + font-weight: bold; +} +table#config tbody td.value { + font-family: "DejaVu Sans Mono",Monaco,monospace; +} + /* Replication */ form#replicator { background: #f4f4f4; border: 1px solid; diff --git a/src/couchdb/couch_config.erl b/src/couchdb/couch_config.erl index 6822dc5c..8bce5718 100644 --- a/src/couchdb/couch_config.erl +++ b/src/couchdb/couch_config.erl @@ -158,4 +158,4 @@ handle_info({'DOWN', _, _, DownPid, _}, #config{notify_funs=PidFuns}=Config) -> terminate(_Reason, _State) -> ok. %% @doc Unused -code_change(_OldVersion, State, _Extra) -> {ok, State}.
\ No newline at end of file +code_change(_OldVersion, State, _Extra) -> {ok, State}. diff --git a/src/couchdb/couch_httpd.erl b/src/couchdb/couch_httpd.erl index b30ef7ee..604e1454 100644 --- a/src/couchdb/couch_httpd.erl +++ b/src/couchdb/couch_httpd.erl @@ -207,10 +207,14 @@ handle_db_request(Req, 'PUT', {DbName, []}) -> couch_db:close(Db), send_json(Req, 201, {[{ok, true}]}); {error, database_already_exists} -> - Msg = io_lib:format("Database ~p already exists.", [DbName]), + Msg = io_lib:format("Database ~p already exists.", [ + binary_to_list(DbName) + ]), throw({database_already_exists, Msg}); Error -> - Msg = io_lib:format("Error creating database ~p: ~p", [DbName, Error]), + Msg = io_lib:format("Error creating database ~p: ~p", [ + binary_to_list(DbName), Error + ]), throw({unknown_error, Msg}) end; @@ -805,6 +809,22 @@ handle_config_request(_Req, Method, {config, Config}) -> Parts = string:tokens(Config, "/"), handle_config_request(_Req, Method, {Parts}); +% GET /_config +handle_config_request(Req, 'GET', {[]}) -> + send_json(Req, 200, {dict:to_list(dict:map( + fun(_, Value) -> {Value} end, + lists:foldl( + fun({{Section, Option}, Value}, Acc) -> + SecBin = list_to_binary(Section), + OptBin = list_to_binary(Option), + ValBin = list_to_binary(Value), + dict:append(SecBin, {OptBin, ValBin}, Acc) + end, + dict:new(), + couch_config:all() + ) + ))}); + % GET /_config/Section handle_config_request(Req, 'GET', {[Section]}) -> KVs = [ |