Пример #1
0
// Executes triggers according to the table operation.
func ExecuteTrigger(db *database.Database, t *table.Table, r *ra.Result, operation string, row1, row2 map[string]string) int {
	for column, _ := range row1 {
		raCopy := r.Copy()
		// Filter according to the column name and operation type.
		raCopy.MultipleSelect(ra.Condition{Alias: "COLUMN", Filter: filter.Eq{}, Parameter: column},
			ra.Condition{Alias: "OP", Filter: filter.Eq{}, Parameter: operation})
		// For each trigger.
		for i := 0; i < raCopy.NumberOfRows(); i++ {
			row, status := raCopy.Read(i)
			if status != st.OK {
				return status
			}
			/*
				Call the trigger function. Parameters given are:
				reference to database
				reference to table
				column name
				extra parameters as stored in trigger lookup table
				row1
				row2

				When insert, row1 is the new row, row2 is nil.
				When update, row1 is the new row, row2 is the old row.
				When delete, row1 is the deleted row, row2 is nil.
			*/
			status = TriggerFuncTable()[row["FUNC"]].Execute(db, t, column, strings.Split(strings.TrimSpace(row["PARAM"]), ";"), row1, row2)
			if status != st.OK {
				return status
			}
		}
	}
	return st.OK
}
Пример #2
0
// Deletes rows in a table of RA result according to some select conditions.
// The RA result is made a copy before using select conditions.
func findAndDelete(t *table.Table, query *ra.Result, conditions ...ra.Condition) int {
	_, status := query.Copy().MultipleSelect(conditions...)
	if status != st.OK {
		return status
	}
	for _, i := range query.Tables[t.Name].RowNumbers {
		status = t.Delete(i)
		if status != st.OK {
			return status
		}
	}
	return t.Flush()
}