blob: 027852e43dae8ac4297e319122e8b00be6266a0f [file] [log] [blame]
package ldifdiff
import (
"bytes"
"errors"
"strings"
"sync"
)
func createModifyStr(actionEntry actionEntry) (string, error) {
var buffer bytes.Buffer
subActions := make(map[subAction]string)
subActions[subActionModifyAdd] = "add"
subActions[subActionModifyDelete] = "delete"
subActions[subActionModifyReplace] = "replace"
for idx, subActionList := range actionEntry.SubActionAttrs {
for subAction, attrList := range subActionList {
if subAction == subActionNone {
return "", errors.New(("Invalid Subaction subActionNone for action actionModify"))
}
for idxInner, attr := range attrList {
if idxInner != 0 || idx != 0 {
buffer.WriteString("-\n")
}
parts := strings.Split(attr, ":")
buffer.WriteString(subActions[subAction] +
": " + parts[0] + "\n")
buffer.WriteString(parts[0] + ":" +
strings.Join(parts[1:], ":") + "\n")
}
}
}
return buffer.String(), nil
}
func writeLdif(queue <-chan actionEntry, writer *bytes.Buffer, wg *sync.WaitGroup, err *error) {
defer wg.Done()
for actionEntry := range queue {
if *err != nil {
continue
}
switch actionEntry.Action {
case actionAdd:
writer.WriteString(actionEntry.Dn + "\n") //dn
writer.WriteString("changetype: add\n")
attrList := actionEntry.SubActionAttrs[0][subActionNone]
for _, attr := range attrList {
writer.WriteString(attr + "\n")
}
case actionDelete:
writer.WriteString(actionEntry.Dn + "\n") //dn
writer.WriteString("changetype: delete\n")
case actionModify:
writer.WriteString(actionEntry.Dn + "\n") //dn
writer.WriteString("changetype: modify\n")
modifyStr, modifyErr := createModifyStr(actionEntry)
if modifyErr != nil {
*err = modifyErr
continue
}
writer.WriteString(modifyStr)
default:
*err = errors.New("Unexpected LDIF action value: " + string(actionEntry.Action))
continue
}
writer.WriteString("\n") // empty line as record separator
}
}