コード例 #1
0
ファイル: mongo.go プロジェクト: carriercomm/bytengine
func (m *FileSystem) copyFileDocument(f *File, newprefix, oldprefix, newname string, c *mgo.Collection) error {
	// update parent path prefix with new prefix
	_parent_path := f.Header.Parent
	_parent_path = strings.Replace(_parent_path, oldprefix, newprefix, 1)

	// update header info
	// both the original and copy will point to the same attachment id
	// in the bst
	id, err := filesystem.NewNodeID()
	if err != nil {
		return err
	}
	f.Header.Parent = _parent_path
	f.Header.Created = filesystem.FormatDatetime(time.Now())
	if newname != "" {
		err = filesystem.ValidateFileName(newname)
		if err != nil {
			return err
		}
		f.Header.Name = newname
	}
	f.Id = id

	// save to mongodb
	err = c.Insert(&f)
	if err != nil {
		return err
	}

	return nil
}
コード例 #2
0
ファイル: mongo.go プロジェクト: carriercomm/bytengine
func (m *FileSystem) NewFile(p, db string, j map[string]interface{}) error {
	// check path
	p = path.Clean(p)
	_name := path.Base(p)
	_parent := path.Dir(p)
	err := filesystem.ValidateFileName(_name)
	if err != nil {
		return err
	}
	// check if parent directory exists
	q := m.findPathQuery(_parent)

	// get collection
	c := m.getBFSCollection(db)
	var _parentdir Directory
	// find record
	err = c.Find(q).One(&_parentdir)
	if err != nil {
		err = fmt.Errorf("destination directory not found: %s", err)
		return err
	}
	if _parentdir.Header.Type != "Directory" {
		err = errors.New("destination isn't a directory")
		return err
	}
	// check if name already taken
	q = m.findPathQuery(p)
	_count, err := c.Find(q).Count()
	if err != nil {
		return err
	}
	if _count > 0 {
		err = fmt.Errorf("file '%s' already exists", p)
		return err
	}

	// create file
	id, err := filesystem.NewNodeID()
	if err != nil {
		return err
	}
	dt := filesystem.FormatDatetime(time.Now())
	h := NodeHeader{_name, "File", false, dt, _parent}
	a := BytesHeader{"", "", 0}
	_file := File{h, a, id, j}
	// insert node into mongodb
	err = c.Insert(&_file)
	if err != nil {
		return err
	}

	return nil
}
コード例 #3
0
ファイル: mongo.go プロジェクト: carriercomm/bytengine
func (m *FileSystem) Rename(p, newname, db string) error {
	// check path
	p = path.Clean(p)
	if p == "/" {
		err := errors.New("root directory cannot be renamed.")
		return err
	}

	// get collection
	c := m.getBFSCollection(db)

	// get file or directory if it exists
	q := m.findPathQuery(p)
	var ri SimpleResultItem
	err := c.Find(q).One(&ri)
	if err != nil {
		return err
	}

	if ri.Header.Type == "Directory" {
		// check if name is valid
		if err = filesystem.ValidateDirName(newname); err != nil {
			return err
		}
		// check if name isn't already in use
		np := path.Join(path.Dir(p), newname)
		q = m.findPathQuery(np)
		_count, err := c.Find(q).Count()
		if err != nil {
			return err
		}
		if _count > 0 {
			err := fmt.Errorf("directory '%s' already exists", np)
			return err
		}
		// get affected parent directories
		q = m.findAllChildrenQuery(p)
		var _dirs []string
		err = c.Find(q).Distinct("__header__.parent", &_dirs)
		if err != nil {
			return err
		}
		for _, item := range _dirs {
			newparent := strings.Replace(item, p, np, 1)
			q = bson.M{"__header__.parent": item}
			uq := bson.M{"$set": bson.M{"__header__.parent": newparent}}
			_, e := c.UpdateAll(q, uq)
			if e != nil {
				return e
			}
		}
		// rename directory by updating field
		q = bson.M{"$set": bson.M{"__header__.name": newname}}
		err = c.UpdateId(ri.Id, q)
		if err != nil {
			return err
		}

	} else {
		// check if name is valid
		if err = filesystem.ValidateFileName(newname); err != nil {
			return err
		}
		// check if name isn't already in use
		np := path.Join(path.Dir(p), newname)
		q = m.findPathQuery(np)
		_count, e := c.Find(q).Count()
		if e != nil {
			return e
		}
		if _count > 0 {
			err = fmt.Errorf("file '%s' already exists", np)
			return err
		}
		// rename file by updating field
		q = bson.M{"$set": bson.M{"__header__.name": newname}}
		err = c.UpdateId(ri.Id, q)
		if err != nil {
			return err
		}
	}

	return nil
}