-
Notifications
You must be signed in to change notification settings - Fork 0
/
downthedrive_getitem.go
152 lines (119 loc) · 4.45 KB
/
downthedrive_getitem.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package downthedrive
import (
"github.com/mysinmyc/gocommons/diagnostic"
"github.com/mysinmyc/onedriveclient"
"time"
)
type IndexStrategy int
const (
IndexStrategy_IndexOrDrive IndexStrategy = 0
IndexStrategy_IndexOnly IndexStrategy = iota
IndexStrategy_DriveOnly IndexStrategy = iota
IndexStrategy_Default IndexStrategy = iota
ItemsMaxAge_None time.Duration = -1
ItemsMaxAge_Unspecified time.Duration = 0
ItemsMaxAge_Default time.Duration = time.Hour * 24*15
)
func (vSelf *DownTheDrive) SetDefaultIndexStrategy(pDefaultIndexStrategy IndexStrategy) {
vSelf.config.IndexStrategy = pDefaultIndexStrategy
}
func (vSelf *DownTheDrive) HasItemsExpiry() bool {
return vSelf.config.ItemsMaxAge > ItemsMaxAge_None
}
func (vSelf *DownTheDrive) GetItemsMaxAge() time.Duration{
if vSelf.config.ItemsMaxAge == ItemsMaxAge_Unspecified {
return ItemsMaxAge_Default
}
return vSelf.config.ItemsMaxAge
}
func (vSelf *DownTheDrive) GetItem(pItem interface{}, pExpandChilden bool, pIndexStrategy IndexStrategy, pContext *DownTheDriveContext) (vRisItem *onedriveclient.OneDriveItem, vRisError error) {
var vContext *DownTheDriveContext
if pContext==nil {
var vContextError error
vContext,vContextError = vSelf.GetDefaultContext()
if vContextError != nil {
return nil,diagnostic.NewError("Error while getting default context", vContextError)
}
} else {
vContext = pContext
}
vIndexStrategy := pIndexStrategy
if vIndexStrategy == IndexStrategy_Default {
vIndexStrategy = vSelf.config.IndexStrategy
}
if vIndexStrategy != IndexStrategy_DriveOnly {
diagnostic.LogDebug("DownTheDrive.GetItem", "Searching item in db %s", pItem)
vDb,vDbError := vContext.GetDb()
if vDbError != nil {
diagnostic.NewError("Error getting db from context",vDbError)
}
vItemInDb, vItemInDbError := vDb.GetItem(pItem, pExpandChilden)
if vItemInDbError != nil {
return nil, diagnostic.NewError("Failed to load item form db %s ", vItemInDbError, pItem)
}
if vItemInDb != nil && pExpandChilden && pIndexStrategy != IndexStrategy_IndexOnly && vItemInDb.ChildrenLoaded() == false {
diagnostic.LogDebug("DownTheDrive.GetItem", "Item in db does not contains all the children, reloading from drive")
vItemInDb = nil
}
if vItemInDb != nil {
if vSelf.HasItemsExpiry() {
if time.Now().Sub(vItemInDb.LocalInfo.SnapShotDate) > vSelf.GetItemsMaxAge() {
diagnostic.LogDebug("DownTheDrive.GetItem", "Item in db expired")
if vIndexStrategy != IndexStrategy_IndexOnly {
diagnostic.LogDebug("DownTheDrive.GetItem", "Forcing item reload")
vItemInDb = nil
}
}
}
}
if vItemInDb != nil {
diagnostic.LogDebug("DownTheDrive.GetItem", "Item loaded from db")
return vItemInDb, nil
}
if vIndexStrategy == IndexStrategy_IndexOnly {
return nil, diagnostic.NewError("Item not found in the index db: %s", nil, vItemInDb)
}
}
diagnostic.LogDebug("DownTheDrive.GetItem", "Getting item from drive %s...", pItem)
vOneDriveClient,vOneDriveClientError := vContext.GetOneDriveClient()
if vOneDriveClientError != nil {
return nil, diagnostic.NewError("An error occurred getting onedriveclient from context",vOneDriveClientError)
}
vItem, vItemError := vOneDriveClient.GetItem(pItem, pExpandChilden)
if vItemError != nil {
return nil, diagnostic.NewError("Error getting item from drive %s", vItemError, pItem)
}
if pIndexStrategy != IndexStrategy_DriveOnly {
diagnostic.LogDebug("DownTheDrive.GetItem", "Saving item %s in db...", vItem.Id)
vDb,vDbError := vContext.GetDb()
if vDbError != nil {
diagnostic.NewError("Error getting db from context",vDbError)
}
vSaveError := vDb.SaveItem(vItem)
if vSaveError != nil {
return nil, diagnostic.NewError("Error saving item in database item from drive %s", vSaveError, pItem)
}
if pExpandChilden && vItem.Children != nil {
var vStartedBulk bool
if len(vItem.Children) > 10 {
vStartedBulk, vDbError = vDb.BeginItemBulk()
if vDbError != nil {
return nil, diagnostic.NewError("Error starting bulk to save children", vDbError)
}
}
for _, vCurChildren := range vItem.Children {
vDbError := vDb.SaveItem(vCurChildren)
if vDbError != nil {
return nil, diagnostic.NewError("error saving children %s ", vDbError, vCurChildren)
}
}
if vStartedBulk {
vDbError := vDb.EndItemBulk()
if vDbError != nil {
return nil, diagnostic.NewError("failed to end bulk", vDbError)
}
}
}
}
return vItem, nil
}