Author: sayer
Date: 2009-03-31 13:22:24 +0200 (Tue, 31 Mar 2009)
New Revision: 1346

Added:
   trunk/apps/dsm/doc/examples/test_dbfile.dsm
Modified:
   trunk/apps/dsm/DSMSession.h
   trunk/apps/dsm/mods/mod_mysql/ModMysql.cpp
   trunk/apps/dsm/mods/mod_mysql/ModMysql.h
   trunk/apps/dsm/mods/mod_mysql/Readme.mod_mysqlpp.txt
Log:
DSM actions to handle files in database

Modified: trunk/apps/dsm/DSMSession.h
===================================================================
--- trunk/apps/dsm/DSMSession.h 2009-03-31 09:31:26 UTC (rev 1345)
+++ trunk/apps/dsm/DSMSession.h 2009-03-31 11:22:24 UTC (rev 1346)
@@ -30,6 +30,7 @@
 #include "AmArg.h"
 #include "AmEvent.h"
 #include "AmSipMsg.h"
+#include "AmAudioFile.h"
 
 #include <string>
 using std::string;
@@ -100,13 +101,21 @@
 };
 
 
-
 class DSMDisposable {
  public:
   DSMDisposable() { }
   virtual ~DSMDisposable() { }
 };
 
+class DSMDisposableAudioFile 
+: public DSMDisposable, 
+  public AmAudioFile 
+{
+ public:
+  DSMDisposableAudioFile() { }
+  ~DSMDisposableAudioFile() { }
+};
+
 #define DSM_EVENT_ID -10
 /**  generic event for passing events between DSM sessions */
 struct DSMEvent : public AmEvent {

Added: trunk/apps/dsm/doc/examples/test_dbfile.dsm
===================================================================
--- trunk/apps/dsm/doc/examples/test_dbfile.dsm 2009-03-31 09:31:26 UTC (rev 
1345)
+++ trunk/apps/dsm/doc/examples/test_dbfile.dsm 2009-03-31 11:22:24 UTC (rev 
1346)
@@ -0,0 +1,15 @@
+import(mod_mysql);
+
+initial state lobby 
+  enter { 
+   mysql.connect(mysql://root:s...@localhost/sems);
+   mysql.putFileToDB('INSERT INTO audio (application,message,audio) VALUES 
("test","testmessage","__FILE__")', wav/welcome.wav);
+   mysql.playDBAudio(SELECT audio FROM audio WHERE id=$db.insert_id, 
anything.wav);
+   mysql.getFileFromDB(SELECT audio FROM audio WHERE id=$db.insert_id, 
/tmp/retrieved.wav);
+  };
+
+transition "error" lobby - test($errno!="") / stop(true) -> end;
+transition "audio ends" lobby - noAudioTest / stop(true) -> end;
+transition "bye recvd" lobby - hangup / stop(false) -> end;
+
+state end;
\ No newline at end of file

Modified: trunk/apps/dsm/mods/mod_mysql/ModMysql.cpp
===================================================================
--- trunk/apps/dsm/mods/mod_mysql/ModMysql.cpp  2009-03-31 09:31:26 UTC (rev 
1345)
+++ trunk/apps/dsm/mods/mod_mysql/ModMysql.cpp  2009-03-31 11:22:24 UTC (rev 
1346)
@@ -31,7 +31,11 @@
 
 #include "DSMSession.h"
 #include "AmSession.h"
+#include "AmPlaylist.h"
 
+#include <stdio.h>
+#include <fstream>
+
 SC_EXPORT(SCMysqlModule);
 
 SCMysqlModule::SCMysqlModule() {
@@ -56,6 +60,9 @@
   DEF_CMD("mysql.resolveQueryParams", SCMyResolveQueryParams);
   DEF_CMD("mysql.saveResult",         SCMySaveResultAction);
   DEF_CMD("mysql.useResult",          SCMyUseResultAction);
+  DEF_CMD("mysql.playDBAudio",        SCMyPlayDBAudioAction);
+  DEF_CMD("mysql.getFileFromDB",      SCMyGetFileFromDBAction);
+  DEF_CMD("mysql.putFileToDB",        SCMyPutFileToDBAction);
 
   return NULL;
 }
@@ -417,3 +424,147 @@
 EXEC_ACTION_START(SCMyUseResultAction) {
   sc_sess->avar[MY_AKEY_RESULT] = sc_sess->avar[resolveVars(arg, sess, 
sc_sess, event_params)];
 } EXEC_ACTION_END;
+
+
+CONST_ACTION_2P(SCMyPlayDBAudioAction, ',', true);
+EXEC_ACTION_START(SCMyPlayDBAudioAction) {
+  mysqlpp::Connection* conn = 
+    getMyDSMSessionConnection(sc_sess);
+  if (NULL == conn) 
+    return false;
+  string qstr = replaceQueryParams(par1, sc_sess, event_params);
+
+  try {
+    mysqlpp::Query query = conn->query(qstr.c_str());
+    mysqlpp::UseQueryResult res = query.use();    
+    if (res) {
+
+      mysqlpp::Row row = res.fetch_row();
+      if (!row) {
+       sc_sess->SET_ERRNO(DSM_ERRNO_MY_NOROW);
+       return false;
+      }
+      FILE *t_file = tmpfile();
+      if (NULL == t_file) {
+       sc_sess->SET_ERRNO(DSM_ERRNO_FILE);
+       return false;
+      }
+
+      fwrite(row.at(0).data(), 1, row.at(0).size(), t_file);
+      rewind(t_file);
+      
+      DSMDisposableAudioFile* a_file = new DSMDisposableAudioFile();
+      if (a_file->fpopen(par2, AmAudioFile::Read, t_file)) {
+       sc_sess->SET_ERRNO(DSM_ERRNO_FILE);
+       return false;
+      }
+
+      sc_sess->addToPlaylist(new AmPlaylistItem(a_file, NULL));
+      sc_sess->transferOwnership(a_file);
+
+      sc_sess->SET_ERRNO(DSM_ERRNO_OK);    
+    } else {
+      sc_sess->SET_ERRNO(DSM_ERRNO_MY_QUERY);
+    }
+  } catch (const mysqlpp::Exception& e) {
+    ERROR("DB query '%s' failed: '%s'\n", 
+         qstr.c_str(), e.what());
+    sc_sess->SET_ERRNO(DSM_ERRNO_MY_QUERY);    
+    sc_sess->var["db.ereason"] = e.what();
+  }
+} EXEC_ACTION_END;
+
+CONST_ACTION_2P(SCMyGetFileFromDBAction, ',', true);
+EXEC_ACTION_START(SCMyGetFileFromDBAction) {
+  mysqlpp::Connection* conn = 
+    getMyDSMSessionConnection(sc_sess);
+  if (NULL == conn) 
+    return false;
+  string qstr = replaceQueryParams(par1, sc_sess, event_params);
+
+  try {
+    mysqlpp::Query query = conn->query(qstr.c_str());
+    mysqlpp::UseQueryResult res = query.use();    
+    if (res) {
+      mysqlpp::Row row = res.fetch_row();
+      if (!row) {
+       sc_sess->SET_ERRNO(DSM_ERRNO_MY_NOROW);
+       return false;
+      }
+      FILE *t_file = fopen(par2.c_str(), "wb");
+      if (NULL == t_file) {
+       sc_sess->SET_ERRNO(DSM_ERRNO_FILE);
+       return false;
+      }
+
+      fwrite(row.at(0).data(), 1, row.at(0).size(), t_file);
+      fclose(t_file);
+
+      sc_sess->SET_ERRNO(DSM_ERRNO_OK);    
+    } else {
+      sc_sess->SET_ERRNO(DSM_ERRNO_MY_QUERY);
+    }
+  } catch (const mysqlpp::Exception& e) {
+    ERROR("DB query '%s' failed: '%s'\n", 
+         qstr.c_str(), e.what());
+    sc_sess->SET_ERRNO(DSM_ERRNO_MY_QUERY);    
+    sc_sess->var["db.ereason"] = e.what();
+  }
+} EXEC_ACTION_END;
+
+CONST_ACTION_2P(SCMyPutFileToDBAction, ',', true);
+EXEC_ACTION_START(SCMyPutFileToDBAction) {
+  mysqlpp::Connection* conn = 
+    getMyDSMSessionConnection(sc_sess);
+  if (NULL == conn) 
+    return false;
+  string qstr = replaceQueryParams(par1, sc_sess, event_params);
+
+  size_t fpos = qstr.find("__FILE__");
+  if (fpos == string::npos) {
+    ERROR("missing __FILE__ in query string '%s'\n", 
+         par1.c_str());
+    sc_sess->SET_ERRNO(DSM_ERRNO_UNKNOWN_ARG);
+    return false;
+  }
+  
+  try {
+    std::ifstream data_file(par2.c_str(), std::ios::in | std::ios::binary);
+    if (!data_file) {
+      DBG("could not read file '%s'\n", par2.c_str());
+      sc_sess->SET_ERRNO(DSM_ERRNO_FILE);
+      return false;
+    }
+    // that one is clever...
+    // (see http://www.gamedev.net/community/forums/topic.asp?topic_id=353162 )
+    string file_data((std::istreambuf_iterator<char>(data_file)), 
+                    std::istreambuf_iterator<char>());
+       
+    if (file_data.empty()) {
+      DBG("could not read file '%s'\n", par2.c_str());
+      sc_sess->SET_ERRNO(DSM_ERRNO_FILE);
+      return false;
+    }
+
+    mysqlpp::Query query = conn->query();
+    query << qstr.substr(0, fpos) <<  
+      mysqlpp::escape << file_data << qstr.substr(fpos+8);
+
+    mysqlpp::SimpleResult res = query.execute();
+    if (res) {
+      sc_sess->SET_ERRNO(DSM_ERRNO_OK);
+      sc_sess->var["db.rows"] = int2str(res.rows());
+      sc_sess->var["db.info"] = res.info();
+      sc_sess->var["db.insert_id"] = int2str(res.insert_id());
+    } else {
+      sc_sess->SET_ERRNO(DSM_ERRNO_MY_QUERY);
+      sc_sess->var["db.info"] = res.info();
+    }
+
+  } catch (const mysqlpp::Exception& e) {
+    ERROR("DB query '%s' failed: '%s'\n", 
+         par1.c_str(), e.what());
+    sc_sess->SET_ERRNO(DSM_ERRNO_MY_QUERY);    
+    sc_sess->var["db.ereason"] = e.what();
+  }
+} EXEC_ACTION_END;

Modified: trunk/apps/dsm/mods/mod_mysql/ModMysql.h
===================================================================
--- trunk/apps/dsm/mods/mod_mysql/ModMysql.h    2009-03-31 09:31:26 UTC (rev 
1345)
+++ trunk/apps/dsm/mods/mod_mysql/ModMysql.h    2009-03-31 11:22:24 UTC (rev 
1346)
@@ -87,7 +87,8 @@
 DEF_SCCondition(MyConnectedCondition);
 DEF_ACTION_1P(SCMySaveResultAction);
 DEF_ACTION_1P(SCMyUseResultAction);
+DEF_ACTION_2P(SCMyPlayDBAudioAction);
+DEF_ACTION_2P(SCMyGetFileFromDBAction);
+DEF_ACTION_2P(SCMyPutFileToDBAction);
 
-
-
 #endif

Modified: trunk/apps/dsm/mods/mod_mysql/Readme.mod_mysqlpp.txt
===================================================================
--- trunk/apps/dsm/mods/mod_mysql/Readme.mod_mysqlpp.txt        2009-03-31 
09:31:26 UTC (rev 1345)
+++ trunk/apps/dsm/mods/mod_mysql/Readme.mod_mysqlpp.txt        2009-03-31 
11:22:24 UTC (rev 1346)
@@ -82,9 +82,24 @@
 -- save result into another name
   mysql.saveResult(string name)
 
--- user saved result
-  mysql.userResult(string name)
+-- use saved result
+  mysql.useResult(string name)
 
+-- play a file from DB 
+  mysql.playDBAudio(string query, string filename)
+
+  filename is there to detect file type
+
+-- get a file from DB to local fs
+  mysql.getFileFromDB(string query, string filename)
+
+-- put a local file into DB
+  mysql.putFileToDB(string query, string filename)
+
+  __FILE__ in query is replaced with the contents of the file at 'filename'
+
+  sets $db.rows, $db.info, $db.insert_id
+
 Conditions
 ==========
   mysql.hasResult()

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to