Ensure that accessing and updating nested buckets is ok across transactions.
(t *testing.T)
| 469 | |
| 470 | // Ensure that accessing and updating nested buckets is ok across transactions. |
| 471 | func TestBucket_Nested(t *testing.T) { |
| 472 | db := btesting.MustCreateDB(t) |
| 473 | |
| 474 | if err := db.Update(func(tx *bolt.Tx) error { |
| 475 | // Create a widgets bucket. |
| 476 | b, err := tx.CreateBucket([]byte("widgets")) |
| 477 | if err != nil { |
| 478 | t.Fatal(err) |
| 479 | } |
| 480 | |
| 481 | // Create a widgets/foo bucket. |
| 482 | _, err = b.CreateBucket([]byte("foo")) |
| 483 | if err != nil { |
| 484 | t.Fatal(err) |
| 485 | } |
| 486 | |
| 487 | // Create a widgets/bar key. |
| 488 | if err := b.Put([]byte("bar"), []byte("0000")); err != nil { |
| 489 | t.Fatal(err) |
| 490 | } |
| 491 | |
| 492 | return nil |
| 493 | }); err != nil { |
| 494 | t.Fatal(err) |
| 495 | } |
| 496 | db.MustCheck() |
| 497 | |
| 498 | // Update widgets/bar. |
| 499 | if err := db.Update(func(tx *bolt.Tx) error { |
| 500 | b := tx.Bucket([]byte("widgets")) |
| 501 | if err := b.Put([]byte("bar"), []byte("xxxx")); err != nil { |
| 502 | t.Fatal(err) |
| 503 | } |
| 504 | return nil |
| 505 | }); err != nil { |
| 506 | t.Fatal(err) |
| 507 | } |
| 508 | db.MustCheck() |
| 509 | |
| 510 | // Cause a split. |
| 511 | if err := db.Update(func(tx *bolt.Tx) error { |
| 512 | var b = tx.Bucket([]byte("widgets")) |
| 513 | for i := 0; i < 10000; i++ { |
| 514 | if err := b.Put([]byte(strconv.Itoa(i)), []byte(strconv.Itoa(i))); err != nil { |
| 515 | t.Fatal(err) |
| 516 | } |
| 517 | } |
| 518 | return nil |
| 519 | }); err != nil { |
| 520 | t.Fatal(err) |
| 521 | } |
| 522 | db.MustCheck() |
| 523 | |
| 524 | // Insert into widgets/foo/baz. |
| 525 | if err := db.Update(func(tx *bolt.Tx) error { |
| 526 | var b = tx.Bucket([]byte("widgets")) |
| 527 | if err := b.Bucket([]byte("foo")).Put([]byte("baz"), []byte("yyyy")); err != nil { |
| 528 | t.Fatal(err) |
nothing calls this directly
no test coverage detected