[svn-commits] ivaxer: branch ivaxer/ast_storage r280236 - in /team/ivaxer/ast_storage: incl...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Wed Jul 28 15:13:31 CDT 2010


Author: ivaxer
Date: Wed Jul 28 15:13:28 2010
New Revision: 280236

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=280236
Log:
fixes due the review #773 (r4)
- added 'temporary' flag to the ast_storage_fileinst structure.
  if this flag is set ast_storage_fileinst_release() will try to unlink() local
file
- ast_storage_fileobject_create() and ast_storage_fileinst_create() is moved to
  to the ast_storage public API.
- fixed tabs/spaces mixing
- allocating memory by '*ptr' rather then by a structure name.
- added ability to PUT fileobject without metadata.
- removed bogus checks in copy_test/get_test/create_test.
- wrote put_test.

Modified:
    team/ivaxer/ast_storage/include/asterisk/storage.h
    team/ivaxer/ast_storage/main/storage.c
    team/ivaxer/ast_storage/res/res_storage_odbc.c

Modified: team/ivaxer/ast_storage/include/asterisk/storage.h
URL: http://svnview.digium.com/svn/asterisk/team/ivaxer/ast_storage/include/asterisk/storage.h?view=diff&rev=280236&r1=280235&r2=280236
==============================================================================
--- team/ivaxer/ast_storage/include/asterisk/storage.h (original)
+++ team/ivaxer/ast_storage/include/asterisk/storage.h Wed Jul 28 15:13:28 2010
@@ -36,6 +36,7 @@
 	int fd;
 	AST_RWLIST_ENTRY(ast_storage_fileinst) list;
 	char ext[16];
+	unsigned int temporary:1;
 	char localfile[64];
 };
 
@@ -124,8 +125,12 @@
 off_t ast_storage_tell(struct ast_storage *st, struct ast_storage_fileinst *fi);
 int ast_storage_seek(struct ast_storage *st, struct ast_storage_fileinst *fi, off_t offset, int whence);
 
+struct ast_storage_fileobject *ast_storage_fileobject_create(void);
 void ast_storage_fileobject_release(struct ast_storage_fileobject *fo);
+
+struct ast_storage_fileinst *ast_storage_fileinst_create(void);
 void ast_storage_fileinst_release(struct ast_storage_fileinst *fi);
+
 void ast_storage_dirobject_release(struct ast_storage_dirobject *dobj);
 
 int ast_storage_open(struct ast_storage_fileinst *fi, int flags);

Modified: team/ivaxer/ast_storage/main/storage.c
URL: http://svnview.digium.com/svn/asterisk/team/ivaxer/ast_storage/main/storage.c?view=diff&rev=280236&r1=280235&r2=280236
==============================================================================
--- team/ivaxer/ast_storage/main/storage.c (original)
+++ team/ivaxer/ast_storage/main/storage.c Wed Jul 28 15:13:28 2010
@@ -226,6 +226,17 @@
 	return st && st->be->listdir ? st->be->listdir(st, pathname) : NULL;
 }
 
+struct ast_storage_fileobject *ast_storage_fileobject_create(void)
+{
+	struct ast_storage_fileobject *fo = ast_calloc(1, sizeof(*fo));
+	if (!fo) {
+		return NULL;
+	}
+
+	AST_RWLIST_HEAD_INIT(&fo->files);
+	return fo;
+}
+
 void ast_storage_fileobject_release(struct ast_storage_fileobject *fo)
 {
 	struct ast_storage_fileinst *inst;
@@ -247,6 +258,17 @@
 	ast_free(fo);
 }
 
+struct ast_storage_fileinst *ast_storage_fileinst_create(void)
+{
+	struct ast_storage_fileinst *fi = ast_calloc(1, sizeof(*fi));
+	if(!fi) {
+		return NULL;
+	}
+
+	fi->fd = -1;
+	return fi;
+}
+
 void ast_storage_fileinst_release(struct ast_storage_fileinst *fi)
 {
 	if (!fi) {
@@ -256,9 +278,11 @@
 	if (fi->fd != -1) {
 		ast_storage_close(fi);
 	}
-	if (fi->localfile[0]) {
+
+	if(fi->temporary && fi->localfile[0]) {
 		unlink(fi->localfile);
 	}
+
 	ast_free(fi);
 }
 
@@ -449,19 +473,19 @@
 {
 	struct ast_storage *st;
 	int ret;
-	char uri[] = "odbc://asterisk-storage-test/storage/testpath";
-
-        switch (cmd) {
-        case TEST_INIT:
-                info->name = "copy_test";
-                info->category = "main/storage/generic";
-                info->summary = "copy test";
-                info->description =
-                        "Tests the ast_storage_copy function";
-                return AST_TEST_NOT_RUN;
-        case TEST_EXECUTE:
-                break;
-        }
+	const char uri[] = "odbc://asterisk-storage-test/storage/testpath";
+
+	switch (cmd) {
+	case TEST_INIT:
+		info->name = "copy_test";
+		info->category = "main/storage/generic";
+		info->summary = "copy test";
+		info->description =
+			"Tests the ast_storage_copy function";
+		return AST_TEST_NOT_RUN;
+	case TEST_EXECUTE:
+		break;
+	}
 
 	st = ast_storage_request(uri);
 	if (!st) {
@@ -473,12 +497,14 @@
 		return AST_TEST_FAIL;
 	}
 
+	/* TODO: add checks here */
+
 	ret = ast_storage_release(st);
 	if (ret) {
 		return AST_TEST_FAIL;
 	}
 
-        return AST_TEST_PASS;
+	return AST_TEST_PASS;
 }
 #endif
 

Modified: team/ivaxer/ast_storage/res/res_storage_odbc.c
URL: http://svnview.digium.com/svn/asterisk/team/ivaxer/ast_storage/res/res_storage_odbc.c?view=diff&rev=280236&r1=280235&r2=280236
==============================================================================
--- team/ivaxer/ast_storage/res/res_storage_odbc.c (original)
+++ team/ivaxer/ast_storage/res/res_storage_odbc.c Wed Jul 28 15:13:28 2010
@@ -88,28 +88,6 @@
 
 static const struct ast_storage_be odbc_se;
 
-static struct ast_storage_fileobject *create_fileobject(void) {
-	struct ast_storage_fileobject *fo;
-	fo = ast_calloc(1, sizeof(struct ast_storage_fileobject));
-	if (!fo) {
-		return NULL;
-	}
-
-	AST_RWLIST_HEAD_INIT(&fo->files);
-	return fo;
-}
-
-static struct ast_storage_fileinst *create_fileinst(void) {
-	struct ast_storage_fileinst *fi;
-	fi = ast_calloc(1, sizeof(struct ast_storage_fileinst));
-	if(!fi) {
-		return NULL;
-	}
-
-	fi->fd = -1;
-	return fi;
-}
-
 static int se_release(struct ast_storage *st)
 {
 	struct odbc_storage_pvt *pvt;
@@ -145,7 +123,7 @@
 	SQLHSTMT stmt = NULL;
 	SQLLEN sqlptr;
 
-	st = ast_calloc(1, sizeof(struct ast_storage));
+	st = ast_calloc(1, sizeof(*st));
 	if (!st) {
 		return NULL;
 	}
@@ -162,7 +140,7 @@
 
 	pathname_len = sizeof(char) * strlen(args.pathname);
 
-	pvt = ast_calloc(1, sizeof(struct odbc_storage_pvt) + pathname_len);
+	pvt = ast_calloc(1, sizeof(*pvt) + pathname_len);
 	if (!pvt) {
 		se_release(st);
 		return NULL;
@@ -203,7 +181,7 @@
 		SQLGetData(stmt, 4, SQL_C_CHAR, columnname, sizeof(columnname), &sqlptr);
 		columnname_len = sizeof(char) * strlen(columnname);
 
-		entry = ast_calloc(1, sizeof(struct columns) + columnname_len);
+		entry = ast_calloc(1, sizeof(*entry) + columnname_len);
 		if (!entry) {
 			ast_log(LOG_ERROR, "Unable to allocate column entry\n");
 			se_release(st);
@@ -234,7 +212,7 @@
 	struct ast_storage_fileinst *fi;
 	char coltitle[128];
 	char rowdata[32];
-	char tmpfile_fmt[] = "/var/tmp/XXXXXX";
+	char tmpfile_fmt[] = "/tmp/storage-odbc-XXXXXX";
 	int fd;
 
 	ret = SQLFetch(stmt);
@@ -252,10 +230,12 @@
 		return NULL;
 	}
 
-	fi = create_fileinst();
+	fi = ast_storage_fileinst_create();
 	if (!fi) {
 		return NULL;
 	}
+
+	fi->temporary = 1;
 
 	for (colid = 1; colid <= colcount; colid++) {
 		ret = SQLDescribeCol(stmt, colid, (SQLCHAR *)coltitle, sizeof(coltitle), &collen,
@@ -293,7 +273,7 @@
 					chunksize >>= 1;
 					offset -= chunksize;
 
-					if (chunksize < 2048) {
+					if (chunksize < 4096) {
 						ast_log(LOG_WARNING, "Could not mmap the output file: [%d] %s\n", errno, strerror(errno));
 						goto error;
 					}
@@ -311,7 +291,7 @@
 
 			fsync(fd);
 
-			if (truncate(fi->localfile, ndata) < 0) {
+			if (ftruncate(fd, ndata) < 0) {
 				ast_log(LOG_WARNING, "Unable to truncate '%s': [%d]: %s\n", fi->localfile, errno, strerror(errno));
 			}
 
@@ -357,9 +337,9 @@
 	SQLBindParameter(stmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(qdata->objectname), 0, (void *)qdata->objectname, 0, NULL);
 	if (qdata->ext) {
 		SQLBindParameter(stmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(qdata->ext), 0, (void *)qdata->ext, 0, NULL);
-	}
-
-	SQLBindParameter(stmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 3, 0, (void *)"txt", 0, NULL);
+		SQLBindParameter(stmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 3, 0, (void *)"txt", 0, NULL);
+	}
+
 
 	return stmt;
 }
@@ -417,7 +397,7 @@
 
 	while ((fi = fetch_fileinst(stmt)) != NULL) {
 		if (!fo) {
-			fo = create_fileobject();
+			fo = ast_storage_fileobject_create();
 			if (!fo) {
 				goto error;
 			}
@@ -461,13 +441,16 @@
 	}
 
 	SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(qdata->pathname), 0, (void *)qdata->pathname, 0, NULL);
-	SQLBindParameter(stmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(qdata->pathname), 0, (void *)qdata->pathname, 0, NULL);
 	SQLBindParameter(stmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(qdata->objectname), 0, (void *)qdata->objectname, 0, NULL);
-	SQLBindParameter(stmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(qdata->objectname), 0, (void *)qdata->objectname, 0, NULL);
 	SQLBindParameter(stmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(qdata->ext), 0, (void *)qdata->ext, 0, NULL);
-	SQLBindParameter(stmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 3, 0, (void *)"txt", 0, NULL);
 	SQLBindParameter(stmt, 4, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_LONGVARBINARY, qdata->data_len, 0, (void *)qdata->data, 0, &qdata->data_ind);
-	SQLBindParameter(stmt, 8, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_LONGVARBINARY, qdata->metadata_len, 0, (void *)qdata->metadata, 0, &qdata->metadata_ind);
+
+	if (qdata->metadata) {
+		SQLBindParameter(stmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(qdata->pathname), 0, (void *)qdata->pathname, 0, NULL);
+		SQLBindParameter(stmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(qdata->objectname), 0, (void *)qdata->objectname, 0, NULL);
+		SQLBindParameter(stmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 3, 0, (void *)"txt", 0, NULL);
+		SQLBindParameter(stmt, 8, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_LONGVARBINARY, qdata->metadata_len, 0, (void *)qdata->metadata, 0, &qdata->metadata_ind);
+	}
 
 	ret = SQLExecDirect(stmt, (unsigned char *)qdata->sql, SQL_NTS);
 	if (!SQL_SUCCEEDED(ret)) {
@@ -532,7 +515,7 @@
 
 	AST_RWLIST_RDLOCK(&fo->files);
 	AST_RWLIST_TRAVERSE(&fo->files, fi, list) {
-		if (!strcasecmp(fi->ext, ext) || !exts) {
+		if (!exts || !strcasecmp(fi->ext, ext)) {
 			break;
 		}
 	}
@@ -545,34 +528,39 @@
 		return -1;
 	}
 
-	if (!mfi) {
-		ast_log(LOG_WARNING, "put() failed: metadata fileinst not found\n");
-		return -1;
-	}
-
 	fdm = mfdm = NULL;
 
 	if (open_fileinst(fi, &fd, &fdlen, &fdm) == -1) {
 		return -1;
 	}
-	if (open_fileinst(mfi, &mfd, &mfdlen, &mfdm) == -1) {
-		goto error;
-	}
-
-	snprintf(sql, sizeof(sql), "INSERT INTO %s (pathname,filename,extension,recording) VALUES (?,?,?,?), (?,?,?,?)", ost->tablename);
-
+	if (mfi) {
+		if (open_fileinst(mfi, &mfd, &mfdlen, &mfdm) == -1) {
+			goto error;
+		}
+	}
+
+	if (mfi) {
+		snprintf(sql, sizeof(sql), "INSERT INTO %s (pathname,filename,extension,recording) VALUES (?,?,?,?), (?,?,?,?)", ost->tablename);
+	}
+	else {
+		snprintf(sql, sizeof(sql), "INSERT INTO %s (pathname,filename,extension,recording) VALUES (?,?,?,?)", ost->tablename);
+	}
+
+	memset(&qdata, 0, sizeof(qdata));
 	qdata.sql = sql;
 	qdata.pathname = fo->pathname;
 	qdata.objectname = fo->objectname;
 	qdata.ext = fi->ext;
 	qdata.data = fdm;
 	qdata.data_len = qdata.data_ind = fdlen;
-	qdata.metadata = mfdm;
-	qdata.metadata_len = qdata.metadata_ind = mfdlen;
+	if (mfi) {
+		qdata.metadata = mfdm;
+		qdata.metadata_len = qdata.metadata_ind = mfdlen;
+	}
 
 	stmt = ast_odbc_direct_execute(ost->conn, execute_put_query, (void *) &qdata);
 	if (!stmt) {
-		ast_log(LOG_WARNING, "SQL Execute failed!");
+		ast_log(LOG_WARNING, "SQL Execute failed!\n");
 		goto error;
 	}
 
@@ -642,21 +630,20 @@
 {
 	struct ast_storage *st;
 	struct odbc_storage_pvt *pvt;
-	struct columns *column;
 	int ret;
-	char uri[] = "asterisk-storage-test/storage/path";
-
-        switch (cmd) {
-        case TEST_INIT:
-                info->name = "creating_test";
-                info->category = "main/storage/odbc";
-                info->summary = "create/release test";
-                info->description =
-                        "Tests the create/release functions";
-                return AST_TEST_NOT_RUN;
-        case TEST_EXECUTE:
-                break;
-        }
+	const char uri[] = "asterisk-storage-test/storage/path";
+
+	switch (cmd) {
+	case TEST_INIT:
+		info->name = "creating_test";
+		info->category = "main/storage/odbc";
+		info->summary = "create/release test";
+		info->description =
+			"Tests the create/release functions";
+		return AST_TEST_NOT_RUN;
+	case TEST_EXECUTE:
+		break;
+	}
 
 	st = se_create(uri);
 	if (!st) {
@@ -665,95 +652,34 @@
 
 	pvt = (struct odbc_storage_pvt *) st->storage_pvt;
 
-	AST_RWLIST_RDLOCK(&pvt->columns);
-
-	ast_test_status_update(test, "Columns of the table '%s' in the odbc_class '%s':\n", pvt->tablename, pvt->odbc_class);
-	AST_RWLIST_TRAVERSE(&pvt->columns, column, list) {
-		ast_test_status_update(test, "%s\n", column->name);
-	}
-
-	AST_RWLIST_UNLOCK(&pvt->columns);
+	/* TODO: add checks here */
 
 	ret = se_release(st);
 	if (ret) {
 		return AST_TEST_FAIL;
 	}
 
-        return AST_TEST_PASS;
+	return AST_TEST_PASS;
 }
 
 AST_TEST_DEFINE(get_test)
-{
-	struct ast_storage *st;
-	struct ast_storage_fileobject *fo;
-	struct ast_storage_fileinst *fi;
-	int ret;
-	char uri[] = "asterisk-storage-test/storage/testpath";
-
-        switch (cmd) {
-        case TEST_INIT:
-                info->name = "get_test";
-                info->category = "main/storage/odbc";
-                info->summary = "get test";
-                info->description =
-                        "Tests the get function";
-                return AST_TEST_NOT_RUN;
-        case TEST_EXECUTE:
-                break;
-        }
-
-	st = se_create(uri);
-	if (!st) {
-		return AST_TEST_FAIL;
-	}
-
-	fo = se_get(st, "test", "wav");
-	if (!fo) {
-		return AST_TEST_FAIL;
-	}
-
-	printf("objectname: %s\n", fo->objectname);
-	printf("pathname: %s\n", fo->pathname);
-	printf("file instances:\n");
-
-	AST_RWLIST_RDLOCK(&fo->files);
-	AST_RWLIST_TRAVERSE(&fo->files, fi, list) {
-		printf("extension: %s, localfile: %s\n", fi->ext, fi->localfile);
-	}
-	AST_RWLIST_UNLOCK(&fo->files);
-
-	if (fo->metadata) {
-		printf("metadata file: %s\n", fo->metadata->localfile);
-	}
-
-	ast_storage_fileobject_release(fo);
-
-	ret = se_release(st);
-	if (ret) {
-		return AST_TEST_FAIL;
-	}
-
-        return AST_TEST_PASS;
-}
-
-AST_TEST_DEFINE(put_test)
 {
 	struct ast_storage *st;
 	struct ast_storage_fileobject *fo;
 	int ret;
-	char uri[] = "asterisk-storage-test/storage/testpath";
-
-        switch (cmd) {
-        case TEST_INIT:
-                info->name = "put_test";
-                info->category = "main/storage/odbc";
-                info->summary = "get test";
-                info->description =
-                        "Tests the put function";
-                return AST_TEST_NOT_RUN;
-        case TEST_EXECUTE:
-                break;
-        }
+	const char uri[] = "asterisk-storage-test/storage/testpath";
+
+	switch (cmd) {
+	case TEST_INIT:
+		info->name = "get_test";
+		info->category = "main/storage/odbc";
+		info->summary = "get test";
+		info->description =
+			"Tests the get function";
+		return AST_TEST_NOT_RUN;
+	case TEST_EXECUTE:
+		break;
+	}
 
 	st = se_create(uri);
 	if (!st) {
@@ -762,15 +688,19 @@
 
 	fo = se_get(st, "test", "wav");
 	if (!fo) {
-		return AST_TEST_FAIL;
-	}
-
-	fo->objectname[0] = 'g';
-
-	ret = se_put(st, fo, NULL);
-	if (ret) {
-		return AST_TEST_FAIL;
-	}
+		ast_test_status_update(test, "GET with extension failed\n");
+		return AST_TEST_FAIL;
+	}
+
+	ast_storage_fileobject_release(fo);
+
+	fo = se_get(st, "test", NULL);
+	if (!fo) {
+		ast_test_status_update(test, "GET failed\n");
+		return AST_TEST_FAIL;
+	}
+
+	/* TODO: add checks here */
 
 	ast_storage_fileobject_release(fo);
 
@@ -779,7 +709,105 @@
 		return AST_TEST_FAIL;
 	}
 
-        return AST_TEST_PASS;
+	return AST_TEST_PASS;
+}
+
+static size_t _get_file_size(const char *path) {
+	int fd;
+
+	fd = open(path, O_RDONLY);
+	if (fd == -1) {
+		return -1;
+	}
+
+	return lseek(fd, 0, SEEK_END);
+}
+
+AST_TEST_DEFINE(put_test)
+{
+	struct ast_storage *st;
+	struct ast_storage_fileobject *fo;
+	struct ast_storage_fileinst *mfi, *fi;
+	int fd, fdlen_orig, fdlen;
+	int ret;
+	const char uri[] = "asterisk-storage-test/storage/testpath";
+	const char metadata_content[] = "[info]\nistest=yes\nfailed=no";
+	char metadata_file[] = "/tmp/storage-odbc-test-XXXXXX";
+	const char sound_file[] = "/bin/bash";
+	const char sound_format[] = "bin";
+	const char objectname[] = "put_test";
+	const char pathname[] = "testpath";
+
+	switch (cmd) {
+	case TEST_INIT:
+		info->name = "put_test";
+		info->category = "main/storage/odbc";
+		info->summary = "get test";
+		info->description =
+			"Tests the put function";
+		return AST_TEST_NOT_RUN;
+	case TEST_EXECUTE:
+		break;
+	}
+
+	st = se_create(uri);
+	if (!st) {
+		return AST_TEST_FAIL;
+	}
+
+	fo = ast_storage_fileobject_create();
+
+	ast_copy_string(fo->objectname, objectname, sizeof(fo->objectname));
+	ast_copy_string(fo->pathname, pathname, sizeof(fo->pathname));
+
+	mfi = ast_storage_fileinst_create();
+	fi = ast_storage_fileinst_create();
+
+	fd = mkstemp(metadata_file);
+	ret = write(fd, (const void *)metadata_content, sizeof(metadata_content));
+	close(fd);
+
+	ast_copy_string(mfi->localfile, metadata_file, sizeof(mfi->localfile));
+	ast_copy_string(mfi->ext, "txt", sizeof(mfi->ext));
+
+	ast_copy_string(fi->localfile, sound_file, sizeof(fi->localfile));
+	ast_copy_string(fi->ext, sound_format, sizeof(fi->ext));
+
+	AST_LIST_INSERT_TAIL(&fo->files, fi, list);
+	fo->metadata = mfi;
+
+	ret = se_put(st, fo, NULL);
+	ast_storage_fileobject_release(fo);
+
+	if (ret) {
+		ast_test_status_update(test, "PUT failed\n");
+		return AST_TEST_FAIL;
+	}
+
+	fo = se_get(st, "put_test", NULL);
+
+	fdlen_orig = _get_file_size(metadata_file);
+	fdlen = _get_file_size(fo->metadata->localfile);
+	if (fdlen_orig != fdlen) {
+		ast_test_status_update(test, "Size of the original metadata file and retrieved mismatch\n");
+		return AST_TEST_FAIL;
+	}
+
+	fdlen_orig = _get_file_size(sound_file);
+	fi = AST_RWLIST_FIRST(&fo->files);
+	fdlen = _get_file_size(fi->localfile);
+	if (fdlen_orig != fdlen) {
+		ast_test_status_update(test, "Size of the original binary file and retrieved mismatch\n");
+		return AST_TEST_FAIL;
+	}
+
+	ret = se_release(st);
+	if (ret) {
+		ast_test_status_update(test, "The storage release function failed\n");
+		return AST_TEST_FAIL;
+	}
+
+	return AST_TEST_PASS;
 }
 #endif
 




More information about the svn-commits mailing list