diff options
Diffstat (limited to 'write.go')
-rw-r--r-- | write.go | 36 |
1 files changed, 35 insertions, 1 deletions
@@ -19,7 +19,31 @@ func (server *Server) putAttributes(dn string, attrs Entry) error { return err } - for k, valuesNC := range attrs { + // Normalize attribute names: if we have several times the same attr + // but with different cases, put that in the same attr + normalized := make(Entry) + for k, values := range attrs { + found := false + for k2 := range normalized { + if strings.EqualFold(k, k2) { + normalized[k2] = append(normalized[k2], values...) + found = true + break + } + } + if !found { + normalized[k] = values + } + } + + // Retreieve previously existing attributes, which we will use to delete + // entries with the wrong case + previous_pairs, _, err := server.kv.List(prefix + "/attribute=", &server.readOpts) + if err != nil { + return err + } + + for k, valuesNC := range normalized { path := prefix + "/attribute=" + k // Trim spaces and remove empty values @@ -31,6 +55,16 @@ func (server *Server) putAttributes(dn string, attrs Entry) error { } } + // If previously existing pairs with the wrong case exist, delete them + for _, prev_pair := range previous_pairs { + if strings.EqualFold(prev_pair.Key, path) && prev_pair.Key != path { + _, err := server.kv.Delete(prev_pair.Key, nil) + if err != nil { + return err + } + } + } + // If we have zero values, delete associated k/v pair // Otherwise, write new values if len(values) == 0 { |