Пример #1
0
/*
 *	Write a binary tree node to disk.
 */
int pdb_write_tree_node_cb(struct pdb* dbptr, FILE* fptr,
	struct pdb_node_t* nptr, int tabs) {

	struct binaryTree* tptr;
	struct linkList* lptr;
	struct linkNode* lnptr;

	/*
	 *	Create a list from the tree so we can iterate through it.
	 */
	tptr = nptr->data;
	lptr = list_create();
	tree_to_list(tptr, lptr);
	lnptr = lptr->root;
	
	/*
	 *	Shuffle tree (if set).
	 */
	if (pdb_is_set(dbptr, PDB_WRITE_SHUFFLE))
		list_shuffle(lptr);
	
	/*
	 *	Set PDB_WRITE_NODE_FIRST_ID as the first in the list
	 *	if PDB_WRITE_NODE_FIRST is set.
	 *	Only if root node.
	 */
	if (!tabs) {
		if (pdb_is_set(dbptr, PDB_WRITE_NODE_FIRST)) {
			while (lnptr) {
				nptr = lnptr->data;
				if (!strcmp(nptr->id, PDB_WRITE_NODE_FIRST_ID)) {
					list_free_node(lptr, lnptr, 0, NULL);
					list_add_node_front(lptr, nptr);
					break;
				}
				lnptr = lnptr->next;
			}
		}
	}
	
	/*
	 *	Write all children to disk.
	 */
	lnptr = lptr->root;
	while (lnptr) {
		nptr = lnptr->data;
		if (!pdb_standard_write_node(dbptr, fptr, nptr, tabs)) {
			list_free(lptr, 0, NULL);
			return 0;
		}
		lnptr = lnptr->next;
	}
	
	/*
	 *	Free temp list (but not data).
	 */
	list_free(lptr, 0, NULL);
	
	return 1;
}
Пример #2
0
/*
 *	Write a loaded database structure to disk.
 */
DLLEXP int pdb_write(struct pdb* dbptr, char* file) {
	FILE* fptr;
	struct pdb_node_t* nptr;
	int ret;
	
	if (!dbptr)
		return 0;

	PDB_MUTEX_LOCK(dbptr);

	if (!dbptr) {
		PDB_MUTEX_UNLOCK(dbptr);
		return 0;
	}
	if (!dbptr->data) {
		PDB_MUTEX_UNLOCK(dbptr);
		return 0;
	}	
		
	fptr = fopen(file, "w");
	if (!fptr) {
		fprintf(stderr, "%s:%s():%i: Error: Unable to open file \"%s\" for "
			"writing.\n", __FILE__, __FUNCTION__, __LINE__, file);
		PDB_MUTEX_UNLOCK(dbptr);
		return 0;
	}
	
	nptr = dbptr->data;
	
	ret = pdb_standard_write_node(dbptr, fptr, nptr, -1);
	fclose(fptr);

	/*
	 *	Reset our writing schedule.
	 */	
	dbptr->altered = 0;
	dbptr->last_write = time(NULL);

	PDB_MUTEX_UNLOCK(dbptr);
	return ret;
}
Пример #3
0
/*
 *	Write a link list node to disk.
 */
int pdb_write_hash_node_cb(struct pdb* dbptr, FILE* fptr,
	struct pdb_node_t* nptr, int tabs) {

	struct hash* hptr = nptr->data;
	struct hash_node_t* hnptr = NULL;
	int i = 0;
	struct linkList* lptr = NULL;
	struct linkNode* lnptr = NULL;
	
	/*
	 *	Write the table size to disk.
	 */
	for (; i < tabs; i++)
		fputc('\t', fptr);

 	fprintf(fptr, "%i", hptr->size);
	fputc(PDB_TOKEN_TERM, fptr);
	fputc('\n', fptr);
	
	/*
	 *	Write all children to disk.
	 */
	lptr = NULL;
	lnptr = NULL;
	for (i = 0; i < hptr->size; i++) {
		lptr = hptr->tbl[i];
		if (!lptr)
			continue;
		lnptr = lptr->root;
		while (lnptr) {
			hnptr = lnptr->data;
			if (!pdb_standard_write_node(dbptr, fptr, hnptr->data, tabs))
				return 0;
			lnptr = lnptr->next;
		}
	}
	
	return 1;
}
Пример #4
0
/*
 *	Write a link list node to disk.
 */
int pdb_write_list_node_cb(struct pdb* dbptr, FILE* fptr,
	struct pdb_node_t* nptr, int tabs) {

	struct linkList* lptr = nptr->data;
	struct linkNode* lnptr = lptr->root;
	
	/*
	 *	Set PDB_WRITE_NODE_FIRST_ID as the first in the list
	 *	if PDB_WRITE_NODE_FIRST is set.
	 *	Only if root node.
	 */
	if (!tabs) {
		if (pdb_is_set(dbptr, PDB_WRITE_NODE_FIRST)) {
			while (lnptr) {
				nptr = lnptr->data;
				if (!strcmp(nptr->id, PDB_WRITE_NODE_FIRST_ID)) {
					list_delink_node(lptr, lnptr);
					list_add_node_front(lptr, nptr);
					break;
				}
				lnptr = lnptr->next;
			}
		}
	}
	
	/*
	 *	Write all children to disk.
	 */
	lnptr = lptr->root;
	while (lnptr) {
		nptr = lnptr->data;
		if (!pdb_standard_write_node(dbptr, fptr, nptr, tabs))
			return 0;
		lnptr = lnptr->next;
	}
	
	return 1;
}