blob: c067ccc279d2289251e2bf7ffb06ae39b0272438 [file] [log] [blame]
Don Newton379ae252019-04-01 12:17:06 -04001// Copyright (C) MongoDB, Inc. 2017-present.
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may
4// not use this file except in compliance with the License. You may obtain
5// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
7package command
8
9import (
10 "context"
11
12 "github.com/mongodb/mongo-go-driver/bson"
13 "github.com/mongodb/mongo-go-driver/mongo/writeconcern"
14 "github.com/mongodb/mongo-go-driver/x/bsonx"
15 "github.com/mongodb/mongo-go-driver/x/mongo/driver/session"
16 "github.com/mongodb/mongo-go-driver/x/network/description"
17 "github.com/mongodb/mongo-go-driver/x/network/wiremessage"
18)
19
20// DropCollection represents the drop command.
21//
22// The dropCollections command drops collection for a database.
23type DropCollection struct {
24 DB string
25 Collection string
26 WriteConcern *writeconcern.WriteConcern
27 Clock *session.ClusterClock
28 Session *session.Client
29
30 result bson.Raw
31 err error
32}
33
34// Encode will encode this command into a wire message for the given server description.
35func (dc *DropCollection) Encode(desc description.SelectedServer) (wiremessage.WireMessage, error) {
36 cmd, err := dc.encode(desc)
37 if err != nil {
38 return nil, err
39 }
40
41 return cmd.Encode(desc)
42}
43
44func (dc *DropCollection) encode(desc description.SelectedServer) (*Write, error) {
45 cmd := bsonx.Doc{{"drop", bsonx.String(dc.Collection)}}
46
47 write := &Write{
48 Clock: dc.Clock,
49 DB: dc.DB,
50 Command: cmd,
51 Session: dc.Session,
52 }
53 if desc.WireVersion != nil && desc.WireVersion.Max >= 5 {
54 write.WriteConcern = dc.WriteConcern
55 }
56 return write, nil
57}
58
59// Decode will decode the wire message using the provided server description. Errors during decoding
60// are deferred until either the Result or Err methods are called.
61func (dc *DropCollection) Decode(desc description.SelectedServer, wm wiremessage.WireMessage) *DropCollection {
62 rdr, err := (&Write{}).Decode(desc, wm).Result()
63 if err != nil {
64 dc.err = err
65 return dc
66 }
67
68 return dc.decode(desc, rdr)
69}
70
71func (dc *DropCollection) decode(desc description.SelectedServer, rdr bson.Raw) *DropCollection {
72 dc.result = rdr
73 return dc
74}
75
76// Result returns the result of a decoded wire message and server description.
77func (dc *DropCollection) Result() (bson.Raw, error) {
78 if dc.err != nil {
79 return nil, dc.err
80 }
81
82 return dc.result, nil
83}
84
85// Err returns the error set on this command.
86func (dc *DropCollection) Err() error { return dc.err }
87
88// RoundTrip handles the execution of this command using the provided wiremessage.ReadWriter.
89func (dc *DropCollection) RoundTrip(ctx context.Context, desc description.SelectedServer, rw wiremessage.ReadWriter) (bson.Raw, error) {
90 cmd, err := dc.encode(desc)
91 if err != nil {
92 return nil, err
93 }
94
95 rdr, err := cmd.RoundTrip(ctx, desc, rw)
96 if err != nil {
97 return nil, err
98 }
99
100 return dc.decode(desc, rdr).Result()
101}