Net-NISplusTied

 view release on metacpan or  search on metacpan

NISplusTied.xs  view on Meta::CPAN

	nis_object *NOb;

	NOb = nis_clone_object (Table, NULL);
	if (! NOb)
		croak ("+++ ""nis_clone_object"" failed in new_entry");
 
	NOb -> zo_data.zo_type = ENTRY_OBJ;
	NOb -> EN_data.en_cols.en_cols_len = Table -> TA_data.ta_cols.ta_cols_len;
	NOb -> zo_data.objdata_u.en_data.en_type = Table -> TA_data.ta_type;

	if (! New (0, NOb -> EN_data.en_cols.en_cols_val,
		Table -> TA_data.ta_maxcol, entry_col))
			croak ("+++ ""New"" failed in new_entry");

	return NOb;
}

# /*#############################################################*/    

int hash_to_entry (nis_object *table, nis_object* entry, SV* hash, int fill) {

	int i; char* colname; SV** iSV;

 	if (fill) {
		entry -> zo_name = "";
		entry -> zo_domain = "";
	}
 
        for (i = 0; i < table -> TA_data.ta_maxcol; i++) {

                colname = table -> TA_data.ta_cols.ta_cols_val [i] . tc_name;

		iSV = hv_fetch ((HV*) SvRV (hash), colname, strlen (colname), 0);

		if (iSV && SvOK (*iSV)) {
			int length;
			char* c = SvPV (*iSV, length);
			ENTRY_VAL (entry, i) = strndup (c, length + 1);
			ENTRY_LEN (entry, i) = length + 1;
			ENTRY_VAL (entry, i) [length] = 0;

		} else if (fill) {
			ENTRY_VAL (entry, i) = "";
			ENTRY_LEN (entry, i) = 0;
		}
		entry -> EN_data.en_cols.en_cols_val [i].ec_flags
				= EN_MODIFIED;
	}

}
# /*#############################################################*/

MODULE = Net::NISplusTied		PACKAGE = Net::NISplusTied		

# /***************************************************************/

void
nismatch (query, table)
	char* query
	char* table
	PPCODE:

        nis_result *en, *tb;
        nis_object *noTable, *noEntry;
	int i, j;
	HV *hash; AV *array;

	en = nis_list (query, EXPAND_NAME, 0, 0);
	tb = nis_lookup (table, EXPAND_NAME);

	if (! en) croak ("+++ ""nis_list"" failed in nismatch (en)");
	if (! tb) croak ("+++ ""nis_list"" failed in nismatch (tb)");

	noEntry = NIS_RES_OBJECT (en);
	noTable = NIS_RES_OBJECT (tb);

	if (NIS_RES_STATUS (en) != NIS_SUCCESS ||
		en->objects.objects_len == 0) {

			XSRETURN_NO;
	} else {

		array = newAV();	/* we return AV */
		for (j = 0; j < NIS_RES_NUMOBJ (en); j++) {

			hash = newHV();  /* AV of RVs to HVs */
			noEntry = NIS_RES_OBJECT (en) + j;

			for (i = 0; i < noTable -> TA_data.ta_maxcol; i++) {

				char* cpTbName = noTable  ->
					TA_data.ta_cols.ta_cols_val [i] . tc_name;

				if (! hv_store (hash, cpTbName, strlen (cpTbName),
					ENTRY_LEN (noEntry, i)
					? newSVpv (
						ENTRY_VAL (noEntry, i),
						ENTRY_LEN (noEntry, i) - 1)
					: newSVpv ("", 0),
				0))
					croak ("+++ ""hv_store"" failed in nismatch");
 
			}
			av_push (array, newRV ((SV*) hash));

		}
		XPUSHs (sv_2mortal (newRV ((SV*) array)));

	}

	nis_freeresult (en);
	nis_freeresult (tb);

# /*****************************************************************/

void
nismodify (query, table, values)
	char* query
	char* table
	SV* values
	PPCODE:

	nis_result *en, *tb, *rc;
	nis_object *noTable, *noEntry;
	SV *i, *j;  SV** iSV;

	en = nis_list (query, EXPAND_NAME, 0, 0);
	tb = nis_lookup (table, EXPAND_NAME);

	if (! en) croak ("+++ nis_list returned NULL in en");
	if (! tb) croak ("+++ nis_list returned NULL in tb");

	noEntry = NIS_RES_OBJECT (en);
	noTable = NIS_RES_OBJECT (tb);

	if (NIS_RES_STATUS (en) == NIS_NOTFOUND &&
		NIS_RES_NUMOBJ (en) == 0 ||
		NIS_RES_NUMOBJ (en) > 1) { /* multiple or not found, will add */

		nis_object* noNew = new_entry (noTable);
		hash_to_entry (noTable, noNew, values, 1);

		rc = nis_add_entry (table, noNew, ADD_OVERWRITE);

		nis_freeresult (rc);

	} else if (NIS_RES_STATUS (en) != NIS_SUCCESS ||
			NIS_RES_STATUS (tb) != NIS_SUCCESS) {

		XSRETURN_UNDEF;

	} else { /* success, will replace */

		hash_to_entry (noTable, noEntry, values, 0);
		rc = nis_modify_entry (query, noEntry, EXPAND_NAME || MOD_SAMEOBJ);

		XPUSHs (sv_2mortal (newSViv (rc -> status)));
		nis_freeresult (rc);

	}

	nis_freeresult (tb);
	nis_freeresult (en);

# /*****************************************************************/

void
nisremove (q)
	char* q
	PPCODE:

	nis_result *rc;

	rc = nis_remove_entry (q, NULL, REM_MULTIPLE || EXPAND_NAME);

	if (! rc)
		croak ("+++ nis_remove returned NULL in rc");

	XPUSHs (sv_2mortal (newSVpv (nis_sperrno (rc -> status), 0)));

	nis_freeresult (rc);

# /*****************************************************************/



( run in 2.265 seconds using v1.01-cache-2.11-cpan-71847e10f99 )