()
| 496 | } |
| 497 | |
| 498 | func (node *Node) Save() (err error) { |
| 499 | // update versions |
| 500 | previousVersion := node.Version |
| 501 | node.UpdateVersion() |
| 502 | // only add to revisions if not new and has changed and allow revisions |
| 503 | if (previousVersion != "") && (previousVersion != node.Version) && (conf.MAX_REVISIONS != 0) { |
| 504 | n := Node{node.Id, node.Version, node.File, node.Attributes, node.Indexes, node.Acl, node.VersionParts, node.Tags, nil, node.Linkages, node.Priority, node.CreatedOn, node.LastModified, node.Expiration, node.Type, node.Subset, node.Parts} |
| 505 | newRevisions := []Node{n} |
| 506 | if len(node.Revisions) > 0 { |
| 507 | newRevisions = append(newRevisions, node.Revisions...) // prepend, latest revisions in front |
| 508 | } |
| 509 | // adjust revisions based on config |
| 510 | // <0 keep all ; >0 keep max |
| 511 | if (conf.MAX_REVISIONS < 0) || (len(newRevisions) <= conf.MAX_REVISIONS) { |
| 512 | node.Revisions = newRevisions |
| 513 | } else { |
| 514 | node.Revisions = newRevisions[:conf.MAX_REVISIONS] // keep most recent MAX_REVISIONS |
| 515 | } |
| 516 | } |
| 517 | if node.CreatedOn.String() == "0001-01-01 00:00:00 +0000 UTC" { |
| 518 | node.CreatedOn = time.Now() |
| 519 | } else { |
| 520 | node.LastModified = time.Now() |
| 521 | } |
| 522 | // get bson, test size and print |
| 523 | nbson, merr := bson.Marshal(node) |
| 524 | if merr != nil { |
| 525 | err = fmt.Errorf("(bson.Marshal) %s", err.Error()) |
| 526 | return |
| 527 | } |
| 528 | if len(nbson) >= DocumentMaxByte { |
| 529 | err = fmt.Errorf("bson document size is greater than limit of %d bytes", DocumentMaxByte) |
| 530 | return |
| 531 | } |
| 532 | bsonPath := fmt.Sprintf("%s/%s.bson", node.Path(), node.Id) |
| 533 | os.Remove(bsonPath) |
| 534 | if err = ioutil.WriteFile(bsonPath, nbson, 0644); err != nil { |
| 535 | // dir path may be missing, recreate and try again |
| 536 | if err = node.Mkdir(); err != nil { |
| 537 | err = fmt.Errorf("(node.Mkdir) %s", err.Error()) |
| 538 | return |
| 539 | } |
| 540 | if err = ioutil.WriteFile(bsonPath, nbson, 0644); err != nil { |
| 541 | err = fmt.Errorf("(ioutil.WriteFile) %s", err.Error()) |
| 542 | return |
| 543 | } |
| 544 | } |
| 545 | // save node to mongodb |
| 546 | if err = dbUpsert(node); err != nil { |
| 547 | err = fmt.Errorf("(node.dbUpsert) %s", err.Error()) |
| 548 | return |
| 549 | } |
| 550 | return |
| 551 | } |
| 552 | |
| 553 | func (node *Node) UpdateVersion() (err error) { |
| 554 | h := md5.New() |
no test coverage detected