分析一下下面这段代码:ds = datastores_get_ds(dsid); if (ds == NULL) { return (nc_reply_error(nc_err_new(NC_ERR_OP_FAILED))); } //DBG("%s/%d ds->datastore->name %s", //__func__,__LINE__,ds->data_model->name); //xmlContentPrintALL(((struct ncds_ds_file*)ds)->xml); op = nc_rpc_get_op(rpc); /* if transapi used AND operation will affect running repository => store current running content */ i = pthread_mutex_lock(&ds->lock); if (i != 0) { ERROR("Failed to lock datastore (%s).", strerror(errno)); return (NULL); } DBG("%s/%d op %d target %d",__func__,__LINE__,op,nc_rpc_get_target(rpc)); if (ds->transapis != NULL && (op == NC_OP_COMMIT || op == NC_OP_COPYCONFIG || (op == NC_OP_EDITCONFIG && (nc_rpc_get_testopt(rpc) != NC_EDIT_TESTOPT_TEST))) && (nc_rpc_get_target(rpc) == NC_DATASTORE_RUNNING)) { old_data = ds->func.getconfig(ds, session, NC_DATASTORE_RUNNING, &e); old = read_datastore_data(ds->id, old_data); if (old == NULL) {/* cannot get or parse data */ pthread_mutex_unlock(&ds->lock); if (e == NULL) { /* error not set */ e = nc_err_new(NC_ERR_OP_FAILED); nc_err_set(e, NC_ERR_PARAM_MSG, "TransAPI: Failed to get data from RUNNING datastore."); } return nc_reply_error(e); } free(old_data); } filter = NULL;
时间: 2024-04-23 22:22:34 浏览: 177
go-ds-pebble:已弃用,转到https:github.comRTradeLtdgo-datastores
这段代码主要是从数据存储中获取数据,并根据操作类型和目标数据存储是否为“running”来决定是否使用事务API。具体来说,它会获取一个数据存储的指针,如果指针为空,则返回一个操作失败的错误消息。然后,它会尝试获取一个锁,如果获取锁失败,则返回 NULL。接下来,它会检查操作类型和目标数据存储是否为“running”,如果是,则使用事务API来获取旧的数据。最后,它将过滤器设置为 NULL。
阅读全文