You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
boundary/internal/db
Michael Gaffney 87492816cb
Replace immutable_create_time_func with immutable_columns (#231)
6 years ago
..
assert update dbassert dep (#100) 6 years ago
common oplog support for null field updates (#107) 6 years ago
db_test Simplify SetTableName pattern (#214) 6 years ago
migrations Replace immutable_create_time_func with immutable_columns (#231) 6 years ago
timestamp Update Watchtower to use grpc-gateway v2 (#204) 6 years ago
README.md Rename GormReadWriter -> Db 6 years ago
backoff.go basic internal db interfaces and Gorm implementation 6 years ago
db.go Use dockertest v3 consistently (#167) 6 years ago
db_test.go ErrRecordNotFound from LookupWhere() when no rows found (#59) 6 years ago
domains_test.go define immutable fields including PKs. (#205) 6 years ago
error.go Add function to check if db error is a check constraint violation (#142) 6 years ago
error_test.go Add function to check if db error is a check constraint violation (#142) 6 years ago
id.go iam and auth integration (#144) 6 years ago
id_test.go iam and auth integration (#144) 6 years ago
option.go Convert option db.WithVersion to *uint32 (#195) 6 years ago
option_test.go Convert option db.WithVersion to *uint32 (#195) 6 years ago
read_writer.go Allow lookupAfterWrite for resources with Private Ids (#229) 6 years ago
read_writer_test.go Allow lookupAfterWrite for resources with Private Ids (#229) 6 years ago
testing.go Creating Auth Token Repo (#125) 6 years ago
testing_test.go Pushing test db cleanup up to where the database objects are created using t.Cleanup. (#166) 6 years ago

README.md

db package

Usage

Just some high-level usage highlights to get you started. Read the godocs for a complete list of capabilities and their documentation.

    conn, _ := gorm.Open("postgres", url)
    
    // Db implements both the Reader and Writer interfaces
    rw := Db{Tx: conn}
    
    // There are writer methods like: Create, Update and Delete
    // that will write Gorm struct to the db.  These writer methods
    // all support options for writing Oplog entries for the 
    // caller: WithOplog(yourWrapper, yourMetadata)
    // the caller is responsible for the transaction life cycle of the writer
    // and if an error is returned the caller must decide what to do with 
    // the transaction, which is almost always a rollback for the caller.
    err = rw.Create(context.Background(), user)
   
    // There are reader methods like: LookupByPublicId,  
    // LookupByName, SearchBy, LookupBy, etc
    // which will lookup resources for you and scan them into your Gorm struct
    err = rw.LookupByPublicId(context.Background(), foundUser)

    // There's reader ScanRows that facilitates scanning rows from 
    // a "raw" SQL query into your Gorm struct
    tx, err := rw.DB()
    where := "select * from test_users where name in ($1, $2)"
    rows, err := tx.Query(where, "alice", "bob")
	defer rows.Close()
	for rows.Next() {
        user := db_test.NewTestUser()
        // scan the row into your Gorm struct
		if err := rw.ScanRows(rows, &user); err != nil {
            return err
        }
        // Do something with the Gorm user struct
    }

    // DoTx is a writer function that wraps a TxHandler 
    // in a retryable transaction.  You simply implement a
    // TxHandler that does your writes and hand the handler
    // to DoTx, which will wrap the writes in a retryable 
    // transaction with the retry attempts and backoff
    // strategy you specify via options.
    _, err = w.DoTx(
        context.Background(),
        10,           // ten retries
        ExpBackoff{}, // exponential backoff
        func(w Writer) error {
            // the TxHandler updates the user's friendly name
            return w.Update(context.Background(), user, []string{"FriendlyName"},
                // write oplogs for this update
                WithOplog(
                    InitTestWrapper(t),
                    oplog.Metadata{
                        "key-only":   nil,
                        "deployment": []string{"amex"},
                        "project":    []string{"central-info-systems", "local-info-systems"},
                    },
                ),
            )
        })