Skip to content

Commit 3d64854

Browse files
drop collections fix
1 parent 1a2b6d7 commit 3d64854

File tree

2 files changed

+78
-62
lines changed

2 files changed

+78
-62
lines changed

src/db.ts

Lines changed: 13 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@ import { type BSONSerializeOptions, type Document, resolveBSONOptions } from './
33
import { ChangeStream, type ChangeStreamDocument, type ChangeStreamOptions } from './change_stream';
44
import { Collection, type CollectionOptions } from './collection';
55
import * as CONSTANTS from './constants';
6-
import { CursorTimeoutContext } from './cursor/abstract_cursor';
76
import { AggregationCursor } from './cursor/aggregation_cursor';
87
import { ListCollectionsCursor } from './cursor/list_collections_cursor';
98
import { RunCommandCursor, type RunCursorCommandOptions } from './cursor/run_command_cursor';
10-
import { MONGODB_ERROR_CODES, MongoInvalidArgumentError, MongoServerError } from './error';
9+
import { MongoInvalidArgumentError } from './error';
1110
import type { MongoClient, PkFactory } from './mongo_client';
1211
import type { Abortable, TODO_NODE_3286 } from './mongo_types';
1312
import type { AggregateOptions } from './operations/aggregate';
@@ -17,8 +16,8 @@ import {
1716
type CreateCollectionOptions
1817
} from './operations/create_collection';
1918
import {
20-
DropCollectionOperation,
2119
type DropCollectionOptions,
20+
dropCollections,
2221
DropDatabaseOperation,
2322
type DropDatabaseOptions
2423
} from './operations/drop';
@@ -44,7 +43,6 @@ import {
4443
import { DbStatsOperation, type DbStatsOptions } from './operations/stats';
4544
import { ReadConcern } from './read_concern';
4645
import { ReadPreference, type ReadPreferenceLike } from './read_preference';
47-
import { TimeoutContext } from './timeout';
4846
import { DEFAULT_PK_FACTORY, filterOptions, MongoDBNamespace, resolveOptions } from './utils';
4947
import { WriteConcern, type WriteConcernOptions } from './write_concern';
5048

@@ -362,13 +360,13 @@ export class Db {
362360
): ListCollectionsCursor<CollectionInfo>;
363361
listCollections<
364362
T extends Pick<CollectionInfo, 'name' | 'type'> | CollectionInfo =
365-
| Pick<CollectionInfo, 'name' | 'type'>
366-
| CollectionInfo
363+
| Pick<CollectionInfo, 'name' | 'type'>
364+
| CollectionInfo
367365
>(filter?: Document, options?: ListCollectionsOptions & Abortable): ListCollectionsCursor<T>;
368366
listCollections<
369367
T extends Pick<CollectionInfo, 'name' | 'type'> | CollectionInfo =
370-
| Pick<CollectionInfo, 'name' | 'type'>
371-
| CollectionInfo
368+
| Pick<CollectionInfo, 'name' | 'type'>
369+
| CollectionInfo
372370
>(
373371
filter: Document = {},
374372
options: ListCollectionsOptions & Abortable = {}
@@ -413,61 +411,15 @@ export class Db {
413411
* @param options - Optional settings for the command
414412
*/
415413
async dropCollection(name: string, options?: DropCollectionOptions): Promise<boolean> {
416-
options = resolveOptions(this, options);
417-
options.session ??= this.client.startSession({ owner: Symbol(), explicit: false });
418-
419-
const timeoutContext = TimeoutContext.create({
420-
session: options.session,
421-
serverSelectionTimeoutMS: this.client.s.options.serverSelectionTimeoutMS,
422-
waitQueueTimeoutMS: this.client.s.options.waitQueueTimeoutMS,
423-
timeoutMS: options.timeoutMS
424-
});
425-
426-
const encryptedFieldsMap = this.client.s.options.autoEncryption?.encryptedFieldsMap;
427-
let encryptedFields: Document | undefined =
428-
options.encryptedFields ?? encryptedFieldsMap?.[`${this.databaseName}.${name}`];
429-
430-
if (!encryptedFields && encryptedFieldsMap) {
431-
// If the MongoClient was configured with an encryptedFieldsMap,
432-
// and no encryptedFields config was available in it or explicitly
433-
// passed as an argument, the spec tells us to look one up using
434-
// listCollections().
435-
const listCollectionsResult = await this.listCollections(
436-
{ name },
437-
{
438-
nameOnly: false,
439-
session: options.session,
440-
timeoutContext: new CursorTimeoutContext(timeoutContext, Symbol())
441-
}
442-
).toArray();
443-
encryptedFields = listCollectionsResult?.[0]?.options?.encryptedFields;
444-
}
445-
446-
if (encryptedFields) {
447-
const escCollection = encryptedFields.escCollection || `enxcol_.${name}.esc`;
448-
const ecocCollection = encryptedFields.ecocCollection || `enxcol_.${name}.ecoc`;
449-
450-
for (const collectionName of [escCollection, ecocCollection]) {
451-
// Drop auxilliary collections, ignoring potential NamespaceNotFound errors.
452-
const dropOp = new DropCollectionOperation(this, collectionName, options);
453-
try {
454-
await executeOperation(this.client, dropOp, timeoutContext);
455-
} catch (err) {
456-
if (
457-
!(err instanceof MongoServerError) ||
458-
err.code !== MONGODB_ERROR_CODES.NamespaceNotFound
459-
) {
460-
throw err;
461-
}
462-
}
463-
}
414+
options = resolveOptions(this, { ...options });
415+
if (options.session) {
416+
return await dropCollections(this, name, options);
464417
}
465418

466-
return await executeOperation(
467-
this.client,
468-
new DropCollectionOperation(this, name, options),
469-
timeoutContext
470-
);
419+
return await this.client.withSession({ explicit: false }, async session => {
420+
options.session = session;
421+
return await dropCollections(this, name, options);
422+
});
471423
}
472424

473425
/**

src/operations/drop.ts

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import type { Document } from '../bson';
2+
import { CursorTimeoutContext } from '../cursor/abstract_cursor';
23
import type { Db } from '../db';
4+
import { MONGODB_ERROR_CODES, MongoServerError } from '../error';
35
import type { Server } from '../sdam/server';
46
import type { ClientSession } from '../sessions';
5-
import { type TimeoutContext } from '../timeout';
7+
import { TimeoutContext } from '../timeout';
68
import { CommandOperation, type CommandOperationOptions } from './command';
9+
import { executeOperation } from './execute_operation';
710
import { Aspect, defineAspects } from './operation';
811

912
/** @public */
@@ -37,6 +40,67 @@ export class DropCollectionOperation extends CommandOperation<boolean> {
3740
}
3841
}
3942

43+
export async function dropCollections(
44+
db: Db,
45+
name: string,
46+
options: DropCollectionOptions
47+
): Promise<boolean> {
48+
const timeoutContext = TimeoutContext.create({
49+
session: options.session,
50+
serverSelectionTimeoutMS: db.client.s.options.serverSelectionTimeoutMS,
51+
waitQueueTimeoutMS: db.client.s.options.waitQueueTimeoutMS,
52+
timeoutMS: options.timeoutMS
53+
});
54+
55+
const encryptedFieldsMap = db.client.s.options.autoEncryption?.encryptedFieldsMap;
56+
let encryptedFields: Document | undefined =
57+
options.encryptedFields ?? encryptedFieldsMap?.[`${db.databaseName}.${name}`];
58+
59+
if (!encryptedFields && encryptedFieldsMap) {
60+
// If the MongoClient was configured with an encryptedFieldsMap,
61+
// and no encryptedFields config was available in it or explicitly
62+
// passed as an argument, the spec tells us to look one up using
63+
// listCollections().
64+
const listCollectionsResult = await db
65+
.listCollections(
66+
{ name },
67+
{
68+
nameOnly: false,
69+
session: options.session,
70+
timeoutContext: new CursorTimeoutContext(timeoutContext, Symbol())
71+
}
72+
)
73+
.toArray();
74+
encryptedFields = listCollectionsResult?.[0]?.options?.encryptedFields;
75+
}
76+
77+
if (encryptedFields) {
78+
const escCollection = encryptedFields.escCollection || `enxcol_.${name}.esc`;
79+
const ecocCollection = encryptedFields.ecocCollection || `enxcol_.${name}.ecoc`;
80+
81+
for (const collectionName of [escCollection, ecocCollection]) {
82+
// Drop auxilliary collections, ignoring potential NamespaceNotFound errors.
83+
const dropOp = new DropCollectionOperation(db, collectionName, options);
84+
try {
85+
await executeOperation(db.client, dropOp, timeoutContext);
86+
} catch (err) {
87+
if (
88+
!(err instanceof MongoServerError) ||
89+
err.code !== MONGODB_ERROR_CODES.NamespaceNotFound
90+
) {
91+
throw err;
92+
}
93+
}
94+
}
95+
}
96+
97+
return await executeOperation(
98+
db.client,
99+
new DropCollectionOperation(db, name, options),
100+
timeoutContext
101+
);
102+
}
103+
40104
/** @public */
41105
export type DropDatabaseOptions = CommandOperationOptions;
42106

0 commit comments

Comments
 (0)