You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					103 lines
				
				2.4 KiB
			
		
		
			
		
	
	
					103 lines
				
				2.4 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | const Aspect = require('./operation').Aspect; | ||
|  | const defineAspects = require('./operation').defineAspects; | ||
|  | const CommandOperation = require('./command'); | ||
|  | const applyWriteConcern = require('../utils').applyWriteConcern; | ||
|  | const loadCollection = require('../dynamic_loaders').loadCollection; | ||
|  | const MongoError = require('../core').MongoError; | ||
|  | const ReadPreference = require('../core').ReadPreference; | ||
|  | 
 | ||
|  | const ILLEGAL_COMMAND_FIELDS = new Set([ | ||
|  |   'w', | ||
|  |   'wtimeout', | ||
|  |   'j', | ||
|  |   'fsync', | ||
|  |   'autoIndexId', | ||
|  |   'strict', | ||
|  |   'serializeFunctions', | ||
|  |   'pkFactory', | ||
|  |   'raw', | ||
|  |   'readPreference', | ||
|  |   'session', | ||
|  |   'readConcern', | ||
|  |   'writeConcern' | ||
|  | ]); | ||
|  | 
 | ||
|  | class CreateCollectionOperation extends CommandOperation { | ||
|  |   constructor(db, name, options) { | ||
|  |     super(db, options); | ||
|  |     this.name = name; | ||
|  |   } | ||
|  | 
 | ||
|  |   _buildCommand() { | ||
|  |     const name = this.name; | ||
|  |     const options = this.options; | ||
|  | 
 | ||
|  |     const cmd = { create: name }; | ||
|  |     for (let n in options) { | ||
|  |       if ( | ||
|  |         options[n] != null && | ||
|  |         typeof options[n] !== 'function' && | ||
|  |         !ILLEGAL_COMMAND_FIELDS.has(n) | ||
|  |       ) { | ||
|  |         cmd[n] = options[n]; | ||
|  |       } | ||
|  |     } | ||
|  | 
 | ||
|  |     return cmd; | ||
|  |   } | ||
|  | 
 | ||
|  |   execute(callback) { | ||
|  |     const db = this.db; | ||
|  |     const name = this.name; | ||
|  |     const options = this.options; | ||
|  |     const Collection = loadCollection(); | ||
|  | 
 | ||
|  |     let listCollectionOptions = Object.assign({ nameOnly: true, strict: false }, options); | ||
|  |     listCollectionOptions = applyWriteConcern(listCollectionOptions, { db }, listCollectionOptions); | ||
|  | 
 | ||
|  |     function done(err) { | ||
|  |       if (err) { | ||
|  |         return callback(err); | ||
|  |       } | ||
|  | 
 | ||
|  |       try { | ||
|  |         callback( | ||
|  |           null, | ||
|  |           new Collection(db, db.s.topology, db.databaseName, name, db.s.pkFactory, options) | ||
|  |         ); | ||
|  |       } catch (err) { | ||
|  |         callback(err); | ||
|  |       } | ||
|  |     } | ||
|  | 
 | ||
|  |     const strictMode = listCollectionOptions.strict; | ||
|  |     if (strictMode) { | ||
|  |       db.listCollections({ name }, listCollectionOptions) | ||
|  |         .setReadPreference(ReadPreference.PRIMARY) | ||
|  |         .toArray((err, collections) => { | ||
|  |           if (err) { | ||
|  |             return callback(err); | ||
|  |           } | ||
|  | 
 | ||
|  |           if (collections.length > 0) { | ||
|  |             return callback( | ||
|  |               new MongoError(`Collection ${name} already exists. Currently in strict mode.`) | ||
|  |             ); | ||
|  |           } | ||
|  | 
 | ||
|  |           super.execute(done); | ||
|  |         }); | ||
|  | 
 | ||
|  |       return; | ||
|  |     } | ||
|  | 
 | ||
|  |     // otherwise just execute the command
 | ||
|  |     super.execute(done); | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | defineAspects(CreateCollectionOperation, Aspect.WRITE_OPERATION); | ||
|  | module.exports = CreateCollectionOperation; |