------------------------------------------------------------
revno: 232
committer: John Deal <bassd...@yahoo.com>
branch nick: dbBackEnd
timestamp: Sat 2011-08-13 15:20:20 -0400
message:
Moved 2 common DB methods from DbSqliteDirectory and DbMySqlDirectory to
DbDirectory. Also made DbMySqlDirectory methods
get_workplace_subscription_list() and get_user_subscription_workplace_list()
use mysql_real_query() instead of prepared statements because of unknown stack
issue with prepared statements (see
http://forums.mysql.com/read.php?168,428369,428369#msg-428369).
modified:
mira-server/include/directory/db/DbDirectory.h
mira-server/include/directory/db/mysql/DbMySqlDirectory.h
mira-server/include/directory/db/sqlite/DbSqliteDirectory.h
mira-server/src/directory/db/DbDirectory.cpp
mira-server/src/directory/db/mysql/DbMySqlDirectory.cpp
mira-server/src/directory/db/sqlite/DbSqliteDirectory.cpp
--
lp:~mira-dev/mira/dbBackEnd
https://code.launchpad.net/~mira-dev/mira/dbBackEnd
You are subscribed to branch lp:~mira-dev/mira/dbBackEnd.
To unsubscribe from this branch go to
https://code.launchpad.net/~mira-dev/mira/dbBackEnd/+edit-subscription
=== modified file 'mira-server/include/directory/db/DbDirectory.h'
--- mira-server/include/directory/db/DbDirectory.h 2011-06-30 15:37:01 +0000
+++ mira-server/include/directory/db/DbDirectory.h 2011-08-13 19:20:20 +0000
@@ -24,6 +24,7 @@
#include <iostream>
#include <string>
#include <map>
+#include <list>
#include "User.h"
#include "WorkPlace.h"
@@ -50,6 +51,16 @@
static std::string getConfigPort() { return "DIRECTORY_PORT"; };
static std::string getConfigSocket() { return "DIRECTORY_SOCKET"; };
+ typedef struct
+ {
+ unsigned int subscription_id;
+ unsigned int user_id;
+ unsigned int workplace_id;
+ unsigned int roles_id;
+ } subscription_record;
+
+ typedef std::list<subscription_record> SubscriptionList;
+
DbDirectory(); // Should not be used directly.
DbDirectory(dbType db_type, std::string path);
~DbDirectory();
@@ -76,6 +87,15 @@
protected:
std::string m_version_rec;
+ // Utility methods not involving database connections.
+ virtual std::string getFieldValue(Field field);
+ virtual std::string getFieldValue(const User& user, std::string attrName);
+ virtual std::string getFieldValue(const WorkPlace& workplace,
+ std::string attrName);
+ virtual bool diff_subscription_list(const SubscriptionList& target_list,
+ const SubscriptionList& current_list, SubscriptionList& add_list,
+ SubscriptionList& delete_list);
+
private:
dbType m_db_type;
std::string m_db_path;
=== modified file 'mira-server/include/directory/db/mysql/DbMySqlDirectory.h'
--- mira-server/include/directory/db/mysql/DbMySqlDirectory.h 2011-08-12 01:38:32 +0000
+++ mira-server/include/directory/db/mysql/DbMySqlDirectory.h 2011-08-13 19:20:20 +0000
@@ -24,12 +24,8 @@
#include <string>
#include <vector>
-#include <list>
-// #include <my_global.h>
-// #include <my_sys.h>
#include <mysql.h>
#include "DbDirectory.h"
-// #include <pthread.h>
namespace miraserver
{
@@ -39,6 +35,7 @@
namespace directory_mysql
{
// MySQL directory backend class.
+/*******
typedef struct
{
unsigned int subscription_id;
@@ -46,6 +43,7 @@
unsigned int workplace_id;
unsigned int roles_id;
} subscription_record;
+*******/
typedef struct
{
@@ -57,7 +55,7 @@
std::string installed_utilities; // Comma separated list.
} workplace_record;
-typedef std::list<subscription_record> SubscriptionList;
+// typedef std::list<DbDirectory::subscription_record> SubscriptionList;
typedef std::list<unsigned int> IdList;
@@ -156,16 +154,16 @@
const char* sqlText);
// bool configMultiThread();
bool openDb();
- std::string getFieldValue(Field field);
- std::string getFieldValue(const User& user, std::string attrName);
- std::string getFieldValue(const WorkPlace& workplace, std::string attrName);
+ // std::string getFieldValue(Field field);
+ // std::string getFieldValue(const User& user, std::string attrName);
+ // std::string getFieldValue(const WorkPlace& workplace, std::string attrName);
SubscriptionList get_workplace_subscription_list(
const unsigned int workplace_id);
SubscriptionList get_user_subscription_workplace_list(unsigned int user_id);
- bool diff_subscription_list(const SubscriptionList& target_list,
+ /* bool diff_subscription_list(const SubscriptionList& target_list,
const SubscriptionList& current_list, SubscriptionList& add_list,
- SubscriptionList& delete_list);
+ SubscriptionList& delete_list); */
bool add_subscription(unsigned int workplace_id, unsigned int user_id);
bool delete_subscription(unsigned int subscription_id);
unsigned int get_workplace_id(const std::string& workplace_name);
=== modified file 'mira-server/include/directory/db/sqlite/DbSqliteDirectory.h'
--- mira-server/include/directory/db/sqlite/DbSqliteDirectory.h 2011-05-14 14:55:22 +0000
+++ mira-server/include/directory/db/sqlite/DbSqliteDirectory.h 2011-08-13 19:20:20 +0000
@@ -24,7 +24,6 @@
#include <string>
#include <vector>
-#include <list>
#include <pthread.h>
// #include <sqlite3.h>
#include "sqlite3.h"
@@ -37,6 +36,7 @@
namespace directory
{
// SQLite directory backend class.
+/**********************
typedef struct
{
unsigned int subscription_id;
@@ -44,6 +44,7 @@
unsigned int workplace_id;
unsigned int roles_id;
} subscription_record;
+**********************/
typedef struct
{
@@ -55,7 +56,7 @@
std::string installed_utilities; // Comma separated list.
} workplace_record;
-typedef std::list<subscription_record> SubscriptionList;
+// typedef std::list<DbDirectory::subscription_record> SubscriptionList;
typedef std::list<unsigned int> IdList;
@@ -142,15 +143,15 @@
bool configMultiThread();
bool openDb();
- std::string getFieldValue(const User& user, std::string attrName);
- std::string getFieldValue(const WorkPlace& workplace, std::string attrName);
+ // std::string getFieldValue(const User& user, std::string attrName);
+ // std::string getFieldValue(const WorkPlace& workplace, std::string attrName);
SubscriptionList get_workplace_subscription_list(
const unsigned int workplace_id);
SubscriptionList get_user_subscription_workplace_list(unsigned int user_id);
- bool diff_subscription_list(const SubscriptionList& target_list,
- const SubscriptionList& current_list, SubscriptionList& add_list,
- SubscriptionList& delete_list);
+ // bool diff_subscription_list(const SubscriptionList& target_list,
+ // const SubscriptionList& current_list, SubscriptionList& add_list,
+ // SubscriptionList& delete_list);
bool add_subscription(unsigned int workplace_id, unsigned int user_id);
bool delete_subscription(unsigned int subscription_id);
unsigned int get_workplace_id(const std::string& workplace_name);
=== modified file 'mira-server/src/directory/db/DbDirectory.cpp'
--- mira-server/src/directory/db/DbDirectory.cpp 2011-06-30 15:37:01 +0000
+++ mira-server/src/directory/db/DbDirectory.cpp 2011-08-13 19:20:20 +0000
@@ -152,7 +152,6 @@
DbDirectory* DbDirectory::get_instance()
{
- static DbDirectory* fixedDb = NULL;
std::map<pid_t, DbDirectory*>::iterator inst_itr;
pid_t tid;
DbDirectory* return_instance;
@@ -266,7 +265,6 @@
bool DbDirectory::add_resource(const Resource& resource)
{
- int lock_return;
bool return_value;
@@ -428,6 +426,189 @@
return work_workplace;
}
+std::string DbDirectory::getFieldValue(Field field)
+{
+ std::string work_str;
+
+
+ if (field.type == Field::type_string)
+ {
+ work_str = field.value;
+ }
+ else
+ {
+ if (Field::is_list(field.type))
+ {
+ work_str = "";
+
+ for (std::list<std::string>::iterator itr =
+ field.value_list.begin(); itr != field.value_list.end(); itr++)
+ {
+ work_str.append(*itr);
+ work_str += ",";
+ }
+
+ if (work_str.size() > 0)
+ { // Remove ending ",".
+ work_str.resize(work_str.size() - 1);
+ }
+ }
+ else
+ {
+ if (field.type == Field::type_invalid)
+ {
+ work_str = "";
+ }
+ else
+ {
+ work_str = field.value;
+ } // End if (field.type == Field::type_invalid).
+ } // End if (Field::is_list(field.type)).
+ } // End if (field.type == Field::type_string).
+
+ return work_str;
+}
+
+std::string DbDirectory::getFieldValue(const User& user,
+ std::string attrName)
+{
+ Field field;
+ std::string work_str;
+
+ field = user.get_field(attrName);
+
+ if (field.type == Field::type_string)
+ {
+ return field.value;
+ }
+ else
+ {
+ if (Field::is_list(field.type))
+ {
+ work_str = "";
+
+ for (std::list<std::string>::iterator itr =
+ field.value_list.begin(); itr != field.value_list.end(); itr++)
+ {
+ work_str += *itr;
+ work_str += ",";
+ }
+
+ if (work_str.size() > 0)
+ { // Remove ending ",".
+ work_str.resize(work_str.size() - 1);
+ }
+ }
+ }
+
+ return ""; // No value
+}
+
+std::string DbDirectory::getFieldValue(const WorkPlace& workPlace,
+ std::string attrName)
+{
+ Field field;
+
+ field = workPlace.get_field(attrName);
+
+ if (field.type == Field::type_string)
+ {
+ return field.value;
+ }
+
+ return ""; // No value
+}
+
+// For some reason this function will not work as a compare function if
+// made part of the class.
+static bool diff_subscription_list_compare(
+ DbDirectory::subscription_record& first,
+ DbDirectory::subscription_record& second)
+{
+ if (first.user_id <= second.user_id)
+ {
+ return true;
+ }
+
+ return false;
+}
+
+bool DbDirectory::diff_subscription_list(
+ const DbDirectory::SubscriptionList& target_list,
+ const DbDirectory::SubscriptionList& current_list,
+ DbDirectory::SubscriptionList& add_list,
+ DbDirectory::SubscriptionList& delete_list)
+{
+ bool changes = false;
+ unsigned int list_limit;
+ unsigned int target_size = target_list.size();
+ unsigned int current_size = current_list.size();
+
+ std::list<subscription_record> target = target_list;
+ std::list<subscription_record> current = current_list;
+
+ std::list<subscription_record>::iterator target_itr = target.begin();
+ std::list<subscription_record>::iterator current_itr = current.begin();
+
+
+ add_list.resize(0);
+ delete_list.resize(0);
+
+ // Sort the supplied lists.
+ target.sort(diff_subscription_list_compare);
+ current.sort(diff_subscription_list_compare);
+
+ // Largest list will determine number of times to loop.
+ if (target_size > current_size)
+ {
+ list_limit = target_size;
+ }
+ else
+ {
+ list_limit = current_size;
+ }
+
+ for (unsigned int count = 0; count < list_limit; count++)
+ { // Look for differences and populate add_list and delete_list
+ if ((target_size == 0) || (target_size <= count))
+ { // Anything still in current_list should be deleted.
+ delete_list.push_back(*current_itr);
+ current_itr++;
+ changes = true;
+ continue;
+ }
+
+ if ((current_size == 0) || (current_size <= count))
+ { // Anything still in target_list should be added.
+ add_list.push_back(*target_itr);
+ target_itr++;
+ changes = true;
+ continue;
+ }
+
+ if (target_itr->user_id < current_itr->user_id)
+ { // Target contains number not in current so add it.
+ add_list.push_back(*target_itr);
+ target_itr++;
+ changes = true;
+ continue;
+ }
+
+ if (current_itr->user_id < target_itr->user_id)
+ { // Current contains number not in target so delete it.
+ delete_list.push_back(*current_itr);
+ current_itr++;
+ changes = true;
+ continue;
+ }
+
+ // If reach this point *current_itr == *target_itr so incrment both.
+ target_itr++;
+ current_itr++;
+ } // End for count < list_limit.
+
+ return changes;
+}
} // namespace directory
=== modified file 'mira-server/src/directory/db/mysql/DbMySqlDirectory.cpp'
--- mira-server/src/directory/db/mysql/DbMySqlDirectory.cpp 2011-08-12 01:38:32 +0000
+++ mira-server/src/directory/db/mysql/DbMySqlDirectory.cpp 2011-08-13 19:20:20 +0000
@@ -145,6 +145,7 @@
return true;
}
+/******************************
std::string DbMySqlDirectory::getFieldValue(Field field)
{
std::string work_str;
@@ -186,7 +187,6 @@
} // End if (field.type == Field::type_string).
return work_str;
-
}
std::string DbMySqlDirectory::getFieldValue(const User& user,
@@ -238,17 +238,44 @@
return ""; // No value
}
-
-SubscriptionList DbMySqlDirectory::get_workplace_subscription_list(
+******************************/
+DbDirectory::SubscriptionList DbMySqlDirectory::get_workplace_subscription_list(
const unsigned int workplace_id)
{
- subscription_record work_subscription;
- SubscriptionList work_subscription_list;
- int mysql_result;
- unsigned long data_lengths[4] = {sizeof(workplace_id)};
- my_bool is_nulls[4];
- MYSQL_BIND bind[4];
-
+ DbDirectory::subscription_record work_subscription;
+ DbDirectory::SubscriptionList work_subscription_list;
+ // int mysql_result;
+ // unsigned long data_lengths[4] = {sizeof(workplace_id)};
+ // my_bool is_nulls[4];
+ // MYSQL_BIND bind[4];
+ MYSQL_RES* mysql_result_set;
+ MYSQL_ROW mysql_result_row;
+ char mysql_statement[sizeof(m_get_subscription_user_list_sql) + 10];
+
+ sprintf(mysql_statement,
+ "select subscriptionID, userID, workplaceID, rolesID from subscriptions where workplaceID = %u",
+ workplace_id);
+
+ if (mysql_real_query(m_db, mysql_statement, strlen(mysql_statement)) !=
+ m_mysql_ok)
+ { // Query failed.
+ cout << "Error (DbMySqlDirectory::get_workplace_subscription_list): Query: '"
+ << mysql_statement << "' failed. Error Code: " << mysql_errno(m_db)
+ << " Message: " << mysql_error(m_db) << endl;
+ return work_subscription_list;
+ }
+
+ mysql_result_set = mysql_store_result(m_db);
+
+ if (mysql_result_set == NULL)
+ { // Retrieving result set failed.
+ cout << "Error (DbMySqlDirectory::get_workplace_subscription_list): Result set retrieval failed. "
+ << " Error Code: " << mysql_errno(m_db) << " Message: "
+ << mysql_error(m_db) << endl;
+ return work_subscription_list;
+ }
+
+ /***********************************************
memset(bind, 0, sizeof(bind)); // Initialize MYSQL_BIND structure.
bind[0].buffer_type = MYSQL_TYPE_LONG;
bind[0].buffer = (char*) &workplace_id;
@@ -315,12 +342,34 @@
<< mysql_stmt_error(m_prep_get_subscription_user_list) << endl;
return work_subscription_list;
}
+ ***********************************************/
do
{ // Retrieve list of user IDs for specified workplace.
- mysql_result = mysql_stmt_fetch(m_prep_get_subscription_user_list);
-
- if (mysql_result == m_mysql_ok)
+ // mysql_result = mysql_stmt_fetch(m_prep_get_subscription_user_list);
+ mysql_result_row = mysql_fetch_row(mysql_result_set);
+
+ // if (mysql_result == m_mysql_ok)
+ if (mysql_result_row != NULL)
+ { // Retrieved record. Load into subscription list.
+ work_subscription.subscription_id = std::atol(mysql_result_row[0]);
+ work_subscription.user_id = std::atol(mysql_result_row[1]);
+ work_subscription.workplace_id = std::atol(mysql_result_row[2]);
+ work_subscription.roles_id = 0; // Roles not currently used.
+ work_subscription_list.push_back(work_subscription); // Add to list.
+ }
+ else
+ { // No more rows or retrieving row failed.
+ if (mysql_result_row != m_mysql_ok)
+ {
+ cout << "Error (DbMySqlDirectory::get_user_subscription_workplace_list): Result set row retrieval failed Error: "
+ << mysql_errno(m_db) << " Message: " << mysql_error(m_db)
+ << endl;
+ return work_subscription_list;
+ }
+ }
+
+ /**********************************
{ // Retrieved record. Load into subscription list.
work_subscription_list.push_back(work_subscription); // Add to list.
}
@@ -345,25 +394,62 @@
} // End of if (mysql_return == MYSQL_DATA_TRUNCATED).
} // End of if (mysql_return != MYSQL_NO_DATA).
} // End of if (mysql_return == m_mysql_ok)
+ **********************************/
}
- while (mysql_result != MYSQL_NO_DATA);
+ // while (mysql_result != MYSQL_NO_DATA);
+ while (mysql_result_row != NULL);
- free_results(m_prep_get_subscription_user_list,
- "DbMySqlDirectory::add_get_workplace_subscription_list");
+ // free_results(m_prep_get_subscription_user_list,
+ // "DbMySqlDirectory::add_get_workplace_subscription_list");
+ mysql_free_result(mysql_result_set);
return work_subscription_list;
}
-SubscriptionList DbMySqlDirectory::get_user_subscription_workplace_list(
+DbDirectory::SubscriptionList DbMySqlDirectory::get_user_subscription_workplace_list(
const unsigned int user_id)
{
subscription_record work_subscription;
SubscriptionList work_subscription_list;
- int mysql_result;
- unsigned long lengths[4];
- my_bool is_nulls[4];
- my_bool truncation_flags[4];
- MYSQL_BIND bind[4];
-
+ // int mysql_result;
+ char sql_statement[sizeof(m_get_subscription_workplace_list_sql) + 10];
+ // unsigned long lengths[4];
+ // my_bool is_nulls[4];
+ // my_bool truncation_flags[4];
+ // MYSQL_BIND bind[4];
+ MYSQL_RES* mysql_result_set;
+ MYSQL_ROW mysql_result_row;
+
+
+ std::sprintf(sql_statement,
+ "select subscriptionID, userID, workplaceID, rolesID from subscriptions where userID = %u",
+ user_id);
+
+ if (mysql_real_query(m_db, sql_statement, std::strlen(sql_statement)) !=
+ m_mysql_ok)
+ { // Query failed.
+ cout << "Error (DbMySqlDirectory::get_user_subscription_workplace_list): Query failed Error: "
+ << mysql_errno(m_db) << " Message: " << mysql_error(m_db) << endl;
+ return work_subscription_list;
+ }
+
+ mysql_result_set = mysql_store_result(m_db);
+
+ if (mysql_result_set == NULL)
+ { // Retrieving results failed.
+ cout << "Error (DbMySqlDirectory::get_user_subscription_workplace_list): Result set retrieval failed Error: "
+ << mysql_errno(m_db) << " Message: " << mysql_error(m_db) << endl;
+ return work_subscription_list;
+ }
+
+ /***************************************************************
+ // HACK! reprepare statement each time. Removing this causes
+ // the mysql_stmt_execute() to trash stack. (JRD)
+ if (prepareStatement("DbMySqlDirectory::DbMySqlDirectory",
+ &m_prep_get_subscription_workplace_list,
+ m_get_subscription_workplace_list_sql) == false)
+ {
+ exit(-1);
+ }
memset(bind, 0, sizeof(bind)); // Initialize MYSQL_BIND structure.
bind[0].buffer_type = MYSQL_TYPE_LONG;
@@ -438,16 +524,33 @@
<< mysql_stmt_error(m_prep_get_subscription_workplace_list) << endl;
return work_subscription_list;
}
+ ***************************************************************/
do
{ // Retrieve list of user IDs for specified workplace.
- mysql_result = mysql_stmt_fetch(m_prep_get_subscription_workplace_list);
+ // mysql_result = mysql_stmt_fetch(m_prep_get_subscription_workplace_list);
+ mysql_result_row = mysql_fetch_row(mysql_result_set);
- if (mysql_result == m_mysql_ok)
+ // if (mysql_result == m_mysql_ok)
+ if (mysql_result_row != NULL)
{ // Retrieved record. Load into subscription list.
+ work_subscription.subscription_id = std::atol(mysql_result_row[0]);
+ work_subscription.user_id = std::atol(mysql_result_row[1]);
+ work_subscription.workplace_id = std::atol(mysql_result_row[2]);
+ work_subscription.roles_id = 0; // Roles not currently used.
work_subscription_list.push_back(work_subscription); // Add to list.
}
else
+ { // No more rows or retrieving row failed.
+ if (mysql_result_row != m_mysql_ok)
+ {
+ cout << "Error (DbMySqlDirectory::get_user_subscription_workplace_list): Result set row retrieval failed Error: "
+ << mysql_errno(m_db) << " Message: " << mysql_error(m_db)
+ << endl;
+ return work_subscription_list;
+ }
+ }
+ /***********************************************
{ // Either finished or error.
if (mysql_result != MYSQL_NO_DATA)
{
@@ -467,17 +570,21 @@
} // End of if (mysql_result == MYSQL_DATA_TRUNCATED).
} // End of if (mysql_result != MYSQL_NO_DATA).
} // End of if (mysql_result == m_mysql_ok)
+ ***********************************************/
}
- while (mysql_result != MYSQL_NO_DATA);
+ // while (mysql_result != MYSQL_NO_DATA);
+ while (mysql_result_row != NULL);
- free_results(m_prep_get_subscription_workplace_list,
- "DbMySqlDirectory::add_get_user_subscription_workplace_list");
+ // free_results(m_prep_get_subscription_workplace_list,
+ // "DbMySqlDirectory::add_get_user_subscription_workplace_list");
+ mysql_free_result(mysql_result_set);
return work_subscription_list;
}
// For some reason this function will not work as a compare function if
// made part of the class.
+/******************
static bool diff_subscription_list_compare(
subscription_record& first, subscription_record& second)
{
@@ -564,7 +671,7 @@
return changes;
}
-
+*******************/
bool DbMySqlDirectory::add_subscription(unsigned int workplace_id,
unsigned int user_id)
=== modified file 'mira-server/src/directory/db/sqlite/DbSqliteDirectory.cpp'
--- mira-server/src/directory/db/sqlite/DbSqliteDirectory.cpp 2011-08-12 01:38:32 +0000
+++ mira-server/src/directory/db/sqlite/DbSqliteDirectory.cpp 2011-08-13 19:20:20 +0000
@@ -143,6 +143,7 @@
return success;
}
+/**************************************
std::string DbSqliteDirectory::getFieldValue(const User& user,
std::string attrName)
{
@@ -173,12 +174,13 @@
return ""; // No value
}
+**************************************/
-SubscriptionList DbSqliteDirectory::get_workplace_subscription_list(
+DbDirectory::SubscriptionList DbSqliteDirectory::get_workplace_subscription_list(
const unsigned int workplace_id)
{
- subscription_record work_subscription;
- SubscriptionList work_subscription_list;
+ DbDirectory::subscription_record work_subscription;
+ DbDirectory::SubscriptionList work_subscription_list;
int error_code;
@@ -231,11 +233,11 @@
}
-SubscriptionList DbSqliteDirectory::get_user_subscription_workplace_list(
+DbDirectory::SubscriptionList DbSqliteDirectory::get_user_subscription_workplace_list(
const unsigned int user_id)
{
- subscription_record work_subscription;
- SubscriptionList work_subscription_list;
+ DbDirectory::subscription_record work_subscription;
+ DbDirectory::SubscriptionList work_subscription_list;
int error_code;
@@ -289,8 +291,9 @@
// For some reason this function will not work as a compare function if
// made part of the class.
+/*****************************************
static bool diff_subscription_list_compare(
- subscription_record& first, subscription_record& second)
+ DbDirectory::subscription_record& first, DbDirectory::subscription_record& second)
{
if (first.user_id <= second.user_id)
{
@@ -375,7 +378,7 @@
return changes;
}
-
+*****************************************/
bool DbSqliteDirectory::add_subscription(unsigned int workplace_id,
unsigned int user_id)
@@ -1860,7 +1863,7 @@
work_string = (const char*) sqlite3_column_text(
m_prep_get_workplace_workplacename, 5);
- for (int begin_index = 0, end_index = 0;
+ for (unsigned int begin_index = 0, end_index = 0;
begin_index < work_string.size();)
{ // Extract each utility name and insert in workplace utility list.
end_index = work_string.find(",", begin_index);
@@ -1981,7 +1984,7 @@
work_field.value = "";
work_string = (const char*) sqlite3_column_text(m_prep_get_workplace, 5);
- for (int begin_index = 0, end_index = 0;
+ for (unsigned int begin_index = 0, end_index = 0;
begin_index < work_string.size();)
{ // Extract each utility name and insert in workplace utility list.
end_index = work_string.find(",", begin_index);
------------------------------------------------------------------------------
FREE DOWNLOAD - uberSVN with Social Coding for Subversion.
Subversion made easy with a complete admin console. Easy
to use, easy to manage, easy to install, easy to extend.
Get a Free download of the new open ALM Subversion platform now.
http://p.sf.net/sfu/wandisco-dev2dev
_______________________________________________
Mira-development mailing list
Mira-development@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mira-development