diff options
author | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-07-21 19:55:24 +0000 |
---|---|---|
committer | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-07-21 19:55:24 +0000 |
commit | a7d4746c0072121d93b57da8901cdaedeec620f8 (patch) | |
tree | 6feb877ae7c888252cc009f7dc204bf56a5b94c4 /src/modules | |
parent | 68712039b8f1174b75e671058aee98186444ba98 (diff) |
Deal with ? substitution, we're at the point now where we can call the mysql_real_query function
(mysql_real_query takes char* and length params, mysql_query just takes char*, and cant deal with NULLs)
TODO after this: signal the main ircd thread that theres a result ready on a given db id, and to fetch that result and post it back to the caller
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@4480 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/modules')
-rw-r--r-- | src/modules/extra/m_mysql.cpp | 74 |
1 files changed, 72 insertions, 2 deletions
diff --git a/src/modules/extra/m_mysql.cpp b/src/modules/extra/m_mysql.cpp index 36624ee6e..bc3586c38 100644 --- a/src/modules/extra/m_mysql.cpp +++ b/src/modules/extra/m_mysql.cpp @@ -200,8 +200,78 @@ class SQLConnection : public classbase void DoLeadingQuery() { - SQLrequest& query = queue.front(); - log(DEBUG,"DO QUERY: %s",query.query.q.c_str()); + /* Parse the command string and dispatch it to mysql */ + SQLrequest& req = queue.front(); + log(DEBUG,"DO QUERY: %s",req.query.q.c_str()); + + /* Pointer to the buffer we screw around with substitution in */ + char* query; + + /* Pointer to the current end of query, where we append new stuff */ + char* queryend; + + /* Total length of the unescaped parameters */ + unsigned long paramlen; + + paramlen = 0; + + for(ParamL::iterator i = req.query.p.begin(); i != req.query.p.end(); i++) + { + paramlen += i->size(); + } + + /* To avoid a lot of allocations, allocate enough memory for the biggest the escaped query could possibly be. + * sizeofquery + (totalparamlength*2) + 1 + * + * The +1 is for null-terminating the string for mysql_real_escape_string + */ + + query = new char[req.query.q.length() + (paramlen*2)]; + queryend = query; + + /* Okay, now we have a buffer large enough we need to start copying the query into it and escaping and substituting + * the parameters into it... + */ + + for(unsigned long i = 0; i < req.query.q.length(); i++) + { + if(req.query.q[i] == '?') + { + /* We found a place to substitute..what fun. + * use mysql calls to escape and write the + * escaped string onto the end of our query buffer, + * then we "just" need to make sure queryend is + * pointing at the right place. + */ + if(req.query.p.size()) + { + unsigned long len = mysql_real_escape_string(&connection, queryend, req.query.p.front().c_str(), req.query.p.front().length()); + + queryend += len; + req.query.p.pop_front(); + } + else + { + log(DEBUG, "Found a substitution location but no parameter to substitute :|"); + break; + } + } + else + { + *queryend = req.query.q[i]; + queryend++; + } + } + + *queryend = 0; + + log(DEBUG, "Attempting to dispatch query: %s", query); + + pthread_mutex_lock(&queue_mutex); + req.query.q = query; + pthread_mutex_unlock(&queue_mutex); + + /* TODO: Do the mysql_real_query here */ } // This method issues a query that expects multiple rows of results. Use GetRow() and QueryDone() to retrieve |