int ln(const char *s1, const char *s2) { int (*flink)(const char *, const char *) = sflag ? symlink : link; if(flink(s1, s2) == 0) return 0; if(fflag && errno == EEXIST) { if(remove(s2) == -1) eprintf("remove %s:", s2); return flink(s1, s2); } return -1; }
void QgsRelationEditorWidget::addFeature() { QgsAttributeMap keyAttrs; const QgsVectorLayerTools* vlTools = mEditorContext.vectorLayerTools(); if ( mNmRelation.isValid() ) { // n:m Relation: first let the user create a new feature on the other table // and autocreate a new linking feature. QgsFeature f; if ( vlTools->addFeature( mNmRelation.referencedLayer(), QgsAttributeMap(), QgsGeometry(), &f ) ) { QgsFeature flink( mRelation.referencingLayer()->fields() ); // Linking feature flink.setAttribute( mRelation.fieldPairs().at( 0 ).first, mFeature.attribute( mRelation.fieldPairs().at( 0 ).second ) ); flink.setAttribute( mNmRelation.referencingFields().at( 0 ), f.attribute( mNmRelation.referencedFields().at( 0 ) ) ); mRelation.referencingLayer()->addFeature( flink ); updateUi(); } } else { QgsFields fields = mRelation.referencingLayer()->fields(); Q_FOREACH ( const QgsRelation::FieldPair& fieldPair, mRelation.fieldPairs() ) { keyAttrs.insert( fields.indexFromName( fieldPair.referencingField() ), mFeature.attribute( fieldPair.referencedField() ) ); } vlTools->addFeature( mDualView->masterModel()->layer(), keyAttrs ); } }
void resolve(int fd, int nl, struct band3 *bnd) { CELL cvalue; int *active; int offset, isz, i, j, pass, activity, goagain, done; active = (int *)G_calloc(nl, sizeof(int)); isz = sizeof(CELL); /* select a direction when there are multiple non-flat links */ lseek(fd, bnd->sz, SEEK_SET); for (i = 1; i < nl - 1; i += 1) { read(fd, bnd->b[0], bnd->sz); for (j = 1; j < bnd->ns - 1; j += 1) { offset = j * isz; if (G_is_c_null_value((void *)(bnd->b[0] + offset))) continue; memcpy(&cvalue, bnd->b[0] + offset, isz); if (cvalue > 0) cvalue = select_dir(cvalue); memcpy(bnd->b[0] + offset, &cvalue, isz); } lseek(fd, -bnd->sz, SEEK_CUR); write(fd, bnd->b[0], bnd->sz); } pass = 0; for (i = 1; i < nl - 1; i += 1) active[i] = 1; /* select a direction when there are multiple flat links */ do { done = 1; pass += 1; activity = 0; lseek(fd, 0, SEEK_SET); advance_band3(fd, bnd); advance_band3(fd, bnd); for (i = 1; i < nl - 1; i++) { lseek(fd, (off_t) (i + 1) * bnd->sz, SEEK_SET); advance_band3(fd, bnd); if (!active[i]) continue; done = 0; active[i] = 0; do { goagain = 0; for (j = 1; j < bnd->ns - 1; j += 1) { flink(i, j, nl, bnd->ns, (void *)bnd->b[0], (void *)bnd->b[1], (void *)bnd->b[2], &active[i], &goagain); if (goagain) activity = 1; } } while (goagain); lseek(fd, (off_t) i * bnd->sz, SEEK_SET); write(fd, bnd->b[1], bnd->sz); } if (!activity) { done = 1; continue; } activity = 0; lseek(fd, (off_t) (nl - 1) * bnd->sz, SEEK_SET); retreat_band3(fd, bnd); retreat_band3(fd, bnd); for (i = nl - 2; i >= 1; i -= 1) { lseek(fd, (off_t) (i - 1) * bnd->sz, SEEK_SET); retreat_band3(fd, bnd); if (!active[i]) continue; done = 0; active[i] = 0; do { goagain = 0; for (j = 1; j < bnd->ns - 1; j++) { flink(i, j, nl, bnd->ns, (void *)bnd->b[0], (void *)bnd->b[1], (void *)bnd->b[2], &active[i], &goagain); if (goagain) activity = 1; } } while (goagain); lseek(fd, (off_t) i * bnd->sz, SEEK_SET); write(fd, bnd->b[1], bnd->sz); } if (!activity) { done = 1; } } while (!done); G_free(active); return; }