@@ -85,6 +85,11 @@ Driver.prototype.find = function (fields, table, conditions, opts, cb) {
8585 }
8686
8787 return cursor . toArray ( function ( err , docs ) {
88+ if ( err ) {
89+ throw err ;
90+ return cb ( err ) ;
91+ }
92+
8893 var pending = 0 ;
8994
9095 for ( var i = 0 ; i < docs . length ; i ++ ) {
@@ -106,7 +111,7 @@ Driver.prototype.find = function (fields, table, conditions, opts, cb) {
106111 }
107112
108113 if ( pending === 0 ) {
109- return cb ( err , docs ) ;
114+ return cb ( null , docs ) ;
110115 }
111116 } ) ;
112117} ;
@@ -280,6 +285,7 @@ Driver.prototype.hasMany = function (Model, association) {
280285} ;
281286
282287Driver . prototype . update = function ( table , changes , conditions , cb ) {
288+ convertToDB ( changes ) ;
283289 convertToDB ( conditions ) ;
284290
285291 return this . db . collection ( table ) . update (
@@ -308,55 +314,64 @@ Driver.prototype.clear = function (table, cb) {
308314function convertToDB ( obj ) {
309315 for ( var k in obj ) {
310316 if ( Array . isArray ( obj [ k ] ) ) {
311- if ( k == "_id" ) {
312- for ( var i = 0 ; i < obj [ k ] . length ; i ++ ) {
313- obj [ k ] [ i ] = new mongodb . ObjectID ( obj [ k ] [ i ] ) ;
314- }
317+ for ( var i = 0 ; i < obj [ k ] . length ; i ++ ) {
318+ obj [ k ] [ i ] = convertToDBVal ( k , obj [ k ] [ i ] ) ;
315319 }
316320
317321 obj [ k ] = { $in : obj [ k ] } ;
318322 continue ;
319323 }
320324
321- if ( obj [ k ] && typeof obj [ k ] . sql_comparator == "function" ) {
322- var val = ( k != "_id" ? obj [ k ] . val : new mongodb . ObjectID ( obj [ k ] . val ) ) ;
323- var comp = obj [ k ] . sql_comparator ( ) ;
324- var condition = { } ;
325-
326- switch ( comp ) {
327- case "gt" :
328- case "gte" :
329- case "lt" :
330- case "lte" :
331- case "ne" :
332- condition [ "$" + comp ] = val ;
333- break ;
334- case "eq" :
335- condition = val ;
336- break ;
337- case "between" :
338- condition [ "$min" ] = obj [ k ] . from ;
339- condition [ "$max" ] = obj [ k ] . to ;
340- break ;
341- case "like" :
342- condition [ "$regex" ] = obj [ k ] . expr . replace ( "%" , ".*" ) ;
343- break ;
344- }
345-
346- obj [ k ] = condition ;
347- continue ;
348- }
349-
350- if ( k == "_id" && typeof obj [ k ] == "string" ) {
351- obj [ k ] = new mongodb . ObjectID ( obj [ k ] ) ;
352- }
325+ obj [ k ] = convertToDBVal ( k , obj [ k ] ) ;
353326 }
354327}
355328
356329function convertFromDB ( obj ) {
357330 for ( var k in obj ) {
358331 if ( obj [ k ] instanceof mongodb . ObjectID ) {
359332 obj [ k ] = obj [ k ] . toString ( ) ;
333+ } else if ( obj [ k ] instanceof mongodb . Binary ) {
334+ obj [ k ] = new Buffer ( obj [ k ] . value ( ) , "binary" ) ;
360335 }
361336 }
362337}
338+
339+ function convertToDBVal ( key , value ) {
340+ if ( value && typeof value . sql_comparator == "function" ) {
341+ var val = ( key != "_id" ? value . val : new mongodb . ObjectID ( value . val ) ) ;
342+ var comp = value . sql_comparator ( ) ;
343+ var condition = { } ;
344+
345+ switch ( comp ) {
346+ case "gt" :
347+ case "gte" :
348+ case "lt" :
349+ case "lte" :
350+ case "ne" :
351+ condition [ "$" + comp ] = val ;
352+ break ;
353+ case "eq" :
354+ condition = val ;
355+ break ;
356+ case "between" :
357+ condition [ "$min" ] = val . from ;
358+ condition [ "$max" ] = val . to ;
359+ break ;
360+ case "like" :
361+ condition [ "$regex" ] = val . expr . replace ( "%" , ".*" ) ;
362+ break ;
363+ }
364+
365+ return condition ;
366+ }
367+
368+ if ( Buffer . isBuffer ( value ) ) {
369+ return new mongodb . Binary ( value ) ;
370+ }
371+
372+ if ( key == "_id" && typeof value == "string" ) {
373+ value = new mongodb . ObjectID ( value ) ;
374+ }
375+
376+ return value ;
377+ }
0 commit comments