本文整理汇总了Golang中appengine/datastore.DecodeCursor函数的典型用法代码示例。如果您正苦于以下问题:Golang DecodeCursor函数的具体用法?Golang DecodeCursor怎么用?Golang DecodeCursor使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了DecodeCursor函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: QueryKeys
func QueryKeys(c appengine.Context, cursor string) ([]Key, string, error) {
var items []Key
q := datastore.NewQuery("Key")
if cursor != "" {
dCursor, err := datastore.DecodeCursor(string(cursor))
if err == nil {
q = q.Start(dCursor)
}
}
t := q.Run(c)
for i := 0; i < 10; i++ {
var item Key
k, err := t.Next(&item)
if err == datastore.Done {
break
}
if err != nil {
return items, "", nil
}
item.Id = k.StringID()
item.Agent.Get(c, item.AgentId)
item.Portal.Get(c, item.PortalId)
items = append(items, item)
}
returnedCursor, err := t.Cursor()
if err != nil {
return items, "", err
}
return items, returnedCursor.String(), nil
}
示例2: GetNewestItems
// GetNewestItems returns the latest number elements for a specific namespace
func GetNewestItems(c appengine.Context, namespace string, limit int, cursor string) ([]Item, string, error) {
q := datastore.NewQuery("Item").
Filter("Namespace =", namespace).
Order("-CreatedAt").
Limit(limit)
if cursor, err := datastore.DecodeCursor(cursor); err == nil {
q = q.Start(cursor)
}
var is []Item
var err error
t := q.Run(c)
for {
var i Item
_, err = t.Next(&i)
if err == datastore.Done {
break
}
is = append(is, i)
if err != nil {
c.Errorf("Error fetching next item for namespace %v: %v", namespace, err)
return nil, "", err
}
}
if cursor, err := t.Cursor(); err == nil {
return is, cursor.String(), nil
}
return nil, "", err
}
示例3: query2
func query2(w http.ResponseWriter, r *http.Request) {
c := appengine.NewContext(r)
// start cursor1 OMIT
q := datastore.NewQuery("Book").Filter("Author=", "author-1").Order("-CreatedAt")
pCursor := r.FormValue("cursor")
if pCursor != "" {
cursor, err := datastore.DecodeCursor(pCursor)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
q.Start(cursor)
}
// end cursor1 OMIT
// start cursor2 OMIT
var books []Book
t := q.Run(c)
for i := 0; i < 10; i++ {
var book Book
key, err := t.Next(&book)
if err == datastore.Done {
break
}
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
c.Debugf("#v", key)
books = append(books, book)
}
// end cursor2 OMIT
response := struct {
Cursor string
Books []Book
}{
Books: books,
}
// start cursor3 OMIT
response.Books = books
if cursor, err := t.Cursor(); err == nil {
response.Cursor = cursor.String()
}
// end cursor3 OMIT
je := json.NewEncoder(w)
if err := je.Encode(response); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
示例4: GetFeed
func GetFeed(c mpg.Context, w http.ResponseWriter, r *http.Request) {
gn := goon.FromContext(c)
f := Feed{Url: r.FormValue("f")}
var stars []string
wg := sync.WaitGroup{}
fk := gn.Key(&f)
q := datastore.NewQuery(gn.Kind(&Story{})).Ancestor(fk).KeysOnly()
q = q.Order("-" + IDX_COL)
if cur := r.FormValue("c"); cur != "" {
if dc, err := datastore.DecodeCursor(cur); err == nil {
q = q.Start(dc)
}
} else {
// grab the stars list on the first run
wg.Add(1)
go c.Step("stars", func(c mpg.Context) {
gn := goon.FromContext(c)
usk := starKey(c, f.Url, "")
q := datastore.NewQuery(gn.Kind(&UserStar{})).Ancestor(gn.Key(usk).Parent()).KeysOnly()
keys, _ := gn.GetAll(q, nil)
stars = make([]string, len(keys))
for i, key := range keys {
stars[i] = starID(key)
}
wg.Done()
})
}
iter := gn.Run(q)
var stories []*Story
for i := 0; i < 20; i++ {
if k, err := iter.Next(nil); err == nil {
stories = append(stories, &Story{
Id: k.StringID(),
Parent: k.Parent(),
})
} else if err == datastore.Done {
break
} else {
serveError(w, err)
return
}
}
cursor := ""
if ic, err := iter.Cursor(); err == nil {
cursor = ic.String()
}
gn.GetMulti(&stories)
wg.Wait()
b, _ := json.Marshal(struct {
Cursor string
Stories []*Story
Stars []string `json:",omitempty"`
}{
Cursor: cursor,
Stories: stories,
Stars: stars,
})
w.Write(b)
}
示例5: GetStars
func GetStars(c mpg.Context, w http.ResponseWriter, r *http.Request) {
gn := goon.FromContext(c)
cu := user.Current(c)
u := User{Id: cu.ID}
q := datastore.NewQuery(gn.Key(&UserStar{}).Kind()).
Ancestor(gn.Key(&u)).
Order("-c").
Limit(20)
if cur := r.FormValue("c"); cur != "" {
if dc, err := datastore.DecodeCursor(cur); err == nil {
q = q.Start(dc)
}
}
iter := gn.Run(q)
stars := make(map[string]int64)
var us UserStar
var stories []*Story
for {
if k, err := iter.Next(&us); err == nil {
stars[starID(k)] = us.Created.Unix()
stories = append(stories, &Story{
Id: k.StringID(),
Parent: gn.Key(&Feed{Url: k.Parent().StringID()}),
})
} else if err == datastore.Done {
break
} else {
serveError(w, err)
return
}
}
cursor := ""
if ic, err := iter.Cursor(); err == nil {
cursor = ic.String()
}
var smap map[string][]*Story
if len(stories) > 0 {
gn.GetMulti(&stories)
smap = make(map[string][]*Story)
for _, s := range stories {
f := s.Parent.StringID()
smap[f] = append(smap[f], s)
}
}
b, _ := json.Marshal(struct {
Cursor string
Stories map[string][]*Story
Stars map[string]int64
}{
Cursor: cursor,
Stories: smap,
Stars: stars,
})
w.Write(b)
}
示例6: applyCursor
func applyCursor(query_in *datastore.Query, cursor_in string) (query_out *datastore.Query, err error) {
if cursor_in != "" {
cursor, err := datastore.DecodeCursor(cursor_in)
if err == nil {
return query_in.Start(cursor), nil
} else {
return query_in, err
}
} else {
return query_in, nil
}
}
示例7: decodeDatastoreCursorValue
func decodeDatastoreCursorValue(d *Decoder, v reflect.Value) error {
s, err := d.DecodeString()
if err != nil {
return err
}
cursor, err := ds.DecodeCursor(s)
if err != nil {
return err
}
v.Set(reflect.ValueOf(cursor))
return nil
}
示例8: SitemapFeed
func SitemapFeed(c mpg.Context, w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
feed := vars["feed"]
fk, err := datastore.DecodeKey(feed)
if err != nil {
serveError(w, err)
return
}
bf := base64.URLEncoding.EncodeToString([]byte(fk.StringID()))
q := datastore.NewQuery("S").KeysOnly().Ancestor(fk)
q = q.Limit(Limit)
cs := r.FormValue("c")
if len(cs) > 0 {
if cur, err := datastore.DecodeCursor(cs); err == nil {
q = q.Start(cur)
}
}
stories := make(map[string]string)
it := q.Run(c)
for {
k, err := it.Next(nil)
if err == datastore.Done {
break
} else if err != nil {
c.Errorf("next error: %v", err)
break
}
stories[k.StringID()] = base64.URLEncoding.EncodeToString([]byte(k.StringID()))
}
cs = ""
if len(stories) == Limit {
if cur, err := it.Cursor(); err == nil {
cs = cur.String()
}
}
if err := templates.ExecuteTemplate(w, "sitemap-feed.html", struct {
Feed, Feed64 string
Stories map[string]string
Cursor string
}{
Feed: feed,
Feed64: bf,
Stories: stories,
Cursor: cs,
}); err != nil {
c.Errorf("%v", err)
serveError(w, err)
return
}
}
示例9: BackendStart
func BackendStart(c mpg.Context, w http.ResponseWriter, r *http.Request) {
return
const sz = 100
ic := 0
var f func(appengine.Context)
var cs string
f = func(c appengine.Context) {
gn := goon.FromContext(c)
c.Errorf("ic: %d", ic)
wg := sync.WaitGroup{}
wg.Add(sz)
var j int64
q := datastore.NewQuery("F").KeysOnly()
if cs != "" {
if cur, err := datastore.DecodeCursor(cs); err == nil {
q = q.Start(cur)
c.Errorf("cur start: %v", cur)
}
}
it := q.Run(c)
for j = 0; j < sz; j++ {
k, err := it.Next(nil)
c.Errorf("%v: %v, %v", j, k, err)
if err != nil {
c.Criticalf("err: %v", err)
return
}
go func(k *datastore.Key) {
f := Feed{Url: k.StringID()}
if err := gn.Get(&f); err == nil {
f.Subscribe(c)
}
wg.Done()
}(k)
}
cur, err := it.Cursor()
if err == nil {
cs = cur.String()
}
wg.Wait()
ic++
runtime.RunInBackground(c, f)
}
runtime.RunInBackground(c, f)
}
示例10: GetImages
// 画像のメタデータ一覧をDSから取得します。
// TODO: 表示する画像数を絞る必要がないなら、Cursor必要ないかも。
func GetImages(c appengine.Context, cursorStr string) ([]Image, string, error) {
q := datastore.NewQuery("Image").Order("-Date")
if len(cursorStr) != 0 {
cursor, err := datastore.DecodeCursor(cursorStr)
if err != nil {
return []Image{}, "", err
}
q = q.Start(cursor)
}
images := []Image{}
iter := q.Run(c)
isNext := true
for {
var img Image
_, err := iter.Next(&img)
if err == datastore.Done {
isNext = false
break
}
if err != nil {
c.Errorf("fetching next Person: %s", err.Error())
break
}
err = img.setThumbnailURL(thumbnailsLongestSide, false)
if err != nil {
c.Errorf("%s", err.Error())
break
}
images = append(images, img)
}
if isNext {
next_cursor, err := iter.Cursor()
if err != nil {
c.Errorf("%s", err.Error())
return []Image{}, "", err
}
return images, next_cursor.String(), nil
} else {
return images, "", nil
}
}
示例11: GetPortals
func GetPortals(c appengine.Context, labels string, checkfavorited bool, favorited []string, cursor string) ([]Portal, string, error) {
q := datastore.NewQuery("Portal")
if cursor != "" {
dCursor, err := datastore.DecodeCursor(string(cursor))
if err == nil {
q = q.Start(dCursor)
}
}
if len(labels) == 0 {
q = q.Limit(30)
} else {
splits := strings.Split(labels, " ")
c.Infof("query....%s", splits)
q = q.Filter("Labels=", splits[0]).Limit(10)
}
var portals []Portal
t := q.Run(c)
for i := 0; i < 10; i++ {
var portal Portal
_, err := t.Next(&portal)
if err == datastore.Done {
break
}
if err != nil {
return portals, "", err
}
if _, err := datastore.NewQuery("Key").Filter("PortalId=", portal.Id).GetAll(c, &portal.Keys); err != nil {
return portals, "", err
}
if checkfavorited {
for _, portalid := range favorited {
if portalid == portal.Id {
portals = append(portals, portal)
}
}
} else {
portals = append(portals, portal)
}
}
cursor1, err := t.Cursor()
if err != nil {
return portals, "", err
}
return portals, cursor1.String(), nil
}
示例12: doExpire
func doExpire(c appengine.Context, expireTime time.Time, cursorString string) {
query := getExpiredQuery(expireTime).KeysOnly()
if len(cursorString) > 0 {
if cursor, err := datastore.DecodeCursor(cursorString); err != nil {
c.Errorf("Failed to decode cursor: %s", err)
return
} else {
query = query.Start(cursor)
}
}
for {
toDelete := make([]*datastore.Key, 0, 100)
for queryIterator := query.Run(c); ; {
peerKey, err := queryIterator.Next(nil)
if len(toDelete) >= 100 {
break
} else if err == datastore.Done {
c.Infof("Done finding expired peers")
break
} else if err != nil {
c.Criticalf("Failed to get next peer: %#v (%s)", err, err)
return
}
toDelete = append(toDelete, peerKey)
}
deleted := len(toDelete)
c.Infof("Deleting %d expired peers", deleted)
if err := ds.DeleteMulti(c, toDelete); err != nil {
c.Criticalf("Failed to delete peers: %#v (%s)", err, err)
return
}
if deleted <= 0 {
break
}
}
c.Infof("Finished deleting expired peers")
}
示例13: DeleteOldFeeds
func DeleteOldFeeds(c mpg.Context, w http.ResponseWriter, r *http.Request) {
ctx := appengine.Timeout(c, time.Minute)
gn := goon.FromContext(c)
q := datastore.NewQuery(gn.Kind(&Feed{})).Filter("n=", timeMax).KeysOnly()
if cur, err := datastore.DecodeCursor(r.FormValue("c")); err == nil {
q = q.Start(cur)
}
it := q.Run(ctx)
done := false
var tasks []*taskqueue.Task
for i := 0; i < 10000 && len(tasks) < 100; i++ {
k, err := it.Next(nil)
if err == datastore.Done {
c.Criticalf("done")
done = true
break
} else if err != nil {
c.Errorf("err: %v", err)
continue
}
values := make(url.Values)
values.Add("f", k.StringID())
tasks = append(tasks, taskqueue.NewPOSTTask("/tasks/delete-old-feed", values))
}
if len(tasks) > 0 {
c.Errorf("deleting %v feeds", len(tasks))
if _, err := taskqueue.AddMulti(c, tasks, ""); err != nil {
c.Errorf("err: %v", err)
}
}
if !done {
if cur, err := it.Cursor(); err == nil {
values := make(url.Values)
values.Add("c", cur.String())
taskqueue.Add(c, taskqueue.NewPOSTTask("/tasks/delete-old-feeds", values), "")
} else {
c.Errorf("err: %v", err)
}
}
}
示例14: GetFeed
func GetFeed(c mpg.Context, w http.ResponseWriter, r *http.Request) {
gn := goon.FromContext(c)
f := Feed{Url: r.FormValue("f")}
fk := gn.Key(&f)
q := datastore.NewQuery(gn.Key(&Story{}).Kind()).Ancestor(fk).KeysOnly()
q = q.Order("-" + IDX_COL)
if c := r.FormValue("c"); c != "" {
if dc, err := datastore.DecodeCursor(c); err == nil {
q = q.Start(dc)
}
}
iter := gn.Run(q)
var stories []*Story
for i := 0; i < 20; i++ {
if k, err := iter.Next(nil); err == nil {
stories = append(stories, &Story{
Id: k.StringID(),
Parent: k.Parent(),
})
} else if err == datastore.Done {
break
} else {
serveError(w, err)
return
}
}
cursor := ""
if ic, err := iter.Cursor(); err == nil {
cursor = ic.String()
}
gn.GetMulti(&stories)
b, _ := json.Marshal(struct {
Cursor string
Stories []*Story
}{
Cursor: cursor,
Stories: stories,
})
w.Write(b)
}
示例15: Sitemap
func Sitemap(c mpg.Context, w http.ResponseWriter, r *http.Request) {
q := datastore.NewQuery("F").KeysOnly()
q = q.Limit(Limit)
cs := r.FormValue("c")
if len(cs) > 0 {
if cur, err := datastore.DecodeCursor(cs); err == nil {
q = q.Start(cur)
}
}
var keys []*datastore.Key
it := q.Run(c)
for {
k, err := it.Next(nil)
if err == datastore.Done {
break
} else if err != nil {
c.Errorf("next error: %v", err)
break
}
keys = append(keys, k)
}
cs = ""
if len(keys) == Limit {
if cur, err := it.Cursor(); err == nil {
cs = cur.String()
}
}
if err := templates.ExecuteTemplate(w, "sitemap.html", struct {
Keys []*datastore.Key
Cursor string
}{
Keys: keys,
Cursor: cs,
}); err != nil {
c.Errorf("%v", err)
serveError(w, err)
return
}
}