On Mon, Jan 25, 2010 at 8:04 PM, Jan Lehnardt <[email protected]> wrote:
> Hey Chris,
>
> great work, thanks. Can you update 
> http://wiki.apache.org/couchdb/Breaking_changes? :)
>

I wouldn't mind. But with that old wiki it'll take me 15 minutes to
figure out what username I'm shooting for.

... signing up for a new account:

http://wiki.apache.org/couchdb/FrontPage?action=newaccount

gives a 500 error. try again, and

OK I seem to have fixed it. Thanks for the prodding. The wiki wasn't
that bad but it could be more fun.

http://wiki.apache.org/couchdb/Breaking_changes

Chris


> Cheers
> Jan
> --
>
> On 25 Jan 2010, at 16:12, [email protected] wrote:
>
>> Author: jchris
>> Date: Tue Jan 26 00:11:59 2010
>> New Revision: 903023
>>
>> URL: http://svn.apache.org/viewvc?rev=903023&view=rev
>> Log:
>> Replace the old JavaScript query server JSON library with json2.js
>>
>> This change makes us interoperate better with other JSON implementations. It 
>> also means we can use the native JSON handlers in JavaScript runtimes that 
>> support them. Should be faster right away on new Spidermonkeys.
>>
>> There are some potential breaking changes for apps that depend on Couch 
>> blowing up on 'undefined'. json2.js serialized undefined as 'null' instead 
>> of crashing.
>>
>> This change will also affect people using E4X, as you can't just return an 
>> XML object and have it serialized to a string for you. Calling 
>> .toXMLString() on these is all you need to do.
>>
>> Added:
>>    couchdb/trunk/share/server/json2.js
>>      - copied, changed from r902422, couchdb/trunk/share/www/script/json2.js
>> Modified:
>>    couchdb/trunk/share/Makefile.am
>>    couchdb/trunk/share/server/util.js
>>    couchdb/trunk/share/www/script/json2.js
>>    couchdb/trunk/share/www/script/test/show_documents.js
>>    couchdb/trunk/share/www/script/test/update_documents.js
>>    couchdb/trunk/share/www/script/test/view_errors.js
>>
>> Modified: couchdb/trunk/share/Makefile.am
>> URL: 
>> http://svn.apache.org/viewvc/couchdb/trunk/share/Makefile.am?rev=903023&r1=903022&r2=903023&view=diff
>> ==============================================================================
>> --- couchdb/trunk/share/Makefile.am (original)
>> +++ couchdb/trunk/share/Makefile.am Tue Jan 26 00:11:59 2010
>> @@ -13,6 +13,7 @@
>> JS_FILE = server/main.js
>>
>> JS_FILE_COMPONENTS = \
>> +    server/json2.js \
>>     server/filter.js \
>>     server/mimeparse.js \
>>     server/render.js \
>>
>> Copied: couchdb/trunk/share/server/json2.js (from r902422, 
>> couchdb/trunk/share/www/script/json2.js)
>> URL: 
>> http://svn.apache.org/viewvc/couchdb/trunk/share/server/json2.js?p2=couchdb/trunk/share/server/json2.js&p1=couchdb/trunk/share/www/script/json2.js&r1=902422&r2=903023&rev=903023&view=diff
>> ==============================================================================
>> --- couchdb/trunk/share/www/script/json2.js [utf-8] (original)
>> +++ couchdb/trunk/share/server/json2.js [utf-8] Tue Jan 26 00:11:59 2010
>> @@ -1,6 +1,6 @@
>> /*
>>     http://www.JSON.org/json2.js
>> -    2009-08-17
>> +    2009-09-29
>>
>>     Public Domain.
>>
>> @@ -8,6 +8,14 @@
>>
>>     See http://www.JSON.org/js.html
>>
>> +
>> +    This code should be minified before deployment.
>> +    See http://javascript.crockford.com/jsmin.html
>> +
>> +    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU 
>> DO
>> +    NOT CONTROL.
>> +
>> +
>>     This file creates a global JSON object containing two methods: stringify
>>     and parse.
>>
>> @@ -136,15 +144,9 @@
>>
>>     This is a reference implementation. You are free to copy, modify, or
>>     redistribute.
>> -
>> -    This code should be minified before deployment.
>> -    See http://javascript.crockford.com/jsmin.html
>> -
>> -    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU 
>> DO
>> -    NOT CONTROL.
>> */
>>
>> -/*jslint evil: true */
>> +/*jslint evil: true, strict: false */
>>
>> /*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
>>     call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
>> @@ -153,7 +155,6 @@
>>     test, toJSON, toString, valueOf
>> */
>>
>> -"use strict";
>>
>> // Create a JSON object only if one does not already exist. We create the
>> // methods in a closure to avoid creating global variables.
>>
>> Modified: couchdb/trunk/share/server/util.js
>> URL: 
>> http://svn.apache.org/viewvc/couchdb/trunk/share/server/util.js?rev=903023&r1=903022&r2=903023&view=diff
>> ==============================================================================
>> --- couchdb/trunk/share/server/util.js (original)
>> +++ couchdb/trunk/share/server/util.js Tue Jan 26 00:11:59 2010
>> @@ -13,14 +13,7 @@
>> var Couch = {
>>   // moving this away from global so we can move to json2.js later
>>   toJSON : function (val) {
>> -    if (typeof(val) == "undefined") {
>> -      throw "Cannot encode 'undefined' value as JSON";
>> -    }
>> -    if (typeof(val) == "xml") { // E4X support
>> -      val = val.toXMLString();
>> -    }
>> -    if (val === null) { return "null"; }
>> -    return (Couch.toJSON.dispatcher[val.constructor.name])(val);
>> +    return JSON.stringify(val);
>>   },
>>   compileFunction : function(source) {
>>     if (!source) throw(["error","not_found","missing function"]);
>> @@ -47,55 +40,6 @@
>>   }
>> }
>>
>> -Couch.toJSON.subs = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f',
>> -              '\r': '\\r', '"' : '\\"', '\\': '\\\\'};
>> -Couch.toJSON.dispatcher = {
>> -    "Array": function(v) {
>> -      var buf = [];
>> -      for (var i = 0; i < v.length; i++) {
>> -        buf.push(Couch.toJSON(v[i]));
>> -      }
>> -      return "[" + buf.join(",") + "]";
>> -    },
>> -    "Boolean": function(v) {
>> -      return v.toString();
>> -    },
>> -    "Date": function(v) {
>> -      var f = function(n) { return n < 10 ? '0' + n : n };
>> -      return '"' + v.getUTCFullYear()   + '-' +
>> -                 f(v.getUTCMonth() + 1) + '-' +
>> -                 f(v.getUTCDate())      + 'T' +
>> -                 f(v.getUTCHours())     + ':' +
>> -                 f(v.getUTCMinutes())   + ':' +
>> -                 f(v.getUTCSeconds())   + 'Z"';
>> -    },
>> -    "Number": function(v) {
>> -      return isFinite(v) ? v.toString() : "null";
>> -    },
>> -    "Object": function(v) {
>> -      //if (v === null) return "null";
>> -      var buf = [];
>> -      for (var k in v) {
>> -        if (!v.hasOwnProperty(k) || typeof(k) !== "string" || v[k] === 
>> undefined) {
>> -          continue;
>> -        }
>> -        buf.push(Couch.toJSON(k) + ": " + Couch.toJSON(v[k]));
>> -      }
>> -      return "{" + buf.join(",") + "}";
>> -    },
>> -    "String": function(v) {
>> -      if (/["\\\x00-\x1f]/.test(v)) {
>> -        v = v.replace(/([\x00-\x1f\\"])/g, function(a, b) {
>> -          var c = Couch.toJSON.subs[b];
>> -          if (c) return c;
>> -          c = b.charCodeAt();
>> -          return '\\u00' + Math.floor(c / 16).toString(16) + (c % 
>> 16).toString(16);
>> -        });
>> -      }
>> -      return '"' + v + '"';
>> -    }
>> -};
>> -
>> // prints the object as JSON, and rescues and logs any toJSON() related 
>> errors
>> function respond(obj) {
>>   try {
>> @@ -107,10 +51,8 @@
>> };
>>
>> function log(message) {
>> -  // return; // idea: query_server_config option for log level
>> -  if (typeof message == "undefined") {
>> -    message = "Error: attempting to log message of 'undefined'.";
>> -  } else if (typeof message != "string") {
>> +  // idea: query_server_config option for log level
>> +  if (typeof message != "string") {
>>     message = Couch.toJSON(message);
>>   }
>>   respond(["log", message]);
>>
>> Modified: couchdb/trunk/share/www/script/json2.js
>> URL: 
>> http://svn.apache.org/viewvc/couchdb/trunk/share/www/script/json2.js?rev=903023&r1=903022&r2=903023&view=diff
>> ==============================================================================
>> --- couchdb/trunk/share/www/script/json2.js [utf-8] (original)
>> +++ couchdb/trunk/share/www/script/json2.js [utf-8] Tue Jan 26 00:11:59 2010
>> @@ -1,6 +1,6 @@
>> /*
>>     http://www.JSON.org/json2.js
>> -    2009-08-17
>> +    2009-09-29
>>
>>     Public Domain.
>>
>> @@ -8,6 +8,14 @@
>>
>>     See http://www.JSON.org/js.html
>>
>> +
>> +    This code should be minified before deployment.
>> +    See http://javascript.crockford.com/jsmin.html
>> +
>> +    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU 
>> DO
>> +    NOT CONTROL.
>> +
>> +
>>     This file creates a global JSON object containing two methods: stringify
>>     and parse.
>>
>> @@ -136,15 +144,9 @@
>>
>>     This is a reference implementation. You are free to copy, modify, or
>>     redistribute.
>> -
>> -    This code should be minified before deployment.
>> -    See http://javascript.crockford.com/jsmin.html
>> -
>> -    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU 
>> DO
>> -    NOT CONTROL.
>> */
>>
>> -/*jslint evil: true */
>> +/*jslint evil: true, strict: false */
>>
>> /*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
>>     call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
>> @@ -153,7 +155,6 @@
>>     test, toJSON, toString, valueOf
>> */
>>
>> -"use strict";
>>
>> // Create a JSON object only if one does not already exist. We create the
>> // methods in a closure to avoid creating global variables.
>>
>> Modified: couchdb/trunk/share/www/script/test/show_documents.js
>> URL: 
>> http://svn.apache.org/viewvc/couchdb/trunk/share/www/script/test/show_documents.js?rev=903023&r1=903022&r2=903023&view=diff
>> ==============================================================================
>> --- couchdb/trunk/share/www/script/test/show_documents.js (original)
>> +++ couchdb/trunk/share/www/script/test/show_documents.js Tue Jan 26 
>> 00:11:59 2010
>> @@ -61,7 +61,7 @@
>>            "headers" : {
>>              "Content-Type" : "application/xml"
>>            },
>> -           "body" : new XML('<xml><node foo="bar"/></xml>')
>> +           "body" : new XML('<xml><node foo="bar"/></xml>').toXMLString()
>>          }
>>        }),
>>       "no-set-etag" : stringFun(function(doc, req) {
>> @@ -114,7 +114,8 @@
>>           // E4X outside of a string. Outside of tests you
>>           // can just use E4X literals.
>>           eval('xml.no...@foo = doc.word');
>> -          return xml;
>> +          log('xml: '+xml.toSource());
>> +          return xml.toXMLString();
>>         });
>>
>>         provides("foo", function() {
>>
>> Modified: couchdb/trunk/share/www/script/test/update_documents.js
>> URL: 
>> http://svn.apache.org/viewvc/couchdb/trunk/share/www/script/test/update_documents.js?rev=903023&r1=903022&r2=903023&view=diff
>> ==============================================================================
>> --- couchdb/trunk/share/www/script/test/update_documents.js (original)
>> +++ couchdb/trunk/share/www/script/test/update_documents.js Tue Jan 26 
>> 00:11:59 2010
>> @@ -68,7 +68,7 @@
>>           "headers" : {
>>             "Content-Type" : "application/xml"
>>           },
>> -          "body" : xml
>> +          "body" : xml.toXMLString()
>>         };
>>
>>          return [doc, resp];
>>
>> Modified: couchdb/trunk/share/www/script/test/view_errors.js
>> URL: 
>> http://svn.apache.org/viewvc/couchdb/trunk/share/www/script/test/view_errors.js?rev=903023&r1=903022&r2=903023&view=diff
>> ==============================================================================
>> --- couchdb/trunk/share/www/script/test/view_errors.js (original)
>> +++ couchdb/trunk/share/www/script/test/view_errors.js Tue Jan 26 00:11:59 
>> 2010
>> @@ -16,8 +16,6 @@
>>   db.createDb();
>>   if (debug) debugger;
>>
>> -
>> -
>>   run_on_modified_server(
>>     [{section: "couchdb",
>>       key: "os_process_timeout",
>> @@ -26,12 +24,13 @@
>>       var doc = {integer: 1, string: "1", array: [1, 2, 3]};
>>       T(db.save(doc).ok);
>>
>> -      // emitting a key value that is undefined should result in that row 
>> not
>> -      // being included in the view results
>> +      // emitting a key value that is undefined should result in that row
>> +      // being included in the view results as null
>>       var results = db.query(function(doc) {
>>         emit(doc.undef, null);
>>       });
>> -      T(results.total_rows == 0);
>> +      T(results.total_rows == 1);
>> +      T(results.rows[0].key == null);
>>
>>       // if a view function throws an exception, its results are not 
>> included in
>>       // the view index, but the view does not itself raise an error
>> @@ -41,13 +40,13 @@
>>       T(results.total_rows == 0);
>>
>>       // if a view function includes an undefined value in the emitted key or
>> -      // value, an error is logged and the result is not included in the 
>> view
>> -      // index, and the view itself does not raise an error
>> +      // value, it is treated as null
>>       var results = db.query(function(doc) {
>>         emit([doc._id, doc.undef], null);
>>       });
>> -      T(results.total_rows == 0);
>> -
>> +      T(results.total_rows == 1);
>> +      T(results.rows[0].key[1] == null);
>> +
>>       // querying a view with invalid params should give a resonable error 
>> message
>>       var xhr = CouchDB.request("POST", 
>> "/test_suite_db/_temp_view?startkey=foo", {
>>         headers: {"Content-Type": "application/json"},
>>
>>
>
>



-- 
Chris Anderson
http://jchrisa.net
http://couch.io

Reply via email to