Exemplo n.º 1
0
// 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
}
Exemplo n.º 2
0
// 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
}
Exemplo n.º 3
0
// 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
}
Exemplo n.º 4
0
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
}
Exemplo n.º 5
0
// 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
}
Exemplo n.º 6
0
// 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
}
Exemplo n.º 7
0
// 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
}
Exemplo n.º 8
0
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
}
Exemplo n.º 9
0
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
}
Exemplo n.º 10
0
func exec(tx interface{}, query string, args ...interface{}) error {
	d, lock := driver.Get()
	defer lock.Unlock()
	return d.Exec(tx, query, args...)
}