function _fnInvalidate(settings, rowIdx, src, colIdx) {
		var row = settings.aoData[rowIdx];
		var i, ien;

		// Remove the cached data for the row
		row._aSortData = null;
		row._aFilterData = null;
		row.displayData = null;

		// Are we reading last data from DOM or the data object?
		if (src === 'dom' || ((!src || src === 'auto') && row.src === 'dom')) {
			// Read the data from the DOM
			row._aData = _fnGetRowElements(
				settings, row, colIdx, colIdx === undefined ? undefined : row._aData
			)
				.data;
		}
		else {
			// Reading from data object, update the DOM
			var cells = row.anCells;
			var display = _fnGetRowDisplay(settings, rowIdx);

			if (cells) {
				if (colIdx !== undefined) {
					_fnWriteCell(cells[colIdx], display[colIdx]);
				}
				else {
					for (i = 0, ien = cells.length; i < ien; i++) {
						_fnWriteCell(cells[i], display[i]);
					}
				}
			}
		}

		// Column specific invalidation
		var cols = settings.aoColumns;
		if (colIdx !== undefined) {
			// Type - the data might have changed
			cols[colIdx].sType = null;

			// Max length string. Its a fairly cheep recalculation, so not worth
			// something more complicated
			cols[colIdx].maxLenString = null;
		}
		else {
			for (i = 0, ien = cols.length; i < ien; i++) {
				cols[i].sType = null;
				cols[i].maxLenString = null;
			}

			// Update DataTables special `DT_*` attributes for the row
			_fnRowAttributes(settings, row);
		}
	}
Mark cached data as invalid such that a re-read of the data will occur when
the cached data is next requested. Also update from the data source object.

@param {object} settings DataTables settings object
@param {int}    rowIdx   Row index to invalidate
@param {string} [src]    Source to invalidate from: undefined, 'auto', 'dom'
    or 'data'
@param {int}    [colIdx] Column index to invalidate. If undefined the whole
    row will be invalidated
@memberof DataTable#oApi

@todo For the modularisation of v1.11 this will need to become a callback, so
  the sort and filter methods can subscribe to it. That will required
  initialisation options for sorting, which is why it is not already baked in