github.com/tacerus/ldifdiff@v0.0.0-20181030102753-4dccbe38183b/ldifConvertor.go (about)

     1  package ldifdiff
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  	"strings"
     7  	"sync"
     8  )
     9  
    10  func createModifyStr(actionEntry actionEntry) (string, error) {
    11  	var buffer bytes.Buffer
    12  	subActions := make(map[subAction]string)
    13  	subActions[subActionModifyAdd] = "add"
    14  	subActions[subActionModifyDelete] = "delete"
    15  	subActions[subActionModifyReplace] = "replace"
    16  	for idx, subActionList := range actionEntry.SubActionAttrs {
    17  		for subAction, attrList := range subActionList {
    18  			if subAction == subActionNone {
    19  				return "", errors.New(("Invalid Subaction subActionNone for action actionModify"))
    20  			}
    21  			for idxInner, attr := range attrList {
    22  				if idxInner != 0 || idx != 0 {
    23  					buffer.WriteString("-\n")
    24  				}
    25  				parts := strings.Split(attr, ":")
    26  				buffer.WriteString(subActions[subAction] +
    27  					": " + parts[0] + "\n")
    28  				buffer.WriteString(parts[0] + ":" +
    29  					strings.Join(parts[1:], ":") + "\n")
    30  
    31  			}
    32  		}
    33  	}
    34  	return buffer.String(), nil
    35  }
    36  
    37  func writeLdif(queue <-chan actionEntry, writer *bytes.Buffer, wg *sync.WaitGroup, err *error) {
    38  	defer wg.Done()
    39  	for actionEntry := range queue {
    40  		if *err != nil {
    41  			continue
    42  		}
    43  		switch actionEntry.Action {
    44  		case actionAdd:
    45  			writer.WriteString(actionEntry.Dn + "\n") //dn
    46  			writer.WriteString("changetype: add\n")
    47  			attrList := actionEntry.SubActionAttrs[0][subActionNone]
    48  			for _, attr := range attrList {
    49  				writer.WriteString(attr + "\n")
    50  			}
    51  		case actionDelete:
    52  			writer.WriteString(actionEntry.Dn + "\n") //dn
    53  			writer.WriteString("changetype: delete\n")
    54  		case actionModify:
    55  			writer.WriteString(actionEntry.Dn + "\n") //dn
    56  			writer.WriteString("changetype: modify\n")
    57  			modifyStr, modifyErr := createModifyStr(actionEntry)
    58  			if modifyErr != nil {
    59  				*err = modifyErr
    60  				continue
    61  			}
    62  			writer.WriteString(modifyStr)
    63  		default:
    64  			*err = errors.New("Unexpected LDIF action value: " + string(actionEntry.Action))
    65  			continue
    66  		}
    67  		writer.WriteString("\n") // empty line as record separator
    68  	}
    69  }