set method

Future<void> set(
  1. T data,
  2. [SetOptions? options,
  3. dynamic transObj]
)

Sets the data for the document, optionally merging.

Parameters:

  • data: The data to set.
  • options: Optional set options (merge, etc.).
  • transObj: Optional transaction object.

Returns: A Future that completes when the set is done.

Example:

await docRef.set({'name': 'John'}, SetOptions(merge: true));

Implementation

Future<void> set(T data, [SetOptions? options, dynamic transObj]) async {
  if (toConverter != null) {
    data = toConverter(data);
  }
  if (options == null) {
    options = SetOptions(merge: false);
  }
  if (transObj == null) {
    transObj = {"name": "", "start": 0, "end": 0};
  }
  ;
  FusabaseAuth auth = FusabaseAuth.instanceFor(app: this._oracledb.app);
  dynamic finalData = convertMap(data as Map<Object, Object?>);

  String? accessToken = await getAccessToken(auth);

  if (checkOracledbApiVersion(
    _oracledb.app.options,
    OracledbVersion["VERSION_1"] ?? 1,
  )) {
    if (options != null &&
        (options.merge == true ||
            (options.mergeFields != null &&
                options.mergeFields!.isNotEmpty))) {
      dynamic docData;
      try {
        docData = await get(null, {
          "name": transObj["name"],
          "start": transObj["start"],
          "end": 0,
          "version": transObj["version"],
        });
        if (transObj["start"] == 1) {
          transObj["start"] = 0;
        }
      } catch (e) {
        final error = Exception("No such doc exists!");
        throw error;
      }
      finalData = updateNestedData(
        this,
        docData._data,
        convertMap(finalData),
      );
    } else {
      finalData = setWholeData(this, {}, convertMap(finalData), false);
    }
    finalData = parseTimestamp(finalData);
  } else if (checkOracledbApiVersion(
    _oracledb.app.options,
    OracledbVersion["VERSION_2"] ?? 2,
  )) {
    if (options != null && options.merge == true) {
      finalData = createPayloadForUpdateVersion2New(
        this,
        finalData,
        options.merge ?? true,
      );
    } else {
      finalData = setWholeData(this, {}, convertMap(finalData), true);
      finalData = serializeVersion2(this, finalData, false);
    }
    finalData = parseTimestamp(finalData);
    finalData = rearrangeBodyOfVersion2(finalData);
  }

  dynamic result = await _helper.setdoc(
    client: createClient(_oracledb.app),
    docRef: this,
    data: finalData,
    logLevel: this.__logLevel,
    accessToken: accessToken,
    options: options,
    transObj: transObj,
  );
  if (result["OID"] == null) {
    throw Utils.oracledbErrorHandler(500, "setDoc failed!", null);
  }
  return;
}