date('Y-m-d H:i:s'),
"type" => $type,
"message" => "$message"
);
$format = array("%s", "%s", "%s");
$tableName = TenDaoUtil::getTableName(TenDaoUtil::SNS_MESSAGE_TABLE);
$result = $wpdb->insert($tableName, $data, $format);
return $result;
}
private static function getMessageType($type)
{
if ($type == TenDaoUtil::NOTIFICATION_STRING) {
return TenDaoUtil::NOTIFICATION;
}
return TenDaoUtil::SUBSCRIPTION_CONFIRM;
}
public static function saveTrackingId($trackingId, $type, $url, $ip, $agent, $referer)
{
global $wpdb;
$data = array(
"trackingId" => "$trackingId",
"type" => "$type",
"url" => "$url",
"ip" => "$ip",
"agent" => "$agent",
"referer" => "$referer",
"date" => date('Y-m-d H:i:s')
);
$format = array("%s", "%s", "%s", "%s", "%s", "%s", "%s");
$tableName = TenDaoUtil::getTableName(TenDaoUtil::TRACKING_TABLE);
$result = $wpdb->insert($tableName, $data, $format);
return $result;
}
public static function updateContactLists($currentContactLists)
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::CONTACT_LISTS_TABLE);
$dbLists = self::getAllContactLists();
$dbListsObj = self::getContactListsObj($dbLists);
$currentListsArray = explode(",", $currentContactLists);
$inactiveLists = array();
foreach ($currentListsArray as $contactList) {
$list = trim($contactList);
if ($dbListsObj->$list) {
if ($dbListsObj->$list->active == Utils::FALSE) {
$dbListsObj->$list->newStatus = Utils::TRUE;
} else {
unset($dbListsObj->$list);
}
} else {
$dbListsObj->$list = (object)array();
$dbListsObj->$list->list = $contactList;
$dbListsObj->$list->active = Utils::TRUE;
$dbListsObj->$list->update = false;
$dbListsObj->$list->add = true;
}
}
$separator = "";
$count = 0;
$insertSqlRaw = "INSERT INTO $tableName (list, active) VALUES ";
foreach ($dbListsObj as $key => $contactList) {
if (!$contactList->update && $contactList->add) {
$count++;
$insertSqlRaw .= $separator . "('" . trim($contactList->list) . "', " . Utils::TRUE . ")";
$separator = ",";
} else {
array_push($inactiveLists, $contactList);
}
}
foreach ($inactiveLists as $contactList) {
$status = ($contactList->newStatus == Utils::TRUE ? Utils::TRUE : Utils::FALSE);
$rawSql = "UPDATE $tableName set active = " . $status . " where id = $contactList->id;";
$updateSQL = $wpdb->prepare($rawSql);
$updateResult = $wpdb->query($updateSQL);
}
if ($count > 0) {
$insertSql = $wpdb->prepare($insertSqlRaw);
$insertResult = $wpdb->query($insertSql);
}
}
public static function getAllContactLists()
{
return self::getContactLists();
}
public static function getActiveContactLists()
{
return self::getContactLists("WHERE active = 0");
}
public static function getInActiveContactLists()
{
return self::getContactLists("WHERE active = 1");
}
/**
* retrieve contact lists from the database
* @param $whereClause
* @return object[] a list of contact list rows
*/
public static function getContactLists($whereClause = "")
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::CONTACT_LISTS_TABLE);
$sql = "SELECT * FROM $tableName $whereClause ORDER BY active DESC;";
$listsRows = $wpdb->get_results($sql);
return $listsRows;
}
public static function getContactListsObj($dbLists)
{
$obj = (object)array();
foreach ($dbLists as $id => $contactList) {
$list = $contactList->list;
$obj->$list = $contactList;
$obj->$list->update = true;
}
return $obj;
}
public static function getContactListByList($list)
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::CONTACT_LISTS_TABLE);
$sql = "SELECT * FROM $tableName WHERE list = '$list'";
$listRow = $wpdb->get_row($sql);
return $listRow;
}
public static function removeEverythingForContactList($id)
{
if (self::contactListExists($id)) {
self::deleteContactList($id);
self::deleteContactListSettings($id);
}
}
public static function contactListExists($id)
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::CONTACT_LISTS_TABLE);
$contactListRow = $wpdb->get_row("SELECT * FROM $tableName WHERE id = '$id';");
return (sizeof($contactListRow) == 0) ? false : true;
}
public static function deleteContactListSettings($listId)
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::CONTACT_LIST_SETTINGS_TABLE);
$deleteSql = "DELETE FROM $tableName WHERE listId = $listId;";
return $wpdb->query($deleteSql);
}
public static function deleteContactList($id)
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::CONTACT_LISTS_TABLE);
if (self::contactListExists($id)) {
$deleteSql = "DELETE FROM $tableName WHERE id = '$id';";
return $wpdb->query($deleteSql);
}
}
public static function contactListExistsByList($list)
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::CONTACT_LISTS_TABLE);
$contactListRow = $wpdb->get_row("SELECT * FROM $tableName WHERE list = '$list';");
return (sizeof($contactListRow) == 0) ? false : true;
}
/*
****************************
Contact List Settings Logic
****************************
*/
public static function getContactListSettings($listId)
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::CONTACT_LIST_SETTINGS_TABLE);
$query = "SELECT * FROM $tableName WHERE listId = $listId;";
$settings = $wpdb->get_row($query, ARRAY_A);
if (!empty($settings)) return $settings;
return null;
}
public static function saveContactListSettings($listId, $settings)
{
$result = null;
if (self::settingsExist($listId)) {
self::updateContactListSettings($listId, $settings);
} else {
try {
global $wpdb;
$settings["listId"] = $listId;
$format = self::getSettingsDataTypes($settings);
$tableName = TenDaoUtil::getTableName(TenDaoUtil::CONTACT_LIST_SETTINGS_TABLE);
$result = $wpdb->insert($tableName, $settings, $format);
} catch (Exception $e) {
$result = $e;
}
}
return $result;
}
public static function settingsExist($listId)
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::CONTACT_LIST_SETTINGS_TABLE);
$query = "SELECT * FROM $tableName WHERE listId = '$listId';";
$results = $wpdb->query($query);
return ($results > 0) ? true : false;
}
public static function updateContactListSettings($listId, $settings)
{
global $wpdb;
$settingsId = self::getSettingsId($listId);
$where = array(
"ID" => $settingsId
);
$tableName = TenDaoUtil::getTableName(TenDaoUtil::CONTACT_LIST_SETTINGS_TABLE);
$result = $wpdb->update($tableName, $settings, $where);
return $result;
}
public static function getSettingsDataTypes($settings)
{
$obj = array();
foreach ($settings as $property => $value) {
$obj[] = '%s';
}
return $obj;
}
public static function getSettingsId($listId)
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::CONTACT_LIST_SETTINGS_TABLE);
$row = $wpdb->get_row("SELECT * FROM $tableName WHERE listId = '$listId';", ARRAY_A);
return $row['id'];
}
public static function confirmOptIn($email, $list)
{
global $wpdb;
if (self::isSubscribed($email, $list)) {
$data = array("confirmedDoubleOpt" => Utils::TRUE);
$where = array(
"ID" => self::getSubscriptionRowId($email, $list)
);
$format = array(
"%d"
);
$tableName = TenDaoUtil::getTableName(TenDaoUtil::SUBSCRIBE_TABLE);
$result = $wpdb->update($tableName, $data, $where, $format);
if ($result == 1) return true;
throw new Exception("Something went when trying to confirm Email address " . $email . " with list " . $list . " was not found");
} else {
throw new Exception("Email address " . $email . " with list " . $list . " was not found");
}
}
public static function isSubscribed($email, $list)
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::SUBSCRIBE_TABLE);
$sql = "SELECT * FROM $tableName WHERE status=" . TenDaoUtil::SUBSCRIBED . " and email = '$email' and list = '$list';";
$rows = $wpdb->get_row($sql);
return (sizeof($rows) == 0) ? false : true;
}
public static function isUnSubscribed($email, $list)
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::SUBSCRIBE_TABLE);
$sql = "SELECT * FROM $tableName WHERE status=" . TenDaoUtil::UNSUBSCRIBED . " and email = '$email' and list = '$list';";
$rows = $wpdb->get_row($sql);
return (sizeof($rows) == 0) ? false : true;
}
public static function getInsertData($config)
{
$obj = array();
foreach ($config as $property => $value) {
if ($property != 'request_uri' && $property != 'redirect_url') {
$obj[$config->$property->data_column] = $config->$property->value;
if ($property == "requires_double_opt") {
$obj[$config->$property->data_column] = ($config->$property->value == "true" ? Utils::TRUE : Utils::FALSE);
}
}
}
return $obj;
}
public static function getDataTypes($config)
{
$obj = array();
foreach ($config as $property => $value) {
if ($property != 'request_uri' && $property != 'redirect_url') {
$obj[] = $config->$property->placeholder;
}
}
return $obj;
}
public static function getSubscriptionRowId($email, $list)
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::SUBSCRIBE_TABLE);
$row = $wpdb->get_row("SELECT * FROM $tableName WHERE email = '$email' AND list = '$list';", ARRAY_A);
return $row['id'];
}
public static function saveSubscriber($config)
{
global $wpdb;
if (!self::isSubscribed($config->email->value, $config->list->value)) {
$data = self::getInsertData($config);
$dataTypes = self::getDataTypes($config);
$result = $wpdb->insert(TenDaoUtil::getTableName(TenDaoUtil::SUBSCRIBE_TABLE), $data, $dataTypes);
if ($result == 1) return true;
if (WP_DEBUG) {
echo '$result was expected to == 1
';
echo '$data = ' . $data . '
';
var_dump($dataTypes);
echo '$result = ' . $result . '
';
}
throw new Exception("Something went wrong, please try again");
} else {
$tableName = TenDaoUtil::getTableName(TenDaoUtil::SUBSCRIBE_TABLE);
$subscription = $wpdb->get_row("SELECT * FROM " . $tableName . " WHERE email = '" . $config->email->value . "' AND list = '" . $config->list->value . "';");
$rowId = $subscription->id;
$data = self::getInsertData($config);
$dataTypes = self::getDataTypes($config);
$result = $wpdb->update(
$tableName,
$data,
array(
"ID" => $rowId
),
$dataTypes
);
if ($result == 1) return true;
if (WP_DEBUG) {
echo '$result was expected to == 1
';
echo '$result = ' . $result . '
';
echo '$tableName = ' . $tableName . '
';
echo '$subscription = ' . $subscription . '
';
echo '$rowId = ' . $rowId . '
';
echo '$data = ' . $data . '
';
var_dump($data);
var_dump($dataTypes);
}
throw new Exception("Something went wrong, please try again");
}
}
public static function tableExistsForType($type)
{
return (self::typeTableMapping()->$type != "" && self::typeTableMapping()->$type != null) ? true : false;
}
public static function typeTableMapping()
{
return (object)array(
"subscribers" => TenDaoUtil::getTableName(TenDaoUtil::SUBSCRIBE_TABLE),
"unsubscribers" => TenDaoUtil::getTableName(TenDaoUtil::SUBSCRIBE_TABLE),
"track" => TenDaoUtil::getTableName(TenDaoUtil::TRACKING_TABLE)
);
}
public static function dataRowExists($tableName, $rowId)
{
global $wpdb;
$query = "SELECT * FROM $tableName WHERE id = $rowId";
$results = $wpdb->query($query);
return ($results > 0) ? true : false;
}
public static function getStatusClause($type)
{
if ($type == "subscribers") return " AND status = " . TenDaoUtil::SUBSCRIBED;
if ($type == "unsubscribers") return " AND status = " . TenDaoUtil::UNSUBSCRIBED;
return "";
}
public static function emailNotAlreadySubscribed($email, $list)
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::SUBSCRIBE_TABLE);
$results = $wpdb->query("SELECT * FROM $tableName WHERE status = " . TenDaoUtil::SUBSCRIBED . " and email = '$email' and list = '$list';");
return ($results == 0) ? true : false;
}
public static function getSubscriptions($list)
{
global $wpdb;
$results = 0;
if (isset($list)) {
$tableName = TenDaoUtil::getTableName(TenDaoUtil::SUBSCRIBE_TABLE);
$querySQL = $wpdb->prepare("SELECT * FROM $tableName WHERE status = " . TenDaoUtil::SUBSCRIBED . " and list = '$list';", ARRAY_A);
$results = $wpdb->get_results($querySQL);
}
return $results;
}
public static function getUnSubscribers($list)
{
global $wpdb;
$results = 0;
if (isset($list)) {
$tableName = TenDaoUtil::getTableName(TenDaoUtil::SUBSCRIBE_TABLE);
$querySQL = $wpdb->prepare("SELECT * FROM $tableName WHERE status = " . TenDaoUtil::UNSUBSCRIBED . " and list = '$list';", ARRAY_A);
$results = $wpdb->get_results($querySQL);
}
return $results;
}
public static function unsubscribe($email, $list, $campaignId)
{
global $wpdb;
$now = date('Y-m-d H:i:s');
$tableName = TenDaoUtil::getTableName(TenDaoUtil::SUBSCRIBE_TABLE);
if (self::isSubscribed($email, $list) || self::isUnSubscribed($email, $list)) {
$data = array(
"campaignId" => $campaignId,
"date" => $now,
"status" => TenDaoUtil::UNSUBSCRIBED
);
$where = array(
"email" => $email,
"list" => $list
);
$whereFormat = array("%s", "%s");
$result = $wpdb->update($tableName, $data, $where, $whereFormat);
} else {
$data = array(
"email" => $email,
"list" => $list,
"campaignId" => $campaignId,
"date" => $now,
"status" => TenDaoUtil::UNSUBSCRIBED,
"requiresDoubleOpt" => Utils::FALSE
);
$format = array("%s", "%s", "%d", "%s", "%d", "%d");
$result = $wpdb->insert($tableName, $data, $format);
}
return $result;
}
public static function addSetting($setting, $value)
{
try {
global $wpdb;
if (!self::settingExists($setting)) {
$data = array(
"setting" => $setting,
"value" => $value
);
$format = array(
"%s",
"%s"
);
$tableName = TenDaoUtil::getTableName(TenDaoUtil::SETTINGS_TABLE);
$result = $wpdb->insert(
$tableName,
$data,
$format
);
return $result;
} else {
self::updateSetting($setting, $value);
}
} catch (Exception $exception) {
echo $exception;
}
return null;
}
public static function removeSetting($setting)
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::SETTINGS_TABLE);
if (self::settingExists($setting)) {
$deleteSql = "DELETE FROM $tableName WHERE setting = '$setting';";
return $wpdb->query($deleteSql);
}
return null;
}
/**
* Retrieves a TCM setting from the MySQL database
*
*
* @param string $setting name of the setting value to retrieve
* @return string the setting value
*/
public static function getSetting($setting)
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::SETTINGS_TABLE);
if (self::settingExists($setting)) {
$sql = "SELECT * FROM $tableName WHERE setting = '$setting';";
$settingRow = $wpdb->get_row($sql);
return $settingRow->value;
} else {
return '';
}
}
public static function settingExists($setting)
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::SETTINGS_TABLE);
$sql = "SELECT * FROM $tableName WHERE setting = '$setting';";
$settingRows = $wpdb->get_row($sql);
return (sizeof($settingRows) == 0) ? false : true;
}
public static function dumpSettings()
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::SETTINGS_TABLE);
echo 'table name = ' . $tableName . '
';
$sql = "SELECT * FROM $tableName;";
echo '$sql = ' . $sql . '
';
$settingRows = $wpdb->get_row($sql);
echo '$settingRows = ' . $settingRows . '
';
echo 'sizeof($settingRows) = ' . sizeof($settingRows) . '
';
}
public static function updateSetting($setting, $value)
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::SETTINGS_TABLE);
if (self::settingExists($setting)) {
$settingRow = $wpdb->get_row("SELECT * FROM $tableName WHERE setting = '$setting';");
$rowId = $settingRow->id;
$result = $wpdb->update(
$tableName,
array(
"setting" => $setting,
"value" => $value
),
array(
"ID" => $rowId
),
array(
"%s"
)
);
return $result;
} else {
return self::addSetting($setting, $value);
}
}
public static function data($type)
{
$data = (object)array();
switch ($type) {
case TenDaoUtil::SUBSCRIBERS :
$data->subscribers = self::getAllSubscriptions();
break;
case TenDaoUtil::UNSUBSCRIBERS :
$data->unsubscribers = self::getAllUnsubscribers();
break;
case TenDaoUtil::TRACK_DATA :
$data->tracks = self::getAllTracking();
break;
case TenDaoUtil::ALL_DATA :
$data->subscribers = self::getAllSubscriptions();
$data->unsubscribers = self::getAllUnsubscribers();
$data->tracks = self::getAllTracking();
break;
default :
//TODO : send error
$data->subscribers = self::getAllSubscriptions();
$data->unsubscribers = self::getAllUnsubscribers();
$data->tracks = self::getAllTracking();
break;
}
return $data;
}
public static function getAllSubscriptions()
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::SUBSCRIBE_TABLE);
$querySQL = $wpdb->prepare("SELECT * FROM $tableName WHERE status = " . TenDaoUtil::SUBSCRIBED . ";", ARRAY_A);
$results = $wpdb->get_results($querySQL);
return $results;
}
public static function getAllUnsubscribers()
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::SUBSCRIBE_TABLE);
$querySQL = $wpdb->prepare("SELECT * FROM $tableName WHERE status = " . TenDaoUtil::UNSUBSCRIBED . ";", ARRAY_A);
$results = $wpdb->get_results($querySQL);
return $results;
}
public static function getAllTracking()
{
global $wpdb;
$tableName = TenDaoUtil::getTableName(TenDaoUtil::TRACKING_TABLE);
$querySQL = $wpdb->prepare("SELECT * FROM $tableName", ARRAY_A);
$results = $wpdb->get_results($querySQL);
return $results;
}
public static function createTables($force = false)
{
self::createTable(TenDaoUtil::getTableName(TenDaoUtil::SUBSCRIBE_TABLE),
TenDaoUtil::getSubscriptionTableSQL(), 'Subscribe', $force);
self::createTable(TenDaoUtil::getTableName(TenDaoUtil::TRACKING_TABLE),
TenDaoUtil::getTrackingTableSQL(), 'Tracking', $force);
self::createTable(TenDaoUtil::getTableName(TenDaoUtil::SETTINGS_TABLE),
TenDaoUtil::getSettingsTableSQL(), 'Settings', $force);
self::createTable(TenDaoUtil::getTableName(TenDaoUtil::CONTACT_LISTS_TABLE),
TenDaoUtil::getListsTableSQL(), 'Lists', $force);
self::createTable(TenDaoUtil::getTableName(TenDaoUtil::CONTACT_LIST_SETTINGS_TABLE),
TenDaoUtil::getContactListSettingsTableSQL(), 'Contact List Settings', $force);
self::createTable(TenDaoUtil::getTableName(TenDaoUtil::SNS_MESSAGE_TABLE),
TenDaoUtil::getSnsMessageTableSQL(), 'Amazon SNS Messages', $force);
}
/**
* dumps data about a table
* @param $tableName
*/
private static function dumpTable($tableName)
{
global $wpdb;
$tn = trim($tableName, TenDaoUtil::MYSQL_QUOTE_CHARACTER);
$tables = $wpdb->get_results("show tables like '$tn'");
echo '$tableName = ' . $tableName . '
';
echo '$tables for ' . $tn . ' = ' . $tables . '
';
echo 'sizeof($tables) = ' . sizeof($tables) . '
';
}
public static function dumpTables()
{
self::dumpTable(TenDaoUtil::getTableName(TenDaoUtil::SUBSCRIBE_TABLE));
self::dumpTable(TenDaoUtil::getTableName(TenDaoUtil::TRACKING_TABLE));
self::dumpTable(TenDaoUtil::getTableName(TenDaoUtil::SETTINGS_TABLE));
self::dumpTable(TenDaoUtil::getTableName(TenDaoUtil::CONTACT_LISTS_TABLE));
self::dumpTable(TenDaoUtil::getTableName(TenDaoUtil::CONTACT_LIST_SETTINGS_TABLE));
self::dumpTable(TenDaoUtil::getTableName(TenDaoUtil::SNS_MESSAGE_TABLE));
}
/**
* Safely adds a column to a MySQL database
*
*
* @param string $tableName name of the table to update
* @param string $columnName name of the column to update
* @param string $columnDefinition definition of the column to update ex: "my_additional_column varchar(2048) NOT NULL DEFAULT"
*/
public static function safelyAddColumn($tableName, $columnName, $columnDefinition)
{
global $wpdb;
$sql =
"IF NOT EXISTS( (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE()
AND COLUMN_NAME='$columnName' AND TABLE_NAME='$tableName') ) THEN
ALTER TABLE $tableName ADD $columnName $columnDefinition '';
END IF;";
$wpdb->query($sql);
}
public static function createTable($tableName, $sql, $description, $throwError = true)
{
if (!TenDaoUtil::tableExists($tableName)) {
global $wpdb;
$result = $wpdb->query($sql);
return $result;
}
if ($throwError) {
throw new Exception('TenCentMail Plugin ' . $description . ' Table already exists. Deactivate or drop the existing table for a fresh install');
}
return null;
}
public static function dropTables()
{
//TODO: drop tables for every site in multisite
self::dropTable(TenDaoUtil::getTableName(TenDaoUtil::SUBSCRIBE_TABLE));
self::dropTable(TenDaoUtil::getTableName(TenDaoUtil::TRACKING_TABLE));
self::dropTable(TenDaoUtil::getTableName(TenDaoUtil::SETTINGS_TABLE));
self::dropTable(TenDaoUtil::getTableName(TenDaoUtil::CONTACT_LIST_SETTINGS_TABLE));
self::dropTable(TenDaoUtil::getTableName(TenDaoUtil::CONTACT_LISTS_TABLE));
self::dropTable(TenDaoUtil::getTableName(TenDaoUtil::SNS_MESSAGE_TABLE));
}
public static function dropTable($tableName, $throwError = true)
{
if (TenDaoUtil::tableExists($tableName)) {
global $wpdb;
$sql = "DROP TABLE " . $tableName;
$dropSQL = $wpdb->prepare($sql);
return $wpdb->query($dropSQL);
}
if ($throwError) {
throw new Exception('TenCentMail Plugin ' . $tableName . ' Table doesnt exist.');
}
return null;
}
}