code: function (hashes, opts, cb) {
              if (isFunction(opts)) {
                  cb = opts;
                  opts = null;
              }
              opts = opts || {};
              hashes = hashes || [];
              var ret = new Promise();
              if (!hashes.length) {
                  ret.callback();
              } else {
                  var columns = Object.keys(hashes[0]);
                  ret = this["import"](columns, hashes.map(function (h) {
                      return columns.map(function (c) {
                          return h[c];
                      });
                  }), opts, cb);
              }
              return ret.classic(cb).promise();
          }
docs: This is the recommended function to do the insert of multiple items into the
  database. This acts as a proxy to the {@link patio.Dataset#import} method so
  one can use an array of hashes rather than an array of columns and an array of values.
  See {@link patio.Dataset#import} for more information regarding the method of inserting.
  <p>
  <b>NOTE:</b>All hashes should have the same keys other wise some values could be missed</b>
  </p>
  
  @example
  
  // INSERT INTO table (x) VALUES (1)
  // INSERT INTO table (x) VALUES (2)
  DB.from("table").multiInsert([{x : 1}, {x : 2}]).chain(function(){
  //...do something
  })
  
  //commit every 50 inserts
  DB.from("table").multiInsert([{x : 1}, {x : 2},....], {commitEvery : 50}).chain(function(){
  //...do something
  });
  
  @param {Object[]} hashes an array of objects to insert into the database. The keys of
  the first item in the array will be used to look up columns in all subsequent objects. If the
  array is empty then the promise is resolved immediatly.
  
  @param {Object} opts See {@link patio.Dataset#import}.
  @param {Function} [cb] the callback to invoke when the action is done.
  
  @return {comb.Promise} See {@link patio.Dataset#import} for return functionality.