Dart Documentationmongo_dartGridIn

GridIn class

class GridIn extends GridFSFile {
 Stream<List<int>> input;
 bool savedChunks = false;
 int currentChunkNumber = 0;
 int currentBufferPosition = 0;
 int totalBytes = 0;
 ObjectId id;
 GridFS fs;
 String filename;
 MD5 messageDigester;

 GridIn(this.fs, [String filename = null, Stream<List<int>> inputStream = null]) {
   id = new ObjectId();
   chunkSize = GridFS.DEFAULT_CHUNKSIZE;
   input = inputStream.transform(new ChunkHandler(chunkSize).transformer);
   uploadDate = new DateTime.now();
   messageDigester = new MD5();
   this.filename = filename;
 }

 Future save([int chunkSize]) {
   if (chunkSize == null) {
     chunkSize = this.chunkSize;
   }

   Future result;
   if (!savedChunks) {
     result = saveChunks(chunkSize);
   } else {
     result = new Future.value({'ok': 1.0});
   }
   return result;
 }

 Future<Map> saveChunks([int chunkSize = 0]) {
   List<Future> futures = new List();
   Completer completer = new Completer();
   
   _onDone() {
     Future.wait(futures).then((list) {
       return finishData();
     }).then((map){
       completer.complete({});
     });
   }
   if (chunkSize == null) {
     chunkSize = this.chunkSize;
   }
   if (savedChunks) {
     throw new MongoDartError('chunks already saved!');
   }
   if (chunkSize <= 0 || chunkSize > GridFS.MAX_CHUNKSIZE) {
     throw new MongoDartError('chunkSize must be greater than zero and less than or equal to GridFS.MAX_CHUNKSIZE');
   }    
   input.listen((data) {
       futures.add(dumpBuffer(data));
       }, onDone: _onDone);    
   return completer.future;
 }
 // TODO(tsander): OutputStream??

 Future<Map> dumpBuffer( List<int> writeBuffer ) {
   if (writeBuffer.length == 0) {
     // Chunk is empty, may be last chunk
     return new Future.value({});
   }

   Map chunk = {"files_id" : id, "n" : currentChunkNumber, "data": new BsonBinary.from(writeBuffer)};
   currentChunkNumber++;
   totalBytes += writeBuffer.length;
   messageDigester.add(writeBuffer);
   currentBufferPosition = 0;

   return fs.chunks.insert(chunk);
 }

 Future finishData() {
   if (!savedChunks) {
     md5 = CryptoUtils.bytesToHex(messageDigester.close());
     length = totalBytes;
     savedChunks = true;
   }
   return super.save();
 }
}

Extends

GridFSFile > GridIn

Constructors

new GridIn(GridFS fs, [String filename = null, Stream<List<int>> inputStream = null]) #

Creates a new Object instance.

Object instances have no meaningful state, and are only useful through their identity. An Object instance is equal to itself only.

docs inherited from Object
GridIn(this.fs, [String filename = null, Stream<List<int>> inputStream = null]) {
 id = new ObjectId();
 chunkSize = GridFS.DEFAULT_CHUNKSIZE;
 input = inputStream.transform(new ChunkHandler(chunkSize).transformer);
 uploadDate = new DateTime.now();
 messageDigester = new MD5();
 this.filename = filename;
}

Properties

final List<String> aliases #

inherited from GridFSFile
List<String> get aliases {
 return extraData["aliases"];
}

int chunkSize #

inherited from GridFSFile
int chunkSize

String contentType #

inherited from GridFSFile
String contentType

int currentBufferPosition #

int currentBufferPosition = 0

int currentChunkNumber #

int currentChunkNumber = 0

Map data #

inherited from GridFSFile
Map get data {
 Map result = {
   "_id" : id,
   "filename" : filename,
   "contentType" : contentType,
   "length" : length,
   "chunkSize" : chunkSize,
   "uploadDate" : uploadDate,
   "md5" : md5,
 };
 extraData.forEach((String key, Object value) {
   result[key] = value;
 });
 return result;
}
set data(Map input) {
 extraData = new Map.from(input);

 // Remove the known keys. Leaving the extraData. 
 id = extraData.remove("_id");
 filename = extraData.remove("filename");
 contentType = extraData.remove("contentType");
 length = extraData.remove("length");
 chunkSize = extraData.remove("chunkSize");
 uploadDate = extraData.remove("uploadDate");
 md5 = extraData.remove("md5");
}

Map<String, Object> extraData #

inherited from GridFSFile
Map<String, Object> extraData

String filename #

String filename

GridFS fs #

GridFS fs

ObjectId id #

ObjectId id

Stream<List<int>> input #

Stream<List<int>> input

int length #

inherited from GridFSFile
int length

String md5 #

inherited from GridFSFile
String md5

MD5 messageDigester #

MD5 messageDigester

Map metaData #

inherited from GridFSFile
Map get metaData {
 return extraData["metadata"];
}
set metaData(Map metaData) {
 extraData["metadata"] = metaData;
}

bool savedChunks #

bool savedChunks = false

int totalBytes #

int totalBytes = 0

DateTime uploadDate #

inherited from GridFSFile
DateTime uploadDate

Methods

Future<Map> dumpBuffer(List<int> writeBuffer) #

Future<Map> dumpBuffer( List<int> writeBuffer ) {
 if (writeBuffer.length == 0) {
   // Chunk is empty, may be last chunk
   return new Future.value({});
 }

 Map chunk = {"files_id" : id, "n" : currentChunkNumber, "data": new BsonBinary.from(writeBuffer)};
 currentChunkNumber++;
 totalBytes += writeBuffer.length;
 messageDigester.add(writeBuffer);
 currentBufferPosition = 0;

 return fs.chunks.insert(chunk);
}

Future finishData() #

Future finishData() {
 if (!savedChunks) {
   md5 = CryptoUtils.bytesToHex(messageDigester.close());
   length = totalBytes;
   savedChunks = true;
 }
 return super.save();
}

int numChunks() #

inherited from GridFSFile
int numChunks() {
 return (length.toDouble() / chunkSize).ceil().toInt();
}

Future save([int chunkSize]) #

Future save([int chunkSize]) {
 if (chunkSize == null) {
   chunkSize = this.chunkSize;
 }

 Future result;
 if (!savedChunks) {
   result = saveChunks(chunkSize);
 } else {
   result = new Future.value({'ok': 1.0});
 }
 return result;
}

Future<Map> saveChunks([int chunkSize = 0]) #

Future<Map> saveChunks([int chunkSize = 0]) {
 List<Future> futures = new List();
 Completer completer = new Completer();
 
 _onDone() {
   Future.wait(futures).then((list) {
     return finishData();
   }).then((map){
     completer.complete({});
   });
 }
 if (chunkSize == null) {
   chunkSize = this.chunkSize;
 }
 if (savedChunks) {
   throw new MongoDartError('chunks already saved!');
 }
 if (chunkSize <= 0 || chunkSize > GridFS.MAX_CHUNKSIZE) {
   throw new MongoDartError('chunkSize must be greater than zero and less than or equal to GridFS.MAX_CHUNKSIZE');
 }    
 input.listen((data) {
     futures.add(dumpBuffer(data));
     }, onDone: _onDone);    
 return completer.future;
}

void setGridFS(GridFS fs) #

inherited from GridFSFile
void setGridFS( GridFS fs ) {
 this.fs = fs;
}

Future<bool> validate() #

inherited from GridFSFile
Future<bool> validate() {
 if (fs == null) {
   throw new MongoDartError('no fs');
 }
 if (md5 == null) {
   throw new MongoDartError('no md5 stored');
 }

 Completer completer = new Completer();
 // query for md5 at filemd5
 DbCommand dbCommand = new DbCommand(
     fs.database,fs.bucketName,0,0,1,{"filemd5" : id}, {"md5" : 1});
 fs.database.executeDbCommand(dbCommand).then((Map data) {
   if (data != null && data.containsKey("md5")) {
     completer.complete(md5 == data["md5"]);
   } else {
     completer.complete(false);
   }
 });
 return completer.future;
}