aboutsummaryrefslogtreecommitdiffstats
path: root/examples/object_storage
diff options
context:
space:
mode:
Diffstat (limited to 'examples/object_storage')
-rw-r--r--examples/object_storage/main.go75
-rw-r--r--examples/object_storage/storage.go89
2 files changed, 164 insertions, 0 deletions
diff --git a/examples/object_storage/main.go b/examples/object_storage/main.go
new file mode 100644
index 0000000..5cba6e6
--- /dev/null
+++ b/examples/object_storage/main.go
@@ -0,0 +1,75 @@
+package main
+
+import (
+ "fmt"
+ "io"
+ "os"
+ "time"
+
+ "github.com/aerospike/aerospike-client-go"
+
+ "gopkg.in/src-d/go-git.v3"
+)
+
+func main() {
+ url := os.Args[2]
+ r, err := git.NewRepository(url, nil)
+ if err != nil {
+ panic(err)
+ }
+
+ client, err := aerospike.NewClient("127.0.0.1", 3000)
+ if err != nil {
+ panic(err)
+ }
+
+ r.Storage = NewAerospikeObjectStorage(url, client)
+
+ switch os.Args[1] {
+ case "pull":
+ pull(r)
+ case "list":
+ list(r)
+ default:
+ panic("unknown option")
+ }
+}
+
+func pull(r *git.Repository) {
+ fmt.Printf("Retrieving %q ...\n", os.Args[2])
+ start := time.Now()
+
+ if err := r.PullDefault(); err != nil {
+ panic(err)
+ }
+
+ fmt.Printf("Time elapsed %s\n", time.Since(start))
+}
+
+func list(r *git.Repository) {
+ fmt.Printf("Listing commits from %q ...\n", os.Args[1])
+
+ iter, err := r.Commits()
+ if err != nil {
+ panic(err)
+ }
+ defer iter.Close()
+
+ var count int
+ for {
+ //the commits are not shorted in any special order
+ commit, err := iter.Next()
+ if err != nil {
+ if err == io.EOF {
+ break
+ }
+
+ panic(err)
+ }
+
+ count++
+ fmt.Println(commit)
+ }
+
+ fmt.Printf("Total number of commits %d\n", count)
+}
diff --git a/examples/object_storage/storage.go b/examples/object_storage/storage.go
new file mode 100644
index 0000000..c1e06a0
--- /dev/null
+++ b/examples/object_storage/storage.go
@@ -0,0 +1,89 @@
+package main
+
+import (
+ "fmt"
+ "io"
+
+ "gopkg.in/src-d/go-git.v3/core"
+ "gopkg.in/src-d/go-git.v3/storage/memory"
+
+ "github.com/aerospike/aerospike-client-go"
+)
+
+// CREATE INDEX commits ON test.commit (url) STRING;
+// CREATE INDEX blobs ON test.blob (url) STRING;
+
+type AerospikeObjectStorage struct {
+ url string
+ client *aerospike.Client
+}
+
+func NewAerospikeObjectStorage(url string, c *aerospike.Client) *AerospikeObjectStorage {
+ return &AerospikeObjectStorage{url, c}
+}
+
+func (o *AerospikeObjectStorage) Set(obj core.Object) (core.Hash, error) {
+ key, err := aerospike.NewKey("test", obj.Type().String(), obj.Hash().String())
+ if err != nil {
+ return obj.Hash(), err
+ }
+
+ bins := aerospike.BinMap{
+ "url": o.url,
+ "hash": obj.Hash().String(),
+ "type": obj.Type().String(),
+ "blob": obj.Content(),
+ }
+
+ err = o.client.Put(nil, key, bins)
+ fmt.Println(err, key)
+ return obj.Hash(), err
+}
+
+func (o *AerospikeObjectStorage) Get(h core.Hash) (core.Object, error) {
+ key, err := keyFromObject(h)
+ if err != nil {
+ return nil, err
+ }
+
+ rec, err := o.client.Get(nil, key)
+ if err != nil {
+ return nil, err
+ }
+
+ fmt.Println(rec.Bins)
+ return nil, core.ErrObjectNotFound
+}
+
+func (o *AerospikeObjectStorage) Iter(t core.ObjectType) (core.ObjectIter, error) {
+ s := aerospike.NewStatement("test", t.String())
+ err := s.Addfilter(aerospike.NewEqualFilter("url", o.url))
+
+ rs, err := o.client.Query(nil, s)
+ if err != nil {
+ return nil, err
+ }
+
+ return &AerospikeObjectIter{t, rs.Records}, nil
+}
+
+func keyFromObject(h core.Hash) (*aerospike.Key, error) {
+ return aerospike.NewKey("test", "objects", h.String())
+}
+
+type AerospikeObjectIter struct {
+ t core.ObjectType
+ ch chan *aerospike.Record
+}
+
+func (i *AerospikeObjectIter) Next() (core.Object, error) {
+ r := <-i.ch
+ if r == nil {
+ return nil, io.EOF
+ }
+
+ content := r.Bins["blob"].([]byte)
+ return memory.NewObject(i.t, int64(len(content)), content), nil
+}
+
+func (i *AerospikeObjectIter) Close() {}