diff options
author | Adam Kocoloski <kocolosk@apache.org> | 2019-05-20 13:46:06 -0400 |
---|---|---|
committer | Adam Kocoloski <kocolosk@apache.org> | 2019-05-25 08:27:34 -0400 |
commit | 8e6fa8bd257c5745cae7147ca4a1ed75c3eed6a8 (patch) | |
tree | 02a38fda475b12206a3bd0ba90e85e19a66b7712 | |
parent | 6f1b8d30066ee84e6d94cbf8f7705ea9112f58a6 (diff) | |
download | couchdb-8e6fa8bd257c5745cae7147ca4a1ed75c3eed6a8.tar.gz |
Add dreyfus.js from cloudant/couchdb@c323f1943
-rw-r--r-- | share/server/dreyfus.js | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/share/server/dreyfus.js b/share/server/dreyfus.js new file mode 100644 index 000000000..7bed97352 --- /dev/null +++ b/share/server/dreyfus.js @@ -0,0 +1,62 @@ +// 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. + +var Dreyfus = (function() { + + var index_results = []; // holds temporary emitted values during index + + function handleIndexError(err, doc) { + if (err == "fatal_error") { + throw(["error", "map_runtime_error", "function raised 'fatal_error'"]); + } else if (err[0] == "fatal") { + throw(err); + } + var message = "function raised exception " + err.toSource(); + if (doc) message += " with doc._id " + doc._id; + log(message); + }; + + return { + index: function(name, value, options) { + if (typeof name !== 'string') { + throw({name: 'TypeError', message: 'name must be a string not ' + typeof name}); + } + if (name.substring(0, 1) === '_') { + throw({name: 'ReservedName', message: 'name must not start with an underscore'}); + } + if (typeof value !== 'string' && typeof value !== 'number' && typeof value !== 'boolean') { + throw({name: 'TypeError', message: 'value must be a string, a number or boolean not ' + typeof value}); + } + if (options && typeof options !== 'object') { + throw({name: 'TypeError', message: 'options must be an object not ' + typeof options}); + } + index_results.push([name, value, options || {}]); + }, + + indexDoc: function(doc) { + Couch.recursivelySeal(doc); + var buf = []; + for each (fun in State.funs) { + index_results = []; + try { + fun(doc); + buf.push(index_results); + } catch (err) { + handleIndexError(err, doc); + buf.push([]); + } + } + print(JSON.stringify(buf)); + } + + } +})(); |