sdk/sdk.go
func SegmentDatastoreBegin(id, parent int64, table, operation, sql, sqlTraceRollupName string) (int64, error) {
	ctable := C.CString(table)
	defer C.free(unsafe.Pointer(ctable))

	coperation := C.CString(operation)
	defer C.free(unsafe.Pointer(coperation))

	csql := C.CString(sql)
	defer C.free(unsafe.Pointer(csql))

	csqlTraceRollupName := C.CString(sqlTraceRollupName)
	defer C.free(unsafe.Pointer(csqlTraceRollupName))

	return errNoLong(C.newrelic_segment_datastore_begin(
		C.long(id),
		C.long(parent),
		ctable,
		coperation,
		csql,
		csqlTraceRollupName,
		(*[0]byte)(C.newrelic_basic_literal_replacement_obfuscator),
	))
}
func SegmentDatastoreBegin(id, parent int64, table, operation, sql, sqlTraceRollupName string) (int64, error) {
	ctable := C.CString(table)
	defer C.free(unsafe.Pointer(ctable))

	coperation := C.CString(operation)
	defer C.free(unsafe.Pointer(coperation))

	csql := C.CString(sql)
	defer C.free(unsafe.Pointer(csql))

	csqlTraceRollupName := C.CString(sqlTraceRollupName)
	defer C.free(unsafe.Pointer(csqlTraceRollupName))

	return errNoLong(C.newrelic_segment_datastore_begin(
		C.long(id),
		C.long(parent),
		ctable,
		coperation,
		csql,
		csqlTraceRollupName,
		(*[0]byte)(C.newrelic_basic_literal_replacement_obfuscator),
	))
}
/*
 * Identify the beginning of a segment that performs a database operation.
 *
 *
 * SQL Obfuscation
 * ===============
 * If you supply the sql_obfuscator parameter with NULL, the supplied SQL string
 * will go through our basic literal replacement obfuscator that strips the SQL
 * string literals (values between single or double quotes) and numeric
 * sequences, replacing them with the ? character. For example:
 *
 * This SQL:
 * 		SELECT * FROM table WHERE ssn=‘000-00-0000’
 *
 * obfuscates to:
 * 		SELECT * FROM table WHERE ssn=?
 *
 * Because our default obfuscator just replaces literals, there could be
 * cases that it does not handle well. For instance, it will not strip out
 * comments from your SQL string, it will not handle certain database-specific
 * language features, and it could fail for other complex cases.
 *
 * If this level of obfuscation is not sufficient, you can supply your own
 * custom obfuscator via the sql_obfuscator parameter.
 *
 * SQL Trace Rollup
 * ================
 * The agent aggregates similar SQL statements together using the supplied
 * sql_trace_rollup_name.
 *
 * To make the most out of this feature, you should either (1) supply the
 * sql_trace_rollup_name parameter with a name that describes what the SQL is
 * doing, such as "get_user_account" or (2) pass it NULL, in which case
 * it will use the sql obfuscator to generate a name.
 *
 * @param transaction_id  id of transaction
 * @param parent_segment_id  id of parent segment
 * @param table  name of the database table
 * @param operation  name of the sql operation
 * @param sql  the sql string
 * @param sql_trace_rollup_name  the rollup name for the sql trace
 * @param sql_obfuscator  a function pointer that takes sql and obfuscates it
 * @return  segment id on success, else negative warning code or error code
 */