33const CommandOperation = require ( './command' ) ;
44const ReadPreference = require ( '../read_preference' ) ;
55const { Aspect, defineAspects } = require ( './operation' ) ;
6- const { applyWriteConcern, handleCallback } = require ( '../utils' ) ;
6+ const { applyWriteConcern } = require ( '../utils' ) ;
77const { loadCollection } = require ( '../dynamic_loaders' ) ;
88const { MongoError } = require ( '../error' ) ;
99
10- // Filter out any write concern options
11- const illegalCommandFields = [
10+ const ILLEGAL_COMMAND_FIELDS = new Set ( [
1211 'w' ,
1312 'wtimeout' ,
1413 'j' ,
@@ -22,27 +21,24 @@ const illegalCommandFields = [
2221 'session' ,
2322 'readConcern' ,
2423 'writeConcern'
25- ] ;
24+ ] ) ;
2625
2726class CreateCollectionOperation extends CommandOperation {
2827 constructor ( db , name , options ) {
2928 super ( db , options ) ;
30-
3129 this . name = name ;
3230 }
3331
3432 _buildCommand ( ) {
3533 const name = this . name ;
3634 const options = this . options ;
3735
38- // Create collection command
3936 const cmd = { create : name } ;
40- // Add all optional parameters
4137 for ( let n in options ) {
4238 if (
4339 options [ n ] != null &&
4440 typeof options [ n ] !== 'function' &&
45- illegalCommandFields . indexOf ( n ) === - 1
41+ ! ILLEGAL_COMMAND_FIELDS . has ( n )
4642 ) {
4743 cmd [ n ] = options [ n ] ;
4844 }
@@ -55,61 +51,51 @@ class CreateCollectionOperation extends CommandOperation {
5551 const db = this . db ;
5652 const name = this . name ;
5753 const options = this . options ;
54+ const Collection = loadCollection ( ) ;
5855
59- let Collection = loadCollection ( ) ;
56+ let listCollectionOptions = Object . assign ( { nameOnly : true , strict : false } , options ) ;
57+ listCollectionOptions = applyWriteConcern ( listCollectionOptions , { db } , listCollectionOptions ) ;
6058
61- // Did the user destroy the topology
62- if ( db . serverConfig && db . serverConfig . isDestroyed ( ) ) {
63- return callback ( new MongoError ( 'topology was destroyed' ) ) ;
64- }
59+ function done ( err ) {
60+ if ( err ) {
61+ return callback ( err ) ;
62+ }
6563
66- let listCollectionOptions = Object . assign ( { } , options , { nameOnly : true } ) ;
67- listCollectionOptions = applyWriteConcern ( listCollectionOptions , { db } , listCollectionOptions ) ;
64+ try {
65+ callback (
66+ null ,
67+ new Collection ( db , db . s . topology , db . databaseName , name , db . s . pkFactory , options )
68+ ) ;
69+ } catch ( err ) {
70+ callback ( err ) ;
71+ }
72+ }
6873
69- // Check if we have the name
70- db . listCollections ( { name } , listCollectionOptions )
71- . setReadPreference ( ReadPreference . PRIMARY )
72- . toArray ( ( err , collections ) => {
73- if ( err != null ) return handleCallback ( callback , err , null ) ;
74- if ( collections . length > 0 && listCollectionOptions . strict ) {
75- return handleCallback (
76- callback ,
77- MongoError . create ( {
78- message : `Collection ${ name } already exists. Currently in strict mode.` ,
79- driver : true
80- } ) ,
81- null
82- ) ;
83- } else if ( collections . length > 0 ) {
84- try {
85- return handleCallback (
86- callback ,
87- null ,
88- new Collection ( db , db . s . topology , db . databaseName , name , db . s . pkFactory , options )
89- ) ;
90- } catch ( err ) {
91- return handleCallback ( callback , err ) ;
74+ const strictMode = listCollectionOptions . strict ;
75+ if ( strictMode ) {
76+ db . listCollections ( { name } , listCollectionOptions )
77+ . setReadPreference ( ReadPreference . PRIMARY )
78+ . toArray ( ( err , collections ) => {
79+ if ( err ) {
80+ return callback ( err ) ;
9281 }
93- }
94-
95- // Execute command
96- super . execute ( err => {
97- if ( err ) return handleCallback ( callback , err ) ;
9882
99- try {
100- return handleCallback (
101- callback ,
102- null ,
103- new Collection ( db , db . s . topology , db . databaseName , name , db . s . pkFactory , options )
83+ if ( collections . length > 0 ) {
84+ return callback (
85+ new MongoError ( `Collection ${ name } already exists. Currently in strict mode.` )
10486 ) ;
105- } catch ( err ) {
106- return handleCallback ( callback , err ) ;
10787 }
88+
89+ super . execute ( done ) ;
10890 } ) ;
109- } ) ;
91+
92+ return ;
93+ }
94+
95+ // otherwise just execute the command
96+ super . execute ( done ) ;
11097 }
11198}
11299
113100defineAspects ( CreateCollectionOperation , Aspect . WRITE_OPERATION ) ;
114-
115101module . exports = CreateCollectionOperation ;
0 commit comments