Browse Source

- make a shallow copy of parameter and result fields in db commands

Jan Janak 18 years ago
parent
commit
26ac66231d
3 changed files with 60 additions and 35 deletions
  1. 21 25
      db/db_cmd.c
  2. 35 7
      db/db_fld.c
  3. 4 3
      db/db_fld.h

+ 21 - 25
db/db_cmd.c

@@ -57,23 +57,29 @@ db_cmd_t* db_cmd(enum db_cmd_type type, db_ctx_t* ctx, char* table,
     memcpy(newp->table.s, table, newp->table.len);
 
 	newp->type = type;
-	newp->result = result;
-	newp->params = params;
+
+	if (result) {
+		newp->result = db_fld_copy(result);
+		if (newp->result == NULL) goto err;
+	}
+
+	if (params) {
+		newp->params = db_fld_copy(params);
+		if (newp->params == NULL) goto err;
+	}
 
 	for(i = 0; i < ctx->con_n; i++) {
 		con = ctx->con[i];
 
-		if (!DB_FLD_EMPTY(result)) {
-			for(j = 0; !DB_FLD_LAST(result[j]); j++) {
-				if (db_fld_init(result + j, 1) < 0) goto err;
-				if (db_drv_call(&con->uri->scheme, "db_fld", result + j, i) < 0) goto err;
+		if (!DB_FLD_EMPTY(newp->result)) {
+			for(j = 0; !DB_FLD_LAST(newp->result[j]); j++) {
+				if (db_drv_call(&con->uri->scheme, "db_fld", newp->result + j, i) < 0) goto err;
 			}
 		}
 
-		if (!DB_FLD_EMPTY(params)) {
-			for(j = 0; !DB_FLD_LAST(params[j]); j++) {
-				if (db_fld_init(params + j, 1) < 0) goto err;
-				if (db_drv_call(&con->uri->scheme, "db_fld", params + j, i) < 0) goto err;
+		if (!DB_FLD_EMPTY(newp->params)) {
+			for(j = 0; !DB_FLD_LAST(newp->params[j]); j++) {
+				if (db_drv_call(&con->uri->scheme, "db_fld", newp->params + j, i) < 0) goto err;
 			}
 		}
 
@@ -128,6 +134,8 @@ db_cmd_t* db_cmd(enum db_cmd_type type, db_ctx_t* ctx, char* table,
     ERR("db_cmd: Cannot create db_cmd structure\n");
     if (newp) {
 		db_gen_free(&newp->gen);
+		if (newp->result) db_fld_free(newp->result);
+		if (newp->params) db_fld_free(newp->params);
 		if (newp->table.s) pkg_free(newp->table.s);
 		pkg_free(newp);
 	}
@@ -137,23 +145,11 @@ db_cmd_t* db_cmd(enum db_cmd_type type, db_ctx_t* ctx, char* table,
 
 void db_cmd_free(db_cmd_t* cmd)
 {
-	int i;
-
     if (cmd == NULL) return;
-
-	if (!DB_FLD_EMPTY(cmd->result)) {
-		for(i = 0; !DB_FLD_LAST(cmd->result[i]); i++) {
-			db_fld_close(cmd->result + i, 1);
-		}
-	}
-	
-	if (!DB_FLD_EMPTY(cmd->params)) {
-		for(i = 0; !DB_FLD_LAST(cmd->params[i]); i++) {
-			db_fld_close(cmd->params + i, 1);
-		}
-	}
-	
 	db_gen_free(&cmd->gen);
+
+	if (cmd->result) db_fld_free(cmd->result);
+	if (cmd->params) db_fld_free(cmd->params);
     if (cmd->table.s) pkg_free(cmd->table.s);
     pkg_free(cmd);
 }

+ 35 - 7
db/db_fld.c

@@ -36,22 +36,22 @@
 #include "db_fld.h"
 
 
-int db_fld_init(db_fld_t* fld, size_t n)
+int db_fld_init(db_fld_t* fld)
 {
 	int i;
 
-	for(i = 0; i < n; i++) {
+	for(i = 0; !DB_FLD_LAST(fld[i]); i++) {
 		if (db_gen_init(&fld[i].gen) < 0) return -1;
 	}
 	return 0;
 }
 
 
-void db_fld_close(db_fld_t* fld, size_t n)
+void db_fld_close(db_fld_t* fld)
 {
 	int i;
 
-	for(i = 0; i < n; i++) {
+	for(i = 0; !DB_FLD_LAST(fld[i]); i++) {
 		db_gen_free(&fld[i].gen);
 	}
 }
@@ -59,6 +59,7 @@ void db_fld_close(db_fld_t* fld, size_t n)
 
 db_fld_t* db_fld(size_t n)
 {
+	int i;
 	db_fld_t* newp;
 
 	newp = (db_fld_t*)pkg_malloc(sizeof(db_fld_t) * n);
@@ -68,7 +69,34 @@ db_fld_t* db_fld(size_t n)
 	}
 	memset(newp, '\0', sizeof(db_fld_t) * n);
 
-	if (db_fld_init(newp, n) < 0) goto error;
+	for(i = 0; i < n; i++) {
+		if (db_gen_init(&newp[i].gen) < 0) goto error;
+	}
+	return newp;
+
+ error:
+	if (newp) {
+		db_gen_free(&newp->gen);
+		pkg_free(newp);
+	}
+	return NULL;
+}
+
+
+db_fld_t* db_fld_copy(db_fld_t* fld)
+{
+	int n;
+	db_fld_t* newp;
+
+	for(n = 0; fld[n].name; n++);
+
+	newp = (db_fld_t*)pkg_malloc(sizeof(db_fld_t) * n);
+	if (newp == NULL) {
+		ERR("db_fld: No memory left\n");
+		return NULL;
+	}
+	memcpy(newp, fld, sizeof(db_fld_t) * n);
+	if (db_fld_init(newp) < 0) goto error;
 	return newp;
 
  error:
@@ -80,9 +108,9 @@ db_fld_t* db_fld(size_t n)
 }
 
 
-void db_fld_free(db_fld_t* fld, size_t n)
+void db_fld_free(db_fld_t* fld)
 {
-	db_fld_close(fld, n);
+	db_fld_close(fld);
 	pkg_free(fld);
 }
 

+ 4 - 3
db/db_fld.h

@@ -89,11 +89,12 @@ typedef struct db_fld {
 #define DB_FLD_EMPTY(fld) ((fld) == NULL || (fld)[0].name == NULL)
 
 struct db_fld* db_fld(size_t n);
-void db_fld_free(struct db_fld* fld, size_t n);
+void db_fld_free(struct db_fld* fld);
 
-int db_fld_init(struct db_fld* fld, size_t n);
-void db_fld_close(struct db_fld* fld, size_t n);
+int db_fld_init(struct db_fld* fld);
+void db_fld_close(struct db_fld* fld);
 
+db_fld_t* db_fld_copy(db_fld_t* fld);
 
 #ifdef __cplusplus
 }