bindFields method

void bindFields(
  1. bool binding
)

Implementation

void bindFields(bool binding) {
  // { FieldNo is set to -1 for calculated/lookup fields, to 0 for
  //   unbound field and for bound fields it is set to
  //   FieldDef.FieldNo } (original comment kept as-is)
  _calcFieldsSize = 0;
  _blobFieldCount = 0;
  for (var i = 0; i < fields.count; i++) {
    final field = fields[i];
    field._fieldDef = null;
    if (!binding) {
      field._fieldNo = 0;
    } else if (field.fieldKind == TFieldKind.fkCalculated ||
        field.fieldKind == TFieldKind.fkLookup) {
      field._fieldNo = -1;
      field._offset = _calcFieldsSize;
      _calcFieldsSize += field.dataSize + 1;
    } else {
      final fieldIndex = fieldDefs.indexOfName(field.fieldName);
      if (fieldIndex == -1) {
        databaseErrorFmt(SFieldNotFound, [field.fieldName], this);
      } else {
        final fieldDef = fieldDefs[fieldIndex];
        field._fieldDef = fieldDef;
        field._fieldNo = fieldDef.fieldNo;
        if (fieldDef.internalCalcField) {
          _internalCalcFields = true;
        }
        if (field.isBlob) {
          field._size = fieldDef.size;
          field._offset = _blobFieldCount;
          _blobFieldCount++;
        }
        // synchronize CodePage between TFieldDef and TField (original comment)
        if (field is TStringField) {
          field._codePage = fieldDef.codePage;
        } else if (field is TMemoField) {
          field._codePage = fieldDef.codePage;
        }
      }
    }
    field.bind(binding);
  }
}