github.com/ravendb/ravendb-go-client@v0.0.0-20240229102137-4474ee7aa0fa/create_database_operation.go (about)

     1  package ravendb
     2  
     3  import (
     4  	"net/http"
     5  	"net/url"
     6  	"strconv"
     7  )
     8  
     9  var _ IServerOperation = &CreateDatabaseOperation{}
    10  
    11  // CreateDatabaseOperation represents "create database" operation
    12  type CreateDatabaseOperation struct {
    13  	databaseRecord    *DatabaseRecord
    14  	replicationFactor int
    15  }
    16  
    17  // NewCreateDatabaseOperation returns CreateDatabaseOperation
    18  func NewCreateDatabaseOperation(databaseRecord *DatabaseRecord, replicationFactor int) *CreateDatabaseOperation {
    19  	if databaseRecord.DatabaseTopology != nil && databaseRecord.DatabaseTopology.ReplicationFactor > 0 {
    20  		replicationFactor = databaseRecord.DatabaseTopology.ReplicationFactor
    21  	} else if replicationFactor <= 0 {
    22  		replicationFactor = 1
    23  	}
    24  
    25  	return &CreateDatabaseOperation{
    26  		databaseRecord:    databaseRecord,
    27  		replicationFactor: replicationFactor,
    28  	}
    29  }
    30  
    31  // GetCommand returns command for this operation
    32  func (o *CreateDatabaseOperation) GetCommand(conventions *DocumentConventions) (RavenCommand, error) {
    33  	return NewCreateDatabaseCommand(conventions, o.databaseRecord, o.replicationFactor)
    34  }
    35  
    36  var (
    37  	_ RavenCommand = &CreateDatabaseCommand{}
    38  )
    39  
    40  // CreateDatabaseCommand represents "create database" command
    41  type CreateDatabaseCommand struct {
    42  	RavenCommandBase
    43  
    44  	conventions       *DocumentConventions
    45  	databaseRecord    *DatabaseRecord
    46  	replicationFactor int
    47  	databaseName      string
    48  
    49  	Result *DatabasePutResult
    50  }
    51  
    52  // NewCreateDatabaseCommand returns new CreateDatabaseCommand
    53  func NewCreateDatabaseCommand(conventions *DocumentConventions, databaseRecord *DatabaseRecord, replicationFactor int) (*CreateDatabaseCommand, error) {
    54  	if databaseRecord.DatabaseName == "" {
    55  		return nil, newIllegalArgumentError("databaseRecord.DatabaseName cannot be empty")
    56  	}
    57  	if databaseRecord.DatabaseTopology != nil && databaseRecord.DatabaseTopology.ReplicationFactor > 0 {
    58  		replicationFactor = databaseRecord.DatabaseTopology.ReplicationFactor
    59  	} else if replicationFactor <= 0 {
    60  		replicationFactor = 1
    61  	}
    62  
    63  	cmd := &CreateDatabaseCommand{
    64  		RavenCommandBase: NewRavenCommandBase(),
    65  
    66  		conventions:       conventions,
    67  		databaseRecord:    databaseRecord,
    68  		replicationFactor: replicationFactor,
    69  		databaseName:      databaseRecord.DatabaseName,
    70  	}
    71  	return cmd, nil
    72  }
    73  
    74  func (c *CreateDatabaseCommand) CreateRequest(node *ServerNode) (*http.Request, error) {
    75  	url := node.URL + "/admin/databases?name=" + url.QueryEscape(c.databaseName)
    76  	url += "&replicationFactor=" + strconv.Itoa(c.replicationFactor)
    77  
    78  	js, err := jsonMarshal(c.databaseRecord)
    79  	if err != nil {
    80  		return nil, err
    81  	}
    82  	return newHttpPut(url, js)
    83  }
    84  
    85  func (c *CreateDatabaseCommand) SetResponse(response []byte, fromCache bool) error {
    86  	if len(response) == 0 {
    87  		return throwInvalidResponse()
    88  	}
    89  	return jsonUnmarshal(response, &c.Result)
    90  }