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 }