[asterisk-commits] ivaxer: branch ivaxer/ast_storage r280236 - in /team/ivaxer/ast_storage: incl...
SVN commits to the Asterisk project
asterisk-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 asterisk-commits
mailing list