| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- //go:build js && wasm
- // +build js,wasm
- package idb
- import (
- "github.com/hack-pad/go-indexeddb/idb/internal/jscache"
- "github.com/hack-pad/safejs"
- )
- // Database provides a connection to a database. You can use a Database object to open a transaction on your database then create, manipulate, and delete objects (data) in that database.
- type Database struct {
- jsDB safejs.Value
- callStrings jscache.Strings
- }
- func wrapDatabase(jsDB safejs.Value) *Database {
- return &Database{jsDB: jsDB}
- }
- // Name returns the name of the connected database.
- func (db *Database) Name() (string, error) {
- value, err := db.jsDB.Get("name")
- if err != nil {
- return "", err
- }
- return value.String()
- }
- // Version returns the version of the connected database.
- func (db *Database) Version() (uint, error) {
- value, err := db.jsDB.Get("version")
- if err != nil {
- return 0, err
- }
- intValue, err := value.Int()
- return uint(intValue), err
- }
- // ObjectStoreNames returns a list of the names of the object stores currently in the connected database.
- func (db *Database) ObjectStoreNames() ([]string, error) {
- array, err := db.jsDB.Get("objectStoreNames")
- if err != nil {
- return nil, err
- }
- return stringsFromArray(array)
- }
- // CreateObjectStore creates and returns a new object store or index.
- func (db *Database) CreateObjectStore(name string, options ObjectStoreOptions) (*ObjectStore, error) {
- jsObjectStore, err := db.jsDB.Call("createObjectStore", name, map[string]interface{}{
- "autoIncrement": options.AutoIncrement,
- "keyPath": options.KeyPath,
- })
- if err != nil {
- return nil, tryAsDOMException(err)
- }
- return wrapObjectStore(nil, jsObjectStore), nil
- }
- // DeleteObjectStore destroys the object store with the given name in the connected database, along with any indexes that reference it.
- func (db *Database) DeleteObjectStore(name string) error {
- _, err := db.jsDB.Call("deleteObjectStore", name)
- return tryAsDOMException(err)
- }
- // Close closes the connection to a database.
- func (db *Database) Close() error {
- _, err := db.jsDB.Call("close")
- return tryAsDOMException(err)
- }
- // Transaction returns a transaction object containing the Transaction.ObjectStore() method, which you can use to access your object store.
- func (db *Database) Transaction(mode TransactionMode, objectStoreName string, objectStoreNames ...string) (_ *Transaction, err error) {
- return db.TransactionWithOptions(TransactionOptions{Mode: mode}, objectStoreName, objectStoreNames...)
- }
- // TransactionOptions contains all available options for creating and starting a Transaction
- type TransactionOptions struct {
- Mode TransactionMode
- Durability TransactionDurability
- }
- // TransactionWithOptions returns a transaction object containing the Transaction.ObjectStore() method, which you can use to access your object store.
- func (db *Database) TransactionWithOptions(options TransactionOptions, objectStoreName string, objectStoreNames ...string) (*Transaction, error) {
- objectStoreNames = append([]string{objectStoreName}, objectStoreNames...) // require at least one name
- optionsMap := make(map[string]interface{})
- if options.Durability != DurabilityDefault {
- optionsMap["durability"] = options.Durability.jsValue()
- }
- args := []interface{}{sliceFromStrings(objectStoreNames), options.Mode.jsValue()}
- if len(optionsMap) > 0 {
- args = append(args, optionsMap)
- }
- jsTxn, err := db.jsDB.Call("transaction", args...)
- if err != nil {
- return nil, tryAsDOMException(err)
- }
- return wrapTransaction(db, jsTxn), nil
- }
|