github.com/altipla-consulting/ravendb-go-client@v0.1.3/tcp_negotiation.go (about)

     1  package ravendb
     2  
     3  import (
     4  	"encoding/json"
     5  	"io"
     6  	"strconv"
     7  )
     8  
     9  const (
    10  	outOfRangeStatus = -1
    11  	dropStatus       = -2
    12  )
    13  
    14  func negotiateProtocolVersion(stream io.Writer, parameters *tcpNegotiateParameters) (*supportedFeatures, error) {
    15  	v := parameters.version
    16  	currentRef := &v
    17  	for {
    18  		sendTcpVersionInfo(stream, parameters, *currentRef)
    19  		version := parameters.readResponseAndGetVersionCallback(parameters.destinationUrl)
    20  
    21  		/*
    22  			   if (logger.isInfoEnabled()) {
    23  				   logger.info("Read response from " + ObjectUtils.firstNonNull(parameters.getSourceNodeTag(), parameters.getDestinationUrl()) + " for " + parameters.getOperation() + ", received version is '" + version + "'");
    24  			   }
    25  		*/
    26  
    27  		if version == *currentRef {
    28  			break
    29  		}
    30  
    31  		//In this case we usually throw internally but for completeness we better handle it
    32  		if version == dropStatus {
    33  			return getSupportedFeaturesFor(operationDrop, dropBaseLine), nil
    34  		}
    35  
    36  		status := operationVersionSupported(parameters.operation, version, currentRef)
    37  
    38  		if status == supportedStatus_OUT_OF_RANGE {
    39  			sendTcpVersionInfo(stream, parameters, outOfRangeStatus)
    40  			return nil, newIllegalArgumentError("The " + parameters.operation + " version " + strconv.Itoa(parameters.version) + " is out of range, out lowest version is " + strconv.Itoa(*currentRef))
    41  		}
    42  
    43  		/*
    44  		   if (logger.isInfoEnabled()) {
    45  		       logger.info("The version " +  version + " is " + status + ", will try to agree on '"
    46  		               + currentRef.value + "' for " + parameters.getOperation() + " with "
    47  		               + ObjectUtils.firstNonNull(parameters.getDestinationNodeTag(), parameters.getDestinationUrl()));
    48  		   }
    49  		*/
    50  	}
    51  	/*
    52  		   if (logger.isInfoEnabled()) {
    53  			   logger.info(ObjectUtils.firstNonNull(parameters.getDestinationNodeTag(), parameters.getDestinationUrl()) + " agreed on version " + currentRef.value + " for " + parameters.getOperation());
    54  		   }
    55  	*/
    56  	return getSupportedFeaturesFor(parameters.operation, *currentRef), nil
    57  }
    58  
    59  func sendTcpVersionInfo(stream io.Writer, parameters *tcpNegotiateParameters, currentVersion int) error {
    60  	/*
    61  		if (logger.isInfoEnabled()) {
    62  			logger.info("Send negotiation for " + parameters.getOperation() + " in version " + currentVersion);
    63  		}
    64  	*/
    65  	m := map[string]interface{}{
    66  		"DatabaseName":     parameters.database,
    67  		"Operation":        parameters.operation,
    68  		"SourceNodeTag":    parameters.sourceNodeTag,
    69  		"OperationVersion": currentVersion,
    70  	}
    71  	enc := json.NewEncoder(stream)
    72  	return enc.Encode(m)
    73  }