MCPcopy Create free account
hub / github.com/MG-RAST/Shock / Save

Method Save

shock-server/node/update.go:498–551  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

496}
497
498func (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
553func (node *Node) UpdateVersion() (err error) {
554 h := md5.New()

Callers 6

AsyncIndexerFunction · 0.95
DeleteIndexMethod · 0.95
UpdateMethod · 0.95
SetFileFromPartsFunction · 0.95
CreateNodesFromArchiveFunction · 0.45
DeleteMethod · 0.45

Calls 7

UpdateVersionMethod · 0.95
PathMethod · 0.95
MkdirMethod · 0.95
dbUpsertFunction · 0.85
StringMethod · 0.45
ErrorMethod · 0.45
RemoveMethod · 0.45

Tested by

no test coverage detected