diff --git a/doc/decent/quickstart.md b/doc/decent/quickstart.md index 43210c81c7..16fcabbbec 100644 --- a/doc/decent/quickstart.md +++ b/doc/decent/quickstart.md @@ -37,7 +37,7 @@ The steps you’ll need to take are: 1. Vendor the code into your project. 1. Set `NOMS_VERSION_NEXT=1` in your environment. -1. Decide which type of storage you'd like to use: memory (convenient for playing around), disk, IPFS, or S3. (If you'd to implement a store on top of another type of storage that's possible too; email us or reach out on slack and we can help.) +1. Decide which type of storage you'd like to use: memory (convenient for playing around), disk, IPFS, or S3. (If you want to implement a store on top of another type of storage that's possible too; email us or reach out on slack and we can help.) 1. Set up and instantiate a database for your storage. Generally, you give a [dataset spec](https://github.com/attic-labs/noms/blob/master/doc/spelling.md) like `mem::mydataset` to a [`config.Resolver`](https://github.com/attic-labs/noms/blob/master/go/config/resolver.go) which gives you a handle to the [`Database`](https://github.com/attic-labs/noms/blob/master/go/datas/database.go) and [`Dataset`](https://github.com/attic-labs/noms/blob/master/go/datas/dataset.go). * **Memory**: no setup required, just instantiate it: ``` @@ -49,9 +49,10 @@ The steps you’ll need to take are: cfg := config.NewResolver() database, dataset, err := cfg.GetDataset("/path/to/chunks::test") // Dataset name is "test" ``` - * **IPFS**: ??? setup + * **IPFS**: identify an IPFS node by directory. If an IPFS node doesn't exist at that directory, one will be created: ``` - ???? + cfg := config.NewResolver() + database, dataset, err := cfg.GetDataset("ipfs:/path/to/chunks::test") // Dataset name is "test" ``` * **S3**: Follow the [S3 setup instructions](https://github.com/attic-labs/noms/blob/master/go/nbs/NBS-on-AWS.md) then instantiate a database and dataset: ``` @@ -60,46 +61,69 @@ The steps you’ll need to take are: database := datas.NewDatabase(store) dataset := database.GetDataset("aws://dynamo-table:s3-bucket/store-name::test") // Dataset name is "test" ``` -1. Implement using the [Go API](../go-tour.md). If you're just playing around you could try something like this. +1. Implement using the [Go API](../go-tour.md). If you're just playing around you could try something like this (source code can be found in [quickstart.go](https://github.com/attic-labs/noms/blob/master/samples/go/quickstart/quickstart.go)). ``` - func newPerson(givenName string, male bool) types.Struct { - return types.NewStruct("Person", types.StructData{ - "given": types.String(givenName), - "male": types.Bool(male), - }) - } - - data := types.NewList(database, - newPerson("Rickon", true), - newPerson("Bran", true), - newPerson("Arya", false), - newPerson("Sansa", false), + // Copyright 2017 Attic Labs, Inc. All rights reserved. + // Licensed under the Apache License, version 2.0: + // http://www.apache.org/licenses/LICENSE-2.0 + + package main + + import ( + "fmt" + "os" + + "github.com/attic-labs/noms/go/spec" + "github.com/attic-labs/noms/go/types" ) - fmt.Fprintf(os.Stdout, "data type: %v\n", types.TypeOf(data).Describe()) - _, err = db.CommitValue(sp.GetDataset(), data) - if err != nil { - fmt.Fprint(os.Stderr, "Error commiting: %s\n", err) + + // Usage: quickstart /path/to/store::ds + func main() { + sp, err := spec.ForDataset(os.Args[1]) + if err != nil { + fmt.Fprintf(os.Stderr, "Unable to parse spec: %s, error: %s\n", sp, err) + os.Exit(1) + } + defer sp.Close() + + db := sp.GetDatabase() + if headValue, ok := sp.GetDataset().MaybeHeadValue(); !ok { + data := types.NewList(sp.GetDatabase(), + newPerson("Rickon", true), + newPerson("Bran", true), + newPerson("Arya", false), + newPerson("Sansa", false), + ) + + fmt.Fprintf(os.Stdout, "data type: %v\n", types.TypeOf(data).Describe()) + _, err = db.CommitValue(sp.GetDataset(), data) + if err != nil { + fmt.Fprint(os.Stderr, "Error commiting: %s\n", err) + os.Exit(1) + } + } else { + // type assertion to convert Head to List + personList := headValue.(types.List) + // type assertion to convert List Value to Struct + personStruct := personList.Get(0).(types.Struct) + // prints: Rickon + fmt.Fprintf(os.Stdout, "given: %v\n", personStruct.Get("given")) + } } - sp, err := spec.ForDataset("") - if err != nil { - fmt.Fprintf(os.Stderr, "Could not create dataset: %s\n", err) - return + func newPerson(givenName string, male bool) types.Struct { + return types.NewStruct("Person", types.StructData{ + "given": types.String(givenName), + "male": types.Bool(male), + }) } - defer sp.Close() - - if headValue, ok := sp.GetDataset().MaybeHeadValue(); !ok { - fmt.Fprintf(os.Stdout, "head is empty\n") - } else { - // type assertion to convert Head to List - personList := headValue.(types.List) - // type assertion to convert List Value to Struct - personStruct := personList.Get(0).(types.Struct) - // prints: Rickon - fmt.Fprintf(os.Stdout, "given: %v\n", personStruct.Get("given")) - } - ``` -1. You can inspect data that you've committed via the [noms command-line interface](https://github.com/attic-labs/noms/blob/master/doc/cli-tour.md). Consider creating a [.nomsconfig](https://github.com/attic-labs/noms/blob/master/samples/cli/nomsconfig/README.md) file to save the trouble of writing database specs on the command line. + ``` +1. You can inspect data that you've committed via the [noms command-line interface](https://github.com/attic-labs/noms/blob/master/doc/cli-tour.md). For example: + ``` + noms log /path/to/store::ds + noms show /path/to/store::ds + ``` + Try Consider creating a [.nomsconfig](https://github.com/attic-labs/noms/blob/master/samples/cli/nomsconfig/README.md) file to save the trouble of writing database specs on the command line. * Note that Memory tables won't be inspectable because they exist only in the memory of the process that created them. 1. Implement pull and merge. The [pull API](../../go/datas/pull.go) is used pull changes from a peer and the [merge API](../../go/merge/) is used to merge changes before commit. There's an [example of merging in the IPFS-based-chat sample app](https://github.com/attic-labs/noms/blob/master/samples/go/ipfs-chat/pubsub.go).