// Rollback is for rolling back the transaction func (tx *Transaction) Rollback() { if tx.finished { return } d, lock := driver.Get() defer lock.Unlock() d.Rollback(tx.tx) tx.finished = true }
// Begin is for creating proper transaction func Begin() (*Transaction, error) { d, lock := driver.Get() defer lock.Unlock() tx, err := d.Begin() if err != nil { return nil, fmt.Errorf("Unable to begin transaction - %s", err) } return &Transaction{ tx: tx, }, nil }
// Commit is for committing the transaction func (tx *Transaction) Commit() error { if tx.finished { return errors.New("Unable to commit transaction - Current transaction is already finished") } d, lock := driver.Get() defer lock.Unlock() if err := d.Commit(tx.tx); err != nil { return fmt.Errorf("Unable to commit transaction - %s", err) } tx.finished = true return nil }
func save(tx interface{}, record interface{}) error { d, lock := driver.Get() defer lock.Unlock() meta, err := getMetadata(record) if err != nil { return err } fields, err := fieldsFor(&meta, record) if err != nil { return fmt.Errorf("Unable to fetch fields for record %+v", record) } idField := meta.primary if err := ensureHasID(record, idField); err != nil { return err } isNew, err := isNewRecord(record, idField) if err != nil { return fmt.Errorf("Unable to determine if record %+v is new - %s", record, err) } if isNew { if err := d.Create(tx, meta.tablename, fields, &idField); err != nil { return fmt.Errorf("Unable to create record %+v - %s", record, err) } if err := assignField(record, idField); err != nil { return fmt.Errorf("Unable to assign primary field for record %+v - %s", record, err) } } else { if err := populateFieldValue(record, &idField); err != nil { return fmt.Errorf("Unable to fetch primary field from record %+v - %s", record, err) } if err := d.Update(tx, meta.tablename, fields, idField); err != nil { return fmt.Errorf("Unable to update record %+v - %s", record, err) } } return nil }
// All is for fetching all records func (c *Context) All(records interface{}) error { d, lock := driver.Get() defer lock.Unlock() meta, err := getMetadata(records) if err != nil { return err } fieldss, err := d.All(meta.tablename, meta.fields, c) if err != nil { return fmt.Errorf("Unable to fetch all records - %s", err) } if err := populateRecordsFromFieldss(records, fieldss); err != nil { return fmt.Errorf("Unable to fetch all records - %s", err) } return nil }
// First is for fetching only one specific record func (c *Context) First(record interface{}, query string, args ...interface{}) error { d, lock := driver.Get() defer lock.Unlock() meta, err := getMetadata(record) if err != nil { return err } fields, err := d.First(meta.tablename, meta.fields, c, query, args...) if err != nil { return fmt.Errorf("Unable to fetch specific records - %s", err) } if err := setFields(record, fields); err != nil { return fmt.Errorf("Unable to assign fields for the record - %s", err) } return nil }
// Where is for fetching specific records func (c *Context) Where(records interface{}, query string, args ...interface{}) error { d, lock := driver.Get() defer lock.Unlock() meta, err := getMetadata(records) if err != nil { return err } fieldss, err := d.Where(meta.tablename, meta.fields, c, query, args...) if err != nil { return fmt.Errorf("Unable to fetch specific records - %s", err) } if err := populateRecordsFromFieldss(records, fieldss); err != nil { return fmt.Errorf("Unable to fetch specific records - %s", err) } return nil }
func get(tx interface{}, ID interface{}, record interface{}) error { d, lock := driver.Get() defer lock.Unlock() meta, err := getMetadata(record) if err != nil { return err } idField := meta.primary idField.Value = ID fields, err := d.Get(tx, meta.tablename, meta.fields, idField) if err != nil { return fmt.Errorf("Unable to find record - %s", err) } if err := setFields(record, fields); err != nil { return fmt.Errorf("Unable to construct found record - %s", err) } return nil }
func remove(tx interface{}, record interface{}) error { d, lock := driver.Get() defer lock.Unlock() meta, err := getMetadata(record) if err != nil { return err } idField := meta.primary if err := ensureHasID(record, idField); err != nil { return err } if err := populateFieldValue(record, &idField); err != nil { return fmt.Errorf("Unable to populate primary field of record %+v - %s", record, err) } if err := d.Remove(tx, meta.tablename, idField); err != nil { return fmt.Errorf("Unable to remove record %+v - %s", record, err) } return nil }
func exec(tx interface{}, query string, args ...interface{}) error { d, lock := driver.Get() defer lock.Unlock() return d.Exec(tx, query, args...) }