Completed
Push — master ( a75ecc...97ae17 )
by Adam
71:21 queued 52:34
created
modules/ModuleBuilder/views/view.modulefields.php 1 patch
Indentation   +38 added lines, -38 removed lines patch added patch discarded remove patch
@@ -45,20 +45,20 @@  discard block
 block discarded – undo
45 45
     var $mbModule;
46 46
     
47 47
     /**
48
-	 * @see SugarView::_getModuleTitleParams()
49
-	 */
50
-	protected function _getModuleTitleParams($browserTitle = false)
51
-	{
52
-	    global $mod_strings;
48
+     * @see SugarView::_getModuleTitleParams()
49
+     */
50
+    protected function _getModuleTitleParams($browserTitle = false)
51
+    {
52
+        global $mod_strings;
53 53
 	    
54
-    	return array(
55
-    	   translate('LBL_MODULE_NAME','Administration'),
56
-    	   ModuleBuilderController::getModuleTitle(),
57
-    	   );
54
+        return array(
55
+            translate('LBL_MODULE_NAME','Administration'),
56
+            ModuleBuilderController::getModuleTitle(),
57
+            );
58 58
     }
59 59
 
60
-	function display()
61
-	{
60
+    function display()
61
+    {
62 62
         $smarty = new Sugar_Smarty();
63 63
         global $mod_strings;
64 64
         $bak_mod_strings=$mod_strings;
@@ -92,13 +92,13 @@  discard block
 block discarded – undo
92 92
                 if ($this->isValidStudioField($def))
93 93
                 {
94 94
                     $def['label'] = translate($def['vname'], $module_name);
95
-					//Custom relate fields will have a non-db source, but custom_module set
96
-                	if(isset($def['source']) && $def['source'] == 'custom_fields' || isset($def['custom_module'])) {
97
-                       $f[$mod_strings['LBL_HCUSTOM']][$def['name']] = $def;
98
-                       $def['custom'] = true;
95
+                    //Custom relate fields will have a non-db source, but custom_module set
96
+                    if(isset($def['source']) && $def['source'] == 'custom_fields' || isset($def['custom_module'])) {
97
+                        $f[$mod_strings['LBL_HCUSTOM']][$def['name']] = $def;
98
+                        $def['custom'] = true;
99 99
                     } else {
100
-                       $f[$mod_strings['LBL_HDEFAULT']][$def['name']] = $def;
101
-                       $def['custom'] = false;
100
+                        $f[$mod_strings['LBL_HDEFAULT']][$def['name']] = $def;
101
+                        $def['custom'] = false;
102 102
                     }
103 103
 
104 104
                     $def['type'] = isset($fieldTypes[$def['type']]) ? $fieldTypes[$def['type']] : ucfirst($def['type']);
@@ -183,15 +183,15 @@  discard block
 block discarded – undo
183 183
                     {
184 184
                         if (isset($loadedFields[$field]))
185 185
                         {
186
-                           unset($this->mbModule->mbvardefs->vardefs['fields'][$k][$field]);
186
+                            unset($this->mbModule->mbvardefs->vardefs['fields'][$k][$field]);
187 187
                         } else {
188
-                           $this->mbModule->mbvardefs->vardefs['fields'][$k][$field]['label'] = isset($def['vname']) && isset($this->mbModule->mblanguage->strings[$current_language.'.lang.php'][$def['vname']]) ? $this->mbModule->mblanguage->strings[$current_language.'.lang.php'][$def['vname']] : $field;
189
-                           $customFieldsData[$field] = ($k == $this->mbModule->name) ? true : false;
190
-                           $loadedFields[$field] = true;
188
+                            $this->mbModule->mbvardefs->vardefs['fields'][$k][$field]['label'] = isset($def['vname']) && isset($this->mbModule->mblanguage->strings[$current_language.'.lang.php'][$def['vname']]) ? $this->mbModule->mblanguage->strings[$current_language.'.lang.php'][$def['vname']] : $field;
189
+                            $customFieldsData[$field] = ($k == $this->mbModule->name) ? true : false;
190
+                            $loadedFields[$field] = true;
191 191
 
192
-                           $type = $this->mbModule->mbvardefs->vardefs['fields'][$k][$field]['type'];
193
-                           $this->mbModule->mbvardefs->vardefs['fields'][$k][$field]['type'] = isset($fieldTypes[$type]) ? $fieldTypes[$type] : ucfirst($type);
194
-                           $fieldsData[] = $this->mbModule->mbvardefs->vardefs['fields'][$k][$field];
192
+                            $type = $this->mbModule->mbvardefs->vardefs['fields'][$k][$field]['type'];
193
+                            $this->mbModule->mbvardefs->vardefs['fields'][$k][$field]['type'] = isset($fieldTypes[$type]) ? $fieldTypes[$type] : ucfirst($type);
194
+                            $fieldsData[] = $this->mbModule->mbvardefs->vardefs['fields'][$k][$field];
195 195
                         }
196 196
                     }
197 197
                 }
@@ -249,29 +249,29 @@  discard block
 block discarded – undo
249 249
     function isValidStudioField(
250 250
         $def
251 251
         )
252
-	{
253
-    	if (isset($def['studio'])) {
252
+    {
253
+        if (isset($def['studio'])) {
254 254
             if (is_array($def [ 'studio' ]))
255 255
             {
256
-    			if (isset($def['studio']['editField']) && $def['studio']['editField'] == true)
256
+                if (isset($def['studio']['editField']) && $def['studio']['editField'] == true)
257 257
                     return true;
258
-    			if (isset($def['studio']['required']) && $def['studio']['required'])
258
+                if (isset($def['studio']['required']) && $def['studio']['required'])
259 259
                     return true;
260 260
                     
261
-    		} else
262
-    		{
263
-    			if ($def['studio'] == 'visible')
261
+            } else
262
+            {
263
+                if ($def['studio'] == 'visible')
264 264
                     return true;
265 265
                 if ($def['studio'] == 'hidden' || $def['studio'] == 'false' || !$def['studio'] )
266 266
                     return false;
267 267
             }
268 268
         }
269
-    	if (empty($def ['source']) || $def ['source'] == 'db' || $def ['source'] == 'custom_fields')
270
-		{
271
-    		if ($def ['type'] != 'id' && (empty($def ['dbType']) || $def ['dbType'] != 'id'))
272
-		  return true;
273
-		}
269
+        if (empty($def ['source']) || $def ['source'] == 'db' || $def ['source'] == 'custom_fields')
270
+        {
271
+            if ($def ['type'] != 'id' && (empty($def ['dbType']) || $def ['dbType'] != 'id'))
272
+            return true;
273
+        }
274 274
 		
275
-		return false;
276
-	}
275
+        return false;
276
+    }
277 277
 }
278 278
\ No newline at end of file
Please login to merge, or discard this patch.
install/language/en_us.lang.php 1 patch
Indentation   +396 added lines, -396 removed lines patch added patch discarded remove patch
@@ -43,40 +43,40 @@  discard block
 block discarded – undo
43 43
  * *******************************************************************************/
44 44
 
45 45
 $mod_strings = array(
46
-	'LBL_BASIC_SEARCH'					=> 'Basic Search',
47
-	'LBL_ADVANCED_SEARCH'				=> 'Advanced Search',
48
-	'LBL_BASIC_TYPE'					=> 'Basic Type',
49
-	'LBL_ADVANCED_TYPE'					=> 'Advanced Type',
50
-	'LBL_SYSOPTS_1'						=> 'Select from the following system configuration options below.',
46
+    'LBL_BASIC_SEARCH'					=> 'Basic Search',
47
+    'LBL_ADVANCED_SEARCH'				=> 'Advanced Search',
48
+    'LBL_BASIC_TYPE'					=> 'Basic Type',
49
+    'LBL_ADVANCED_TYPE'					=> 'Advanced Type',
50
+    'LBL_SYSOPTS_1'						=> 'Select from the following system configuration options below.',
51 51
     'LBL_SYSOPTS_2'                     => 'What type of database will be used for the SuiteCRM instance you are about to install?',
52
-	'LBL_SYSOPTS_CONFIG'				=> 'System Configuration',
53
-	'LBL_SYSOPTS_DB_TYPE'				=> '',
54
-	'LBL_SYSOPTS_DB'					=> 'Specify Database Type',
52
+    'LBL_SYSOPTS_CONFIG'				=> 'System Configuration',
53
+    'LBL_SYSOPTS_DB_TYPE'				=> '',
54
+    'LBL_SYSOPTS_DB'					=> 'Specify Database Type',
55 55
     'LBL_SYSOPTS_DB_TITLE'              => 'Database Type',
56
-	'LBL_SYSOPTS_ERRS_TITLE'			=> 'Please fix the following errors before proceeding:',
57
-	'LBL_MAKE_DIRECTORY_WRITABLE'      => 'Please make the following directory writable:',
56
+    'LBL_SYSOPTS_ERRS_TITLE'			=> 'Please fix the following errors before proceeding:',
57
+    'LBL_MAKE_DIRECTORY_WRITABLE'      => 'Please make the following directory writable:',
58 58
     'ERR_DB_VERSION_FAILURE'			=> 'Unable to check database version.',
59
-	'DEFAULT_CHARSET'					=> 'UTF-8',
59
+    'DEFAULT_CHARSET'					=> 'UTF-8',
60 60
     'ERR_ADMIN_USER_NAME_BLANK'         => 'Provide the user name for the SuiteCRM admin user. ',
61
-	'ERR_ADMIN_PASS_BLANK'				=> 'Provide the password for the SuiteCRM admin user. ',
61
+    'ERR_ADMIN_PASS_BLANK'				=> 'Provide the password for the SuiteCRM admin user. ',
62 62
 
63 63
     //'ERR_CHECKSYS_CALL_TIME'			=> 'Allow Call Time Pass Reference is Off (please enable in php.ini)',
64 64
     'ERR_CHECKSYS'                      => 'Errors have been detected during compatibility check.  In order for your SuiteCRM Installation to function properly, please take the proper steps to address the issues listed below and either press the recheck button, or try installing again.',
65 65
     'ERR_CHECKSYS_CALL_TIME'            => 'Allow Call Time Pass Reference is On (this should be set to Off in php.ini)',
66
-	'ERR_CHECKSYS_CURL'					=> 'Not found: SuiteCRM Scheduler will run with limited functionality.',
66
+    'ERR_CHECKSYS_CURL'					=> 'Not found: SuiteCRM Scheduler will run with limited functionality.',
67 67
     'ERR_CHECKSYS_IMAP'					=> 'Not found: InboundEmail and Campaigns (Email) require the IMAP libraries. Neither will be functional.',
68
-	'ERR_CHECKSYS_MSSQL_MQGPC'			=> 'Magic Quotes GPC cannot be turned "On" when using MS SQL Server.',
69
-	'ERR_CHECKSYS_MEM_LIMIT_0'			=> 'Warning: ',
70
-	'ERR_CHECKSYS_MEM_LIMIT_1'			=> ' (Set this to ',
71
-	'ERR_CHECKSYS_MEM_LIMIT_2'			=> 'M or larger in your php.ini file)',
72
-	'ERR_CHECKSYS_MYSQL_VERSION'		=> 'Minimum Version 4.1.2 - Found: ',
73
-	'ERR_CHECKSYS_NO_SESSIONS'			=> 'Failed to write and read session variables.  Unable to proceed with the installation.',
74
-	'ERR_CHECKSYS_NOT_VALID_DIR'		=> 'Not A Valid Directory',
75
-	'ERR_CHECKSYS_NOT_WRITABLE'			=> 'Warning: Not Writable',
76
-	'ERR_CHECKSYS_PHP_INVALID_VER'		=> 'Your version of PHP is not supported by SuiteCRM.  You will need to install a version that is compatible with the SuiteCRM application.  Please consult the Compatibility Matrix in the Release Notes for supported PHP Versions. Your version is ',
77
-	'ERR_CHECKSYS_IIS_INVALID_VER'      => 'Your version of IIS is not supported by SuiteCRM.  You will need to install a version that is compatible with the SuiteCRM application.  Please consult the Compatibility Matrix in the Release Notes for supported IIS Versions. Your version is ',
78
-	'ERR_CHECKSYS_FASTCGI'              => 'We detect that you are not using a FastCGI handler mapping for PHP. You will need to install/configure a version that is compatible with the SuiteCRM application.  Please consult the Compatibility Matrix in the Release Notes for supported Versions. Please see <a href="http://www.iis.net/php/" target="_blank">http://www.iis.net/php/</a> for details ',
79
-	'ERR_CHECKSYS_FASTCGI_LOGGING'      => 'For optimal experience using IIS/FastCGI sapi, set fastcgi.logging to 0 in your php.ini file.',
68
+    'ERR_CHECKSYS_MSSQL_MQGPC'			=> 'Magic Quotes GPC cannot be turned "On" when using MS SQL Server.',
69
+    'ERR_CHECKSYS_MEM_LIMIT_0'			=> 'Warning: ',
70
+    'ERR_CHECKSYS_MEM_LIMIT_1'			=> ' (Set this to ',
71
+    'ERR_CHECKSYS_MEM_LIMIT_2'			=> 'M or larger in your php.ini file)',
72
+    'ERR_CHECKSYS_MYSQL_VERSION'		=> 'Minimum Version 4.1.2 - Found: ',
73
+    'ERR_CHECKSYS_NO_SESSIONS'			=> 'Failed to write and read session variables.  Unable to proceed with the installation.',
74
+    'ERR_CHECKSYS_NOT_VALID_DIR'		=> 'Not A Valid Directory',
75
+    'ERR_CHECKSYS_NOT_WRITABLE'			=> 'Warning: Not Writable',
76
+    'ERR_CHECKSYS_PHP_INVALID_VER'		=> 'Your version of PHP is not supported by SuiteCRM.  You will need to install a version that is compatible with the SuiteCRM application.  Please consult the Compatibility Matrix in the Release Notes for supported PHP Versions. Your version is ',
77
+    'ERR_CHECKSYS_IIS_INVALID_VER'      => 'Your version of IIS is not supported by SuiteCRM.  You will need to install a version that is compatible with the SuiteCRM application.  Please consult the Compatibility Matrix in the Release Notes for supported IIS Versions. Your version is ',
78
+    'ERR_CHECKSYS_FASTCGI'              => 'We detect that you are not using a FastCGI handler mapping for PHP. You will need to install/configure a version that is compatible with the SuiteCRM application.  Please consult the Compatibility Matrix in the Release Notes for supported Versions. Please see <a href="http://www.iis.net/php/" target="_blank">http://www.iis.net/php/</a> for details ',
79
+    'ERR_CHECKSYS_FASTCGI_LOGGING'      => 'For optimal experience using IIS/FastCGI sapi, set fastcgi.logging to 0 in your php.ini file.',
80 80
     'ERR_CHECKSYS_PHP_UNSUPPORTED'		=> 'Unsupported PHP Version Installed: ( ver',
81 81
     'LBL_DB_UNAVAILABLE'                => 'Database unavailable',
82 82
     'LBL_CHECKSYS_DB_SUPPORT_NOT_AVAILABLE' => 'Database Support was not found.  Please make sure you have the necessary drivers for one of the following supported Database Types: MySQL or MS SQLServer.  You might need to uncomment the extension in the php.ini file, or recompile with the right binary file, depending on your version of PHP.  Please refer to your PHP Manual for more information on how to enable Database Support.',
@@ -89,184 +89,184 @@  discard block
 block discarded – undo
89 89
     'ERR_CHECKSYS_CUSTOM_NOT_WRITABLE'  => 'The Custom Directory exists but is not writeable.  You may have to change permissions on it (chmod 766) or right click on it and uncheck the read only option, depending on your Operating System.  Please take the needed steps to make the file writeable.',
90 90
     'ERR_CHECKSYS_FILES_NOT_WRITABLE'   => "The files or directories listed below are not writeable or are missing and cannot be created.  Depending on your Operating System, correcting this may require you to change permissions on the files or parent directory (chmod 755), or to right click on the parent directory and uncheck the 'read only' option and apply it to all subfolders.",
91 91
     'LBL_CHECKSYS_OVERRIDE_CONFIG' => 'Config override',
92
-	//'ERR_CHECKSYS_SAFE_MODE'			=> 'Safe Mode is On (please disable in php.ini)',
93
-	'ERR_CHECKSYS_SAFE_MODE'			=> 'Safe Mode is On (you may wish to disable in php.ini)',
92
+    //'ERR_CHECKSYS_SAFE_MODE'			=> 'Safe Mode is On (please disable in php.ini)',
93
+    'ERR_CHECKSYS_SAFE_MODE'			=> 'Safe Mode is On (you may wish to disable in php.ini)',
94 94
     'ERR_CHECKSYS_ZLIB'					=> 'ZLib support not found: SuiteCRM reaps enormous performance benefits with zlib compression.',
95 95
     'ERR_CHECKSYS_ZIP'					=> 'ZIP support not found: SuiteCRM needs ZIP support in order to process compressed files.',
96 96
     'ERR_CHECKSYS_PCRE'					=> 'PCRE library not found: SuiteCRM needs PCRE library in order to process Perl style of regular expression pattern matching.',
97 97
     'ERR_CHECKSYS_PCRE_VER'				=> 'PCRE library version: SuiteCRM needs PCRE library 7.0 or above to process Perl style of regular expression pattern matching.',
98
-	'ERR_DB_ADMIN'						=> 'The provided database administrator username and/or password is invalid, and a connection to the database could not be established.  Please enter a valid user name and password.  (Error: ',
98
+    'ERR_DB_ADMIN'						=> 'The provided database administrator username and/or password is invalid, and a connection to the database could not be established.  Please enter a valid user name and password.  (Error: ',
99 99
     'ERR_DB_ADMIN_MSSQL'                => 'The provided database administrator username and/or password is invalid, and a connection to the database could not be established.  Please enter a valid user name and password.',
100
-	'ERR_DB_EXISTS_NOT'					=> 'The specified database does not exist.',
101
-	'ERR_DB_EXISTS_WITH_CONFIG'			=> 'Database already exists with config data.  To run an install with the chosen database, please re-run the install and choose: "Drop and recreate existing SuiteCRM tables?"  To upgrade, use the Upgrade Wizard in the Admin Console.  Please read the upgrade documentation located <a href="http://www.suitecrm.com target="_new">here</a>.',
102
-	'ERR_DB_EXISTS'						=> 'The provided Database Name already exists -- cannot create another one with the same name.',
100
+    'ERR_DB_EXISTS_NOT'					=> 'The specified database does not exist.',
101
+    'ERR_DB_EXISTS_WITH_CONFIG'			=> 'Database already exists with config data.  To run an install with the chosen database, please re-run the install and choose: "Drop and recreate existing SuiteCRM tables?"  To upgrade, use the Upgrade Wizard in the Admin Console.  Please read the upgrade documentation located <a href="http://www.suitecrm.com target="_new">here</a>.',
102
+    'ERR_DB_EXISTS'						=> 'The provided Database Name already exists -- cannot create another one with the same name.',
103 103
     'ERR_DB_EXISTS_PROCEED'             => 'The provided Database Name already exists.  You can<br>1.  hit the back button and choose a new database name <br>2.  click next and continue but all existing tables on this database will be dropped.  <strong>This means your tables and data will be blown away.</strong>',
104
-	'ERR_DB_HOSTNAME'					=> 'Host name cannot be blank.',
105
-	'ERR_DB_INVALID'					=> 'Invalid database type selected.',
106
-	'ERR_DB_LOGIN_FAILURE'				=> 'The provided database host, username, and/or password is invalid, and a connection to the database could not be established.  Please enter a valid host, username and password',
107
-	'ERR_DB_LOGIN_FAILURE_MYSQL'		=> 'The provided database host, username, and/or password is invalid, and a connection to the database could not be established.  Please enter a valid host, username and password',
108
-	'ERR_DB_LOGIN_FAILURE_MSSQL'		=> 'The provided database host, username, and/or password is invalid, and a connection to the database could not be established.  Please enter a valid host, username and password',
109
-	'ERR_DB_MYSQL_VERSION'				=> 'Your MySQL version (%s) is not supported by SuiteCRM.  You will need to install a version that is compatible with the SuiteCRM application.  Please consult the Compatibility Matrix in the Release Notes for supported MySQL versions.',
110
-	'ERR_DB_NAME'						=> 'Database name cannot be blank.',
111
-	'ERR_DB_NAME2'						=> "Database name cannot contain a '\\', '/', or '.'",
104
+    'ERR_DB_HOSTNAME'					=> 'Host name cannot be blank.',
105
+    'ERR_DB_INVALID'					=> 'Invalid database type selected.',
106
+    'ERR_DB_LOGIN_FAILURE'				=> 'The provided database host, username, and/or password is invalid, and a connection to the database could not be established.  Please enter a valid host, username and password',
107
+    'ERR_DB_LOGIN_FAILURE_MYSQL'		=> 'The provided database host, username, and/or password is invalid, and a connection to the database could not be established.  Please enter a valid host, username and password',
108
+    'ERR_DB_LOGIN_FAILURE_MSSQL'		=> 'The provided database host, username, and/or password is invalid, and a connection to the database could not be established.  Please enter a valid host, username and password',
109
+    'ERR_DB_MYSQL_VERSION'				=> 'Your MySQL version (%s) is not supported by SuiteCRM.  You will need to install a version that is compatible with the SuiteCRM application.  Please consult the Compatibility Matrix in the Release Notes for supported MySQL versions.',
110
+    'ERR_DB_NAME'						=> 'Database name cannot be blank.',
111
+    'ERR_DB_NAME2'						=> "Database name cannot contain a '\\', '/', or '.'",
112 112
     'ERR_DB_MYSQL_DB_NAME_INVALID'      => "Database name cannot contain a '\\', '/', or '.'",
113 113
     'ERR_DB_MSSQL_DB_NAME_INVALID'      => "Database name cannot begin with a number, '#', or '@' and cannot contain a space, '\"', \"'\", '*', '/', '\', '?', ':', '<', '>', '&', '!', or '-'",
114 114
     'ERR_DB_OCI8_DB_NAME_INVALID'       => "Database name can only consist of alphanumeric characters and the symbols '#', '_' or '$'",
115
-	'ERR_DB_PASSWORD'					=> 'The passwords provided for the SuiteCRM database administrator do not match.  Please re-enter the same passwords in the password fields.',
116
-	'ERR_DB_PRIV_USER'					=> 'Provide a database administrator user name.  The user is required for the initial connection to the database.',
117
-	'ERR_DB_USER_EXISTS'				=> 'User name for SuiteCRM database user already exists -- cannot create another one with the same name. Please enter a new user name.',
118
-	'ERR_DB_USER'						=> 'Enter a user name for the SuiteCRM database administrator.',
119
-	'ERR_DBCONF_VALIDATION'				=> 'Please fix the following errors before proceeding:',
115
+    'ERR_DB_PASSWORD'					=> 'The passwords provided for the SuiteCRM database administrator do not match.  Please re-enter the same passwords in the password fields.',
116
+    'ERR_DB_PRIV_USER'					=> 'Provide a database administrator user name.  The user is required for the initial connection to the database.',
117
+    'ERR_DB_USER_EXISTS'				=> 'User name for SuiteCRM database user already exists -- cannot create another one with the same name. Please enter a new user name.',
118
+    'ERR_DB_USER'						=> 'Enter a user name for the SuiteCRM database administrator.',
119
+    'ERR_DBCONF_VALIDATION'				=> 'Please fix the following errors before proceeding:',
120 120
     'ERR_DBCONF_PASSWORD_MISMATCH'      => 'The passwords provided for the SuiteCRM database user do not match. Please re-enter the same passwords in the password fields.',
121
-	'ERR_ERROR_GENERAL'					=> 'The following errors were encountered:',
122
-	'ERR_LANG_CANNOT_DELETE_FILE'		=> 'Cannot delete file: ',
123
-	'ERR_LANG_MISSING_FILE'				=> 'Cannot find file: ',
124
-	'ERR_LANG_NO_LANG_FILE'			 	=> 'No language pack file found at include/language inside: ',
125
-	'ERR_LANG_UPLOAD_1'					=> 'There was a problem with your upload.  Please try again.',
126
-	'ERR_LANG_UPLOAD_2'					=> 'Language Packs must be ZIP archives.',
127
-	'ERR_LANG_UPLOAD_3'					=> 'PHP could not move the temp file to the upgrade directory.',
128
-	'ERR_LICENSE_MISSING'				=> 'Missing Required Fields',
129
-	'ERR_LICENSE_NOT_FOUND'				=> 'License file not found!',
130
-	'ERR_LOG_DIRECTORY_NOT_EXISTS'		=> 'Log directory provided is not a valid directory.',
131
-	'ERR_LOG_DIRECTORY_NOT_WRITABLE'	=> 'Log directory provided is not a writable directory.',
132
-	'ERR_LOG_DIRECTORY_REQUIRED'		=> 'Log directory is required if you wish to specify your own.',
133
-	'ERR_NO_DIRECT_SCRIPT'				=> 'Unable to process script directly.',
134
-	'ERR_NO_SINGLE_QUOTE'				=> 'Cannot use the single quotation mark for ',
135
-	'ERR_PASSWORD_MISMATCH'				=> 'The passwords provided for the SuiteCRM admin user do not match.  Please re-enter the same passwords in the password fields.',
136
-	'ERR_PERFORM_CONFIG_PHP_1'			=> 'Cannot write to the <span class=stop>config.php</span> file.',
137
-	'ERR_PERFORM_CONFIG_PHP_2'			=> 'You can continue this installation by manually creating the config.php file and pasting the configuration information below into the config.php file.  However, you <strong>must </strong>create the config.php file before you continue to the next step.',
138
-	'ERR_PERFORM_CONFIG_PHP_3'			=> 'Did you remember to create the config.php file?',
139
-	'ERR_PERFORM_CONFIG_PHP_4'			=> 'Warning: Could not write to config.php file.  Please ensure it exists.',
140
-	'ERR_PERFORM_HTACCESS_1'			=> 'Cannot write to the ',
141
-	'ERR_PERFORM_HTACCESS_2'			=> ' file.',
142
-	'ERR_PERFORM_HTACCESS_3'			=> 'If you want to secure your log file from being accessible via browser, create an .htaccess file in your log directory with the line:',
143
-	'ERR_PERFORM_NO_TCPIP'				=> '<b>We could not detect an Internet connection.</b> When you do have a connection, please visit <a href="http://www.suitecrm.com/">http://www.suitecrm.com/</a> to register with SuiteCRM. By letting us know a little bit about how your company plans to use SuiteCRM, we can ensure we are always delivering the right application for your business needs.',
144
-	'ERR_SESSION_DIRECTORY_NOT_EXISTS'	=> 'Session directory provided is not a valid directory.',
145
-	'ERR_SESSION_DIRECTORY'				=> 'Session directory provided is not a writable directory.',
146
-	'ERR_SESSION_PATH'					=> 'Session path is required if you wish to specify your own.',
147
-	'ERR_SI_NO_CONFIG'					=> 'You did not include config_si.php in the document root, or you did not define $sugar_config_si in config.php',
148
-	'ERR_SITE_GUID'						=> 'Application ID is required if you wish to specify your own.',
121
+    'ERR_ERROR_GENERAL'					=> 'The following errors were encountered:',
122
+    'ERR_LANG_CANNOT_DELETE_FILE'		=> 'Cannot delete file: ',
123
+    'ERR_LANG_MISSING_FILE'				=> 'Cannot find file: ',
124
+    'ERR_LANG_NO_LANG_FILE'			 	=> 'No language pack file found at include/language inside: ',
125
+    'ERR_LANG_UPLOAD_1'					=> 'There was a problem with your upload.  Please try again.',
126
+    'ERR_LANG_UPLOAD_2'					=> 'Language Packs must be ZIP archives.',
127
+    'ERR_LANG_UPLOAD_3'					=> 'PHP could not move the temp file to the upgrade directory.',
128
+    'ERR_LICENSE_MISSING'				=> 'Missing Required Fields',
129
+    'ERR_LICENSE_NOT_FOUND'				=> 'License file not found!',
130
+    'ERR_LOG_DIRECTORY_NOT_EXISTS'		=> 'Log directory provided is not a valid directory.',
131
+    'ERR_LOG_DIRECTORY_NOT_WRITABLE'	=> 'Log directory provided is not a writable directory.',
132
+    'ERR_LOG_DIRECTORY_REQUIRED'		=> 'Log directory is required if you wish to specify your own.',
133
+    'ERR_NO_DIRECT_SCRIPT'				=> 'Unable to process script directly.',
134
+    'ERR_NO_SINGLE_QUOTE'				=> 'Cannot use the single quotation mark for ',
135
+    'ERR_PASSWORD_MISMATCH'				=> 'The passwords provided for the SuiteCRM admin user do not match.  Please re-enter the same passwords in the password fields.',
136
+    'ERR_PERFORM_CONFIG_PHP_1'			=> 'Cannot write to the <span class=stop>config.php</span> file.',
137
+    'ERR_PERFORM_CONFIG_PHP_2'			=> 'You can continue this installation by manually creating the config.php file and pasting the configuration information below into the config.php file.  However, you <strong>must </strong>create the config.php file before you continue to the next step.',
138
+    'ERR_PERFORM_CONFIG_PHP_3'			=> 'Did you remember to create the config.php file?',
139
+    'ERR_PERFORM_CONFIG_PHP_4'			=> 'Warning: Could not write to config.php file.  Please ensure it exists.',
140
+    'ERR_PERFORM_HTACCESS_1'			=> 'Cannot write to the ',
141
+    'ERR_PERFORM_HTACCESS_2'			=> ' file.',
142
+    'ERR_PERFORM_HTACCESS_3'			=> 'If you want to secure your log file from being accessible via browser, create an .htaccess file in your log directory with the line:',
143
+    'ERR_PERFORM_NO_TCPIP'				=> '<b>We could not detect an Internet connection.</b> When you do have a connection, please visit <a href="http://www.suitecrm.com/">http://www.suitecrm.com/</a> to register with SuiteCRM. By letting us know a little bit about how your company plans to use SuiteCRM, we can ensure we are always delivering the right application for your business needs.',
144
+    'ERR_SESSION_DIRECTORY_NOT_EXISTS'	=> 'Session directory provided is not a valid directory.',
145
+    'ERR_SESSION_DIRECTORY'				=> 'Session directory provided is not a writable directory.',
146
+    'ERR_SESSION_PATH'					=> 'Session path is required if you wish to specify your own.',
147
+    'ERR_SI_NO_CONFIG'					=> 'You did not include config_si.php in the document root, or you did not define $sugar_config_si in config.php',
148
+    'ERR_SITE_GUID'						=> 'Application ID is required if you wish to specify your own.',
149 149
     'ERROR_SPRITE_SUPPORT'              => "Currently we are not able to locate the GD library, as a result you will not be able to use the CSS Sprite functionality.",
150
-	'ERR_UPLOAD_MAX_FILESIZE'			=> 'Warning: Your PHP configuration should be changed to allow files of at least 6MB to be uploaded.',
150
+    'ERR_UPLOAD_MAX_FILESIZE'			=> 'Warning: Your PHP configuration should be changed to allow files of at least 6MB to be uploaded.',
151 151
     'LBL_UPLOAD_MAX_FILESIZE_TITLE'     => 'Upload File Size',
152
-	'ERR_URL_BLANK'						=> 'Provide the base URL for the SuiteCRM instance.',
153
-	'ERR_UW_NO_UPDATE_RECORD'			=> 'Could not locate installation record of',
154
-	'ERROR_FLAVOR_INCOMPATIBLE'			=> 'The uploaded file is not compatible with this flavor (Community Edition, Professional, or Enterprise) of SuiteCRM: ',
155
-	'ERROR_LICENSE_EXPIRED'				=> "Error: Your license expired ",
156
-	'ERROR_LICENSE_EXPIRED2'			=> " day(s) ago.   Please go to the <a href='index.php?action=LicenseSettings&module=Administration'>'\"License Management\"</a>  in the Admin screen to enter your new license key.  If you do not enter a new license key within 30 days of your license key expiration, you will no longer be able to log in to this application.",
157
-	'ERROR_MANIFEST_TYPE'				=> 'Manifest file must specify the package type.',
158
-	'ERROR_PACKAGE_TYPE'				=> 'Manifest file specifies an unrecognized package type',
159
-	'ERROR_VALIDATION_EXPIRED'			=> "Error: Your validation key expired ",
160
-	'ERROR_VALIDATION_EXPIRED2'			=> " day(s) ago.   Please go to the <a href='index.php?action=LicenseSettings&module=Administration'>'\"License Management\"</a> in the Admin screen to enter your new validation key.  If you do not enter a new validation key within 30 days of your validation key expiration, you will no longer be able to log in to this application.",
161
-	'ERROR_VERSION_INCOMPATIBLE'		=> 'The uploaded file is not compatible with this version of SuiteCRM: ',
162
-
163
-	'LBL_BACK'							=> 'Back',
152
+    'ERR_URL_BLANK'						=> 'Provide the base URL for the SuiteCRM instance.',
153
+    'ERR_UW_NO_UPDATE_RECORD'			=> 'Could not locate installation record of',
154
+    'ERROR_FLAVOR_INCOMPATIBLE'			=> 'The uploaded file is not compatible with this flavor (Community Edition, Professional, or Enterprise) of SuiteCRM: ',
155
+    'ERROR_LICENSE_EXPIRED'				=> "Error: Your license expired ",
156
+    'ERROR_LICENSE_EXPIRED2'			=> " day(s) ago.   Please go to the <a href='index.php?action=LicenseSettings&module=Administration'>'\"License Management\"</a>  in the Admin screen to enter your new license key.  If you do not enter a new license key within 30 days of your license key expiration, you will no longer be able to log in to this application.",
157
+    'ERROR_MANIFEST_TYPE'				=> 'Manifest file must specify the package type.',
158
+    'ERROR_PACKAGE_TYPE'				=> 'Manifest file specifies an unrecognized package type',
159
+    'ERROR_VALIDATION_EXPIRED'			=> "Error: Your validation key expired ",
160
+    'ERROR_VALIDATION_EXPIRED2'			=> " day(s) ago.   Please go to the <a href='index.php?action=LicenseSettings&module=Administration'>'\"License Management\"</a> in the Admin screen to enter your new validation key.  If you do not enter a new validation key within 30 days of your validation key expiration, you will no longer be able to log in to this application.",
161
+    'ERROR_VERSION_INCOMPATIBLE'		=> 'The uploaded file is not compatible with this version of SuiteCRM: ',
162
+
163
+    'LBL_BACK'							=> 'Back',
164 164
     'LBL_CANCEL'                        => 'Cancel',
165 165
     'LBL_ACCEPT'                        => 'I Accept',
166
-	'LBL_CHECKSYS_1'					=> 'In order for your SuiteCRM installation to function properly, please ensure all of the system check items listed below are green. If any are red, please take the necessary steps to fix them.<BR><BR> For help on these system checks, please visit the <a href="http://www.suitecrm.com" target="_blank">SuiteCRM</a>.',
167
-	'LBL_CHECKSYS_CACHE'				=> 'Writable Cache Sub-Directories',
166
+    'LBL_CHECKSYS_1'					=> 'In order for your SuiteCRM installation to function properly, please ensure all of the system check items listed below are green. If any are red, please take the necessary steps to fix them.<BR><BR> For help on these system checks, please visit the <a href="http://www.suitecrm.com" target="_blank">SuiteCRM</a>.',
167
+    'LBL_CHECKSYS_CACHE'				=> 'Writable Cache Sub-Directories',
168 168
     'LBL_DROP_DB_CONFIRM'               => 'The provided Database Name already exists.<br>You can either:<br>1.  Click on the Cancel button and choose a new database name, or <br>2.  Click the Accept button and continue.  All existing tables in the database will be dropped. <strong>This means that all of the tables and pre-existing data will be blown away.</strong>',
169
-	'LBL_CHECKSYS_CALL_TIME'			=> 'PHP Allow Call Time Pass Reference Turned Off',
169
+    'LBL_CHECKSYS_CALL_TIME'			=> 'PHP Allow Call Time Pass Reference Turned Off',
170 170
     'LBL_CHECKSYS_COMPONENT'			=> 'Component',
171
-	'LBL_CHECKSYS_COMPONENT_OPTIONAL'	=> 'Optional Components',
172
-	'LBL_CHECKSYS_CONFIG'				=> 'Writable SuiteCRM Configuration File (config.php)',
173
-	'LBL_CHECKSYS_CONFIG_OVERRIDE'		=> 'Writable SuiteCRM Configuration File (config_override.php)',
174
-	'LBL_CHECKSYS_CURL'					=> 'cURL Module',
171
+    'LBL_CHECKSYS_COMPONENT_OPTIONAL'	=> 'Optional Components',
172
+    'LBL_CHECKSYS_CONFIG'				=> 'Writable SuiteCRM Configuration File (config.php)',
173
+    'LBL_CHECKSYS_CONFIG_OVERRIDE'		=> 'Writable SuiteCRM Configuration File (config_override.php)',
174
+    'LBL_CHECKSYS_CURL'					=> 'cURL Module',
175 175
     'LBL_CHECKSYS_SESSION_SAVE_PATH'    => 'Session Save Path Setting',
176
-	'LBL_CHECKSYS_CUSTOM'				=> 'Writeable Custom Directory',
177
-	'LBL_CHECKSYS_DATA'					=> 'Writable Data Sub-Directories',
178
-	'LBL_CHECKSYS_IMAP'					=> 'IMAP Module',
179
-	'LBL_CHECKSYS_FASTCGI'             => 'FastCGI',
180
-	'LBL_CHECKSYS_MQGPC'				=> 'Magic Quotes GPC',
181
-	'LBL_CHECKSYS_MBSTRING'				=> 'MB Strings Module',
182
-	'LBL_CHECKSYS_MEM_OK'				=> 'OK (No Limit)',
183
-	'LBL_CHECKSYS_MEM_UNLIMITED'		=> 'OK (Unlimited)',
184
-	'LBL_CHECKSYS_MEM'					=> 'PHP Memory Limit',
185
-	'LBL_CHECKSYS_MODULE'				=> 'Writable Modules Sub-Directories and Files',
186
-	'LBL_CHECKSYS_MYSQL_VERSION'		=> 'MySQL Version',
187
-	'LBL_CHECKSYS_NOT_AVAILABLE'		=> 'Not Available',
188
-	'LBL_CHECKSYS_OK'					=> 'OK',
189
-	'LBL_CHECKSYS_PHP_INI'				=> 'Location of your PHP configuration file (php.ini):',
190
-	'LBL_CHECKSYS_PHP_OK'				=> 'OK (ver ',
191
-	'LBL_CHECKSYS_PHPVER'				=> 'PHP Version',
176
+    'LBL_CHECKSYS_CUSTOM'				=> 'Writeable Custom Directory',
177
+    'LBL_CHECKSYS_DATA'					=> 'Writable Data Sub-Directories',
178
+    'LBL_CHECKSYS_IMAP'					=> 'IMAP Module',
179
+    'LBL_CHECKSYS_FASTCGI'             => 'FastCGI',
180
+    'LBL_CHECKSYS_MQGPC'				=> 'Magic Quotes GPC',
181
+    'LBL_CHECKSYS_MBSTRING'				=> 'MB Strings Module',
182
+    'LBL_CHECKSYS_MEM_OK'				=> 'OK (No Limit)',
183
+    'LBL_CHECKSYS_MEM_UNLIMITED'		=> 'OK (Unlimited)',
184
+    'LBL_CHECKSYS_MEM'					=> 'PHP Memory Limit',
185
+    'LBL_CHECKSYS_MODULE'				=> 'Writable Modules Sub-Directories and Files',
186
+    'LBL_CHECKSYS_MYSQL_VERSION'		=> 'MySQL Version',
187
+    'LBL_CHECKSYS_NOT_AVAILABLE'		=> 'Not Available',
188
+    'LBL_CHECKSYS_OK'					=> 'OK',
189
+    'LBL_CHECKSYS_PHP_INI'				=> 'Location of your PHP configuration file (php.ini):',
190
+    'LBL_CHECKSYS_PHP_OK'				=> 'OK (ver ',
191
+    'LBL_CHECKSYS_PHPVER'				=> 'PHP Version',
192 192
     'LBL_CHECKSYS_IISVER'               => 'IIS Version',
193
-	'LBL_CHECKSYS_RECHECK'				=> 'Re-check',
194
-	'LBL_CHECKSYS_SAFE_MODE'			=> 'PHP Safe Mode Turned Off',
195
-	'LBL_CHECKSYS_SESSION'				=> 'Writable Session Save Path (',
196
-	'LBL_CHECKSYS_STATUS'				=> 'Status',
197
-	'LBL_CHECKSYS_TITLE'				=> 'System Check Acceptance',
198
-	'LBL_CHECKSYS_VER'					=> 'Found: ( ver ',
199
-	'LBL_CHECKSYS_XML'					=> 'XML Parsing',
200
-	'LBL_CHECKSYS_ZLIB'					=> 'ZLIB Compression Module',
201
-	'LBL_CHECKSYS_ZIP'					=> 'ZIP Handling Module',
202
-	'LBL_CHECKSYS_PCRE'					=> 'PCRE Library',
203
-	'LBL_CHECKSYS_FIX_FILES'            => 'Please fix the following files or directories before proceeding:',
193
+    'LBL_CHECKSYS_RECHECK'				=> 'Re-check',
194
+    'LBL_CHECKSYS_SAFE_MODE'			=> 'PHP Safe Mode Turned Off',
195
+    'LBL_CHECKSYS_SESSION'				=> 'Writable Session Save Path (',
196
+    'LBL_CHECKSYS_STATUS'				=> 'Status',
197
+    'LBL_CHECKSYS_TITLE'				=> 'System Check Acceptance',
198
+    'LBL_CHECKSYS_VER'					=> 'Found: ( ver ',
199
+    'LBL_CHECKSYS_XML'					=> 'XML Parsing',
200
+    'LBL_CHECKSYS_ZLIB'					=> 'ZLIB Compression Module',
201
+    'LBL_CHECKSYS_ZIP'					=> 'ZIP Handling Module',
202
+    'LBL_CHECKSYS_PCRE'					=> 'PCRE Library',
203
+    'LBL_CHECKSYS_FIX_FILES'            => 'Please fix the following files or directories before proceeding:',
204 204
     'LBL_CHECKSYS_FIX_MODULE_FILES'     => 'Please fix the following module directories and the files under them before proceeding:',
205 205
     'LBL_CHECKSYS_UPLOAD'               => 'Writable Upload Directory',
206 206
     'LBL_CLOSE'							=> 'Close',
207 207
     'LBL_THREE'                         => '3',
208
-	'LBL_CONFIRM_BE_CREATED'			=> 'be created',
209
-	'LBL_CONFIRM_DB_TYPE'				=> 'Database Type',
210
-	'LBL_CONFIRM_DIRECTIONS'			=> 'Please confirm the settings below.  If you would like to change any of the values, click "Back" to edit.  Otherwise, click "Next" to start the installation.',
211
-	'LBL_CONFIRM_LICENSE_TITLE'			=> 'License Information',
212
-	'LBL_CONFIRM_NOT'					=> 'not',
213
-	'LBL_CONFIRM_TITLE'					=> 'Confirm Settings',
214
-	'LBL_CONFIRM_WILL'					=> 'will',
215
-	'LBL_DBCONF_CREATE_DB'				=> 'Create Database',
216
-	'LBL_DBCONF_CREATE_USER'			=> 'Create User',
217
-	'LBL_DBCONF_DB_DROP_CREATE_WARN'	=> 'Caution: All SuiteCRM data will be erased<br>if this box is checked.',
218
-	'LBL_DBCONF_DB_DROP_CREATE'			=> 'Drop and Recreate Existing SuiteCRM tables?',
208
+    'LBL_CONFIRM_BE_CREATED'			=> 'be created',
209
+    'LBL_CONFIRM_DB_TYPE'				=> 'Database Type',
210
+    'LBL_CONFIRM_DIRECTIONS'			=> 'Please confirm the settings below.  If you would like to change any of the values, click "Back" to edit.  Otherwise, click "Next" to start the installation.',
211
+    'LBL_CONFIRM_LICENSE_TITLE'			=> 'License Information',
212
+    'LBL_CONFIRM_NOT'					=> 'not',
213
+    'LBL_CONFIRM_TITLE'					=> 'Confirm Settings',
214
+    'LBL_CONFIRM_WILL'					=> 'will',
215
+    'LBL_DBCONF_CREATE_DB'				=> 'Create Database',
216
+    'LBL_DBCONF_CREATE_USER'			=> 'Create User',
217
+    'LBL_DBCONF_DB_DROP_CREATE_WARN'	=> 'Caution: All SuiteCRM data will be erased<br>if this box is checked.',
218
+    'LBL_DBCONF_DB_DROP_CREATE'			=> 'Drop and Recreate Existing SuiteCRM tables?',
219 219
     'LBL_DBCONF_DB_DROP'                => 'Drop Tables',
220 220
     'LBL_DBCONF_DB_NAME'				=> 'Database Name',
221
-	'LBL_DBCONF_DB_PASSWORD'			=> 'SuiteCRM Database User Password',
222
-	'LBL_DBCONF_DB_PASSWORD2'			=> 'Re-enter SuiteCRM Database User Password',
223
-	'LBL_DBCONF_DB_USER'				=> 'SuiteCRM Database User',
221
+    'LBL_DBCONF_DB_PASSWORD'			=> 'SuiteCRM Database User Password',
222
+    'LBL_DBCONF_DB_PASSWORD2'			=> 'Re-enter SuiteCRM Database User Password',
223
+    'LBL_DBCONF_DB_USER'				=> 'SuiteCRM Database User',
224 224
     'LBL_DBCONF_SUGAR_DB_USER'          => 'SuiteCRM Database User',
225 225
     'LBL_DBCONF_DB_ADMIN_USER'          => 'Database Administrator Username',
226 226
     'LBL_DBCONF_DB_ADMIN_PASSWORD'      => 'Database Admin Password',
227
-	'LBL_DBCONF_DEMO_DATA'				=> 'Populate Database with Demo Data?',
227
+    'LBL_DBCONF_DEMO_DATA'				=> 'Populate Database with Demo Data?',
228 228
     'LBL_DBCONF_DEMO_DATA_TITLE'        => 'Choose Demo Data',
229
-	'LBL_DBCONF_HOST_NAME'				=> 'Host Name',
230
-	'LBL_DBCONF_HOST_INSTANCE'			=> 'Host Instance',
231
-	'LBL_DBCONF_HOST_PORT'				=> 'Port',
232
-	'LBL_DBCONF_INSTRUCTIONS'			=> 'Please enter your database configuration information below. If you are unsure of what to fill in, we suggest that you use the default values.',
233
-	'LBL_DBCONF_MB_DEMO_DATA'			=> 'Use multi-byte text in demo data?',
229
+    'LBL_DBCONF_HOST_NAME'				=> 'Host Name',
230
+    'LBL_DBCONF_HOST_INSTANCE'			=> 'Host Instance',
231
+    'LBL_DBCONF_HOST_PORT'				=> 'Port',
232
+    'LBL_DBCONF_INSTRUCTIONS'			=> 'Please enter your database configuration information below. If you are unsure of what to fill in, we suggest that you use the default values.',
233
+    'LBL_DBCONF_MB_DEMO_DATA'			=> 'Use multi-byte text in demo data?',
234 234
     'LBL_DBCONFIG_MSG2'                 => 'Name of web server or machine (host) on which the database is located ( such as localhost or www.mydomain.com ):',
235
-	'LBL_DBCONFIG_MSG2_LABEL' => 'Host Name',
235
+    'LBL_DBCONFIG_MSG2_LABEL' => 'Host Name',
236 236
     'LBL_DBCONFIG_MSG3'                 => 'Name of the database that will contain the data for the SuiteCRM instance you are about to install:',
237
-	'LBL_DBCONFIG_MSG3_LABEL' => 'Database Name',
237
+    'LBL_DBCONFIG_MSG3_LABEL' => 'Database Name',
238 238
     'LBL_DBCONFIG_B_MSG1'               => 'The username and password of a database administrator who can create database tables and users and who can write to the database is necessary in order to set up the SuiteCRM database.',
239
-	'LBL_DBCONFIG_B_MSG1_LABEL' => '',
239
+    'LBL_DBCONFIG_B_MSG1_LABEL' => '',
240 240
     'LBL_DBCONFIG_SECURITY'             => 'For security purposes, you can specify an exclusive database user to connect to the SuiteCRM database.  This user must be able to write, update and retrieve data on the SuiteCRM database that will be created for this instance.  This user can be the database administrator specified above, or you can provide new or existing database user information.',
241 241
     'LBL_DBCONFIG_AUTO_DD'              => 'Do it for me',
242 242
     'LBL_DBCONFIG_PROVIDE_DD'           => 'Provide existing user',
243 243
     'LBL_DBCONFIG_CREATE_DD'            => 'Define user to create',
244 244
     'LBL_DBCONFIG_SAME_DD'              => 'Same as Admin User',
245
-	//'LBL_DBCONF_I18NFIX'              => 'Apply database column expansion for varchar and char types (up to 255) for multi-byte data?',
245
+    //'LBL_DBCONF_I18NFIX'              => 'Apply database column expansion for varchar and char types (up to 255) for multi-byte data?',
246 246
     'LBL_FTS'                           => 'Full Text Search',
247 247
     'LBL_FTS_INSTALLED'                 => 'Installed',
248 248
     'LBL_FTS_INSTALLED_ERR1'            => 'Full Text Search capability is not installed.',
249 249
     'LBL_FTS_INSTALLED_ERR2'            => 'You can still install but will not be able to use Full Text Search functionality.  Please refer to your database server install guide on how to do this, or contact your Administrator.',
250
-	'LBL_DBCONF_PRIV_PASS'				=> 'Privileged Database User Password',
251
-	'LBL_DBCONF_PRIV_USER_2'			=> 'Database Account Above Is a Privileged User?',
252
-	'LBL_DBCONF_PRIV_USER_DIRECTIONS'	=> 'This privileged database user must have the proper permissions to create a database, drop/create tables, and create a user.  This privileged database user will only be used to perform these tasks as needed during the installation process.  You may also use the same database user as above if that user has sufficient privileges.',
253
-	'LBL_DBCONF_PRIV_USER'				=> 'Privileged Database User Name',
254
-	'LBL_DBCONF_TITLE'					=> 'Database Configuration',
250
+    'LBL_DBCONF_PRIV_PASS'				=> 'Privileged Database User Password',
251
+    'LBL_DBCONF_PRIV_USER_2'			=> 'Database Account Above Is a Privileged User?',
252
+    'LBL_DBCONF_PRIV_USER_DIRECTIONS'	=> 'This privileged database user must have the proper permissions to create a database, drop/create tables, and create a user.  This privileged database user will only be used to perform these tasks as needed during the installation process.  You may also use the same database user as above if that user has sufficient privileges.',
253
+    'LBL_DBCONF_PRIV_USER'				=> 'Privileged Database User Name',
254
+    'LBL_DBCONF_TITLE'					=> 'Database Configuration',
255 255
     'LBL_DBCONF_TITLE_NAME'             => 'Provide Database Name',
256 256
     'LBL_DBCONF_TITLE_USER_INFO'        => 'Provide Database User Information',
257
-	'LBL_DBCONF_TITLE_USER_INFO_LABEL' => 'User',
258
-	'LBL_DBCONF_TITLE_PSWD_INFO_LABEL' => 'Password',
259
-	'LBL_DISABLED_DESCRIPTION_2'		=> 'After this change has been made, you may click the "Start" button below to begin your installation.  <i>After the installation is complete, you will want to change the value for \'installer_locked\' to \'true\'.</i>',
260
-	'LBL_DISABLED_DESCRIPTION'			=> 'The installer has already been run once.  As a safety measure, it has been disabled from running a second time.  If you are absolutely sure you want to run it again, please go to your config.php file and locate (or add) a variable called \'installer_locked\' and set it to \'false\'.  The line should look like this:',
261
-	'LBL_DISABLED_HELP_1'				=> 'For installation help, please visit the SuiteCRM',
257
+    'LBL_DBCONF_TITLE_USER_INFO_LABEL' => 'User',
258
+    'LBL_DBCONF_TITLE_PSWD_INFO_LABEL' => 'Password',
259
+    'LBL_DISABLED_DESCRIPTION_2'		=> 'After this change has been made, you may click the "Start" button below to begin your installation.  <i>After the installation is complete, you will want to change the value for \'installer_locked\' to \'true\'.</i>',
260
+    'LBL_DISABLED_DESCRIPTION'			=> 'The installer has already been run once.  As a safety measure, it has been disabled from running a second time.  If you are absolutely sure you want to run it again, please go to your config.php file and locate (or add) a variable called \'installer_locked\' and set it to \'false\'.  The line should look like this:',
261
+    'LBL_DISABLED_HELP_1'				=> 'For installation help, please visit the SuiteCRM',
262 262
     'LBL_DISABLED_HELP_LNK'             => 'http://www.suitecrm.com/forum/index',
263
-	'LBL_DISABLED_HELP_2'				=> 'support forums',
264
-	'LBL_DISABLED_TITLE_2'				=> 'SuiteCRM Installation has been Disabled',
265
-	'LBL_DISABLED_TITLE'				=> 'SuiteCRM Installation Disabled',
266
-	'LBL_EMAIL_CHARSET_DESC'			=> 'Character Set most commonly used in your locale',
267
-	'LBL_EMAIL_CHARSET_TITLE'			=> 'Outbound Email Settings',
263
+    'LBL_DISABLED_HELP_2'				=> 'support forums',
264
+    'LBL_DISABLED_TITLE_2'				=> 'SuiteCRM Installation has been Disabled',
265
+    'LBL_DISABLED_TITLE'				=> 'SuiteCRM Installation Disabled',
266
+    'LBL_EMAIL_CHARSET_DESC'			=> 'Character Set most commonly used in your locale',
267
+    'LBL_EMAIL_CHARSET_TITLE'			=> 'Outbound Email Settings',
268 268
     'LBL_EMAIL_CHARSET_CONF'            => 'Character Set for Outbound Email ',
269
-	'LBL_HELP'							=> 'Help',
269
+    'LBL_HELP'							=> 'Help',
270 270
     'LBL_INSTALL'                       => 'Install',
271 271
     'LBL_INSTALL_TYPE_TITLE'            => 'Installation Options',
272 272
     'LBL_INSTALL_TYPE_SUBTITLE'         => 'Choose Install Type',
@@ -275,158 +275,158 @@  discard block
 block discarded – undo
275 275
     'LBL_INSTALL_TYPE_MSG1'             => 'The key is required for general application functionality, but it is not required for installation. You do not need to enter the key at this time, but you will need to provide the key after you have installed the application.',
276 276
     'LBL_INSTALL_TYPE_MSG2'             => 'Requires minimum information for the installation. Recommended for new users.',
277 277
     'LBL_INSTALL_TYPE_MSG3'             => 'Provides additional options to set during the installation. Most of these options are also available after installation in the admin screens. Recommended for advanced users.',
278
-	'LBL_LANG_1'						=> 'To use a language in SuiteCRM other than the default language (US-English), you can upload and install the language pack at this time. You will be able to upload and install language packs from within the SuiteCRM application as well.  If you would like to skip this step, click Next.',
279
-	'LBL_LANG_BUTTON_COMMIT'			=> 'Install',
280
-	'LBL_LANG_BUTTON_REMOVE'			=> 'Remove',
281
-	'LBL_LANG_BUTTON_UNINSTALL'			=> 'Uninstall',
282
-	'LBL_LANG_BUTTON_UPLOAD'			=> 'Upload',
283
-	'LBL_LANG_NO_PACKS'					=> 'none',
284
-	'LBL_LANG_PACK_INSTALLED'			=> 'The following language packs have been installed: ',
285
-	'LBL_LANG_PACK_READY'				=> 'The following language packs are ready to be installed: ',
286
-	'LBL_LANG_SUCCESS'					=> 'The language pack was successfully uploaded.',
287
-	'LBL_LANG_TITLE'			   		=> 'Language Pack',
278
+    'LBL_LANG_1'						=> 'To use a language in SuiteCRM other than the default language (US-English), you can upload and install the language pack at this time. You will be able to upload and install language packs from within the SuiteCRM application as well.  If you would like to skip this step, click Next.',
279
+    'LBL_LANG_BUTTON_COMMIT'			=> 'Install',
280
+    'LBL_LANG_BUTTON_REMOVE'			=> 'Remove',
281
+    'LBL_LANG_BUTTON_UNINSTALL'			=> 'Uninstall',
282
+    'LBL_LANG_BUTTON_UPLOAD'			=> 'Upload',
283
+    'LBL_LANG_NO_PACKS'					=> 'none',
284
+    'LBL_LANG_PACK_INSTALLED'			=> 'The following language packs have been installed: ',
285
+    'LBL_LANG_PACK_READY'				=> 'The following language packs are ready to be installed: ',
286
+    'LBL_LANG_SUCCESS'					=> 'The language pack was successfully uploaded.',
287
+    'LBL_LANG_TITLE'			   		=> 'Language Pack',
288 288
     'LBL_LAUNCHING_SILENT_INSTALL'     => 'Installing SuiteCRM now.  This may take up to a few minutes.',
289
-	'LBL_LANG_UPLOAD'					=> 'Upload a Language Pack',
290
-	'LBL_LICENSE_ACCEPTANCE'			=> 'License Acceptance',
289
+    'LBL_LANG_UPLOAD'					=> 'Upload a Language Pack',
290
+    'LBL_LICENSE_ACCEPTANCE'			=> 'License Acceptance',
291 291
     'LBL_LICENSE_CHECKING'              => 'Checking system for compatibility.',
292 292
     'LBL_LICENSE_CHKENV_HEADER'         => 'Checking Environment',
293 293
     'LBL_LICENSE_CHKDB_HEADER'          => 'Verifying DB Credentials.',
294 294
     'LBL_LICENSE_CHECK_PASSED'          => 'System passed check for compatibility.',
295
-	'LBL_CREATE_CACHE' => 'Preparing to Install...',
295
+    'LBL_CREATE_CACHE' => 'Preparing to Install...',
296 296
     'LBL_LICENSE_REDIRECT'              => 'Redirecting in ',
297
-	'LBL_LICENSE_DIRECTIONS'			=> 'If you have your license information, please enter it in the fields below.',
298
-	'LBL_LICENSE_DOWNLOAD_KEY'			=> 'Enter Download Key',
299
-	'LBL_LICENSE_EXPIRY'				=> 'Expiration Date',
300
-	'LBL_LICENSE_I_ACCEPT'				=> 'I Accept',
301
-	'LBL_LICENSE_NUM_USERS'				=> 'Number of Users',
302
-	'LBL_LICENSE_OC_DIRECTIONS'			=> 'Please enter the number of purchased offline clients.',
303
-	'LBL_LICENSE_OC_NUM'				=> 'Number of Offline Client Licenses',
304
-	'LBL_LICENSE_OC'					=> 'Offline Client Licenses',
305
-	'LBL_LICENSE_PRINTABLE'				=> ' Printable View ',
297
+    'LBL_LICENSE_DIRECTIONS'			=> 'If you have your license information, please enter it in the fields below.',
298
+    'LBL_LICENSE_DOWNLOAD_KEY'			=> 'Enter Download Key',
299
+    'LBL_LICENSE_EXPIRY'				=> 'Expiration Date',
300
+    'LBL_LICENSE_I_ACCEPT'				=> 'I Accept',
301
+    'LBL_LICENSE_NUM_USERS'				=> 'Number of Users',
302
+    'LBL_LICENSE_OC_DIRECTIONS'			=> 'Please enter the number of purchased offline clients.',
303
+    'LBL_LICENSE_OC_NUM'				=> 'Number of Offline Client Licenses',
304
+    'LBL_LICENSE_OC'					=> 'Offline Client Licenses',
305
+    'LBL_LICENSE_PRINTABLE'				=> ' Printable View ',
306 306
     'LBL_PRINT_SUMM'                    => 'Print Summary',
307
-	'LBL_LICENSE_TITLE_2'				=> 'SuiteCRM License',
308
-	'LBL_LICENSE_TITLE'					=> 'License Information',
309
-	'LBL_LICENSE_USERS'					=> 'Licensed Users',
310
-
311
-	'LBL_LOCALE_CURRENCY'				=> 'Currency Settings',
312
-	'LBL_LOCALE_CURR_DEFAULT'			=> 'Default Currency',
313
-	'LBL_LOCALE_CURR_SYMBOL'			=> 'Currency Symbol',
314
-	'LBL_LOCALE_CURR_ISO'				=> 'Currency Code (ISO 4217)',
315
-	'LBL_LOCALE_CURR_1000S'				=> '1000s Separator',
316
-	'LBL_LOCALE_CURR_DECIMAL'			=> 'Decimal Separator',
317
-	'LBL_LOCALE_CURR_EXAMPLE'			=> 'Example',
318
-	'LBL_LOCALE_CURR_SIG_DIGITS'		=> 'Significant Digits',
319
-	'LBL_LOCALE_DATEF'					=> 'Default Date Format',
320
-	'LBL_LOCALE_DESC'					=> 'The specified locale settings will be reflected globally within the SuiteCRM instance.',
321
-	'LBL_LOCALE_EXPORT'					=> 'Character Set for Import/Export<br> <i>(Email, .csv, vCard, PDF, data import)</i>',
322
-	'LBL_LOCALE_EXPORT_DELIMITER'		=> 'Export (.csv) Delimiter',
323
-	'LBL_LOCALE_EXPORT_TITLE'			=> 'Import/Export Settings',
324
-	'LBL_LOCALE_LANG'					=> 'Default Language',
325
-	'LBL_LOCALE_NAMEF'					=> 'Default Name Format',
326
-	'LBL_LOCALE_NAMEF_DESC'				=> 's = salutation<br />f = first name<br />l = last name',
327
-	'LBL_LOCALE_NAME_FIRST'				=> 'David',
328
-	'LBL_LOCALE_NAME_LAST'				=> 'Livingstone',
329
-	'LBL_LOCALE_NAME_SALUTATION'		=> 'Dr.',
330
-	'LBL_LOCALE_TIMEF'					=> 'Default Time Format',
331
-	'LBL_LOCALE_TITLE'					=> 'Locale Settings',
307
+    'LBL_LICENSE_TITLE_2'				=> 'SuiteCRM License',
308
+    'LBL_LICENSE_TITLE'					=> 'License Information',
309
+    'LBL_LICENSE_USERS'					=> 'Licensed Users',
310
+
311
+    'LBL_LOCALE_CURRENCY'				=> 'Currency Settings',
312
+    'LBL_LOCALE_CURR_DEFAULT'			=> 'Default Currency',
313
+    'LBL_LOCALE_CURR_SYMBOL'			=> 'Currency Symbol',
314
+    'LBL_LOCALE_CURR_ISO'				=> 'Currency Code (ISO 4217)',
315
+    'LBL_LOCALE_CURR_1000S'				=> '1000s Separator',
316
+    'LBL_LOCALE_CURR_DECIMAL'			=> 'Decimal Separator',
317
+    'LBL_LOCALE_CURR_EXAMPLE'			=> 'Example',
318
+    'LBL_LOCALE_CURR_SIG_DIGITS'		=> 'Significant Digits',
319
+    'LBL_LOCALE_DATEF'					=> 'Default Date Format',
320
+    'LBL_LOCALE_DESC'					=> 'The specified locale settings will be reflected globally within the SuiteCRM instance.',
321
+    'LBL_LOCALE_EXPORT'					=> 'Character Set for Import/Export<br> <i>(Email, .csv, vCard, PDF, data import)</i>',
322
+    'LBL_LOCALE_EXPORT_DELIMITER'		=> 'Export (.csv) Delimiter',
323
+    'LBL_LOCALE_EXPORT_TITLE'			=> 'Import/Export Settings',
324
+    'LBL_LOCALE_LANG'					=> 'Default Language',
325
+    'LBL_LOCALE_NAMEF'					=> 'Default Name Format',
326
+    'LBL_LOCALE_NAMEF_DESC'				=> 's = salutation<br />f = first name<br />l = last name',
327
+    'LBL_LOCALE_NAME_FIRST'				=> 'David',
328
+    'LBL_LOCALE_NAME_LAST'				=> 'Livingstone',
329
+    'LBL_LOCALE_NAME_SALUTATION'		=> 'Dr.',
330
+    'LBL_LOCALE_TIMEF'					=> 'Default Time Format',
331
+    'LBL_LOCALE_TITLE'					=> 'Locale Settings',
332 332
     'LBL_CUSTOMIZE_LOCALE'              => 'Customize Locale Settings',
333
-	'LBL_LOCALE_UI'						=> 'User Interface',
334
-
335
-	'LBL_ML_ACTION'						=> 'Action',
336
-	'LBL_ML_DESCRIPTION'				=> 'Description',
337
-	'LBL_ML_INSTALLED'					=> 'Date Installed',
338
-	'LBL_ML_NAME'						=> 'Name',
339
-	'LBL_ML_PUBLISHED'					=> 'Date Published',
340
-	'LBL_ML_TYPE'						=> 'Type',
341
-	'LBL_ML_UNINSTALLABLE'				=> 'Uninstallable',
342
-	'LBL_ML_VERSION'					=> 'Version',
343
-	'LBL_MSSQL'							=> 'SQL Server',
344
-	'LBL_MSSQL2'                        => 'SQL Server (FreeTDS)',
345
-	'LBL_MSSQL_SQLSRV'				    => 'SQL Server (Microsoft SQL Server Driver for PHP)',
346
-	'LBL_MYSQL'							=> 'MySQL',
333
+    'LBL_LOCALE_UI'						=> 'User Interface',
334
+
335
+    'LBL_ML_ACTION'						=> 'Action',
336
+    'LBL_ML_DESCRIPTION'				=> 'Description',
337
+    'LBL_ML_INSTALLED'					=> 'Date Installed',
338
+    'LBL_ML_NAME'						=> 'Name',
339
+    'LBL_ML_PUBLISHED'					=> 'Date Published',
340
+    'LBL_ML_TYPE'						=> 'Type',
341
+    'LBL_ML_UNINSTALLABLE'				=> 'Uninstallable',
342
+    'LBL_ML_VERSION'					=> 'Version',
343
+    'LBL_MSSQL'							=> 'SQL Server',
344
+    'LBL_MSSQL2'                        => 'SQL Server (FreeTDS)',
345
+    'LBL_MSSQL_SQLSRV'				    => 'SQL Server (Microsoft SQL Server Driver for PHP)',
346
+    'LBL_MYSQL'							=> 'MySQL',
347 347
     'LBL_MYSQLI'						=> 'MySQL (mysqli extension)',
348
-	'LBL_IBM_DB2'						=> 'IBM DB2',
349
-	'LBL_NEXT'							=> 'Next',
350
-	'LBL_NO'							=> 'No',
348
+    'LBL_IBM_DB2'						=> 'IBM DB2',
349
+    'LBL_NEXT'							=> 'Next',
350
+    'LBL_NO'							=> 'No',
351 351
     'LBL_ORACLE'						=> 'Oracle',
352
-	'LBL_PERFORM_ADMIN_PASSWORD'		=> 'Setting site admin password',
353
-	'LBL_PERFORM_AUDIT_TABLE'			=> 'audit table / ',
354
-	'LBL_PERFORM_CONFIG_PHP'			=> 'Creating SuiteCRM configuration file',
355
-	'LBL_PERFORM_CREATE_DB_1'			=> '<b>Creating the database</b> ',
356
-	'LBL_PERFORM_CREATE_DB_2'			=> ' <b>on</b> ',
357
-	'LBL_PERFORM_CREATE_DB_USER'		=> 'Creating the Database username and password...',
358
-	'LBL_PERFORM_CREATE_DEFAULT'		=> 'Creating default SuiteCRM data',
359
-	'LBL_PERFORM_CREATE_LOCALHOST'		=> 'Creating the Database username and password for localhost...',
360
-	'LBL_PERFORM_CREATE_RELATIONSHIPS'	=> 'Creating SuiteCRM relationship tables',
361
-	'LBL_PERFORM_CREATING'				=> 'creating / ',
362
-	'LBL_PERFORM_DEFAULT_REPORTS'		=> 'Creating default reports',
363
-	'LBL_PERFORM_DEFAULT_SCHEDULER'		=> 'Creating default scheduler jobs',
364
-	'LBL_PERFORM_DEFAULT_SETTINGS'		=> 'Inserting default settings',
365
-	'LBL_PERFORM_DEFAULT_USERS'			=> 'Creating default users',
366
-	'LBL_PERFORM_DEMO_DATA'				=> 'Populating the database tables with demo data (this may take a little while)',
367
-	'LBL_PERFORM_DONE'					=> 'done<br>',
368
-	'LBL_PERFORM_DROPPING'				=> 'dropping / ',
369
-	'LBL_PERFORM_FINISH'				=> 'Finish',
370
-	'LBL_PERFORM_LICENSE_SETTINGS'		=> 'Updating license information',
371
-	'LBL_PERFORM_OUTRO_1'				=> 'The setup of SuiteCRM ',
372
-	'LBL_PERFORM_OUTRO_2'				=> ' is now complete!',
373
-	'LBL_PERFORM_OUTRO_3'				=> 'Total time: ',
374
-	'LBL_PERFORM_OUTRO_4'				=> ' seconds.',
375
-	'LBL_PERFORM_OUTRO_5'				=> 'Approximate memory used: ',
376
-	'LBL_PERFORM_OUTRO_6'				=> ' bytes.',
377
-	'LBL_PERFORM_OUTRO_7'				=> 'Your system is now installed and configured for use.',
378
-	'LBL_PERFORM_REL_META'				=> 'relationship meta ... ',
379
-	'LBL_PERFORM_SUCCESS'				=> 'Success!',
380
-	'LBL_PERFORM_TABLES'				=> 'Creating SuiteCRM application tables, audit tables and relationship metadata',
381
-	'LBL_PERFORM_TITLE'					=> 'Perform Setup',
382
-	'LBL_PRINT'							=> 'Print',
383
-	'LBL_REG_CONF_1'					=> 'Please complete the short form below to receive product announcements, training news, special offers and special event invitations from SuiteCRM. We do not sell, rent, share or otherwise distribute the information collected here to third parties.',
384
-	'LBL_REG_CONF_2'					=> 'Your name and email address are the only required fields for registration. All other fields are optional, but very helpful. We do not sell, rent, share, or otherwise distribute the information collected here to third parties.',
385
-	'LBL_REG_CONF_3'					=> 'Thank you for registering. Click on the Finish button to login to SuiteCRM. You will need to log in for the first time using the username "admin" and the password you entered in step 2.',
386
-	'LBL_REG_TITLE'						=> 'Registration',
352
+    'LBL_PERFORM_ADMIN_PASSWORD'		=> 'Setting site admin password',
353
+    'LBL_PERFORM_AUDIT_TABLE'			=> 'audit table / ',
354
+    'LBL_PERFORM_CONFIG_PHP'			=> 'Creating SuiteCRM configuration file',
355
+    'LBL_PERFORM_CREATE_DB_1'			=> '<b>Creating the database</b> ',
356
+    'LBL_PERFORM_CREATE_DB_2'			=> ' <b>on</b> ',
357
+    'LBL_PERFORM_CREATE_DB_USER'		=> 'Creating the Database username and password...',
358
+    'LBL_PERFORM_CREATE_DEFAULT'		=> 'Creating default SuiteCRM data',
359
+    'LBL_PERFORM_CREATE_LOCALHOST'		=> 'Creating the Database username and password for localhost...',
360
+    'LBL_PERFORM_CREATE_RELATIONSHIPS'	=> 'Creating SuiteCRM relationship tables',
361
+    'LBL_PERFORM_CREATING'				=> 'creating / ',
362
+    'LBL_PERFORM_DEFAULT_REPORTS'		=> 'Creating default reports',
363
+    'LBL_PERFORM_DEFAULT_SCHEDULER'		=> 'Creating default scheduler jobs',
364
+    'LBL_PERFORM_DEFAULT_SETTINGS'		=> 'Inserting default settings',
365
+    'LBL_PERFORM_DEFAULT_USERS'			=> 'Creating default users',
366
+    'LBL_PERFORM_DEMO_DATA'				=> 'Populating the database tables with demo data (this may take a little while)',
367
+    'LBL_PERFORM_DONE'					=> 'done<br>',
368
+    'LBL_PERFORM_DROPPING'				=> 'dropping / ',
369
+    'LBL_PERFORM_FINISH'				=> 'Finish',
370
+    'LBL_PERFORM_LICENSE_SETTINGS'		=> 'Updating license information',
371
+    'LBL_PERFORM_OUTRO_1'				=> 'The setup of SuiteCRM ',
372
+    'LBL_PERFORM_OUTRO_2'				=> ' is now complete!',
373
+    'LBL_PERFORM_OUTRO_3'				=> 'Total time: ',
374
+    'LBL_PERFORM_OUTRO_4'				=> ' seconds.',
375
+    'LBL_PERFORM_OUTRO_5'				=> 'Approximate memory used: ',
376
+    'LBL_PERFORM_OUTRO_6'				=> ' bytes.',
377
+    'LBL_PERFORM_OUTRO_7'				=> 'Your system is now installed and configured for use.',
378
+    'LBL_PERFORM_REL_META'				=> 'relationship meta ... ',
379
+    'LBL_PERFORM_SUCCESS'				=> 'Success!',
380
+    'LBL_PERFORM_TABLES'				=> 'Creating SuiteCRM application tables, audit tables and relationship metadata',
381
+    'LBL_PERFORM_TITLE'					=> 'Perform Setup',
382
+    'LBL_PRINT'							=> 'Print',
383
+    'LBL_REG_CONF_1'					=> 'Please complete the short form below to receive product announcements, training news, special offers and special event invitations from SuiteCRM. We do not sell, rent, share or otherwise distribute the information collected here to third parties.',
384
+    'LBL_REG_CONF_2'					=> 'Your name and email address are the only required fields for registration. All other fields are optional, but very helpful. We do not sell, rent, share, or otherwise distribute the information collected here to third parties.',
385
+    'LBL_REG_CONF_3'					=> 'Thank you for registering. Click on the Finish button to login to SuiteCRM. You will need to log in for the first time using the username "admin" and the password you entered in step 2.',
386
+    'LBL_REG_TITLE'						=> 'Registration',
387 387
     'LBL_REG_NO_THANKS'                 => 'No Thanks',
388 388
     'LBL_REG_SKIP_THIS_STEP'            => 'Skip this Step',
389
-	'LBL_REQUIRED'						=> '* Required field',
389
+    'LBL_REQUIRED'						=> '* Required field',
390 390
 
391 391
     'LBL_SITECFG_ADMIN_Name'            => 'SuiteCRM Application Admin Name',
392
-	'LBL_SITECFG_ADMIN_PASS_2'			=> 'Re-enter SuiteCRM Admin User Password',
393
-	'LBL_SITECFG_ADMIN_PASS_WARN'		=> 'Caution: This will override the admin password of any previous installation.',
394
-	'LBL_SITECFG_ADMIN_PASS'			=> 'SuiteCRM Admin User Password',
395
-	'LBL_SITECFG_APP_ID'				=> 'Application ID',
396
-	'LBL_SITECFG_CUSTOM_ID_DIRECTIONS'	=> 'If selected, you must provide an application ID to override the auto-generated ID. The ID ensures that sessions of one SuiteCRM instance are not used by other instances.  If you have a cluster of SuiteCRM installations, they all must share the same application ID.',
397
-	'LBL_SITECFG_CUSTOM_ID'				=> 'Provide Your Own Application ID',
398
-	'LBL_SITECFG_CUSTOM_LOG_DIRECTIONS'	=> 'If selected, you must specify a log directory to override the default directory for the SuiteCRM log. Regardless of where the log file is located, access to it through a web browser will be restricted via an .htaccess redirect.',
399
-	'LBL_SITECFG_CUSTOM_LOG'			=> 'Use a Custom Log Directory',
400
-	'LBL_SITECFG_CUSTOM_SESSION_DIRECTIONS'	=> 'If selected, you must provide a secure folder for storing SuiteCRM session information. This can be done to prevent session data from being vulnerable on shared servers.',
401
-	'LBL_SITECFG_CUSTOM_SESSION'		=> 'Use a Custom Session Directory for SuiteCRM',
402
-	'LBL_SITECFG_DIRECTIONS'			=> 'Please enter your site configuration information below. If you are unsure of the fields, we suggest that you use the default values.',
403
-	'LBL_SITECFG_FIX_ERRORS'			=> '<b>Please fix the following errors before proceeding:</b>',
404
-	'LBL_SITECFG_LOG_DIR'				=> 'Log Directory',
405
-	'LBL_SITECFG_SESSION_PATH'			=> 'Path to Session Directory<br>(must be writable)',
406
-	'LBL_SITECFG_SITE_SECURITY'			=> 'Select Security Options',
407
-	'LBL_SITECFG_SUGAR_UP_DIRECTIONS'	=> 'If selected, the system will periodically check for updated versions of the application.',
408
-	'LBL_SITECFG_SUGAR_UP'				=> 'Automatically Check For Updates?',
409
-	'LBL_SITECFG_SUGAR_UPDATES'			=> 'SuiteCRM Updates Config',
410
-	'LBL_SITECFG_TITLE'					=> 'Site Configuration',
392
+    'LBL_SITECFG_ADMIN_PASS_2'			=> 'Re-enter SuiteCRM Admin User Password',
393
+    'LBL_SITECFG_ADMIN_PASS_WARN'		=> 'Caution: This will override the admin password of any previous installation.',
394
+    'LBL_SITECFG_ADMIN_PASS'			=> 'SuiteCRM Admin User Password',
395
+    'LBL_SITECFG_APP_ID'				=> 'Application ID',
396
+    'LBL_SITECFG_CUSTOM_ID_DIRECTIONS'	=> 'If selected, you must provide an application ID to override the auto-generated ID. The ID ensures that sessions of one SuiteCRM instance are not used by other instances.  If you have a cluster of SuiteCRM installations, they all must share the same application ID.',
397
+    'LBL_SITECFG_CUSTOM_ID'				=> 'Provide Your Own Application ID',
398
+    'LBL_SITECFG_CUSTOM_LOG_DIRECTIONS'	=> 'If selected, you must specify a log directory to override the default directory for the SuiteCRM log. Regardless of where the log file is located, access to it through a web browser will be restricted via an .htaccess redirect.',
399
+    'LBL_SITECFG_CUSTOM_LOG'			=> 'Use a Custom Log Directory',
400
+    'LBL_SITECFG_CUSTOM_SESSION_DIRECTIONS'	=> 'If selected, you must provide a secure folder for storing SuiteCRM session information. This can be done to prevent session data from being vulnerable on shared servers.',
401
+    'LBL_SITECFG_CUSTOM_SESSION'		=> 'Use a Custom Session Directory for SuiteCRM',
402
+    'LBL_SITECFG_DIRECTIONS'			=> 'Please enter your site configuration information below. If you are unsure of the fields, we suggest that you use the default values.',
403
+    'LBL_SITECFG_FIX_ERRORS'			=> '<b>Please fix the following errors before proceeding:</b>',
404
+    'LBL_SITECFG_LOG_DIR'				=> 'Log Directory',
405
+    'LBL_SITECFG_SESSION_PATH'			=> 'Path to Session Directory<br>(must be writable)',
406
+    'LBL_SITECFG_SITE_SECURITY'			=> 'Select Security Options',
407
+    'LBL_SITECFG_SUGAR_UP_DIRECTIONS'	=> 'If selected, the system will periodically check for updated versions of the application.',
408
+    'LBL_SITECFG_SUGAR_UP'				=> 'Automatically Check For Updates?',
409
+    'LBL_SITECFG_SUGAR_UPDATES'			=> 'SuiteCRM Updates Config',
410
+    'LBL_SITECFG_TITLE'					=> 'Site Configuration',
411 411
     'LBL_SITECFG_TITLE2'                => 'Identify Administration User',
412 412
     'LBL_SITECFG_SECURITY_TITLE'        => 'Site Security',
413
-	'LBL_SITECFG_URL'					=> 'URL of SuiteCRM Instance',
414
-	'LBL_SITECFG_USE_DEFAULTS'			=> 'Use Defaults?',
415
-	'LBL_SITECFG_ANONSTATS'             => 'Send Anonymous Usage Statistics?',
416
-	'LBL_SITECFG_ANONSTATS_DIRECTIONS'  => 'If selected, SuiteCRM will send <b>anonymous</b> statistics about your installation to SuiteCRM Inc. every time your system checks for new versions. This information will help us better understand how the application is used and guide improvements to the product.',
413
+    'LBL_SITECFG_URL'					=> 'URL of SuiteCRM Instance',
414
+    'LBL_SITECFG_USE_DEFAULTS'			=> 'Use Defaults?',
415
+    'LBL_SITECFG_ANONSTATS'             => 'Send Anonymous Usage Statistics?',
416
+    'LBL_SITECFG_ANONSTATS_DIRECTIONS'  => 'If selected, SuiteCRM will send <b>anonymous</b> statistics about your installation to SuiteCRM Inc. every time your system checks for new versions. This information will help us better understand how the application is used and guide improvements to the product.',
417 417
     'LBL_SITECFG_URL_MSG'               => 'Enter the URL that will be used to access the SuiteCRM instance after installation. The URL will also be used as a base for the URLs in the SuiteCRM application pages. The URL should include the web server or machine name or IP address.',
418 418
     'LBL_SITECFG_SYS_NAME_MSG'          => 'Enter a name for your system.  This name will be displayed in the browser title bar when users visit the SuiteCRM application.',
419 419
     'LBL_SITECFG_PASSWORD_MSG'          => 'After installation, you will need to use the SuiteCRM admin user (default username = admin) to log in to the SuiteCRM instance.  Enter a password for this administrator user. This password can be changed after the initial login.  You may also enter another admin username to use besides the default value provided.',
420 420
     'LBL_SITECFG_COLLATION_MSG'         => 'Select collation (sorting) settings for your system. This settings will create the tables with the specific language you use. In case your language doesn\'t require special settings please use default value.',
421 421
     'LBL_SPRITE_SUPPORT'                => 'Sprite Support',
422
-	'LBL_SYSTEM_CREDS'                  => 'System Credentials',
422
+    'LBL_SYSTEM_CREDS'                  => 'System Credentials',
423 423
     'LBL_SYSTEM_ENV'                    => 'System Environment',
424
-	'LBL_START'							=> 'Start',
424
+    'LBL_START'							=> 'Start',
425 425
     'LBL_SHOW_PASS'                     => 'Show Passwords',
426 426
     'LBL_HIDE_PASS'                     => 'Hide Passwords',
427 427
     'LBL_HIDDEN'                        => '<i>(hidden)</i>',
428
-	'LBL_STEP1' => 'Step 1 of 2 - Pre-Installation requirements',
429
-	'LBL_STEP2' => 'Step 2 of 2 - Configuration',
428
+    'LBL_STEP1' => 'Step 1 of 2 - Pre-Installation requirements',
429
+    'LBL_STEP2' => 'Step 2 of 2 - Configuration',
430 430
 //    'LBL_STEP1'                         => 'Step 1 of 8 - Pre-Installation requirements',
431 431
 //    'LBL_STEP2'                         => 'Step 2 of 8 - License Agreement',
432 432
 //    'LBL_STEP3'                         => 'Step 3 of 8 - Installation Type',
@@ -436,11 +436,11 @@  discard block
 block discarded – undo
436 436
 //    'LBL_STEP7'                         => 'Step 7 of 8 - Confirm Settings',
437 437
 //    'LBL_STEP8'                         => 'Step 8 of 8 - Installation Successful',
438 438
 //	'LBL_NO_THANKS'						=> 'Continue to installer',
439
-	'LBL_CHOOSE_LANG'					=> '<b>Choose your language</b>',
440
-	'LBL_STEP'							=> 'Step',
441
-	'LBL_TITLE_WELCOME'					=> 'Welcome to the SuiteCRM ',
442
-	'LBL_WELCOME_1'						=> 'This installer creates the SuiteCRM database tables and sets the configuration variables that you need to start. The entire process should take about ten minutes.',
443
-	'LBL_WELCOME_2'						=> 'For installation documentation, please visit the <a href="http://www.SuiteCRM.com/" target="_blank">SuiteCRM</a>.  <BR><BR> You can also find help from the SuiteCRM Community in the <a href="http://www.SuiteCRM.com/" target="_blank">SuiteCRM Forums</a>.',
439
+    'LBL_CHOOSE_LANG'					=> '<b>Choose your language</b>',
440
+    'LBL_STEP'							=> 'Step',
441
+    'LBL_TITLE_WELCOME'					=> 'Welcome to the SuiteCRM ',
442
+    'LBL_WELCOME_1'						=> 'This installer creates the SuiteCRM database tables and sets the configuration variables that you need to start. The entire process should take about ten minutes.',
443
+    'LBL_WELCOME_2'						=> 'For installation documentation, please visit the <a href="http://www.SuiteCRM.com/" target="_blank">SuiteCRM</a>.  <BR><BR> You can also find help from the SuiteCRM Community in the <a href="http://www.SuiteCRM.com/" target="_blank">SuiteCRM Forums</a>.',
444 444
     //welcome page variables
445 445
     'LBL_TITLE_ARE_YOU_READY'            => 'Are you ready to install?',
446 446
     'REQUIRED_SYS_COMP' => 'Required System Components',
@@ -523,20 +523,20 @@  discard block
 block discarded – undo
523 523
                                 ',
524 524
     'LBL_WELCOME_PLEASE_READ_BELOW' => 'Please read the following important information before proceeding with the installation.  The information will help you determine whether or not you are ready to install the application at this time.',
525 525
 
526
-	'LBL_WELCOME_CHOOSE_LANGUAGE'		=> '<b>Choose your language</b>',
527
-	'LBL_WELCOME_SETUP_WIZARD'			=> 'Setup Wizard',
528
-	'LBL_WELCOME_TITLE_WELCOME'			=> 'Welcome to the SuiteCRM ',
529
-	'LBL_WELCOME_TITLE'					=> 'SuiteCRM Setup Wizard',
530
-	'LBL_WIZARD_TITLE'					=> 'SuiteCRM Setup Wizard: ',
531
-	'LBL_YES'							=> 'Yes',
526
+    'LBL_WELCOME_CHOOSE_LANGUAGE'		=> '<b>Choose your language</b>',
527
+    'LBL_WELCOME_SETUP_WIZARD'			=> 'Setup Wizard',
528
+    'LBL_WELCOME_TITLE_WELCOME'			=> 'Welcome to the SuiteCRM ',
529
+    'LBL_WELCOME_TITLE'					=> 'SuiteCRM Setup Wizard',
530
+    'LBL_WIZARD_TITLE'					=> 'SuiteCRM Setup Wizard: ',
531
+    'LBL_YES'							=> 'Yes',
532 532
     'LBL_YES_MULTI'                     => 'Yes - Multibyte',
533
-	// OOTB Scheduler Job Names:
534
-	'LBL_OOTB_WORKFLOW'		=> 'Process Workflow Tasks',
535
-	'LBL_OOTB_REPORTS'		=> 'Run Report Generation Scheduled Tasks',
536
-	'LBL_OOTB_IE'			=> 'Check Inbound Mailboxes',
537
-	'LBL_OOTB_BOUNCE'		=> 'Run Nightly Process Bounced Campaign Emails',
533
+    // OOTB Scheduler Job Names:
534
+    'LBL_OOTB_WORKFLOW'		=> 'Process Workflow Tasks',
535
+    'LBL_OOTB_REPORTS'		=> 'Run Report Generation Scheduled Tasks',
536
+    'LBL_OOTB_IE'			=> 'Check Inbound Mailboxes',
537
+    'LBL_OOTB_BOUNCE'		=> 'Run Nightly Process Bounced Campaign Emails',
538 538
     'LBL_OOTB_CAMPAIGN'		=> 'Run Nightly Mass Email Campaigns',
539
-	'LBL_OOTB_PRUNE'		=> 'Prune Database on 1st of Month',
539
+    'LBL_OOTB_PRUNE'		=> 'Prune Database on 1st of Month',
540 540
     'LBL_OOTB_TRACKER'		=> 'Prune tracker tables',
541 541
     'LBL_OOTB_SUGARFEEDS'   => 'Prune SuiteCRM Feed Tables',
542 542
     'LBL_OOTB_SEND_EMAIL_REMINDERS'	=> 'Run Email Reminder Notifications',
@@ -550,19 +550,19 @@  discard block
 block discarded – undo
550 550
     'LBL_PATCH_1'           => 'If you would like to skip this step, click Next.',
551 551
     'LBL_PATCH_TITLE'       => 'System Patch',
552 552
     'LBL_PATCH_READY'       => 'The following patch(es) are ready to be installed:',
553
-	'LBL_SESSION_ERR_DESCRIPTION'		=> "SuiteCRM relies upon PHP sessions to store important information while connected to this web server.  Your PHP installation does not have the Session information correctly configured.
553
+    'LBL_SESSION_ERR_DESCRIPTION'		=> "SuiteCRM relies upon PHP sessions to store important information while connected to this web server.  Your PHP installation does not have the Session information correctly configured.
554 554
 											<br><br>A common misconfiguration is that the <b>'session.save_path'</b> directive is not pointing to a valid directory.  <br>
555 555
 											<br> Please correct your <a target=_new href='http://us2.php.net/manual/en/ref.session.php'>PHP configuration</a> in the php.ini file located here below.",
556
-	'LBL_SESSION_ERR_TITLE'				=> 'PHP Sessions Configuration Error',
557
-	'LBL_SYSTEM_NAME'=>'System Name',
556
+    'LBL_SESSION_ERR_TITLE'				=> 'PHP Sessions Configuration Error',
557
+    'LBL_SYSTEM_NAME'=>'System Name',
558 558
     'LBL_COLLATION' => 'Collation Settings',
559
-	'LBL_REQUIRED_SYSTEM_NAME'=>'Provide a System Name for the SuiteCRM instance.',
560
-	'LBL_PATCH_UPLOAD' => 'Select a patch file from your local computer',
561
-	'LBL_INCOMPATIBLE_PHP_VERSION' => 'Php version 5 or above is required.',
562
-	'LBL_MINIMUM_PHP_VERSION' => 'Minimum Php version required is 5.1.0. Recommended Php version is 5.2.x.',
563
-	'LBL_YOUR_PHP_VERSION' => '(Your current php version is ',
564
-	'LBL_RECOMMENDED_PHP_VERSION' =>' Recommended php version is 5.2.x)',
565
-	'LBL_BACKWARD_COMPATIBILITY_ON' => 'Php Backward Compatibility mode is turned on. Set zend.ze1_compatibility_mode to Off for proceeding further',
559
+    'LBL_REQUIRED_SYSTEM_NAME'=>'Provide a System Name for the SuiteCRM instance.',
560
+    'LBL_PATCH_UPLOAD' => 'Select a patch file from your local computer',
561
+    'LBL_INCOMPATIBLE_PHP_VERSION' => 'Php version 5 or above is required.',
562
+    'LBL_MINIMUM_PHP_VERSION' => 'Minimum Php version required is 5.1.0. Recommended Php version is 5.2.x.',
563
+    'LBL_YOUR_PHP_VERSION' => '(Your current php version is ',
564
+    'LBL_RECOMMENDED_PHP_VERSION' =>' Recommended php version is 5.2.x)',
565
+    'LBL_BACKWARD_COMPATIBILITY_ON' => 'Php Backward Compatibility mode is turned on. Set zend.ze1_compatibility_mode to Off for proceeding further',
566 566
     'LBL_STREAM' => 'PHP allows to use stream',
567 567
 
568 568
     'advanced_password_new_account_email' => array(
@@ -594,91 +594,91 @@  discard block
 block discarded – undo
594 594
         'name' => 'Forgot Password email',
595 595
         ),
596 596
 
597
-	// SMTP settings
598
-
599
-	'LBL_WIZARD_SMTP_DESC' => 'Provide the email account that will be used to send emails, such as the assignment notifications and new user passwords. Users will receive emails from SuiteCRM, as sent from the specified email account.',
600
-	'LBL_CHOOSE_EMAIL_PROVIDER'        => 'Choose your Email provider:',
601
-
602
-	'LBL_SMTPTYPE_GMAIL'                    => 'Gmail',
603
-	'LBL_SMTPTYPE_YAHOO'                    => 'Yahoo! Mail',
604
-	'LBL_SMTPTYPE_EXCHANGE'                 => 'Microsoft Exchange',
605
-	'LBL_SMTPTYPE_OTHER'                  => 'Other',
606
-	'LBL_MAIL_SMTP_SETTINGS'           => 'SMTP Server Specification',
607
-	'LBL_MAIL_SMTPSERVER'				=> 'SMTP Server:',
608
-	'LBL_MAIL_SMTPPORT'					=> 'SMTP Port:',
609
-	'LBL_MAIL_SMTPAUTH_REQ'				=> 'Use SMTP Authentication?',
610
-	'LBL_EMAIL_SMTP_SSL_OR_TLS'         => 'Enable SMTP over SSL or TLS?',
611
-	'LBL_GMAIL_SMTPUSER'					=> 'Gmail Email Address:',
612
-	'LBL_GMAIL_SMTPPASS'					=> 'Gmail Password:',
613
-	'LBL_ALLOW_DEFAULT_SELECTION'           => 'Allow users to use this account for outgoing email:',
614
-	'LBL_ALLOW_DEFAULT_SELECTION_HELP'          => 'When this option is selected, all users will be able to send emails using the same outgoing mail account used to send system notifications and alerts.  If the option is not selected, users can still use the outgoing mail server after providing their own account information.',
615
-
616
-	'LBL_YAHOOMAIL_SMTPPASS'					=> 'Yahoo! Mail Password:',
617
-	'LBL_YAHOOMAIL_SMTPUSER'					=> 'Yahoo! Mail ID:',
618
-
619
-	'LBL_EXCHANGE_SMTPPASS'					=> 'Exchange Password:',
620
-	'LBL_EXCHANGE_SMTPUSER'					=> 'Exchange Username:',
621
-	'LBL_EXCHANGE_SMTPPORT'					=> 'Exchange Server Port:',
622
-	'LBL_EXCHANGE_SMTPSERVER'				=> 'Exchange Server:',
623
-
624
-
625
-	'LBL_MAIL_SMTPUSER'					=> 'SMTP Username:',
626
-	'LBL_MAIL_SMTPPASS'					=> 'SMTP Password:',
627
-
628
-	// Branding
629
-
630
-	'LBL_WIZARD_SYSTEM_TITLE' => 'Branding',
631
-	'LBL_WIZARD_SYSTEM_DESC' => 'Provide your organization\'s name and logo in order to brand your SuiteCRM.',
632
-	'SYSTEM_NAME_WIZARD'=>'Name:',
633
-	'SYSTEM_NAME_HELP'=>'This is the name that displays in the title bar of your browser.',
634
-	'NEW_LOGO'=>'Select Logo:',
635
-	'NEW_LOGO_HELP'=>'The image file format can be either .png or .jpg. The maximum height is 170px, and the maximum width is 450px. Any image uploaded that is larger in any direction will be scaled to these max dimensions.',
636
-	'COMPANY_LOGO_UPLOAD_BTN' => 'Upload',
637
-	'CURRENT_LOGO'=>'Current Logo:',
597
+    // SMTP settings
598
+
599
+    'LBL_WIZARD_SMTP_DESC' => 'Provide the email account that will be used to send emails, such as the assignment notifications and new user passwords. Users will receive emails from SuiteCRM, as sent from the specified email account.',
600
+    'LBL_CHOOSE_EMAIL_PROVIDER'        => 'Choose your Email provider:',
601
+
602
+    'LBL_SMTPTYPE_GMAIL'                    => 'Gmail',
603
+    'LBL_SMTPTYPE_YAHOO'                    => 'Yahoo! Mail',
604
+    'LBL_SMTPTYPE_EXCHANGE'                 => 'Microsoft Exchange',
605
+    'LBL_SMTPTYPE_OTHER'                  => 'Other',
606
+    'LBL_MAIL_SMTP_SETTINGS'           => 'SMTP Server Specification',
607
+    'LBL_MAIL_SMTPSERVER'				=> 'SMTP Server:',
608
+    'LBL_MAIL_SMTPPORT'					=> 'SMTP Port:',
609
+    'LBL_MAIL_SMTPAUTH_REQ'				=> 'Use SMTP Authentication?',
610
+    'LBL_EMAIL_SMTP_SSL_OR_TLS'         => 'Enable SMTP over SSL or TLS?',
611
+    'LBL_GMAIL_SMTPUSER'					=> 'Gmail Email Address:',
612
+    'LBL_GMAIL_SMTPPASS'					=> 'Gmail Password:',
613
+    'LBL_ALLOW_DEFAULT_SELECTION'           => 'Allow users to use this account for outgoing email:',
614
+    'LBL_ALLOW_DEFAULT_SELECTION_HELP'          => 'When this option is selected, all users will be able to send emails using the same outgoing mail account used to send system notifications and alerts.  If the option is not selected, users can still use the outgoing mail server after providing their own account information.',
615
+
616
+    'LBL_YAHOOMAIL_SMTPPASS'					=> 'Yahoo! Mail Password:',
617
+    'LBL_YAHOOMAIL_SMTPUSER'					=> 'Yahoo! Mail ID:',
618
+
619
+    'LBL_EXCHANGE_SMTPPASS'					=> 'Exchange Password:',
620
+    'LBL_EXCHANGE_SMTPUSER'					=> 'Exchange Username:',
621
+    'LBL_EXCHANGE_SMTPPORT'					=> 'Exchange Server Port:',
622
+    'LBL_EXCHANGE_SMTPSERVER'				=> 'Exchange Server:',
623
+
624
+
625
+    'LBL_MAIL_SMTPUSER'					=> 'SMTP Username:',
626
+    'LBL_MAIL_SMTPPASS'					=> 'SMTP Password:',
627
+
628
+    // Branding
629
+
630
+    'LBL_WIZARD_SYSTEM_TITLE' => 'Branding',
631
+    'LBL_WIZARD_SYSTEM_DESC' => 'Provide your organization\'s name and logo in order to brand your SuiteCRM.',
632
+    'SYSTEM_NAME_WIZARD'=>'Name:',
633
+    'SYSTEM_NAME_HELP'=>'This is the name that displays in the title bar of your browser.',
634
+    'NEW_LOGO'=>'Select Logo:',
635
+    'NEW_LOGO_HELP'=>'The image file format can be either .png or .jpg. The maximum height is 170px, and the maximum width is 450px. Any image uploaded that is larger in any direction will be scaled to these max dimensions.',
636
+    'COMPANY_LOGO_UPLOAD_BTN' => 'Upload',
637
+    'CURRENT_LOGO'=>'Current Logo:',
638 638
     'CURRENT_LOGO_HELP'=>'This logo is displayed in the left-hand corner of the footer of the SuiteCRM application.',
639 639
 
640
-	// System Local Settings
641
-
642
-
643
-	'LBL_LOCALE_TITLE' => 'System Locale Settings',
644
-	'LBL_WIZARD_LOCALE_DESC' => 'Specify how you would like data in SuiteCRM to be displayed, based on your geographical location. The settings you provide here will be the default settings. Users will be able set their own preferences.',
645
-	'LBL_DATE_FORMAT' => 'Date Format:',
646
-	'LBL_TIME_FORMAT' => 'Time Format:',
647
-		'LBL_TIMEZONE' => 'Time Zone:',
648
-	'LBL_LANGUAGE'=>'Language:',
649
-	'LBL_CURRENCY'=>'Currency:',
650
-	'LBL_CURRENCY_SYMBOL'=>'Currency Symbol:',
651
-	'LBL_CURRENCY_ISO4217' => 'ISO 4217 Currency Code:',
652
-	'LBL_NUMBER_GROUPING_SEP' => '1000s separator:',
653
-	'LBL_DECIMAL_SEP' => 'Decimal symbol:',
654
-	'LBL_NAME_FORMAT' => 'Name Format:',
655
-	'UPLOAD_LOGO' => 'Please wait, logo uploading..',
656
-	'ERR_UPLOAD_FILETYPE' => 'File type do not allowed, please upload a jpeg or png.',
657
-	'ERR_LANG_UPLOAD_UNKNOWN' => 'Unknown file upload error occured.',
658
-	'ERR_UPLOAD_FILE_UPLOAD_ERR_INI_SIZE' => 'The uploaded file exceeds the upload_max_filesize directive in php.ini.',
659
-	'ERR_UPLOAD_FILE_UPLOAD_ERR_FORM_SIZE' => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.',
660
-	'ERR_UPLOAD_FILE_UPLOAD_ERR_PARTIAL' => 'The uploaded file was only partially uploaded.',
661
-	'ERR_UPLOAD_FILE_UPLOAD_ERR_NO_FILE' => 'No file was uploaded.',
662
-	'ERR_UPLOAD_FILE_UPLOAD_ERR_NO_TMP_DIR' => 'Missing a temporary folder.',
663
-	'ERR_UPLOAD_FILE_UPLOAD_ERR_CANT_WRITE' => 'Failed to write file to disk.',
664
-	'ERR_UPLOAD_FILE_UPLOAD_ERR_EXTENSION' => 'A PHP extension stopped the file upload. PHP does not provide a way to ascertain which extension caused the file upload to stop.',
665
-
666
-	'LBL_INSTALL_PROCESS' => 'Install...',
667
-
668
-	'LBL_EMAIL_ADDRESS' => 'Email Address:',
669
-	'ERR_ADMIN_EMAIL' => 'Administrator Email Address is incorrect.',
670
-	'ERR_SITE_URL' => 'Site URL is required.',
671
-
672
-	'STAT_CONFIGURATION' => 'Configuration relationships...',
673
-	'STAT_CREATE_DB' => 'Create database...',
674
-	//'STAT_CREATE_DB_TABLE' => 'Create database... (table: %s)',
675
-	'STAT_CREATE_DEFAULT_SETTINGS' => 'Create default settings...',
676
-	'STAT_INSTALL_FINISH' => 'Install finish...',
677
-	'STAT_INSTALL_FINISH_LOGIN' => 'Installation process finished, <a href="%s">please log in...</a>',
678
-	'LBL_LICENCE_TOOLTIP' => 'Please accept license first',
679
-
680
-	'LBL_MORE_OPTIONS_TITLE' => 'More options',
681
-	'LBL_START' => '',
640
+    // System Local Settings
641
+
642
+
643
+    'LBL_LOCALE_TITLE' => 'System Locale Settings',
644
+    'LBL_WIZARD_LOCALE_DESC' => 'Specify how you would like data in SuiteCRM to be displayed, based on your geographical location. The settings you provide here will be the default settings. Users will be able set their own preferences.',
645
+    'LBL_DATE_FORMAT' => 'Date Format:',
646
+    'LBL_TIME_FORMAT' => 'Time Format:',
647
+        'LBL_TIMEZONE' => 'Time Zone:',
648
+    'LBL_LANGUAGE'=>'Language:',
649
+    'LBL_CURRENCY'=>'Currency:',
650
+    'LBL_CURRENCY_SYMBOL'=>'Currency Symbol:',
651
+    'LBL_CURRENCY_ISO4217' => 'ISO 4217 Currency Code:',
652
+    'LBL_NUMBER_GROUPING_SEP' => '1000s separator:',
653
+    'LBL_DECIMAL_SEP' => 'Decimal symbol:',
654
+    'LBL_NAME_FORMAT' => 'Name Format:',
655
+    'UPLOAD_LOGO' => 'Please wait, logo uploading..',
656
+    'ERR_UPLOAD_FILETYPE' => 'File type do not allowed, please upload a jpeg or png.',
657
+    'ERR_LANG_UPLOAD_UNKNOWN' => 'Unknown file upload error occured.',
658
+    'ERR_UPLOAD_FILE_UPLOAD_ERR_INI_SIZE' => 'The uploaded file exceeds the upload_max_filesize directive in php.ini.',
659
+    'ERR_UPLOAD_FILE_UPLOAD_ERR_FORM_SIZE' => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.',
660
+    'ERR_UPLOAD_FILE_UPLOAD_ERR_PARTIAL' => 'The uploaded file was only partially uploaded.',
661
+    'ERR_UPLOAD_FILE_UPLOAD_ERR_NO_FILE' => 'No file was uploaded.',
662
+    'ERR_UPLOAD_FILE_UPLOAD_ERR_NO_TMP_DIR' => 'Missing a temporary folder.',
663
+    'ERR_UPLOAD_FILE_UPLOAD_ERR_CANT_WRITE' => 'Failed to write file to disk.',
664
+    'ERR_UPLOAD_FILE_UPLOAD_ERR_EXTENSION' => 'A PHP extension stopped the file upload. PHP does not provide a way to ascertain which extension caused the file upload to stop.',
665
+
666
+    'LBL_INSTALL_PROCESS' => 'Install...',
667
+
668
+    'LBL_EMAIL_ADDRESS' => 'Email Address:',
669
+    'ERR_ADMIN_EMAIL' => 'Administrator Email Address is incorrect.',
670
+    'ERR_SITE_URL' => 'Site URL is required.',
671
+
672
+    'STAT_CONFIGURATION' => 'Configuration relationships...',
673
+    'STAT_CREATE_DB' => 'Create database...',
674
+    //'STAT_CREATE_DB_TABLE' => 'Create database... (table: %s)',
675
+    'STAT_CREATE_DEFAULT_SETTINGS' => 'Create default settings...',
676
+    'STAT_INSTALL_FINISH' => 'Install finish...',
677
+    'STAT_INSTALL_FINISH_LOGIN' => 'Installation process finished, <a href="%s">please log in...</a>',
678
+    'LBL_LICENCE_TOOLTIP' => 'Please accept license first',
679
+
680
+    'LBL_MORE_OPTIONS_TITLE' => 'More options',
681
+    'LBL_START' => '',
682 682
 
683 683
 
684 684
 );
Please login to merge, or discard this patch.
include/generic/SugarWidgets/SugarWidgetField.php 1 patch
Indentation   +136 added lines, -136 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 if(!defined('sugarEntry') || !sugarEntry)
3
-	die('Not A Valid Entry Point');
3
+    die('Not A Valid Entry Point');
4 4
 /*********************************************************************************
5 5
  * SugarCRM Community Edition is a customer relationship management program developed by
6 6
  * SugarCRM, Inc. Copyright (C) 2004-2013 SugarCRM Inc.
@@ -46,162 +46,162 @@  discard block
 block discarded – undo
46 46
 
47 47
 class SugarWidgetField extends SugarWidget {
48 48
 
49
-	function SugarWidgetField(&$layout_manager) {
49
+    function SugarWidgetField(&$layout_manager) {
50 50
         parent::SugarWidget($layout_manager);
51 51
     }
52 52
 
53
-	function display($layout_def) {
54
-		//print $layout_def['start_link_wrapper']."===";
55
-		$context = $this->layout_manager->getAttribute('context'); //_ppd($context);
56
-		$func_name = 'display'.$context;
53
+    function display($layout_def) {
54
+        //print $layout_def['start_link_wrapper']."===";
55
+        $context = $this->layout_manager->getAttribute('context'); //_ppd($context);
56
+        $func_name = 'display'.$context;
57 57
 
58
-		if (!empty ($context) && method_exists($this, $func_name)) {
59
-			return $this-> $func_name ($layout_def);
60
-		} else {
61
-			return 'display not found:'.$func_name;
62
-		}
63
-	}
58
+        if (!empty ($context) && method_exists($this, $func_name)) {
59
+            return $this-> $func_name ($layout_def);
60
+        } else {
61
+            return 'display not found:'.$func_name;
62
+        }
63
+    }
64 64
 
65
-	function _get_column_alias($layout_def) {
66
-		$alias_arr = array ();
65
+    function _get_column_alias($layout_def) {
66
+        $alias_arr = array ();
67 67
 
68
-		if (!empty ($layout_def['name']) && $layout_def['name'] == 'count') {
69
-			return 'count';
70
-		}
68
+        if (!empty ($layout_def['name']) && $layout_def['name'] == 'count') {
69
+            return 'count';
70
+        }
71 71
 
72
-		if (!empty ($layout_def['table_alias'])) {
73
-			array_push($alias_arr, $layout_def['table_alias']);
74
-		}
72
+        if (!empty ($layout_def['table_alias'])) {
73
+            array_push($alias_arr, $layout_def['table_alias']);
74
+        }
75 75
 
76
-		if (!empty ($layout_def['name'])) {
77
-			array_push($alias_arr, $layout_def['name']);
78
-		}
76
+        if (!empty ($layout_def['name'])) {
77
+            array_push($alias_arr, $layout_def['name']);
78
+        }
79 79
 
80
-		return $this->getTruncatedColumnAlias(implode("_", $alias_arr));
81
-	}
80
+        return $this->getTruncatedColumnAlias(implode("_", $alias_arr));
81
+    }
82 82
 
83
-	function & displayDetailLabel(& $layout_def) {
83
+    function & displayDetailLabel(& $layout_def) {
84 84
 
85
-		return '';
86
-	}
85
+        return '';
86
+    }
87 87
 
88
-	function & displayDetail($layout_def) {
88
+    function & displayDetail($layout_def) {
89 89
 
90 90
         $layout_def = '';
91
-		return $layout_def;
92
-	}
91
+        return $layout_def;
92
+    }
93 93
 	
94
-	function displayHeaderCellPlain($layout_def) 
95
-	{
96
-		if (!empty ($layout_def['label'])) {
97
-			return $layout_def['label'];
98
-		}
99
-		if (!empty ($layout_def['vname'])) {
100
-			return translate($layout_def['vname'], $this->layout_manager->getAttribute('module_name'));
101
-		}
102
-		return '';
103
-	}
104
-
105
-	function displayHeaderCell($layout_def) {
106
-		$module_name = $this->layout_manager->getAttribute('module_name');
107
-
108
-		$this->local_current_module = $_REQUEST['module'];
109
-		$this->is_dynamic = true;
110
-		// don't show sort links if name isn't defined
111
-		if (empty ($layout_def['name']) || (isset ($layout_def['sortable']) && !$layout_def['sortable'])) {
112
-			return $this->displayHeaderCellPlain($layout_def);
113
-		}
114
-
115
-		$header_cell_text = $this->displayHeaderCellPlain($layout_def);
116
-
117
-		$subpanel_module = $layout_def['subpanel_module'];
118
-		$html_var = $subpanel_module . "_CELL";
119
-		if (empty ($this->base_URL)) {
120
-			$objListView = new ListView();
121
-			$this->base_URL = $objListView -> getBaseURL($html_var);
122
-			$split_url = explode('&to_pdf=true&action=SubPanelViewer&subpanel=', $this->base_URL);
123
-			$this->base_URL = $split_url[0];
124
-			$this->base_URL .= '&inline=true&to_pdf=true&action=SubPanelViewer&subpanel=';
125
-		}
126
-		$sort_by_name = $layout_def['name'];
127
-		if (isset ($layout_def['sort_by'])) {
128
-			$sort_by_name = $layout_def['sort_by'];
129
-		}
130
-
131
-		$objListView = new ListView();
132
-		$sort_by = $objListView->getSessionVariableName($html_var, "ORDER_BY").'='.$sort_by_name;
133
-
134
-		$start = (empty ($layout_def['start_link_wrapper'])) ? '' : $layout_def['start_link_wrapper'];
135
-		$end = (empty ($layout_def['end_link_wrapper'])) ? '' : $layout_def['end_link_wrapper'];
136
-
137
-		$header_cell = "<a class=\"listViewThLinkS1\" href=\"".$start.$this->base_URL.$subpanel_module.'&'.$sort_by.$end."\">";
138
-		$header_cell .= $header_cell_text;
139
-
140
-		$imgArrow = '';
141
-
142
-		if (isset ($layout_def['sort'])) {
143
-			$imgArrow = $layout_def['sort'];
144
-		}
145
-		$arrow_start = $objListView->getArrowUpDownStart($imgArrow);
146
-		$arrow_end = $objListView->getArrowUpDownEnd($imgArrow);
147
-		$header_cell .= " ".$arrow_start.$arrow_end."</a>";
148
-
149
-		return $header_cell;
150
-
151
-	}
152
-
153
-	function displayList($layout_def) {
154
-		return $this->displayListPlain($layout_def);
155
-	}
156
-
157
-	function displayListPlain($layout_def) {
158
-		$value= $this->_get_list_value($layout_def);
159
-		if (isset($layout_def['widget_type']) && $layout_def['widget_type'] =='checkbox') {
160
-			if ($value != '' &&  ($value == 'on' || intval($value) == 1 || $value == 'yes'))
161
-			{
162
-				return "<input name='checkbox_display' class='checkbox' type='checkbox' disabled='true' checked>";
163
-			}
164
-			return "<input name='checkbox_display' class='checkbox' type='checkbox' disabled='true'>";
165
-		}
166
-		return $value;
167
-	}
168
-
169
-	function _get_list_value(& $layout_def) 
170
-	{
171
-		$key = '';
172
-		if ( isset($layout_def['varname']) ) {
173
-		    $key = strtoupper($layout_def['varname']);
174
-		} 
175
-		else {
176
-			$key = strtoupper($this->_get_column_alias($layout_def));
177
-		}
178
-
179
-		if ( isset($layout_def['fields'][$key]) ) {
180
-			return $layout_def['fields'][$key];
181
-		}
94
+    function displayHeaderCellPlain($layout_def) 
95
+    {
96
+        if (!empty ($layout_def['label'])) {
97
+            return $layout_def['label'];
98
+        }
99
+        if (!empty ($layout_def['vname'])) {
100
+            return translate($layout_def['vname'], $this->layout_manager->getAttribute('module_name'));
101
+        }
102
+        return '';
103
+    }
104
+
105
+    function displayHeaderCell($layout_def) {
106
+        $module_name = $this->layout_manager->getAttribute('module_name');
107
+
108
+        $this->local_current_module = $_REQUEST['module'];
109
+        $this->is_dynamic = true;
110
+        // don't show sort links if name isn't defined
111
+        if (empty ($layout_def['name']) || (isset ($layout_def['sortable']) && !$layout_def['sortable'])) {
112
+            return $this->displayHeaderCellPlain($layout_def);
113
+        }
114
+
115
+        $header_cell_text = $this->displayHeaderCellPlain($layout_def);
116
+
117
+        $subpanel_module = $layout_def['subpanel_module'];
118
+        $html_var = $subpanel_module . "_CELL";
119
+        if (empty ($this->base_URL)) {
120
+            $objListView = new ListView();
121
+            $this->base_URL = $objListView -> getBaseURL($html_var);
122
+            $split_url = explode('&to_pdf=true&action=SubPanelViewer&subpanel=', $this->base_URL);
123
+            $this->base_URL = $split_url[0];
124
+            $this->base_URL .= '&inline=true&to_pdf=true&action=SubPanelViewer&subpanel=';
125
+        }
126
+        $sort_by_name = $layout_def['name'];
127
+        if (isset ($layout_def['sort_by'])) {
128
+            $sort_by_name = $layout_def['sort_by'];
129
+        }
130
+
131
+        $objListView = new ListView();
132
+        $sort_by = $objListView->getSessionVariableName($html_var, "ORDER_BY").'='.$sort_by_name;
133
+
134
+        $start = (empty ($layout_def['start_link_wrapper'])) ? '' : $layout_def['start_link_wrapper'];
135
+        $end = (empty ($layout_def['end_link_wrapper'])) ? '' : $layout_def['end_link_wrapper'];
136
+
137
+        $header_cell = "<a class=\"listViewThLinkS1\" href=\"".$start.$this->base_URL.$subpanel_module.'&'.$sort_by.$end."\">";
138
+        $header_cell .= $header_cell_text;
139
+
140
+        $imgArrow = '';
141
+
142
+        if (isset ($layout_def['sort'])) {
143
+            $imgArrow = $layout_def['sort'];
144
+        }
145
+        $arrow_start = $objListView->getArrowUpDownStart($imgArrow);
146
+        $arrow_end = $objListView->getArrowUpDownEnd($imgArrow);
147
+        $header_cell .= " ".$arrow_start.$arrow_end."</a>";
148
+
149
+        return $header_cell;
150
+
151
+    }
152
+
153
+    function displayList($layout_def) {
154
+        return $this->displayListPlain($layout_def);
155
+    }
156
+
157
+    function displayListPlain($layout_def) {
158
+        $value= $this->_get_list_value($layout_def);
159
+        if (isset($layout_def['widget_type']) && $layout_def['widget_type'] =='checkbox') {
160
+            if ($value != '' &&  ($value == 'on' || intval($value) == 1 || $value == 'yes'))
161
+            {
162
+                return "<input name='checkbox_display' class='checkbox' type='checkbox' disabled='true' checked>";
163
+            }
164
+            return "<input name='checkbox_display' class='checkbox' type='checkbox' disabled='true'>";
165
+        }
166
+        return $value;
167
+    }
168
+
169
+    function _get_list_value(& $layout_def) 
170
+    {
171
+        $key = '';
172
+        if ( isset($layout_def['varname']) ) {
173
+            $key = strtoupper($layout_def['varname']);
174
+        } 
175
+        else {
176
+            $key = strtoupper($this->_get_column_alias($layout_def));
177
+        }
178
+
179
+        if ( isset($layout_def['fields'][$key]) ) {
180
+            return $layout_def['fields'][$key];
181
+        }
182 182
 		
183
-		return '';
184
-	}
183
+        return '';
184
+    }
185 185
 
186
-	function & displayEditLabel($layout_def) {
187
-		return '';
188
-	}
186
+    function & displayEditLabel($layout_def) {
187
+        return '';
188
+    }
189 189
 
190
-	function & displayEdit($layout_def) {
191
-		return '';
192
-	}
190
+    function & displayEdit($layout_def) {
191
+        return '';
192
+    }
193 193
 
194
-	function & displaySearchLabel($layout_def) {
195
-		return '';
196
-	}
194
+    function & displaySearchLabel($layout_def) {
195
+        return '';
196
+    }
197 197
 
198
-	function & displaySearch($layout_def) {
199
-		return '';
200
-	}
198
+    function & displaySearch($layout_def) {
199
+        return '';
200
+    }
201 201
 
202
-	function displayInput($layout_def) {
203
-		return ' -- Not Implemented --';
204
-	}
202
+    function displayInput($layout_def) {
203
+        return ' -- Not Implemented --';
204
+    }
205 205
 
206 206
     function getVardef($layout_def) {
207 207
         $myName = $layout_def['column_key'];
Please login to merge, or discard this patch.
include/language/en_us.lang.php 1 patch
Indentation   +759 added lines, -759 removed lines patch added patch discarded remove patch
@@ -50,9 +50,9 @@  discard block
 block discarded – undo
50 50
 //to translate, only modify the right value in each key/value pair
51 51
 $app_list_strings = array (
52 52
 //e.g. auf Deutsch 'Contacts'=>'Contakten',
53
-  'language_pack_name' => 'US English',
54
-  'moduleList' =>
55
-  array (
53
+    'language_pack_name' => 'US English',
54
+    'moduleList' =>
55
+    array (
56 56
     'Home' => 'Home',
57 57
     'Contacts' => 'Contacts',
58 58
     'Accounts' => 'Accounts',
@@ -106,14 +106,14 @@  discard block
 block discarded – undo
106 106
     'Newsletters' => 'Newsletters',
107 107
     'SugarFeed'=>'SuiteCRM Feed',
108 108
     'KBDocuments' => 'Knowledge Base',
109
-  'SugarFavorites'=>'SuiteCRM Favorites',
109
+    'SugarFavorites'=>'SuiteCRM Favorites',
110 110
 
111 111
     'OAuthKeys' => 'OAuth Consumer Keys',
112 112
     'OAuthTokens' => 'OAuth Tokens',
113
-  ),
113
+    ),
114 114
 
115
-  'moduleListSingular' =>
116
-  array (
115
+    'moduleListSingular' =>
116
+    array (
117 117
     'Home' => 'Home',
118 118
     'Dashboard' => 'Dashboard',
119 119
     'Contacts' => 'Contact',
@@ -141,19 +141,19 @@  discard block
 block discarded – undo
141 141
     'SugarFollowing'=>'SuiteCRM Following',
142 142
     'Sync'=>'Sync',
143 143
     'Users' => 'User',
144
-  'SugarFavorites'=>'SuiteCRM Favorites'
144
+    'SugarFavorites'=>'SuiteCRM Favorites'
145 145
 
146 146
         ),
147 147
 
148
-  'checkbox_dom'=> array(
148
+    'checkbox_dom'=> array(
149 149
     ''=>'',
150 150
     '1'=>'Yes',
151 151
     '2'=>'No',
152
-  ),
152
+    ),
153 153
 
154
-  //e.g. en fran�ais 'Analyst'=>'Analyste',
155
-  'account_type_dom' =>
156
-  array (
154
+    //e.g. en fran�ais 'Analyst'=>'Analyste',
155
+    'account_type_dom' =>
156
+    array (
157 157
     '' => '',
158 158
     'Analyst' => 'Analyst',
159 159
     'Competitor' => 'Competitor',
@@ -165,10 +165,10 @@  discard block
 block discarded – undo
165 165
     'Prospect' => 'Prospect',
166 166
     'Reseller' => 'Reseller',
167 167
     'Other' => 'Other',
168
-  ),
169
-  //e.g. en espa�ol 'Apparel'=>'Ropa',
170
-  'industry_dom' =>
171
-  array (
168
+    ),
169
+    //e.g. en espa�ol 'Apparel'=>'Ropa',
170
+    'industry_dom' =>
171
+    array (
172 172
     '' => '',
173 173
     'Apparel' => 'Apparel',
174 174
     'Banking' => 'Banking',
@@ -200,10 +200,10 @@  discard block
 block discarded – undo
200 200
     'Transportation' => 'Transportation',
201 201
     'Utilities' => 'Utilities',
202 202
     'Other' => 'Other',
203
-  ),
204
-  'lead_source_default_key' => 'Self Generated',
205
-  'lead_source_dom' =>
206
-  array (
203
+    ),
204
+    'lead_source_default_key' => 'Self Generated',
205
+    'lead_source_dom' =>
206
+    array (
207 207
     '' => '',
208 208
     'Cold Call' => 'Cold Call',
209 209
     'Existing Customer' => 'Existing Customer',
@@ -219,26 +219,26 @@  discard block
 block discarded – undo
219 219
     'Email' => 'Email',
220 220
     'Campaign'=>'Campaign',
221 221
     'Other' => 'Other',
222
-  ),
223
-  'opportunity_type_dom' =>
224
-  array (
222
+    ),
223
+    'opportunity_type_dom' =>
224
+    array (
225 225
     '' => '',
226 226
     'Existing Business' => 'Existing Business',
227 227
     'New Business' => 'New Business',
228
-  ),
229
-  'roi_type_dom' =>
228
+    ),
229
+    'roi_type_dom' =>
230 230
     array (
231 231
     'Revenue' => 'Revenue',
232 232
     'Investment'=>'Investment',
233 233
     'Expected_Revenue'=>'Expected Revenue',
234 234
     'Budget'=>'Budget',
235 235
 
236
-  ),
237
-  //Note:  do not translate opportunity_relationship_type_default_key
236
+    ),
237
+    //Note:  do not translate opportunity_relationship_type_default_key
238 238
 //       it is the key for the default opportunity_relationship_type_dom value
239
-  'opportunity_relationship_type_default_key' => 'Primary Decision Maker',
240
-  'opportunity_relationship_type_dom' =>
241
-  array (
239
+    'opportunity_relationship_type_default_key' => 'Primary Decision Maker',
240
+    'opportunity_relationship_type_dom' =>
241
+    array (
242 242
     '' => '',
243 243
     'Primary Decision Maker' => 'Primary Decision Maker',
244 244
     'Business Decision Maker' => 'Business Decision Maker',
@@ -248,29 +248,29 @@  discard block
 block discarded – undo
248 248
     'Executive Sponsor' => 'Executive Sponsor',
249 249
     'Influencer' => 'Influencer',
250 250
     'Other' => 'Other',
251
-  ),
252
-  //Note:  do not translate case_relationship_type_default_key
251
+    ),
252
+    //Note:  do not translate case_relationship_type_default_key
253 253
 //       it is the key for the default case_relationship_type_dom value
254
-  'case_relationship_type_default_key' => 'Primary Contact',
255
-  'case_relationship_type_dom' =>
256
-  array (
254
+    'case_relationship_type_default_key' => 'Primary Contact',
255
+    'case_relationship_type_dom' =>
256
+    array (
257 257
     '' => '',
258 258
     'Primary Contact' => 'Primary Contact',
259 259
     'Alternate Contact' => 'Alternate Contact',
260
-  ),
261
-  'payment_terms' =>
262
-  array (
260
+    ),
261
+    'payment_terms' =>
262
+    array (
263 263
     '' => '',
264 264
     'Net 15' => 'Net 15',
265 265
     'Net 30' => 'Net 30',
266
-  ),
267
-  'sales_stage_default_key' => 'Prospecting',
268
-  'fts_type' => array (
269
-      '' => '',
270
-      'Elastic' => 'elasticsearch'
271
-  ),
272
-  'sales_stage_dom' =>
273
-  array (
266
+    ),
267
+    'sales_stage_default_key' => 'Prospecting',
268
+    'fts_type' => array (
269
+        '' => '',
270
+        'Elastic' => 'elasticsearch'
271
+    ),
272
+    'sales_stage_dom' =>
273
+    array (
274 274
     'Prospecting' => 'Prospecting',
275 275
     'Qualification' => 'Qualification',
276 276
     'Needs Analysis' => 'Needs Analysis',
@@ -281,8 +281,8 @@  discard block
 block discarded – undo
281 281
     'Negotiation/Review' => 'Negotiation/Review',
282 282
     'Closed Won' => 'Closed Won',
283 283
     'Closed Lost' => 'Closed Lost',
284
-  ),
285
-  'in_total_group_stages' => array (
284
+    ),
285
+    'in_total_group_stages' => array (
286 286
     'Draft' => 'Draft',
287 287
     'Negotiation' => 'Negotiation',
288 288
     'Delivered' => 'Delivered',
@@ -291,9 +291,9 @@  discard block
 block discarded – undo
291 291
     'Closed Accepted' => 'Closed Accepted',
292 292
     'Closed Lost' => 'Closed Lost',
293 293
     'Closed Dead' => 'Closed Dead',
294
-  ),
295
-  'sales_probability_dom' => // keys must be the same as sales_stage_dom
296
-  array (
294
+    ),
295
+    'sales_probability_dom' => // keys must be the same as sales_stage_dom
296
+    array (
297 297
     'Prospecting' => '10',
298 298
     'Qualification' => '20',
299 299
     'Needs Analysis' => '25',
@@ -304,85 +304,85 @@  discard block
 block discarded – undo
304 304
     'Negotiation/Review' => '80',
305 305
     'Closed Won' => '100',
306 306
     'Closed Lost' => '0',
307
-  ),
308
-  'activity_dom' =>
309
-  array (
307
+    ),
308
+    'activity_dom' =>
309
+    array (
310 310
     'Call' => 'Call',
311 311
     'Meeting' => 'Meeting',
312 312
     'Task' => 'Task',
313 313
     'Email' => 'Email',
314 314
     'Note' => 'Note',
315
-  ),
316
-  'salutation_dom' =>
317
-      array (
315
+    ),
316
+    'salutation_dom' =>
317
+        array (
318 318
         '' => '',
319 319
         'Mr.' => 'Mr.',
320 320
         'Ms.' => 'Ms.',
321 321
         'Mrs.' => 'Mrs.',
322 322
         'Dr.' => 'Dr.',
323 323
         'Prof.' => 'Prof.',
324
-      ),
325
-  //time is in seconds; the greater the time the longer it takes;
326
-  'reminder_max_time' => 90000,
327
-  'reminder_time_options' => array( 60=> '1 minute prior',
328
-                                  300=> '5 minutes prior',
329
-                                  600=> '10 minutes prior',
330
-                                  900=> '15 minutes prior',
331
-                                  1800=> '30 minutes prior',
332
-                                  3600=> '1 hour prior',
333
-                                  7200 => '2 hours prior',
334
-                                  10800 => '3 hours prior',
335
-                                  18000 => '5 hours prior',
336
-                                  86400 => '1 day prior',
337
-                                 ),
338
-
339
-  'task_priority_default' => 'Medium',
340
-  'task_priority_dom' =>
341
-  array (
324
+        ),
325
+    //time is in seconds; the greater the time the longer it takes;
326
+    'reminder_max_time' => 90000,
327
+    'reminder_time_options' => array( 60=> '1 minute prior',
328
+                                    300=> '5 minutes prior',
329
+                                    600=> '10 minutes prior',
330
+                                    900=> '15 minutes prior',
331
+                                    1800=> '30 minutes prior',
332
+                                    3600=> '1 hour prior',
333
+                                    7200 => '2 hours prior',
334
+                                    10800 => '3 hours prior',
335
+                                    18000 => '5 hours prior',
336
+                                    86400 => '1 day prior',
337
+                                    ),
338
+
339
+    'task_priority_default' => 'Medium',
340
+    'task_priority_dom' =>
341
+    array (
342 342
     'High' => 'High',
343 343
     'Medium' => 'Medium',
344 344
     'Low' => 'Low',
345
-  ),
346
-  'task_status_default' => 'Not Started',
347
-  'task_status_dom' =>
348
-  array (
345
+    ),
346
+    'task_status_default' => 'Not Started',
347
+    'task_status_dom' =>
348
+    array (
349 349
     'Not Started' => 'Not Started',
350 350
     'In Progress' => 'In Progress',
351 351
     'Completed' => 'Completed',
352 352
     'Pending Input' => 'Pending Input',
353 353
     'Deferred' => 'Deferred',
354
-  ),
355
-  'meeting_status_default' => 'Planned',
356
-  'meeting_status_dom' =>
357
-  array (
354
+    ),
355
+    'meeting_status_default' => 'Planned',
356
+    'meeting_status_dom' =>
357
+    array (
358 358
     'Planned' => 'Planned',
359 359
     'Held' => 'Held',
360 360
     'Not Held' => 'Not Held',
361
-  ),
362
-  'extapi_meeting_password' =>
363
-  array (
364
-      'WebEx' => 'WebEx',
365
-  ),
366
-  'meeting_type_dom' =>
367
-   array (
368
-      'Other' => 'Other',
369
-      'Sugar' => 'SuiteCRM',
370
-   ),
371
-  'call_status_default' => 'Planned',
372
-  'call_status_dom' =>
373
-  array (
361
+    ),
362
+    'extapi_meeting_password' =>
363
+    array (
364
+        'WebEx' => 'WebEx',
365
+    ),
366
+    'meeting_type_dom' =>
367
+    array (
368
+        'Other' => 'Other',
369
+        'Sugar' => 'SuiteCRM',
370
+    ),
371
+    'call_status_default' => 'Planned',
372
+    'call_status_dom' =>
373
+    array (
374 374
     'Planned' => 'Planned',
375 375
     'Held' => 'Held',
376 376
     'Not Held' => 'Not Held',
377
-  ),
378
-  'call_direction_default' => 'Outbound',
379
-  'call_direction_dom' =>
380
-  array (
377
+    ),
378
+    'call_direction_default' => 'Outbound',
379
+    'call_direction_dom' =>
380
+    array (
381 381
     'Inbound' => 'Inbound',
382 382
     'Outbound' => 'Outbound',
383
-  ),
384
-  'lead_status_dom' =>
385
-  array (
383
+    ),
384
+    'lead_status_dom' =>
385
+    array (
386 386
     '' => '',
387 387
     'New' => 'New',
388 388
     'Assigned' => 'Assigned',
@@ -390,54 +390,54 @@  discard block
 block discarded – undo
390 390
     'Converted' => 'Converted',
391 391
     'Recycled' => 'Recycled',
392 392
     'Dead' => 'Dead',
393
-  ),
394
-   'gender_list' =>
395
-  array (
393
+    ),
394
+    'gender_list' =>
395
+    array (
396 396
     'male' => 'Male',
397 397
     'female' => 'Female',
398
-  ),
399
-  //Note:  do not translate case_status_default_key
398
+    ),
399
+    //Note:  do not translate case_status_default_key
400 400
 //       it is the key for the default case_status_dom value
401
-  'case_status_default_key' => 'New',
402
-  'case_status_dom' =>
403
-  array (
401
+    'case_status_default_key' => 'New',
402
+    'case_status_dom' =>
403
+    array (
404 404
     'New' => 'New',
405 405
     'Assigned' => 'Assigned',
406 406
     'Closed' => 'Closed',
407 407
     'Pending Input' => 'Pending Input',
408 408
     'Rejected' => 'Rejected',
409 409
     'Duplicate' => 'Duplicate',
410
-  ),
411
-  'case_priority_default_key' => 'P2',
412
-  'case_priority_dom' =>
413
-  array (
410
+    ),
411
+    'case_priority_default_key' => 'P2',
412
+    'case_priority_dom' =>
413
+    array (
414 414
     'P1' => 'High',
415 415
     'P2' => 'Medium',
416 416
     'P3' => 'Low',
417
-  ),
418
-  'user_type_dom' =>
419
-  array (
417
+    ),
418
+    'user_type_dom' =>
419
+    array (
420 420
     'RegularUser' => 'Regular User',
421 421
     'Administrator' => 'Administrator',
422
-  ),
423
-  'user_status_dom' =>
424
-  array (
422
+    ),
423
+    'user_status_dom' =>
424
+    array (
425 425
     'Active' => 'Active',
426 426
     'Inactive' => 'Inactive',
427
-  ),
428
-  'employee_status_dom' =>
429
-  array (
427
+    ),
428
+    'employee_status_dom' =>
429
+    array (
430 430
     'Active' => 'Active',
431 431
     'Terminated' => 'Terminated',
432 432
     'Leave of Absence' => 'Leave of Absence',
433
-  ),
434
-  'messenger_type_dom' =>
435
-  array (
433
+    ),
434
+    'messenger_type_dom' =>
435
+    array (
436 436
     '' => '',
437 437
     'MSN' => 'MSN',
438 438
     'Yahoo!' => 'Yahoo!',
439 439
     'AOL' => 'AOL',
440
-  ),
440
+    ),
441 441
     'project_task_priority_options' => array (
442 442
         'High' => 'High',
443 443
         'Medium' => 'Medium',
@@ -480,11 +480,11 @@  discard block
 block discarded – undo
480 480
         'Low' => 'Low',
481 481
     ),
482 482
     'project_priority_default' => 'Medium',
483
-  //Note:  do not translate record_type_default_key
483
+    //Note:  do not translate record_type_default_key
484 484
 //       it is the key for the default record_type_module value
485
-  'record_type_default_key' => 'Accounts',
486
-  'record_type_display' =>
487
-  array (
485
+    'record_type_default_key' => 'Accounts',
486
+    'record_type_display' =>
487
+    array (
488 488
     '' => '',
489 489
     'Accounts' => 'Account',
490 490
     'Opportunities' => 'Opportunity',
@@ -502,10 +502,10 @@  discard block
 block discarded – undo
502 502
 
503 503
     'Tasks' => 'Task',
504 504
 
505
-  ),
505
+    ),
506 506
 
507
-  'record_type_display_notes' =>
508
-  array (
507
+    'record_type_display_notes' =>
508
+    array (
509 509
     'Accounts' => 'Account',
510 510
     'Contacts' => 'Contact',
511 511
     'Opportunities' => 'Opportunity',
@@ -521,10 +521,10 @@  discard block
 block discarded – undo
521 521
 
522 522
     'Meetings' => 'Meeting',
523 523
     'Calls' => 'Call',
524
-  ),
524
+    ),
525 525
 
526
-  'parent_type_display' =>
527
-  array (
526
+    'parent_type_display' =>
527
+    array (
528 528
     'Accounts' => 'Account',
529 529
     'Contacts' => 'Contact',
530 530
     'Tasks' => 'Task',
@@ -541,48 +541,48 @@  discard block
 block discarded – undo
541 541
 
542 542
     'Prospects' => 'Target',
543 543
 
544
-  ),
544
+    ),
545 545
 
546
-  'issue_priority_default_key' => 'Medium',
547
-  'issue_priority_dom' =>
548
-  array (
546
+    'issue_priority_default_key' => 'Medium',
547
+    'issue_priority_dom' =>
548
+    array (
549 549
     'Urgent' => 'Urgent',
550 550
     'High' => 'High',
551 551
     'Medium' => 'Medium',
552 552
     'Low' => 'Low',
553
-  ),
554
-  'issue_resolution_default_key' => '',
555
-  'issue_resolution_dom' =>
556
-  array (
553
+    ),
554
+    'issue_resolution_default_key' => '',
555
+    'issue_resolution_dom' =>
556
+    array (
557 557
     '' => '',
558 558
     'Accepted' => 'Accepted',
559 559
     'Duplicate' => 'Duplicate',
560 560
     'Closed' => 'Closed',
561 561
     'Out of Date' => 'Out of Date',
562 562
     'Invalid' => 'Invalid',
563
-  ),
563
+    ),
564 564
 
565
-  'issue_status_default_key' => 'New',
566
-  'issue_status_dom' =>
567
-  array (
565
+    'issue_status_default_key' => 'New',
566
+    'issue_status_dom' =>
567
+    array (
568 568
     'New' => 'New',
569 569
     'Assigned' => 'Assigned',
570 570
     'Closed' => 'Closed',
571 571
     'Pending' => 'Pending',
572 572
     'Rejected' => 'Rejected',
573
-  ),
573
+    ),
574 574
 
575
-  'bug_priority_default_key' => 'Medium',
576
-  'bug_priority_dom' =>
577
-  array (
575
+    'bug_priority_default_key' => 'Medium',
576
+    'bug_priority_dom' =>
577
+    array (
578 578
     'Urgent' => 'Urgent',
579 579
     'High' => 'High',
580 580
     'Medium' => 'Medium',
581 581
     'Low' => 'Low',
582
-  ),
583
-   'bug_resolution_default_key' => '',
584
-  'bug_resolution_dom' =>
585
-  array (
582
+    ),
583
+    'bug_resolution_default_key' => '',
584
+    'bug_resolution_dom' =>
585
+    array (
586 586
     '' => '',
587 587
     'Accepted' => 'Accepted',
588 588
     'Duplicate' => 'Duplicate',
@@ -590,42 +590,42 @@  discard block
 block discarded – undo
590 590
     'Out of Date' => 'Out of Date',
591 591
     'Invalid' => 'Invalid',
592 592
     'Later' => 'Later',
593
-  ),
594
-  'bug_status_default_key' => 'New',
595
-  'bug_status_dom' =>
596
-  array (
593
+    ),
594
+    'bug_status_default_key' => 'New',
595
+    'bug_status_dom' =>
596
+    array (
597 597
     'New' => 'New',
598 598
     'Assigned' => 'Assigned',
599 599
     'Closed' => 'Closed',
600 600
     'Pending' => 'Pending',
601 601
     'Rejected' => 'Rejected',
602
-  ),
603
-   'bug_type_default_key' => 'Bug',
604
-  'bug_type_dom' =>
605
-  array (
602
+    ),
603
+    'bug_type_default_key' => 'Bug',
604
+    'bug_type_dom' =>
605
+    array (
606 606
     'Defect' => 'Defect',
607 607
     'Feature' => 'Feature',
608
-  ),
609
- 'case_type_dom' =>
610
-  array (
608
+    ),
609
+    'case_type_dom' =>
610
+    array (
611 611
     'Administration' => 'Administration',
612 612
     'Product' => 'Product',
613 613
     'User' => 'User',
614
-  ),
614
+    ),
615 615
 
616
-  'source_default_key' => '',
617
-  'source_dom' =>
618
-  array (
616
+    'source_default_key' => '',
617
+    'source_dom' =>
618
+    array (
619 619
     '' => '',
620 620
     'Internal' => 'Internal',
621 621
     'Forum' => 'Forum',
622 622
     'Web' => 'Web',
623 623
     'InboundEmail' => 'Email'
624
-  ),
624
+    ),
625 625
 
626
-  'product_category_default_key' => '',
627
-  'product_category_dom' =>
628
-  array (
626
+    'product_category_default_key' => '',
627
+    'product_category_dom' =>
628
+    array (
629 629
     '' => '',
630 630
     'Accounts' => 'Accounts',
631 631
     'Activities' => 'Activities',
@@ -636,15 +636,15 @@  discard block
 block discarded – undo
636 636
     'Cases' => 'Cases',
637 637
     'Contacts' => 'Contacts',
638 638
     'Currencies' => 'Currencies',
639
-  'Dashboard' => 'Dashboard',
640
-  'Documents' => 'Documents',
639
+    'Dashboard' => 'Dashboard',
640
+    'Documents' => 'Documents',
641 641
     'Emails' => 'Emails',
642 642
     'Feeds' => 'Feeds',
643 643
     'Forecasts' => 'Forecasts',
644 644
     'Help' => 'Help',
645 645
     'Home' => 'Home',
646
-  'Leads' => 'Leads',
647
-  'Meetings' => 'Meetings',
646
+    'Leads' => 'Leads',
647
+    'Meetings' => 'Meetings',
648 648
     'Notes' => 'Notes',
649 649
     'Opportunities' => 'Opportunities',
650 650
     'Outlook Plugin' => 'Outlook Plugin',
@@ -655,10 +655,10 @@  discard block
 block discarded – undo
655 655
     'Studio' => 'Studio',
656 656
     'Upgrade' => 'Upgrade',
657 657
     'Users' => 'Users',
658
-  ),
659
-  /*Added entries 'Queued' and 'Sending' for 4.0 release..*/
660
-  'campaign_status_dom' =>
661
-  array (
658
+    ),
659
+    /*Added entries 'Queued' and 'Sending' for 4.0 release..*/
660
+    'campaign_status_dom' =>
661
+    array (
662 662
         '' => '',
663 663
         'Planning' => 'Planning',
664 664
         'Active' => 'Active',
@@ -666,9 +666,9 @@  discard block
 block discarded – undo
666 666
         'Complete' => 'Complete',
667 667
         'In Queue' => 'In Queue',
668 668
         'Sending'=> 'Sending',
669
-  ),
670
-  'campaign_type_dom' =>
671
-  array (
669
+    ),
670
+    'campaign_type_dom' =>
671
+    array (
672 672
         '' => '',
673 673
         'Telesales' => 'Telesales',
674 674
         'Mail' => 'Mail',
@@ -680,8 +680,8 @@  discard block
 block discarded – undo
680 680
         'NewsLetter' => 'Newsletter',
681 681
         ),
682 682
 
683
-  'newsletter_frequency_dom' =>
684
-  array (
683
+    'newsletter_frequency_dom' =>
684
+    array (
685 685
         '' => '',
686 686
         'Weekly' => 'Weekly',
687 687
         'Monthly' => 'Monthly',
@@ -689,11 +689,11 @@  discard block
 block discarded – undo
689 689
         'Annually' => 'Annually',
690 690
         ),
691 691
 
692
-  'notifymail_sendtype' =>
693
-  array (
692
+    'notifymail_sendtype' =>
693
+    array (
694 694
     'SMTP' => 'SMTP',
695
-  ),
696
-      'dom_cal_month_long'=>array(
695
+    ),
696
+        'dom_cal_month_long'=>array(
697 697
                 '0'=>"",
698 698
                 '1'=>"January",
699 699
                 '2'=>"February",
@@ -748,8 +748,8 @@  discard block
 block discarded – undo
748 748
                 'pm'=>"pm"
749 749
         ),
750 750
     'dom_meridiem_uppercase'=>array(
751
-                 'AM'=>'AM',
752
-                 'PM'=>'PM'
751
+                    'AM'=>'AM',
752
+                    'PM'=>'PM'
753 753
         ),
754 754
 
755 755
     'dom_report_types'=>array(
@@ -785,26 +785,26 @@  discard block
 block discarded – undo
785 785
                                         'imap'      => 'IMAP',
786 786
     ),
787 787
     'dom_mailbox_type'      => array(/*''           => '--None Specified--',*/
788
-                                     'pick'     => '--None--',
789
-                                     'createcase'  => 'Create Case',
790
-                                     'bounce'   => 'Bounce Handling',
788
+                                        'pick'     => '--None--',
789
+                                        'createcase'  => 'Create Case',
790
+                                        'bounce'   => 'Bounce Handling',
791 791
     ),
792 792
     'dom_email_distribution'=> array(''             => '--None--',
793
-                                     'direct'       => 'Direct Assign',
794
-                                     'roundRobin'   => 'Round-Robin',
795
-                                     'leastBusy'    => 'Least-Busy',
793
+                                        'direct'       => 'Direct Assign',
794
+                                        'roundRobin'   => 'Round-Robin',
795
+                                        'leastBusy'    => 'Least-Busy',
796 796
     ),
797 797
     'dom_email_distribution_for_auto_create'=> array('roundRobin'   => 'Round-Robin',
798
-                                                     'leastBusy'    => 'Least-Busy',
798
+                                                        'leastBusy'    => 'Least-Busy',
799 799
     ),
800 800
     'dom_email_errors'      => array(1 => 'Only select one user when Direct Assigning items.',
801
-                                     2 => 'You must assign Only Checked Items when Direct Assigning items.',
801
+                                        2 => 'You must assign Only Checked Items when Direct Assigning items.',
802 802
     ),
803 803
     'dom_email_bool'        => array('bool_true' => 'Yes',
804
-                                     'bool_false' => 'No',
804
+                                        'bool_false' => 'No',
805 805
     ),
806 806
     'dom_int_bool'          => array(1 => 'Yes',
807
-                                     0 => 'No',
807
+                                        0 => 'No',
808 808
     ),
809 809
     'dom_switch_bool'       => array ('on' => 'Yes',
810 810
                                         'off' => 'No',
@@ -841,19 +841,19 @@  discard block
 block discarded – undo
841 841
     array (
842 842
     'Active' => 'Active',
843 843
     'Inactive' => 'Inactive',
844
-  ),
844
+    ),
845 845
     'forecast_type_dom' =>
846 846
     array (
847 847
     'Direct' => 'Direct',
848 848
     'Rollup' => 'Rollup',
849
-  ),
849
+    ),
850 850
     'document_category_dom' =>
851 851
     array (
852 852
     '' => '',
853 853
     'Marketing' => 'Marketing',
854 854
     'Knowledege Base' => 'Knowledge Base',
855 855
     'Sales' => 'Sales',
856
-  ),
856
+    ),
857 857
 
858 858
     'document_subcategory_dom' =>
859 859
     array (
@@ -861,7 +861,7 @@  discard block
 block discarded – undo
861 861
     'Marketing Collateral' => 'Marketing Collateral',
862 862
     'Product Brochures' => 'Product Brochures',
863 863
     'FAQ' => 'FAQ',
864
-  ),
864
+    ),
865 865
 
866 866
     'document_status_dom' =>
867 867
     array (
@@ -871,39 +871,39 @@  discard block
 block discarded – undo
871 871
     'Expired' => 'Expired',
872 872
     'Under Review' => 'Under Review',
873 873
     'Pending' => 'Pending',
874
-  ),
875
-  'document_template_type_dom' =>
876
-  array(
874
+    ),
875
+    'document_template_type_dom' =>
876
+    array(
877 877
     ''=>'',
878 878
     'mailmerge'=>'Mail Merge',
879 879
     'eula'=>'EULA',
880 880
     'nda'=>'NDA',
881 881
     'license'=>'License Agreement',
882
-  ),
882
+    ),
883 883
     'dom_meeting_accept_options' =>
884 884
     array (
885 885
     'accept' => 'Accept',
886 886
     'decline' => 'Decline',
887 887
     'tentative' => 'Tentative',
888
-  ),
888
+    ),
889 889
     'dom_meeting_accept_status' =>
890 890
     array (
891 891
     'accept' => 'Accepted',
892 892
     'decline' => 'Declined',
893 893
     'tentative' => 'Tentative',
894 894
     'none'      => 'None',
895
-  ),
895
+    ),
896 896
     'duration_intervals' => array('0'=>'00',
897 897
                                     '15'=>'15',
898 898
                                     '30'=>'30',
899 899
                                     '45'=>'45',
900
-  ),
900
+    ),
901 901
     'repeat_type_dom' => array(
902
-    	'' => 'None',
903
-    	'Daily'	=> 'Daily',
904
-	'Weekly' => 'Weekly',
905
-	'Monthly' => 'Monthly',
906
-	'Yearly' => 'Yearly',
902
+        '' => 'None',
903
+        'Daily'	=> 'Daily',
904
+    'Weekly' => 'Weekly',
905
+    'Monthly' => 'Monthly',
906
+    'Yearly' => 'Yearly',
907 907
     ),
908 908
 
909 909
     'repeat_intervals' => array(
@@ -915,19 +915,19 @@  discard block
 block discarded – undo
915 915
     ),
916 916
 
917 917
     'duration_dom' => array(
918
-    	'' => 'None',
919
-    	'900' => '15 minutes',
920
-	'1800' => '30 minutes',
921
-	'2700' => '45 minutes',
922
-	'3600' => '1 hour',
923
-	'5400' => '1.5 hours',
924
-	'7200' => '2 hours',
925
-	'10800' => '3 hours',
926
-	'21600' => '6 hours',
927
-	'86400' => '1 day',
928
-	'172800' => '2 days',
929
-	'259200' => '3 days',
930
-	'604800' => '1 week',
918
+        '' => 'None',
919
+        '900' => '15 minutes',
920
+    '1800' => '30 minutes',
921
+    '2700' => '45 minutes',
922
+    '3600' => '1 hour',
923
+    '5400' => '1.5 hours',
924
+    '7200' => '2 hours',
925
+    '10800' => '3 hours',
926
+    '21600' => '6 hours',
927
+    '86400' => '1 day',
928
+    '172800' => '2 days',
929
+    '259200' => '3 days',
930
+    '604800' => '1 week',
931 931
     ),
932 932
 
933 933
 // deferred
@@ -938,31 +938,31 @@  discard block
 block discarded – undo
938 938
 ),
939 939
 */
940 940
 //prospect list type dom
941
-  'prospect_list_type_dom' =>
942
-  array (
941
+    'prospect_list_type_dom' =>
942
+    array (
943 943
     'default' => 'Default',
944 944
     'seed' => 'Seed',
945 945
     'exempt_domain' => 'Suppression List - By Domain',
946 946
     'exempt_address' => 'Suppression List - By Email Address',
947 947
     'exempt' => 'Suppression List - By Id',
948 948
     'test' => 'Test',
949
-  ),
949
+    ),
950 950
 
951
-  'email_settings_num_dom' =>
952
-  array(
951
+    'email_settings_num_dom' =>
952
+    array(
953 953
         '10'    => '10',
954 954
         '20'    => '20',
955 955
         '50'    => '50'
956 956
     ),
957
-  'email_marketing_status_dom' =>
958
-  array (
957
+    'email_marketing_status_dom' =>
958
+    array (
959 959
     '' => '',
960 960
     'active'=>'Active',
961 961
     'inactive'=>'Inactive'
962
-  ),
962
+    ),
963 963
 
964
-  'campainglog_activity_type_dom' =>
965
-  array (
964
+    'campainglog_activity_type_dom' =>
965
+    array (
966 966
     ''=>'',
967 967
     'targeted' => 'Message Sent/Attempted',
968 968
     'send error'=>'Bounced Messages,Other',
@@ -973,27 +973,27 @@  discard block
 block discarded – undo
973 973
     'lead'=>'Leads Created',
974 974
     'contact'=>'Contacts Created',
975 975
     'blocked'=>'Suppressed by address or domain',
976
-  ),
976
+    ),
977 977
 
978
-  'campainglog_target_type_dom' =>
979
-  array (
978
+    'campainglog_target_type_dom' =>
979
+    array (
980 980
     'Contacts' => 'Contacts',
981 981
     'Users'=>'Users',
982 982
     'Prospects'=>'Targets',
983 983
     'Leads'=>'Leads',
984 984
     'Accounts'=>'Accounts',
985
-  ),
986
-  'merge_operators_dom' => array (
985
+    ),
986
+    'merge_operators_dom' => array (
987 987
     'like'=>'Contains',
988 988
     'exact'=>'Exactly',
989 989
     'start'=>'Starts With',
990
-  ),
990
+    ),
991 991
 
992
-  'custom_fields_importable_dom' => array (
992
+    'custom_fields_importable_dom' => array (
993 993
     'true'=>'Yes',
994 994
     'false'=>'No',
995 995
     'required'=>'Required',
996
-  ),
996
+    ),
997 997
 
998 998
     'Elastic_boost_options' => array (
999 999
         '0' =>'Disabled',
@@ -1002,15 +1002,15 @@  discard block
 block discarded – undo
1002 1002
         '3'=>'High Boost',
1003 1003
     ),
1004 1004
 
1005
-  'custom_fields_merge_dup_dom'=> array (
1005
+    'custom_fields_merge_dup_dom'=> array (
1006 1006
         0=>'Disabled',
1007 1007
         1=>'Enabled',
1008
-  ),
1008
+    ),
1009 1009
 
1010
-  'navigation_paradigms' => array(
1010
+    'navigation_paradigms' => array(
1011 1011
         'm'=>'Modules',
1012 1012
         'gm'=>'Grouped Modules',
1013
-  ),
1013
+    ),
1014 1014
 
1015 1015
 
1016 1016
     'projects_priority_options' => array (
@@ -1083,7 +1083,7 @@  discard block
 block discarded – undo
1083 1083
         '300'   => 'Every 5 minutes',
1084 1084
         '600'   => 'Every 10 minutes',
1085 1085
     ),
1086
-  'dashlet_auto_refresh_options_admin' =>
1086
+    'dashlet_auto_refresh_options_admin' =>
1087 1087
     array (
1088 1088
         '-1'  => 'Never',
1089 1089
         '30'  => 'Every 30 seconds',
@@ -1092,8 +1092,8 @@  discard block
 block discarded – undo
1092 1092
         '300'   => 'Every 5 minutes',
1093 1093
         '600'   => 'Every 10 minutes',
1094 1094
     ),
1095
-  'date_range_search_dom' =>
1096
-  array(
1095
+    'date_range_search_dom' =>
1096
+    array(
1097 1097
     '=' => 'Equals',
1098 1098
     'not_equal' => 'Not On',
1099 1099
     'greater_than' => 'After',
@@ -1109,9 +1109,9 @@  discard block
 block discarded – undo
1109 1109
     'this_year' => 'This Year',
1110 1110
     'next_year' => 'Next Year',
1111 1111
     'between' => 'Is Between',
1112
-  ),
1113
-  'numeric_range_search_dom' =>
1114
-  array(
1112
+    ),
1113
+    'numeric_range_search_dom' =>
1114
+    array(
1115 1115
     '=' => 'Equals',
1116 1116
     'not_equal' => 'Does Not Equal',
1117 1117
     'greater_than' => 'Greater Than',
@@ -1119,46 +1119,46 @@  discard block
 block discarded – undo
1119 1119
     'less_than' => 'Less Than',
1120 1120
     'less_than_equals' => 'Less Than Or Equal To',
1121 1121
     'between' => 'Is Between',
1122
-  ),
1123
-  'lead_conv_activity_opt' =>
1124
-  array(
1122
+    ),
1123
+    'lead_conv_activity_opt' =>
1124
+    array(
1125 1125
         'copy' => 'Copy',
1126 1126
         'move' => 'Move',
1127 1127
         'donothing' => 'Do Nothing',
1128
-  ),
1128
+    ),
1129 1129
 );
1130 1130
 
1131 1131
 $app_strings = array (
1132
-  'LBL_TOUR_NEXT' => 'Next',
1133
-  'LBL_TOUR_SKIP' => 'Skip',
1134
-  'LBL_TOUR_BACK' => 'Back',
1135
-  'LBL_TOUR_CLOSE' => 'Close',
1136
-  'LBL_TOUR_TAKE_TOUR' => 'Take the tour',
1137
-  'LBL_MY_AREA_LINKS' => 'My area links: ' /*for 508 compliance fix*/,
1138
-  'LBL_GETTINGAIR' => 'Getting Air' /*for 508 compliance fix*/,
1139
-  'LBL_WELCOMEBAR' => 'Welcome' /*for 508 compliance fix*/,
1140
-  'LBL_ADVANCEDSEARCH' => 'Advanced Search' /*for 508 compliance fix*/,
1141
-  'LBL_MOREDETAIL' => 'More Detail' /*for 508 compliance fix*/,
1142
-  'LBL_EDIT_INLINE' => 'Edit Inline' /*for 508 compliance fix*/,
1143
-  'LBL_VIEW_INLINE' => 'View' /*for 508 compliance fix*/,
1144
-  'LBL_BASIC_SEARCH' => 'Search' /*for 508 compliance fix*/,
1145
-  'LBL_PROJECT_MINUS' => 'Remove' /*for 508 compliance fix*/,
1146
-  'LBL_PROJECT_PLUS' => 'Add' /*for 508 compliance fix*/,
1147
-  'LBL_Blank' => ' ' /*for 508 compliance fix*/,
1148
-  'LBL_ICON_COLUMN_1' => 'Column' /*for 508 compliance fix*/,
1149
-  'LBL_ICON_COLUMN_2' => '2 Columns' /*for 508 compliance fix*/,
1150
-  'LBL_ICON_COLUMN_3' => '3 Columns' /*for 508 compliance fix*/,
1151
-  'LBL_ADVANCED_SEARCH' => 'Advanced Search' /*for 508 compliance fix*/,
1152
-  'LBL_ID_FF_ADD' => 'Add' /*for 508 compliance fix*/,
1153
-  'LBL_HIDE_SHOW' => 'Hide/Show' /*for 508 compliance fix*/,
1154
-  'LBL_DELETE_INLINE' => 'Delete' /*for 508 compliance fix*/,
1155
-  'LBL_PLUS_INLINE' => 'Add' /*for 508 compliance fix*/,
1156
-  'LBL_ID_FF_CLEAR' => 'Clear' /*for 508 compliance fix*/,
1157
-  'LBL_ID_FF_VCARD' => 'vCard' /*for 508 compliance fix*/,
1158
-  'LBL_ID_FF_REMOVE' => 'Remove' /*for 508 compliance fix*/,
1159
-  'LBL_ADD' => 'Add' /*for 508 compliance fix*/,
1160
-  'LBL_COMPANY_LOGO' => 'Company logo' /*for 508 compliance fix*/,
1161
-  'LBL_JS_CALENDAR' => 'Calendar' /*for 508 compliance fix*/,
1132
+    'LBL_TOUR_NEXT' => 'Next',
1133
+    'LBL_TOUR_SKIP' => 'Skip',
1134
+    'LBL_TOUR_BACK' => 'Back',
1135
+    'LBL_TOUR_CLOSE' => 'Close',
1136
+    'LBL_TOUR_TAKE_TOUR' => 'Take the tour',
1137
+    'LBL_MY_AREA_LINKS' => 'My area links: ' /*for 508 compliance fix*/,
1138
+    'LBL_GETTINGAIR' => 'Getting Air' /*for 508 compliance fix*/,
1139
+    'LBL_WELCOMEBAR' => 'Welcome' /*for 508 compliance fix*/,
1140
+    'LBL_ADVANCEDSEARCH' => 'Advanced Search' /*for 508 compliance fix*/,
1141
+    'LBL_MOREDETAIL' => 'More Detail' /*for 508 compliance fix*/,
1142
+    'LBL_EDIT_INLINE' => 'Edit Inline' /*for 508 compliance fix*/,
1143
+    'LBL_VIEW_INLINE' => 'View' /*for 508 compliance fix*/,
1144
+    'LBL_BASIC_SEARCH' => 'Search' /*for 508 compliance fix*/,
1145
+    'LBL_PROJECT_MINUS' => 'Remove' /*for 508 compliance fix*/,
1146
+    'LBL_PROJECT_PLUS' => 'Add' /*for 508 compliance fix*/,
1147
+    'LBL_Blank' => ' ' /*for 508 compliance fix*/,
1148
+    'LBL_ICON_COLUMN_1' => 'Column' /*for 508 compliance fix*/,
1149
+    'LBL_ICON_COLUMN_2' => '2 Columns' /*for 508 compliance fix*/,
1150
+    'LBL_ICON_COLUMN_3' => '3 Columns' /*for 508 compliance fix*/,
1151
+    'LBL_ADVANCED_SEARCH' => 'Advanced Search' /*for 508 compliance fix*/,
1152
+    'LBL_ID_FF_ADD' => 'Add' /*for 508 compliance fix*/,
1153
+    'LBL_HIDE_SHOW' => 'Hide/Show' /*for 508 compliance fix*/,
1154
+    'LBL_DELETE_INLINE' => 'Delete' /*for 508 compliance fix*/,
1155
+    'LBL_PLUS_INLINE' => 'Add' /*for 508 compliance fix*/,
1156
+    'LBL_ID_FF_CLEAR' => 'Clear' /*for 508 compliance fix*/,
1157
+    'LBL_ID_FF_VCARD' => 'vCard' /*for 508 compliance fix*/,
1158
+    'LBL_ID_FF_REMOVE' => 'Remove' /*for 508 compliance fix*/,
1159
+    'LBL_ADD' => 'Add' /*for 508 compliance fix*/,
1160
+    'LBL_COMPANY_LOGO' => 'Company logo' /*for 508 compliance fix*/,
1161
+    'LBL_JS_CALENDAR' => 'Calendar' /*for 508 compliance fix*/,
1162 1162
     'LBL_ADVANCED' => 'Advanced',
1163 1163
     'LBL_BASIC' => 'Basic',
1164 1164
     'LBL_MODULE_FILTER' => 'Filter By',
@@ -1228,8 +1228,8 @@  discard block
 block discarded – undo
1228 1228
     'LBL_ROUTING_TO'                        => 'to',
1229 1229
     'LBL_ROUTING_TO_ADDRESS'                => 'to address',
1230 1230
     'LBL_ROUTING_WITH_TEMPLATE'             => 'with template',
1231
-  'NTC_OVERWRITE_ADDRESS_PHONE_CONFIRM' => 'This record currently contains values in the Office Phone and Address fields. To overwrite these values with the following Office Phone and Address of the Account that you selected, click "OK". To keep the current values, click "Cancel".',
1232
-  'LBL_DROP_HERE' => '[Drop Here]',
1231
+    'NTC_OVERWRITE_ADDRESS_PHONE_CONFIRM' => 'This record currently contains values in the Office Phone and Address fields. To overwrite these values with the following Office Phone and Address of the Account that you selected, click "OK". To keep the current values, click "Cancel".',
1232
+    'LBL_DROP_HERE' => '[Drop Here]',
1233 1233
     'LBL_EMAIL_ACCOUNTS_EDIT'               => 'Edit',
1234 1234
     'LBL_EMAIL_ACCOUNTS_GMAIL_DEFAULTS'     => 'Prefill Gmail&#153; Defaults',
1235 1235
     'LBL_EMAIL_ACCOUNTS_NAME'               => 'Name',
@@ -1247,8 +1247,8 @@  discard block
 block discarded – undo
1247 1247
     'LBL_EMAIL_ACCOUNTS_SMTPPASS_REQD'      => 'SMTP Password is required',
1248 1248
     'LBL_EMAIL_ACCOUNTS_TITLE'              => 'Mail Account Management',
1249 1249
     'LBL_EMAIL_POP3_REMOVE_MESSAGE'     => 'Mail Server Protocol of type POP3 will not be supported in the next release. Only IMAP will be supported.',
1250
-  'LBL_EMAIL_ACCOUNTS_SUBTITLE'           => 'Set up Mail Accounts to view incoming emails from your email accounts.',
1251
-  'LBL_EMAIL_ACCOUNTS_OUTBOUND_SUBTITLE'  => 'Provide SMTP mail server information to use for outgoing email in Mail Accounts.',
1250
+    'LBL_EMAIL_ACCOUNTS_SUBTITLE'           => 'Set up Mail Accounts to view incoming emails from your email accounts.',
1251
+    'LBL_EMAIL_ACCOUNTS_OUTBOUND_SUBTITLE'  => 'Provide SMTP mail server information to use for outgoing email in Mail Accounts.',
1252 1252
     'LBL_EMAIL_ADD'                         => 'Add Address',
1253 1253
 
1254 1254
     'LBL_EMAIL_ADDRESS_BOOK_ADD'            => 'Done',
@@ -1318,7 +1318,7 @@  discard block
 block discarded – undo
1318 1318
     'LBL_EMAIL_MULT_GROUP_FOLDER_ACCOUNTS'  => 'Multiple',
1319 1319
     'LBL_EMAIL_MULT_GROUP_FOLDER_ACCOUNTS_EMPTY' => 'Empty',
1320 1320
     'LBL_EMAIL_DATE_SENT_BY_SENDER'         => 'Date Sent by Sender',
1321
-  'LBL_EMAIL_DATE_RECEIVED'               => 'Date Received',
1321
+    'LBL_EMAIL_DATE_RECEIVED'               => 'Date Received',
1322 1322
     'LBL_EMAIL_ASSIGNED_TO_USER'            => 'Assigned to User',
1323 1323
     'LBL_EMAIL_DATE_TODAY'                  => 'Today',
1324 1324
     'LBL_EMAIL_DATE_YESTERDAY'              => 'Yesterday',
@@ -1563,17 +1563,17 @@  discard block
 block discarded – undo
1563 1563
     'LBL_EMAIL_SETTINGS_TOGGLE_ADV'         => 'Show Advanced',
1564 1564
     'LBL_EMAIL_SETTINGS_USER_FOLDERS'       => 'Available User Folders',
1565 1565
     'LBL_EMAIL_ERROR_PREPEND'               => 'Error:',
1566
-  'LBL_EMAIL_INVALID_PERSONAL_OUTBOUND' => 'The outbound mail server selected for the mail account you are using is invalid.  Check the settings or select a different mail server for the mail account.',
1567
-  'LBL_EMAIL_INVALID_SYSTEM_OUTBOUND' => 'An outgoing mail server is not configured to send emails. Please configure an outgoing mail server or select an outgoing mail server for the mail account that you are using in Settings >> Mail Account.',
1566
+    'LBL_EMAIL_INVALID_PERSONAL_OUTBOUND' => 'The outbound mail server selected for the mail account you are using is invalid.  Check the settings or select a different mail server for the mail account.',
1567
+    'LBL_EMAIL_INVALID_SYSTEM_OUTBOUND' => 'An outgoing mail server is not configured to send emails. Please configure an outgoing mail server or select an outgoing mail server for the mail account that you are using in Settings >> Mail Account.',
1568 1568
     'LBL_EMAIL_SHOW_READ'                   => 'Show All',
1569 1569
     'LBL_EMAIL_SHOW_UNREAD_ONLY'            => 'Show Unread Only',
1570 1570
     'LBL_EMAIL_SIGNATURES'                  => 'Signatures',
1571 1571
     'LBL_EMAIL_SIGNATURE_CREATE'            => 'Create Signature',
1572 1572
     'LBL_EMAIL_SIGNATURE_NAME'              => 'Signature Name',
1573 1573
     'LBL_EMAIL_SIGNATURE_TEXT'              => 'Signature Body',
1574
-  'LBL_SMTPTYPE_GMAIL'                    => 'Gmail',
1575
-  'LBL_SMTPTYPE_YAHOO'                    => 'Yahoo! Mail',
1576
-  'LBL_SMTPTYPE_EXCHANGE'                 => 'Microsoft Exchange',
1574
+    'LBL_SMTPTYPE_GMAIL'                    => 'Gmail',
1575
+    'LBL_SMTPTYPE_YAHOO'                    => 'Yahoo! Mail',
1576
+    'LBL_SMTPTYPE_EXCHANGE'                 => 'Microsoft Exchange',
1577 1577
     'LBL_SMTPTYPE_OTHER'                  => 'Other',
1578 1578
     'LBL_EMAIL_SPACER_MAIL_SERVER'          => '[ Remote Folders ]',
1579 1579
     'LBL_EMAIL_SPACER_LOCAL_FOLDER'         => '[ SuiteCRM Folders ]',
@@ -1880,8 +1880,8 @@  discard block
 block discarded – undo
1880 1880
     'LBL_PRIMARY_ADDRESS_STREET' => 'Primary Address Street:',
1881 1881
     'LBL_PRIMARY_ADDRESS' => 'Primary Address:',
1882 1882
 
1883
-	'LBL_BILLING_STREET'=> 'Street:',
1884
-	'LBL_SHIPPING_STREET'=> 'Street:',
1883
+    'LBL_BILLING_STREET'=> 'Street:',
1884
+    'LBL_SHIPPING_STREET'=> 'Street:',
1885 1885
 
1886 1886
     'LBL_PROSPECTS'=>'Prospects',
1887 1887
     'LBL_PRODUCT_BUNDLES'=>'Product Bundles',
@@ -2151,16 +2151,16 @@  discard block
 block discarded – undo
2151 2151
     'MSG_JS_ALERT_MTG_REMINDER_STATUS' => 'Status: ',
2152 2152
     'MSG_JS_ALERT_MTG_REMINDER_RELATED_TO' => 'Related To: ',
2153 2153
     'MSG_JS_ALERT_MTG_REMINDER_CALL_MSG' => "\nClick OK to view this call or click Cancel to dismiss this message.",
2154
-  	'MSG_JS_ALERT_MTG_REMINDER_MEETING_MSG' => "\nClick OK to view this meeting or click Cancel to dismiss this message.",
2155
-	'MSG_JS_ALERT_MTG_REMINDER_NO_EVENT_NAME' => 'Event',
2156
-	'MSG_JS_ALERT_MTG_REMINDER_NO_DESCRIPTION' => 'Event isn\'t set.',
2157
-	'MSG_JS_ALERT_MTG_REMINDER_NO_LOCATION' => 'Location isn\'t set.',
2158
-	'MSG_JS_ALERT_MTG_REMINDER_NO_START_DATE' => 'Start date isn\'t defined.',
2159
- 	'MSG_LIST_VIEW_NO_RESULTS_BASIC' => "No results found.",
2160
-	'MSG_LIST_VIEW_NO_RESULTS' => "No results found for <item1>",
2161
- 	'MSG_LIST_VIEW_NO_RESULTS_SUBMSG' => "Create <item1> as a new <item2>",
2162
-	'MSG_EMPTY_LIST_VIEW_NO_RESULTS' => "You currently have no records saved. <item2> or <item3> one now.",
2163
-	'MSG_EMPTY_LIST_VIEW_NO_RESULTS_SUBMSG' =>	"<item4> to learn more about the <item1> module. In order to access more information, use the user menu drop down located on the main navigation bar to access Help.",
2154
+        'MSG_JS_ALERT_MTG_REMINDER_MEETING_MSG' => "\nClick OK to view this meeting or click Cancel to dismiss this message.",
2155
+    'MSG_JS_ALERT_MTG_REMINDER_NO_EVENT_NAME' => 'Event',
2156
+    'MSG_JS_ALERT_MTG_REMINDER_NO_DESCRIPTION' => 'Event isn\'t set.',
2157
+    'MSG_JS_ALERT_MTG_REMINDER_NO_LOCATION' => 'Location isn\'t set.',
2158
+    'MSG_JS_ALERT_MTG_REMINDER_NO_START_DATE' => 'Start date isn\'t defined.',
2159
+        'MSG_LIST_VIEW_NO_RESULTS_BASIC' => "No results found.",
2160
+    'MSG_LIST_VIEW_NO_RESULTS' => "No results found for <item1>",
2161
+        'MSG_LIST_VIEW_NO_RESULTS_SUBMSG' => "Create <item1> as a new <item2>",
2162
+    'MSG_EMPTY_LIST_VIEW_NO_RESULTS' => "You currently have no records saved. <item2> or <item3> one now.",
2163
+    'MSG_EMPTY_LIST_VIEW_NO_RESULTS_SUBMSG' =>	"<item4> to learn more about the <item1> module. In order to access more information, use the user menu drop down located on the main navigation bar to access Help.",
2164 2164
 
2165 2165
     'LBL_CLICK_HERE' => "Click here",
2166 2166
     // contextMenu strings
@@ -2187,13 +2187,13 @@  discard block
 block discarded – undo
2187 2187
     'LBL_TRAINING' => 'Support',
2188 2188
     'ERR_DATABASE_CONN_DROPPED'=>'Error executing a query. Possibly, your database dropped the connection. Please refresh this page, you may need to restart you web server.',
2189 2189
     'ERR_MSSQL_DB_CONTEXT' =>'Changed database context to',
2190
-  'ERR_MSSQL_WARNING' =>'Warning:',
2190
+    'ERR_MSSQL_WARNING' =>'Warning:',
2191 2191
 
2192 2192
     //Meta-Data framework
2193 2193
     'ERR_MISSING_VARDEF_NAME' => 'Warning: field [[field]] does not have a mapped entry in [moduleDir] vardefs.php file',
2194 2194
     'ERR_CANNOT_CREATE_METADATA_FILE' => 'Error: File [[file]] is missing.  Unable to create because no corresponding HTML file was found.',
2195
-  'ERR_CANNOT_FIND_MODULE' => 'Error: Module [module] does not exist.',
2196
-  'LBL_ALT_ADDRESS' => 'Other Address:',
2195
+    'ERR_CANNOT_FIND_MODULE' => 'Error: Module [module] does not exist.',
2196
+    'LBL_ALT_ADDRESS' => 'Other Address:',
2197 2197
     'ERR_SMARTY_UNEQUAL_RELATED_FIELD_PARAMETERS' => 'Error: There are an unequal number of arguments for the \'key\' and \'copy\' elements in the displayParams array.',
2198 2198
     'ERR_SMARTY_MISSING_DISPLAY_PARAMS' => 'Missing index in displayParams Array for: ',
2199 2199
 
@@ -2284,10 +2284,10 @@  discard block
 block discarded – undo
2284 2284
 
2285 2285
     //jc:#12287 - For javascript validation messages
2286 2286
     'MSG_IS_NOT_BEFORE' => 'is not before',
2287
-  'MSG_IS_MORE_THAN' => 'is more than',
2288
-  'MSG_IS_LESS_THAN' => 'is less than',
2289
-  'MSG_SHOULD_BE' => 'should be',
2290
-  'MSG_OR_GREATER' => 'or greater',
2287
+    'MSG_IS_MORE_THAN' => 'is more than',
2288
+    'MSG_IS_LESS_THAN' => 'is less than',
2289
+    'MSG_SHOULD_BE' => 'should be',
2290
+    'MSG_OR_GREATER' => 'or greater',
2291 2291
 
2292 2292
     'LBL_PORTAL_WELCOME_TITLE' => 'Welcome to SuiteCRM Portal',
2293 2293
     'LBL_PORTAL_WELCOME_INFO' => 'SuiteCRM Portal is a framework which provides real-time view of cases, bugs & newsletters etc to customers. This is an external facing interface to SuiteCRM that can be deployed within any website.',
@@ -2319,13 +2319,13 @@  discard block
 block discarded – undo
2319 2319
     'LBL_OPERATOR_NOT_IN_TEXT' => 'is not one of the following:',
2320 2320
 
2321 2321
 
2322
-  //Connector
2322
+    //Connector
2323 2323
     'ERR_CONNECTOR_FILL_BEANS_SIZE_MISMATCH' => 'Error: The Array count of the bean parameter does not match the Array count of the results.',
2324
-  'ERR_MISSING_MAPPING_ENTRY_FORM_MODULE' => 'Error: Missing mapping entry for module.',
2325
-  'ERROR_UNABLE_TO_RETRIEVE_DATA' => 'Error: Unable to retrieve data for {0} Connector.  The service may currently be inaccessible or the configuration settings may be invalid.  Connector error message: ({1}).',
2326
-  'LBL_MERGE_CONNECTORS' => 'Get Data',
2327
-  'LBL_MERGE_CONNECTORS_BUTTON_KEY' => '[D]',
2328
-  'LBL_REMOVE_MODULE_ENTRY' => 'Are you sure you want to disable connector integration for this module?',
2324
+    'ERR_MISSING_MAPPING_ENTRY_FORM_MODULE' => 'Error: Missing mapping entry for module.',
2325
+    'ERROR_UNABLE_TO_RETRIEVE_DATA' => 'Error: Unable to retrieve data for {0} Connector.  The service may currently be inaccessible or the configuration settings may be invalid.  Connector error message: ({1}).',
2326
+    'LBL_MERGE_CONNECTORS' => 'Get Data',
2327
+    'LBL_MERGE_CONNECTORS_BUTTON_KEY' => '[D]',
2328
+    'LBL_REMOVE_MODULE_ENTRY' => 'Are you sure you want to disable connector integration for this module?',
2329 2329
 
2330 2330
     // fastcgi checks
2331 2331
     'LBL_FASTCGI_LOGGING'      => 'For optimal experience using IIS/FastCGI sapi, set fastcgi.logging to 0 in your php.ini file.',
@@ -2336,28 +2336,28 @@  discard block
 block discarded – undo
2336 2336
 
2337 2337
     //martin #25548
2338 2338
     'LBL_NO_FLASH_PLAYER' => 'You either have Abobe Flash turned off or are using an older version of the Adobe Flash Player. To get the latest version of the Flash Player, <a href="http://www.adobe.com/go/getflashplayer/">click here</a>.',
2339
-  //Collection Field
2340
-  'LBL_COLLECTION_NAME' => 'Name',
2341
-  'LBL_COLLECTION_PRIMARY' => 'Primary',
2342
-  'ERROR_MISSING_COLLECTION_SELECTION' => 'Empty required field',
2339
+    //Collection Field
2340
+    'LBL_COLLECTION_NAME' => 'Name',
2341
+    'LBL_COLLECTION_PRIMARY' => 'Primary',
2342
+    'ERROR_MISSING_COLLECTION_SELECTION' => 'Empty required field',
2343 2343
     'LBL_COLLECTION_EXACT' => 'Exact',
2344 2344
 
2345 2345
     //MB -Fixed Bug #32812 -Max
2346 2346
     'LBL_ASSIGNED_TO_NAME' => 'Assigned to',
2347 2347
     'LBL_DESCRIPTION' => 'Description',
2348 2348
 
2349
-  'LBL_YESTERDAY'=> 'yesterday',
2350
-  'LBL_TODAY'=>'today',
2351
-  'LBL_TOMORROW'=>'tomorrow',
2352
-  'LBL_NEXT_WEEK'=> 'next week',
2353
-  'LBL_NEXT_MONDAY'=>'next monday',
2354
-  'LBL_NEXT_FRIDAY'=>'next friday',
2355
-  'LBL_TWO_WEEKS'=> 'two weeks',
2356
-  'LBL_NEXT_MONTH'=> 'next month',
2357
-  'LBL_FIRST_DAY_OF_NEXT_MONTH'=> 'first day of next month',
2358
-  'LBL_THREE_MONTHS'=> 'three months',
2359
-  'LBL_SIXMONTHS'=> 'six months',
2360
-  'LBL_NEXT_YEAR'=> 'next year',
2349
+    'LBL_YESTERDAY'=> 'yesterday',
2350
+    'LBL_TODAY'=>'today',
2351
+    'LBL_TOMORROW'=>'tomorrow',
2352
+    'LBL_NEXT_WEEK'=> 'next week',
2353
+    'LBL_NEXT_MONDAY'=>'next monday',
2354
+    'LBL_NEXT_FRIDAY'=>'next friday',
2355
+    'LBL_TWO_WEEKS'=> 'two weeks',
2356
+    'LBL_NEXT_MONTH'=> 'next month',
2357
+    'LBL_FIRST_DAY_OF_NEXT_MONTH'=> 'first day of next month',
2358
+    'LBL_THREE_MONTHS'=> 'three months',
2359
+    'LBL_SIXMONTHS'=> 'six months',
2360
+    'LBL_NEXT_YEAR'=> 'next year',
2361 2361
     'LBL_FILTERED' => 'Filtered',
2362 2362
 
2363 2363
     //Datetimecombo fields
@@ -2384,7 +2384,7 @@  discard block
 block discarded – undo
2384 2384
 
2385 2385
     //File write error label
2386 2386
     'ERR_FILE_WRITE' => 'Error: Could not write file {0}.  Please check system and web server permissions.',
2387
-  'ERR_FILE_NOT_FOUND' => 'Error: Could not load file {0}.  Please check system and web server permissions.',
2387
+    'ERR_FILE_NOT_FOUND' => 'Error: Could not load file {0}.  Please check system and web server permissions.',
2388 2388
 
2389 2389
     'LBL_AND' => 'And',
2390 2390
     'LBL_BEFORE' => 'Before',
@@ -2456,7 +2456,7 @@  discard block
 block discarded – undo
2456 2456
     'LBL_ALT_MOVE_COLUMN_UP' =>'Move selected entry up in the displayed list order',
2457 2457
     'LBL_ALT_MOVE_COLUMN_DOWN' => 'Move selected entry down in the displayed list order',
2458 2458
     'LBL_ALT_INFO' => 'Information',
2459
-	'MSG_DUPLICATE' => 'The {0} record you are about to create might be a duplicate of an {0} record that already exists. {1} records containing similar names are listed below.<br>Click Create {1} to continue creating this new {0}, or select an existing {0} listed below.',
2459
+    'MSG_DUPLICATE' => 'The {0} record you are about to create might be a duplicate of an {0} record that already exists. {1} records containing similar names are listed below.<br>Click Create {1} to continue creating this new {0}, or select an existing {0} listed below.',
2460 2460
     'MSG_SHOW_DUPLICATES' => 'The {0} record you are about to create might be a duplicate of a {0} record that already exists. {1} records containing similar names are listed below.  Click Save to continue creating this new {0}, or click Cancel to return to the module without creating the {0}.',
2461 2461
     'LBL_EMAIL_TITLE' => 'email address',
2462 2462
     'LBL_EMAIL_OPT_TITLE' => 'opted out email address',
@@ -2532,9 +2532,9 @@  discard block
 block discarded – undo
2532 2532
     'Expired' => 'Expired',
2533 2533
     'In Review' => 'In Review',
2534 2534
     'Published' => 'Published',
2535
-  );
2535
+    );
2536 2536
 
2537
-   $app_list_strings['kbadmin_actions_dom'] =
2537
+    $app_list_strings['kbadmin_actions_dom'] =
2538 2538
     array (
2539 2539
     ''          => '--Admin Actions--',
2540 2540
     'Create New Tag' => 'Create New Tag',
@@ -2543,10 +2543,10 @@  discard block
 block discarded – undo
2543 2543
     'Move Selected Articles'=>'Move Selected Articles',
2544 2544
     'Apply Tags On Articles'=>'Apply Tags To Articles',
2545 2545
     'Delete Selected Articles'=>'Delete Selected Articles',
2546
-  );
2546
+    );
2547 2547
 
2548 2548
 
2549
-  $app_list_strings['kbdocument_attachment_option_dom'] =
2549
+    $app_list_strings['kbdocument_attachment_option_dom'] =
2550 2550
     array(
2551 2551
         ''=>'',
2552 2552
         'some' => 'Has Attachments',
@@ -2555,10 +2555,10 @@  discard block
 block discarded – undo
2555 2555
         'name' => 'Specify Name',
2556 2556
     );
2557 2557
 
2558
-  $app_list_strings['moduleList']['KBDocuments'] = 'Knowledge Base';
2559
-  $app_strings['LBL_CREATE_KB_DOCUMENT'] = 'Create Article';
2560
-  $app_list_strings['kbdocument_viewing_frequency_dom'] =
2561
-  array(
2558
+    $app_list_strings['moduleList']['KBDocuments'] = 'Knowledge Base';
2559
+    $app_strings['LBL_CREATE_KB_DOCUMENT'] = 'Create Article';
2560
+    $app_list_strings['kbdocument_viewing_frequency_dom'] =
2561
+    array(
2562 2562
     ''=>'',
2563 2563
     'Top_5'  => 'Top 5',
2564 2564
     'Top_10' => 'Top 10',
@@ -2566,9 +2566,9 @@  discard block
 block discarded – undo
2566 2566
     'Bot_5'  => 'Bottom 5',
2567 2567
     'Bot_10' => 'Bottom 10',
2568 2568
     'Bot_20' => 'Bottom 20',
2569
-  );
2569
+    );
2570 2570
 
2571
-   $app_list_strings['kbdocument_canned_search'] =
2571
+    $app_list_strings['kbdocument_canned_search'] =
2572 2572
     array(
2573 2573
         'all'=>'All',
2574 2574
         'added' => 'Added Last 30 days',
@@ -2835,7 +2835,7 @@  discard block
 block discarded – undo
2835 2835
         'ZIMBABWE' => 'ZIMBABWE',
2836 2836
     );
2837 2837
 
2838
-  $app_list_strings['charset_dom'] = array(
2838
+    $app_list_strings['charset_dom'] = array(
2839 2839
     'BIG-5'     => 'BIG-5 (Taiwan and Hong Kong)',
2840 2840
     /*'CP866'     => 'CP866', // ms-dos Cyrillic */
2841 2841
     /*'CP949'     => 'CP949 (Microsoft Korean)', */
@@ -2864,389 +2864,389 @@  discard block
 block discarded – undo
2864 2864
     'KOI8-U'    => 'KOI8-U (Cyrillic Ukranian)',
2865 2865
     'SJIS'      => 'SJIS (MS Japanese)',
2866 2866
     'UTF-8'     => 'UTF-8',
2867
-  );
2868
-
2869
-  $app_list_strings['timezone_dom'] = array(
2870
-
2871
-  'Africa/Algiers' => 'Africa/Algiers',
2872
-  'Africa/Luanda' => 'Africa/Luanda',
2873
-  'Africa/Porto-Novo' => 'Africa/Porto-Novo',
2874
-  'Africa/Gaborone' => 'Africa/Gaborone',
2875
-  'Africa/Ouagadougou' => 'Africa/Ouagadougou',
2876
-  'Africa/Bujumbura' => 'Africa/Bujumbura',
2877
-  'Africa/Douala' => 'Africa/Douala',
2878
-  'Atlantic/Cape_Verde' => 'Atlantic/Cape Verde',
2879
-  'Africa/Bangui' => 'Africa/Bangui',
2880
-  'Africa/Ndjamena' => 'Africa/Ndjamena',
2881
-  'Indian/Comoro' => 'Indian/Comoro',
2882
-  'Africa/Kinshasa' => 'Africa/Kinshasa',
2883
-  'Africa/Lubumbashi' => 'Africa/Lubumbashi',
2884
-  'Africa/Brazzaville' => 'Africa/Brazzaville',
2885
-  'Africa/Abidjan' => 'Africa/Abidjan',
2886
-  'Africa/Djibouti' => 'Africa/Djibouti',
2887
-  'Africa/Cairo' => 'Africa/Cairo',
2888
-  'Africa/Malabo' => 'Africa/Malabo',
2889
-  'Africa/Asmera' => 'Africa/Asmera',
2890
-  'Africa/Addis_Ababa' => 'Africa/Addis Ababa',
2891
-  'Africa/Libreville' => 'Africa/Libreville',
2892
-  'Africa/Banjul' => 'Africa/Banjul',
2893
-  'Africa/Accra' => 'Africa/Accra',
2894
-  'Africa/Conakry' => 'Africa/Conakry',
2895
-  'Africa/Bissau' => 'Africa/Bissau',
2896
-  'Africa/Nairobi' => 'Africa/Nairobi',
2897
-  'Africa/Maseru' => 'Africa/Maseru',
2898
-  'Africa/Monrovia' => 'Africa/Monrovia',
2899
-  'Africa/Tripoli' => 'Africa/Tripoli',
2900
-  'Indian/Antananarivo' => 'Indian/Antananarivo',
2901
-  'Africa/Blantyre' => 'Africa/Blantyre',
2902
-  'Africa/Bamako' => 'Africa/Bamako',
2903
-  'Africa/Nouakchott' => 'Africa/Nouakchott',
2904
-  'Indian/Mauritius' => 'Indian/Mauritius',
2905
-  'Indian/Mayotte' => 'Indian/Mayotte',
2906
-  'Africa/Casablanca' => 'Africa/Casablanca',
2907
-  'Africa/El_Aaiun' => 'Africa/El Aaiun',
2908
-  'Africa/Maputo' => 'Africa/Maputo',
2909
-  'Africa/Windhoek' => 'Africa/Windhoek',
2910
-  'Africa/Niamey' => 'Africa/Niamey',
2911
-  'Africa/Lagos' => 'Africa/Lagos',
2912
-  'Indian/Reunion' => 'Indian/Reunion',
2913
-  'Africa/Kigali' => 'Africa/Kigali',
2914
-  'Atlantic/St_Helena' => 'Atlantic/St. Helena',
2915
-  'Africa/Sao_Tome' => 'Africa/Sao Tome',
2916
-  'Africa/Dakar' => 'Africa/Dakar',
2917
-  'Indian/Mahe' => 'Indian/Mahe',
2918
-  'Africa/Freetown' => 'Africa/Freetown',
2919
-  'Africa/Mogadishu' => 'Africa/Mogadishu',
2920
-  'Africa/Johannesburg' => 'Africa/Johannesburg',
2921
-  'Africa/Khartoum' => 'Africa/Khartoum',
2922
-  'Africa/Mbabane' => 'Africa/Mbabane',
2923
-  'Africa/Dar_es_Salaam' => 'Africa/Dar es Salaam',
2924
-  'Africa/Lome' => 'Africa/Lome',
2925
-  'Africa/Tunis' => 'Africa/Tunis',
2926
-  'Africa/Kampala' => 'Africa/Kampala',
2927
-  'Africa/Lusaka' => 'Africa/Lusaka',
2928
-  'Africa/Harare' => 'Africa/Harare',
2929
-  'Antarctica/Casey' => 'Antarctica/Casey',
2930
-  'Antarctica/Davis' => 'Antarctica/Davis',
2931
-  'Antarctica/Mawson' => 'Antarctica/Mawson',
2932
-  'Indian/Kerguelen' => 'Indian/Kerguelen',
2933
-  'Antarctica/DumontDUrville' => 'Antarctica/DumontDUrville',
2934
-  'Antarctica/Syowa' => 'Antarctica/Syowa',
2935
-  'Antarctica/Vostok' => 'Antarctica/Vostok',
2936
-  'Antarctica/Rothera' => 'Antarctica/Rothera',
2937
-  'Antarctica/Palmer' => 'Antarctica/Palmer',
2938
-  'Antarctica/McMurdo' => 'Antarctica/McMurdo',
2939
-  'Asia/Kabul' => 'Asia/Kabul',
2940
-  'Asia/Yerevan' => 'Asia/Yerevan',
2941
-  'Asia/Baku' => 'Asia/Baku',
2942
-  'Asia/Bahrain' => 'Asia/Bahrain',
2943
-  'Asia/Dhaka' => 'Asia/Dhaka',
2944
-  'Asia/Thimphu' => 'Asia/Thimphu',
2945
-  'Indian/Chagos' => 'Indian/Chagos',
2946
-  'Asia/Brunei' => 'Asia/Brunei',
2947
-  'Asia/Rangoon' => 'Asia/Rangoon',
2948
-  'Asia/Phnom_Penh' => 'Asia/Phnom Penh',
2949
-  'Asia/Beijing' => 'Asia/Beijing',
2950
-  'Asia/Harbin' => 'Asia/Harbin',
2951
-  'Asia/Shanghai' => 'Asia/Shanghai',
2952
-  'Asia/Chongqing' => 'Asia/Chongqing',
2953
-  'Asia/Urumqi' => 'Asia/Urumqi',
2954
-  'Asia/Kashgar' => 'Asia/Kashgar',
2955
-  'Asia/Hong_Kong' => 'Asia/Hong Kong',
2956
-  'Asia/Taipei' => 'Asia/Taipei',
2957
-  'Asia/Macau' => 'Asia/Macau',
2958
-  'Asia/Nicosia' => 'Asia/Nicosia',
2959
-  'Asia/Tbilisi' => 'Asia/Tbilisi',
2960
-  'Asia/Dili' => 'Asia/Dili',
2961
-  'Asia/Calcutta' => 'Asia/Calcutta',
2962
-  'Asia/Jakarta' => 'Asia/Jakarta',
2963
-  'Asia/Pontianak' => 'Asia/Pontianak',
2964
-  'Asia/Makassar' => 'Asia/Makassar',
2965
-  'Asia/Jayapura' => 'Asia/Jayapura',
2966
-  'Asia/Tehran' => 'Asia/Tehran',
2967
-  'Asia/Baghdad' => 'Asia/Baghdad',
2968
-  'Asia/Jerusalem' => 'Asia/Jerusalem',
2969
-  'Asia/Tokyo' => 'Asia/Tokyo',
2970
-  'Asia/Amman' => 'Asia/Amman',
2971
-  'Asia/Almaty' => 'Asia/Almaty',
2972
-  'Asia/Qyzylorda' => 'Asia/Qyzylorda',
2973
-  'Asia/Aqtobe' => 'Asia/Aqtobe',
2974
-  'Asia/Aqtau' => 'Asia/Aqtau',
2975
-  'Asia/Oral' => 'Asia/Oral',
2976
-  'Asia/Bishkek' => 'Asia/Bishkek',
2977
-  'Asia/Seoul' => 'Asia/Seoul',
2978
-  'Asia/Pyongyang' => 'Asia/Pyongyang',
2979
-  'Asia/Kuwait' => 'Asia/Kuwait',
2980
-  'Asia/Vientiane' => 'Asia/Vientiane',
2981
-  'Asia/Beirut' => 'Asia/Beirut',
2982
-  'Asia/Kuala_Lumpur' => 'Asia/Kuala Lumpur',
2983
-  'Asia/Kuching' => 'Asia/Kuching',
2984
-  'Indian/Maldives' => 'Indian/Maldives',
2985
-  'Asia/Hovd' => 'Asia/Hovd',
2986
-  'Asia/Ulaanbaatar' => 'Asia/Ulaanbaatar',
2987
-  'Asia/Choibalsan' => 'Asia/Choibalsan',
2988
-  'Asia/Katmandu' => 'Asia/Katmandu',
2989
-  'Asia/Muscat' => 'Asia/Muscat',
2990
-  'Asia/Karachi' => 'Asia/Karachi',
2991
-  'Asia/Gaza' => 'Asia/Gaza',
2992
-  'Asia/Manila' => 'Asia/Manila',
2993
-  'Asia/Qatar' => 'Asia/Qatar',
2994
-  'Asia/Riyadh' => 'Asia/Riyadh',
2995
-  'Asia/Singapore' => 'Asia/Singapore',
2996
-  'Asia/Colombo' => 'Asia/Colombo',
2997
-  'Asia/Damascus' => 'Asia/Damascus',
2998
-  'Asia/Dushanbe' => 'Asia/Dushanbe',
2999
-  'Asia/Bangkok' => 'Asia/Bangkok',
3000
-  'Asia/Ashgabat' => 'Asia/Ashgabat',
3001
-  'Asia/Dubai' => 'Asia/Dubai',
3002
-  'Asia/Samarkand' => 'Asia/Samarkand',
3003
-  'Asia/Tashkent' => 'Asia/Tashkent',
3004
-  'Asia/Saigon' => 'Asia/Saigon',
3005
-  'Asia/Aden' => 'Asia/Aden',
3006
-  'Australia/Darwin' => 'Australia/Darwin',
3007
-  'Australia/Perth' => 'Australia/Perth',
3008
-  'Australia/Brisbane' => 'Australia/Brisbane',
3009
-  'Australia/Lindeman' => 'Australia/Lindeman',
3010
-  'Australia/Adelaide' => 'Australia/Adelaide',
3011
-  'Australia/Hobart' => 'Australia/Hobart',
3012
-  'Australia/Currie' => 'Australia/Currie',
3013
-  'Australia/Melbourne' => 'Australia/Melbourne',
3014
-  'Australia/Sydney' => 'Australia/Sydney',
3015
-  'Australia/Broken_Hill' => 'Australia/Broken Hill',
3016
-  'Indian/Christmas' => 'Indian/Christmas',
3017
-  'Pacific/Rarotonga' => 'Pacific/Rarotonga',
3018
-  'Indian/Cocos' => 'Indian/Cocos',
3019
-  'Pacific/Fiji' => 'Pacific/Fiji',
3020
-  'Pacific/Gambier' => 'Pacific/Gambier',
3021
-  'Pacific/Marquesas' => 'Pacific/Marquesas',
3022
-  'Pacific/Tahiti' => 'Pacific/Tahiti',
3023
-  'Pacific/Guam' => 'Pacific/Guam',
3024
-  'Pacific/Tarawa' => 'Pacific/Tarawa',
3025
-  'Pacific/Enderbury' => 'Pacific/Enderbury',
3026
-  'Pacific/Kiritimati' => 'Pacific/Kiritimati',
3027
-  'Pacific/Saipan' => 'Pacific/Saipan',
3028
-  'Pacific/Majuro' => 'Pacific/Majuro',
3029
-  'Pacific/Kwajalein' => 'Pacific/Kwajalein',
3030
-  'Pacific/Truk' => 'Pacific/Truk',
3031
-  'Pacific/Pohnpei' => 'Pacific/Pohnpei',
3032
-  'Pacific/Kosrae' => 'Pacific/Kosrae',
3033
-  'Pacific/Nauru' => 'Pacific/Nauru',
3034
-  'Pacific/Noumea' => 'Pacific/Noumea',
3035
-  'Pacific/Auckland' => 'Pacific/Auckland',
3036
-  'Pacific/Chatham' => 'Pacific/Chatham',
3037
-  'Pacific/Niue' => 'Pacific/Niue',
3038
-  'Pacific/Norfolk' => 'Pacific/Norfolk',
3039
-  'Pacific/Palau' => 'Pacific/Palau',
3040
-  'Pacific/Port_Moresby' => 'Pacific/Port Moresby',
3041
-  'Pacific/Pitcairn' => 'Pacific/Pitcairn',
3042
-  'Pacific/Pago_Pago' => 'Pacific/Pago Pago',
3043
-  'Pacific/Apia' => 'Pacific/Apia',
3044
-  'Pacific/Guadalcanal' => 'Pacific/Guadalcanal',
3045
-  'Pacific/Fakaofo' => 'Pacific/Fakaofo',
3046
-  'Pacific/Tongatapu' => 'Pacific/Tongatapu',
3047
-  'Pacific/Funafuti' => 'Pacific/Funafuti',
3048
-  'Pacific/Johnston' => 'Pacific/Johnston',
3049
-  'Pacific/Midway' => 'Pacific/Midway',
3050
-  'Pacific/Wake' => 'Pacific/Wake',
3051
-  'Pacific/Efate' => 'Pacific/Efate',
3052
-  'Pacific/Wallis' => 'Pacific/Wallis',
3053
-  'Europe/London' => 'Europe/London',
3054
-  'Europe/Dublin' => 'Europe/Dublin',
3055
-  'WET' => 'WET',
3056
-  'CET' => 'CET',
3057
-  'MET' => 'MET',
3058
-  'EET' => 'EET',
3059
-  'Europe/Tirane' => 'Europe/Tirane',
3060
-  'Europe/Andorra' => 'Europe/Andorra',
3061
-  'Europe/Vienna' => 'Europe/Vienna',
3062
-  'Europe/Minsk' => 'Europe/Minsk',
3063
-  'Europe/Brussels' => 'Europe/Brussels',
3064
-  'Europe/Sofia' => 'Europe/Sofia',
3065
-  'Europe/Prague' => 'Europe/Prague',
3066
-  'Europe/Copenhagen' => 'Europe/Copenhagen',
3067
-  'Atlantic/Faeroe' => 'Atlantic/Faeroe',
3068
-  'America/Danmarkshavn' => 'America/Danmarkshavn',
3069
-  'America/Scoresbysund' => 'America/Scoresbysund',
3070
-  'America/Godthab' => 'America/Godthab',
3071
-  'America/Thule' => 'America/Thule',
3072
-  'Europe/Tallinn' => 'Europe/Tallinn',
3073
-  'Europe/Helsinki' => 'Europe/Helsinki',
3074
-  'Europe/Paris' => 'Europe/Paris',
3075
-  'Europe/Berlin' => 'Europe/Berlin',
3076
-  'Europe/Gibraltar' => 'Europe/Gibraltar',
3077
-  'Europe/Athens' => 'Europe/Athens',
3078
-  'Europe/Budapest' => 'Europe/Budapest',
3079
-  'Atlantic/Reykjavik' => 'Atlantic/Reykjavik',
3080
-  'Europe/Rome' => 'Europe/Rome',
3081
-  'Europe/Riga' => 'Europe/Riga',
3082
-  'Europe/Vaduz' => 'Europe/Vaduz',
3083
-  'Europe/Vilnius' => 'Europe/Vilnius',
3084
-  'Europe/Luxembourg' => 'Europe/Luxembourg',
3085
-  'Europe/Malta' => 'Europe/Malta',
3086
-  'Europe/Chisinau' => 'Europe/Chisinau',
3087
-  'Europe/Monaco' => 'Europe/Monaco',
3088
-  'Europe/Amsterdam' => 'Europe/Amsterdam',
3089
-  'Europe/Oslo' => 'Europe/Oslo',
3090
-  'Europe/Warsaw' => 'Europe/Warsaw',
3091
-  'Europe/Lisbon' => 'Europe/Lisbon',
3092
-  'Atlantic/Azores' => 'Atlantic/Azores',
3093
-  'Atlantic/Madeira' => 'Atlantic/Madeira',
3094
-  'Europe/Bucharest' => 'Europe/Bucharest',
3095
-  'Europe/Kaliningrad' => 'Europe/Kaliningrad',
3096
-  'Europe/Moscow' => 'Europe/Moscow',
3097
-  'Europe/Samara' => 'Europe/Samara',
3098
-  'Asia/Yekaterinburg' => 'Asia/Yekaterinburg',
3099
-  'Asia/Omsk' => 'Asia/Omsk',
3100
-  'Asia/Novosibirsk' => 'Asia/Novosibirsk',
3101
-  'Asia/Krasnoyarsk' => 'Asia/Krasnoyarsk',
3102
-  'Asia/Irkutsk' => 'Asia/Irkutsk',
3103
-  'Asia/Yakutsk' => 'Asia/Yakutsk',
3104
-  'Asia/Vladivostok' => 'Asia/Vladivostok',
3105
-  'Asia/Sakhalin' => 'Asia/Sakhalin',
3106
-  'Asia/Magadan' => 'Asia/Magadan',
3107
-  'Asia/Kamchatka' => 'Asia/Kamchatka',
3108
-  'Asia/Anadyr' => 'Asia/Anadyr',
3109
-  'Europe/Belgrade' => 'Europe/Belgrade' ,
3110
-  'Europe/Madrid' =>'Europe/Madrid' ,
3111
-  'Africa/Ceuta' => 'Africa/Ceuta',
3112
-  'Atlantic/Canary' => 'Atlantic/Canary',
3113
-  'Europe/Stockholm' => 'Europe/Stockholm',
3114
-  'Europe/Zurich' => 'Europe/Zurich' ,
3115
-  'Europe/Istanbul' => 'Europe/Istanbul',
3116
-  'Europe/Kiev' => 'Europe/Kiev',
3117
-  'Europe/Uzhgorod' => 'Europe/Uzhgorod',
3118
-  'Europe/Zaporozhye' => 'Europe/Zaporozhye',
3119
-  'Europe/Simferopol' => 'Europe/Simferopol',
3120
-  'America/New_York' => 'America/New York',
3121
-  'America/Chicago' =>'America/Chicago' ,
3122
-  'America/North_Dakota/Center' => 'America/North Dakota/Center',
3123
-  'America/Denver' => 'America/Denver',
3124
-  'America/Los_Angeles' => 'America/Los Angeles',
3125
-  'America/Juneau' => 'America/Juneau',
3126
-  'America/Yakutat' => 'America/Yakutat',
3127
-  'America/Anchorage' => 'America/Anchorage',
3128
-  'America/Nome' =>'America/Nome' ,
3129
-  'America/Adak' => 'America/Adak',
3130
-  'Pacific/Honolulu' => 'Pacific/Honolulu',
3131
-  'America/Phoenix' => 'America/Phoenix',
3132
-  'America/Boise' => 'America/Boise',
3133
-  'America/Indiana/Indianapolis' => 'America/Indiana/Indianapolis',
3134
-  'America/Indiana/Marengo' => 'America/Indiana/Marengo',
3135
-  'America/Indiana/Knox' =>  'America/Indiana/Knox',
3136
-  'America/Indiana/Vevay' => 'America/Indiana/Vevay',
3137
-  'America/Kentucky/Louisville' =>'America/Kentucky/Louisville'  ,
3138
-  'America/Kentucky/Monticello' =>  'America/Kentucky/Monticello' ,
3139
-  'America/Detroit' => 'America/Detroit',
3140
-  'America/Menominee' => 'America/Menominee',
3141
-  'America/St_Johns' => 'America/St. Johns',
3142
-  'America/Goose_Bay' => 'America/Goose_Bay' ,
3143
-  'America/Halifax' => 'America/Halifax',
3144
-  'America/Glace_Bay' =>'America/Glace Bay' ,
3145
-  'America/Montreal' => 'America/Montreal',
3146
-  'America/Toronto' => 'America/Toronto',
3147
-  'America/Thunder_Bay' => 'America/Thunder Bay' ,
3148
-  'America/Nipigon' => 'America/Nipigon',
3149
-  'America/Rainy_River' => 'America/Rainy River',
3150
-  'America/Winnipeg' => 'America/Winnipeg',
3151
-  'America/Regina' => 'America/Regina',
3152
-  'America/Swift_Current' => 'America/Swift Current',
3153
-  'America/Edmonton' =>  'America/Edmonton',
3154
-  'America/Vancouver' => 'America/Vancouver',
3155
-  'America/Dawson_Creek' => 'America/Dawson Creek',
3156
-  'America/Pangnirtung' => 'America/Pangnirtung'  ,
3157
-  'America/Iqaluit' => 'America/Iqaluit' ,
3158
-  'America/Coral_Harbour' => 'America/Coral Harbour' ,
3159
-  'America/Rankin_Inlet' => 'America/Rankin Inlet',
3160
-  'America/Cambridge_Bay' => 'America/Cambridge Bay',
3161
-  'America/Yellowknife' => 'America/Yellowknife',
3162
-  'America/Inuvik' =>'America/Inuvik' ,
3163
-  'America/Whitehorse' => 'America/Whitehorse' ,
3164
-  'America/Dawson' => 'America/Dawson',
3165
-  'America/Cancun' => 'America/Cancun',
3166
-  'America/Merida' => 'America/Merida',
3167
-  'America/Monterrey' => 'America/Monterrey',
3168
-  'America/Mexico_City' => 'America/Mexico City',
3169
-  'America/Chihuahua' => 'America/Chihuahua',
3170
-  'America/Hermosillo' => 'America/Hermosillo',
3171
-  'America/Mazatlan' => 'America/Mazatlan',
3172
-  'America/Tijuana' => 'America/Tijuana',
3173
-  'America/Anguilla' => 'America/Anguilla',
3174
-  'America/Antigua' => 'America/Antigua',
3175
-  'America/Nassau' =>'America/Nassau' ,
3176
-  'America/Barbados' => 'America/Barbados',
3177
-  'America/Belize' => 'America/Belize',
3178
-  'Atlantic/Bermuda' => 'Atlantic/Bermuda',
3179
-  'America/Cayman' => 'America/Cayman',
3180
-  'America/Costa_Rica' => 'America/Costa Rica',
3181
-  'America/Havana' => 'America/Havana',
3182
-  'America/Dominica' => 'America/Dominica',
3183
-  'America/Santo_Domingo' => 'America/Santo Domingo',
3184
-  'America/El_Salvador' => 'America/El Salvador',
3185
-  'America/Grenada' => 'America/Grenada',
3186
-  'America/Guadeloupe' => 'America/Guadeloupe',
3187
-  'America/Guatemala' => 'America/Guatemala',
3188
-  'America/Port-au-Prince' => 'America/Port-au-Prince',
3189
-  'America/Tegucigalpa' => 'America/Tegucigalpa',
3190
-  'America/Jamaica' => 'America/Jamaica',
3191
-  'America/Martinique' => 'America/Martinique',
3192
-  'America/Montserrat' => 'America/Montserrat',
3193
-  'America/Managua' => 'America/Managua',
3194
-  'America/Panama' => 'America/Panama',
3195
-  'America/Puerto_Rico' =>'America/Puerto_Rico' ,
3196
-  'America/St_Kitts' => 'America/St_Kitts',
3197
-  'America/St_Lucia' => 'America/St_Lucia',
3198
-  'America/Miquelon' => 'America/Miquelon',
3199
-  'America/St_Vincent' => 'America/St. Vincent',
3200
-  'America/Grand_Turk' => 'America/Grand Turk',
3201
-  'America/Tortola' => 'America/Tortola',
3202
-  'America/St_Thomas' => 'America/St. Thomas',
3203
-  'America/Argentina/Buenos_Aires' => 'America/Argentina/Buenos Aires',
3204
-  'America/Argentina/Cordoba' => 'America/Argentina/Cordoba',
3205
-  'America/Argentina/Tucuman' => 'America/Argentina/Tucuman',
3206
-  'America/Argentina/La_Rioja' => 'America/Argentina/La_Rioja',
3207
-  'America/Argentina/San_Juan' => 'America/Argentina/San_Juan',
3208
-  'America/Argentina/Jujuy' => 'America/Argentina/Jujuy',
3209
-  'America/Argentina/Catamarca' => 'America/Argentina/Catamarca',
3210
-  'America/Argentina/Mendoza' => 'America/Argentina/Mendoza',
3211
-  'America/Argentina/Rio_Gallegos' => 'America/Argentina/Rio Gallegos',
3212
-  'America/Argentina/Ushuaia' =>  'America/Argentina/Ushuaia',
3213
-  'America/Aruba' => 'America/Aruba',
3214
-  'America/La_Paz' => 'America/La Paz',
3215
-  'America/Noronha' => 'America/Noronha',
3216
-  'America/Belem' => 'America/Belem',
3217
-  'America/Fortaleza' => 'America/Fortaleza',
3218
-  'America/Recife' => 'America/Recife',
3219
-  'America/Araguaina' => 'America/Araguaina',
3220
-  'America/Maceio' => 'America/Maceio',
3221
-  'America/Bahia' => 'America/Bahia',
3222
-  'America/Sao_Paulo' => 'America/Sao Paulo',
3223
-  'America/Campo_Grande' => 'America/Campo Grande',
3224
-  'America/Cuiaba' => 'America/Cuiaba',
3225
-  'America/Porto_Velho' => 'America/Porto_Velho',
3226
-  'America/Boa_Vista' => 'America/Boa Vista',
3227
-  'America/Manaus' => 'America/Manaus',
3228
-  'America/Eirunepe' => 'America/Eirunepe',
3229
-  'America/Rio_Branco' => 'America/Rio Branco',
3230
-  'America/Santiago' => 'America/Santiago',
3231
-  'Pacific/Easter' => 'Pacific/Easter' ,
3232
-  'America/Bogota' => 'America/Bogota',
3233
-  'America/Curacao' => 'America/Curacao',
3234
-  'America/Guayaquil' => 'America/Guayaquil',
3235
-  'Pacific/Galapagos' => 'Pacific/Galapagos' ,
3236
-  'Atlantic/Stanley' => 'Atlantic/Stanley',
3237
-  'America/Cayenne' => 'America/Cayenne',
3238
-  'America/Guyana' => 'America/Guyana',
3239
-  'America/Asuncion' => 'America/Asuncion',
3240
-  'America/Lima' => 'America/Lima',
3241
-  'Atlantic/South_Georgia' => 'Atlantic/South Georgia',
3242
-  'America/Paramaribo' => 'America/Paramaribo',
3243
-  'America/Port_of_Spain' => 'America/Port-of-Spain',
3244
-  'America/Montevideo' => 'America/Montevideo',
3245
-  'America/Caracas' => 'America/Caracas',
3246
-  );
3247
-
3248
-  $app_list_strings['moduleList']['Sugar_Favorites'] = 'Favorites';
3249
-  $app_list_strings['eapm_list']= array(
2867
+    );
2868
+
2869
+    $app_list_strings['timezone_dom'] = array(
2870
+
2871
+    'Africa/Algiers' => 'Africa/Algiers',
2872
+    'Africa/Luanda' => 'Africa/Luanda',
2873
+    'Africa/Porto-Novo' => 'Africa/Porto-Novo',
2874
+    'Africa/Gaborone' => 'Africa/Gaborone',
2875
+    'Africa/Ouagadougou' => 'Africa/Ouagadougou',
2876
+    'Africa/Bujumbura' => 'Africa/Bujumbura',
2877
+    'Africa/Douala' => 'Africa/Douala',
2878
+    'Atlantic/Cape_Verde' => 'Atlantic/Cape Verde',
2879
+    'Africa/Bangui' => 'Africa/Bangui',
2880
+    'Africa/Ndjamena' => 'Africa/Ndjamena',
2881
+    'Indian/Comoro' => 'Indian/Comoro',
2882
+    'Africa/Kinshasa' => 'Africa/Kinshasa',
2883
+    'Africa/Lubumbashi' => 'Africa/Lubumbashi',
2884
+    'Africa/Brazzaville' => 'Africa/Brazzaville',
2885
+    'Africa/Abidjan' => 'Africa/Abidjan',
2886
+    'Africa/Djibouti' => 'Africa/Djibouti',
2887
+    'Africa/Cairo' => 'Africa/Cairo',
2888
+    'Africa/Malabo' => 'Africa/Malabo',
2889
+    'Africa/Asmera' => 'Africa/Asmera',
2890
+    'Africa/Addis_Ababa' => 'Africa/Addis Ababa',
2891
+    'Africa/Libreville' => 'Africa/Libreville',
2892
+    'Africa/Banjul' => 'Africa/Banjul',
2893
+    'Africa/Accra' => 'Africa/Accra',
2894
+    'Africa/Conakry' => 'Africa/Conakry',
2895
+    'Africa/Bissau' => 'Africa/Bissau',
2896
+    'Africa/Nairobi' => 'Africa/Nairobi',
2897
+    'Africa/Maseru' => 'Africa/Maseru',
2898
+    'Africa/Monrovia' => 'Africa/Monrovia',
2899
+    'Africa/Tripoli' => 'Africa/Tripoli',
2900
+    'Indian/Antananarivo' => 'Indian/Antananarivo',
2901
+    'Africa/Blantyre' => 'Africa/Blantyre',
2902
+    'Africa/Bamako' => 'Africa/Bamako',
2903
+    'Africa/Nouakchott' => 'Africa/Nouakchott',
2904
+    'Indian/Mauritius' => 'Indian/Mauritius',
2905
+    'Indian/Mayotte' => 'Indian/Mayotte',
2906
+    'Africa/Casablanca' => 'Africa/Casablanca',
2907
+    'Africa/El_Aaiun' => 'Africa/El Aaiun',
2908
+    'Africa/Maputo' => 'Africa/Maputo',
2909
+    'Africa/Windhoek' => 'Africa/Windhoek',
2910
+    'Africa/Niamey' => 'Africa/Niamey',
2911
+    'Africa/Lagos' => 'Africa/Lagos',
2912
+    'Indian/Reunion' => 'Indian/Reunion',
2913
+    'Africa/Kigali' => 'Africa/Kigali',
2914
+    'Atlantic/St_Helena' => 'Atlantic/St. Helena',
2915
+    'Africa/Sao_Tome' => 'Africa/Sao Tome',
2916
+    'Africa/Dakar' => 'Africa/Dakar',
2917
+    'Indian/Mahe' => 'Indian/Mahe',
2918
+    'Africa/Freetown' => 'Africa/Freetown',
2919
+    'Africa/Mogadishu' => 'Africa/Mogadishu',
2920
+    'Africa/Johannesburg' => 'Africa/Johannesburg',
2921
+    'Africa/Khartoum' => 'Africa/Khartoum',
2922
+    'Africa/Mbabane' => 'Africa/Mbabane',
2923
+    'Africa/Dar_es_Salaam' => 'Africa/Dar es Salaam',
2924
+    'Africa/Lome' => 'Africa/Lome',
2925
+    'Africa/Tunis' => 'Africa/Tunis',
2926
+    'Africa/Kampala' => 'Africa/Kampala',
2927
+    'Africa/Lusaka' => 'Africa/Lusaka',
2928
+    'Africa/Harare' => 'Africa/Harare',
2929
+    'Antarctica/Casey' => 'Antarctica/Casey',
2930
+    'Antarctica/Davis' => 'Antarctica/Davis',
2931
+    'Antarctica/Mawson' => 'Antarctica/Mawson',
2932
+    'Indian/Kerguelen' => 'Indian/Kerguelen',
2933
+    'Antarctica/DumontDUrville' => 'Antarctica/DumontDUrville',
2934
+    'Antarctica/Syowa' => 'Antarctica/Syowa',
2935
+    'Antarctica/Vostok' => 'Antarctica/Vostok',
2936
+    'Antarctica/Rothera' => 'Antarctica/Rothera',
2937
+    'Antarctica/Palmer' => 'Antarctica/Palmer',
2938
+    'Antarctica/McMurdo' => 'Antarctica/McMurdo',
2939
+    'Asia/Kabul' => 'Asia/Kabul',
2940
+    'Asia/Yerevan' => 'Asia/Yerevan',
2941
+    'Asia/Baku' => 'Asia/Baku',
2942
+    'Asia/Bahrain' => 'Asia/Bahrain',
2943
+    'Asia/Dhaka' => 'Asia/Dhaka',
2944
+    'Asia/Thimphu' => 'Asia/Thimphu',
2945
+    'Indian/Chagos' => 'Indian/Chagos',
2946
+    'Asia/Brunei' => 'Asia/Brunei',
2947
+    'Asia/Rangoon' => 'Asia/Rangoon',
2948
+    'Asia/Phnom_Penh' => 'Asia/Phnom Penh',
2949
+    'Asia/Beijing' => 'Asia/Beijing',
2950
+    'Asia/Harbin' => 'Asia/Harbin',
2951
+    'Asia/Shanghai' => 'Asia/Shanghai',
2952
+    'Asia/Chongqing' => 'Asia/Chongqing',
2953
+    'Asia/Urumqi' => 'Asia/Urumqi',
2954
+    'Asia/Kashgar' => 'Asia/Kashgar',
2955
+    'Asia/Hong_Kong' => 'Asia/Hong Kong',
2956
+    'Asia/Taipei' => 'Asia/Taipei',
2957
+    'Asia/Macau' => 'Asia/Macau',
2958
+    'Asia/Nicosia' => 'Asia/Nicosia',
2959
+    'Asia/Tbilisi' => 'Asia/Tbilisi',
2960
+    'Asia/Dili' => 'Asia/Dili',
2961
+    'Asia/Calcutta' => 'Asia/Calcutta',
2962
+    'Asia/Jakarta' => 'Asia/Jakarta',
2963
+    'Asia/Pontianak' => 'Asia/Pontianak',
2964
+    'Asia/Makassar' => 'Asia/Makassar',
2965
+    'Asia/Jayapura' => 'Asia/Jayapura',
2966
+    'Asia/Tehran' => 'Asia/Tehran',
2967
+    'Asia/Baghdad' => 'Asia/Baghdad',
2968
+    'Asia/Jerusalem' => 'Asia/Jerusalem',
2969
+    'Asia/Tokyo' => 'Asia/Tokyo',
2970
+    'Asia/Amman' => 'Asia/Amman',
2971
+    'Asia/Almaty' => 'Asia/Almaty',
2972
+    'Asia/Qyzylorda' => 'Asia/Qyzylorda',
2973
+    'Asia/Aqtobe' => 'Asia/Aqtobe',
2974
+    'Asia/Aqtau' => 'Asia/Aqtau',
2975
+    'Asia/Oral' => 'Asia/Oral',
2976
+    'Asia/Bishkek' => 'Asia/Bishkek',
2977
+    'Asia/Seoul' => 'Asia/Seoul',
2978
+    'Asia/Pyongyang' => 'Asia/Pyongyang',
2979
+    'Asia/Kuwait' => 'Asia/Kuwait',
2980
+    'Asia/Vientiane' => 'Asia/Vientiane',
2981
+    'Asia/Beirut' => 'Asia/Beirut',
2982
+    'Asia/Kuala_Lumpur' => 'Asia/Kuala Lumpur',
2983
+    'Asia/Kuching' => 'Asia/Kuching',
2984
+    'Indian/Maldives' => 'Indian/Maldives',
2985
+    'Asia/Hovd' => 'Asia/Hovd',
2986
+    'Asia/Ulaanbaatar' => 'Asia/Ulaanbaatar',
2987
+    'Asia/Choibalsan' => 'Asia/Choibalsan',
2988
+    'Asia/Katmandu' => 'Asia/Katmandu',
2989
+    'Asia/Muscat' => 'Asia/Muscat',
2990
+    'Asia/Karachi' => 'Asia/Karachi',
2991
+    'Asia/Gaza' => 'Asia/Gaza',
2992
+    'Asia/Manila' => 'Asia/Manila',
2993
+    'Asia/Qatar' => 'Asia/Qatar',
2994
+    'Asia/Riyadh' => 'Asia/Riyadh',
2995
+    'Asia/Singapore' => 'Asia/Singapore',
2996
+    'Asia/Colombo' => 'Asia/Colombo',
2997
+    'Asia/Damascus' => 'Asia/Damascus',
2998
+    'Asia/Dushanbe' => 'Asia/Dushanbe',
2999
+    'Asia/Bangkok' => 'Asia/Bangkok',
3000
+    'Asia/Ashgabat' => 'Asia/Ashgabat',
3001
+    'Asia/Dubai' => 'Asia/Dubai',
3002
+    'Asia/Samarkand' => 'Asia/Samarkand',
3003
+    'Asia/Tashkent' => 'Asia/Tashkent',
3004
+    'Asia/Saigon' => 'Asia/Saigon',
3005
+    'Asia/Aden' => 'Asia/Aden',
3006
+    'Australia/Darwin' => 'Australia/Darwin',
3007
+    'Australia/Perth' => 'Australia/Perth',
3008
+    'Australia/Brisbane' => 'Australia/Brisbane',
3009
+    'Australia/Lindeman' => 'Australia/Lindeman',
3010
+    'Australia/Adelaide' => 'Australia/Adelaide',
3011
+    'Australia/Hobart' => 'Australia/Hobart',
3012
+    'Australia/Currie' => 'Australia/Currie',
3013
+    'Australia/Melbourne' => 'Australia/Melbourne',
3014
+    'Australia/Sydney' => 'Australia/Sydney',
3015
+    'Australia/Broken_Hill' => 'Australia/Broken Hill',
3016
+    'Indian/Christmas' => 'Indian/Christmas',
3017
+    'Pacific/Rarotonga' => 'Pacific/Rarotonga',
3018
+    'Indian/Cocos' => 'Indian/Cocos',
3019
+    'Pacific/Fiji' => 'Pacific/Fiji',
3020
+    'Pacific/Gambier' => 'Pacific/Gambier',
3021
+    'Pacific/Marquesas' => 'Pacific/Marquesas',
3022
+    'Pacific/Tahiti' => 'Pacific/Tahiti',
3023
+    'Pacific/Guam' => 'Pacific/Guam',
3024
+    'Pacific/Tarawa' => 'Pacific/Tarawa',
3025
+    'Pacific/Enderbury' => 'Pacific/Enderbury',
3026
+    'Pacific/Kiritimati' => 'Pacific/Kiritimati',
3027
+    'Pacific/Saipan' => 'Pacific/Saipan',
3028
+    'Pacific/Majuro' => 'Pacific/Majuro',
3029
+    'Pacific/Kwajalein' => 'Pacific/Kwajalein',
3030
+    'Pacific/Truk' => 'Pacific/Truk',
3031
+    'Pacific/Pohnpei' => 'Pacific/Pohnpei',
3032
+    'Pacific/Kosrae' => 'Pacific/Kosrae',
3033
+    'Pacific/Nauru' => 'Pacific/Nauru',
3034
+    'Pacific/Noumea' => 'Pacific/Noumea',
3035
+    'Pacific/Auckland' => 'Pacific/Auckland',
3036
+    'Pacific/Chatham' => 'Pacific/Chatham',
3037
+    'Pacific/Niue' => 'Pacific/Niue',
3038
+    'Pacific/Norfolk' => 'Pacific/Norfolk',
3039
+    'Pacific/Palau' => 'Pacific/Palau',
3040
+    'Pacific/Port_Moresby' => 'Pacific/Port Moresby',
3041
+    'Pacific/Pitcairn' => 'Pacific/Pitcairn',
3042
+    'Pacific/Pago_Pago' => 'Pacific/Pago Pago',
3043
+    'Pacific/Apia' => 'Pacific/Apia',
3044
+    'Pacific/Guadalcanal' => 'Pacific/Guadalcanal',
3045
+    'Pacific/Fakaofo' => 'Pacific/Fakaofo',
3046
+    'Pacific/Tongatapu' => 'Pacific/Tongatapu',
3047
+    'Pacific/Funafuti' => 'Pacific/Funafuti',
3048
+    'Pacific/Johnston' => 'Pacific/Johnston',
3049
+    'Pacific/Midway' => 'Pacific/Midway',
3050
+    'Pacific/Wake' => 'Pacific/Wake',
3051
+    'Pacific/Efate' => 'Pacific/Efate',
3052
+    'Pacific/Wallis' => 'Pacific/Wallis',
3053
+    'Europe/London' => 'Europe/London',
3054
+    'Europe/Dublin' => 'Europe/Dublin',
3055
+    'WET' => 'WET',
3056
+    'CET' => 'CET',
3057
+    'MET' => 'MET',
3058
+    'EET' => 'EET',
3059
+    'Europe/Tirane' => 'Europe/Tirane',
3060
+    'Europe/Andorra' => 'Europe/Andorra',
3061
+    'Europe/Vienna' => 'Europe/Vienna',
3062
+    'Europe/Minsk' => 'Europe/Minsk',
3063
+    'Europe/Brussels' => 'Europe/Brussels',
3064
+    'Europe/Sofia' => 'Europe/Sofia',
3065
+    'Europe/Prague' => 'Europe/Prague',
3066
+    'Europe/Copenhagen' => 'Europe/Copenhagen',
3067
+    'Atlantic/Faeroe' => 'Atlantic/Faeroe',
3068
+    'America/Danmarkshavn' => 'America/Danmarkshavn',
3069
+    'America/Scoresbysund' => 'America/Scoresbysund',
3070
+    'America/Godthab' => 'America/Godthab',
3071
+    'America/Thule' => 'America/Thule',
3072
+    'Europe/Tallinn' => 'Europe/Tallinn',
3073
+    'Europe/Helsinki' => 'Europe/Helsinki',
3074
+    'Europe/Paris' => 'Europe/Paris',
3075
+    'Europe/Berlin' => 'Europe/Berlin',
3076
+    'Europe/Gibraltar' => 'Europe/Gibraltar',
3077
+    'Europe/Athens' => 'Europe/Athens',
3078
+    'Europe/Budapest' => 'Europe/Budapest',
3079
+    'Atlantic/Reykjavik' => 'Atlantic/Reykjavik',
3080
+    'Europe/Rome' => 'Europe/Rome',
3081
+    'Europe/Riga' => 'Europe/Riga',
3082
+    'Europe/Vaduz' => 'Europe/Vaduz',
3083
+    'Europe/Vilnius' => 'Europe/Vilnius',
3084
+    'Europe/Luxembourg' => 'Europe/Luxembourg',
3085
+    'Europe/Malta' => 'Europe/Malta',
3086
+    'Europe/Chisinau' => 'Europe/Chisinau',
3087
+    'Europe/Monaco' => 'Europe/Monaco',
3088
+    'Europe/Amsterdam' => 'Europe/Amsterdam',
3089
+    'Europe/Oslo' => 'Europe/Oslo',
3090
+    'Europe/Warsaw' => 'Europe/Warsaw',
3091
+    'Europe/Lisbon' => 'Europe/Lisbon',
3092
+    'Atlantic/Azores' => 'Atlantic/Azores',
3093
+    'Atlantic/Madeira' => 'Atlantic/Madeira',
3094
+    'Europe/Bucharest' => 'Europe/Bucharest',
3095
+    'Europe/Kaliningrad' => 'Europe/Kaliningrad',
3096
+    'Europe/Moscow' => 'Europe/Moscow',
3097
+    'Europe/Samara' => 'Europe/Samara',
3098
+    'Asia/Yekaterinburg' => 'Asia/Yekaterinburg',
3099
+    'Asia/Omsk' => 'Asia/Omsk',
3100
+    'Asia/Novosibirsk' => 'Asia/Novosibirsk',
3101
+    'Asia/Krasnoyarsk' => 'Asia/Krasnoyarsk',
3102
+    'Asia/Irkutsk' => 'Asia/Irkutsk',
3103
+    'Asia/Yakutsk' => 'Asia/Yakutsk',
3104
+    'Asia/Vladivostok' => 'Asia/Vladivostok',
3105
+    'Asia/Sakhalin' => 'Asia/Sakhalin',
3106
+    'Asia/Magadan' => 'Asia/Magadan',
3107
+    'Asia/Kamchatka' => 'Asia/Kamchatka',
3108
+    'Asia/Anadyr' => 'Asia/Anadyr',
3109
+    'Europe/Belgrade' => 'Europe/Belgrade' ,
3110
+    'Europe/Madrid' =>'Europe/Madrid' ,
3111
+    'Africa/Ceuta' => 'Africa/Ceuta',
3112
+    'Atlantic/Canary' => 'Atlantic/Canary',
3113
+    'Europe/Stockholm' => 'Europe/Stockholm',
3114
+    'Europe/Zurich' => 'Europe/Zurich' ,
3115
+    'Europe/Istanbul' => 'Europe/Istanbul',
3116
+    'Europe/Kiev' => 'Europe/Kiev',
3117
+    'Europe/Uzhgorod' => 'Europe/Uzhgorod',
3118
+    'Europe/Zaporozhye' => 'Europe/Zaporozhye',
3119
+    'Europe/Simferopol' => 'Europe/Simferopol',
3120
+    'America/New_York' => 'America/New York',
3121
+    'America/Chicago' =>'America/Chicago' ,
3122
+    'America/North_Dakota/Center' => 'America/North Dakota/Center',
3123
+    'America/Denver' => 'America/Denver',
3124
+    'America/Los_Angeles' => 'America/Los Angeles',
3125
+    'America/Juneau' => 'America/Juneau',
3126
+    'America/Yakutat' => 'America/Yakutat',
3127
+    'America/Anchorage' => 'America/Anchorage',
3128
+    'America/Nome' =>'America/Nome' ,
3129
+    'America/Adak' => 'America/Adak',
3130
+    'Pacific/Honolulu' => 'Pacific/Honolulu',
3131
+    'America/Phoenix' => 'America/Phoenix',
3132
+    'America/Boise' => 'America/Boise',
3133
+    'America/Indiana/Indianapolis' => 'America/Indiana/Indianapolis',
3134
+    'America/Indiana/Marengo' => 'America/Indiana/Marengo',
3135
+    'America/Indiana/Knox' =>  'America/Indiana/Knox',
3136
+    'America/Indiana/Vevay' => 'America/Indiana/Vevay',
3137
+    'America/Kentucky/Louisville' =>'America/Kentucky/Louisville'  ,
3138
+    'America/Kentucky/Monticello' =>  'America/Kentucky/Monticello' ,
3139
+    'America/Detroit' => 'America/Detroit',
3140
+    'America/Menominee' => 'America/Menominee',
3141
+    'America/St_Johns' => 'America/St. Johns',
3142
+    'America/Goose_Bay' => 'America/Goose_Bay' ,
3143
+    'America/Halifax' => 'America/Halifax',
3144
+    'America/Glace_Bay' =>'America/Glace Bay' ,
3145
+    'America/Montreal' => 'America/Montreal',
3146
+    'America/Toronto' => 'America/Toronto',
3147
+    'America/Thunder_Bay' => 'America/Thunder Bay' ,
3148
+    'America/Nipigon' => 'America/Nipigon',
3149
+    'America/Rainy_River' => 'America/Rainy River',
3150
+    'America/Winnipeg' => 'America/Winnipeg',
3151
+    'America/Regina' => 'America/Regina',
3152
+    'America/Swift_Current' => 'America/Swift Current',
3153
+    'America/Edmonton' =>  'America/Edmonton',
3154
+    'America/Vancouver' => 'America/Vancouver',
3155
+    'America/Dawson_Creek' => 'America/Dawson Creek',
3156
+    'America/Pangnirtung' => 'America/Pangnirtung'  ,
3157
+    'America/Iqaluit' => 'America/Iqaluit' ,
3158
+    'America/Coral_Harbour' => 'America/Coral Harbour' ,
3159
+    'America/Rankin_Inlet' => 'America/Rankin Inlet',
3160
+    'America/Cambridge_Bay' => 'America/Cambridge Bay',
3161
+    'America/Yellowknife' => 'America/Yellowknife',
3162
+    'America/Inuvik' =>'America/Inuvik' ,
3163
+    'America/Whitehorse' => 'America/Whitehorse' ,
3164
+    'America/Dawson' => 'America/Dawson',
3165
+    'America/Cancun' => 'America/Cancun',
3166
+    'America/Merida' => 'America/Merida',
3167
+    'America/Monterrey' => 'America/Monterrey',
3168
+    'America/Mexico_City' => 'America/Mexico City',
3169
+    'America/Chihuahua' => 'America/Chihuahua',
3170
+    'America/Hermosillo' => 'America/Hermosillo',
3171
+    'America/Mazatlan' => 'America/Mazatlan',
3172
+    'America/Tijuana' => 'America/Tijuana',
3173
+    'America/Anguilla' => 'America/Anguilla',
3174
+    'America/Antigua' => 'America/Antigua',
3175
+    'America/Nassau' =>'America/Nassau' ,
3176
+    'America/Barbados' => 'America/Barbados',
3177
+    'America/Belize' => 'America/Belize',
3178
+    'Atlantic/Bermuda' => 'Atlantic/Bermuda',
3179
+    'America/Cayman' => 'America/Cayman',
3180
+    'America/Costa_Rica' => 'America/Costa Rica',
3181
+    'America/Havana' => 'America/Havana',
3182
+    'America/Dominica' => 'America/Dominica',
3183
+    'America/Santo_Domingo' => 'America/Santo Domingo',
3184
+    'America/El_Salvador' => 'America/El Salvador',
3185
+    'America/Grenada' => 'America/Grenada',
3186
+    'America/Guadeloupe' => 'America/Guadeloupe',
3187
+    'America/Guatemala' => 'America/Guatemala',
3188
+    'America/Port-au-Prince' => 'America/Port-au-Prince',
3189
+    'America/Tegucigalpa' => 'America/Tegucigalpa',
3190
+    'America/Jamaica' => 'America/Jamaica',
3191
+    'America/Martinique' => 'America/Martinique',
3192
+    'America/Montserrat' => 'America/Montserrat',
3193
+    'America/Managua' => 'America/Managua',
3194
+    'America/Panama' => 'America/Panama',
3195
+    'America/Puerto_Rico' =>'America/Puerto_Rico' ,
3196
+    'America/St_Kitts' => 'America/St_Kitts',
3197
+    'America/St_Lucia' => 'America/St_Lucia',
3198
+    'America/Miquelon' => 'America/Miquelon',
3199
+    'America/St_Vincent' => 'America/St. Vincent',
3200
+    'America/Grand_Turk' => 'America/Grand Turk',
3201
+    'America/Tortola' => 'America/Tortola',
3202
+    'America/St_Thomas' => 'America/St. Thomas',
3203
+    'America/Argentina/Buenos_Aires' => 'America/Argentina/Buenos Aires',
3204
+    'America/Argentina/Cordoba' => 'America/Argentina/Cordoba',
3205
+    'America/Argentina/Tucuman' => 'America/Argentina/Tucuman',
3206
+    'America/Argentina/La_Rioja' => 'America/Argentina/La_Rioja',
3207
+    'America/Argentina/San_Juan' => 'America/Argentina/San_Juan',
3208
+    'America/Argentina/Jujuy' => 'America/Argentina/Jujuy',
3209
+    'America/Argentina/Catamarca' => 'America/Argentina/Catamarca',
3210
+    'America/Argentina/Mendoza' => 'America/Argentina/Mendoza',
3211
+    'America/Argentina/Rio_Gallegos' => 'America/Argentina/Rio Gallegos',
3212
+    'America/Argentina/Ushuaia' =>  'America/Argentina/Ushuaia',
3213
+    'America/Aruba' => 'America/Aruba',
3214
+    'America/La_Paz' => 'America/La Paz',
3215
+    'America/Noronha' => 'America/Noronha',
3216
+    'America/Belem' => 'America/Belem',
3217
+    'America/Fortaleza' => 'America/Fortaleza',
3218
+    'America/Recife' => 'America/Recife',
3219
+    'America/Araguaina' => 'America/Araguaina',
3220
+    'America/Maceio' => 'America/Maceio',
3221
+    'America/Bahia' => 'America/Bahia',
3222
+    'America/Sao_Paulo' => 'America/Sao Paulo',
3223
+    'America/Campo_Grande' => 'America/Campo Grande',
3224
+    'America/Cuiaba' => 'America/Cuiaba',
3225
+    'America/Porto_Velho' => 'America/Porto_Velho',
3226
+    'America/Boa_Vista' => 'America/Boa Vista',
3227
+    'America/Manaus' => 'America/Manaus',
3228
+    'America/Eirunepe' => 'America/Eirunepe',
3229
+    'America/Rio_Branco' => 'America/Rio Branco',
3230
+    'America/Santiago' => 'America/Santiago',
3231
+    'Pacific/Easter' => 'Pacific/Easter' ,
3232
+    'America/Bogota' => 'America/Bogota',
3233
+    'America/Curacao' => 'America/Curacao',
3234
+    'America/Guayaquil' => 'America/Guayaquil',
3235
+    'Pacific/Galapagos' => 'Pacific/Galapagos' ,
3236
+    'Atlantic/Stanley' => 'Atlantic/Stanley',
3237
+    'America/Cayenne' => 'America/Cayenne',
3238
+    'America/Guyana' => 'America/Guyana',
3239
+    'America/Asuncion' => 'America/Asuncion',
3240
+    'America/Lima' => 'America/Lima',
3241
+    'Atlantic/South_Georgia' => 'Atlantic/South Georgia',
3242
+    'America/Paramaribo' => 'America/Paramaribo',
3243
+    'America/Port_of_Spain' => 'America/Port-of-Spain',
3244
+    'America/Montevideo' => 'America/Montevideo',
3245
+    'America/Caracas' => 'America/Caracas',
3246
+    );
3247
+
3248
+    $app_list_strings['moduleList']['Sugar_Favorites'] = 'Favorites';
3249
+    $app_list_strings['eapm_list']= array(
3250 3250
     'Sugar'=>'SuiteCRM',
3251 3251
     'WebEx'=>'WebEx',
3252 3252
     'GoToMeeting'=>'GoToMeeting',
@@ -3255,14 +3255,14 @@  discard block
 block discarded – undo
3255 3255
     'Box' => 'Box.net',
3256 3256
     'Facebook'=>'Facebook',
3257 3257
     'Twitter'=>'Twitter',
3258
-  );
3259
-  $app_list_strings['eapm_list_import']= array(
3260
-  	'Google' => 'Google Contacts',
3261
-  );
3258
+    );
3259
+    $app_list_strings['eapm_list_import']= array(
3260
+        'Google' => 'Google Contacts',
3261
+    );
3262 3262
 $app_list_strings['eapm_list_documents']= array(
3263
-  	'Google' => 'Google Docs',
3264
-  );
3265
-	$app_list_strings['token_status'] = array(
3263
+        'Google' => 'Google Docs',
3264
+    );
3265
+    $app_list_strings['token_status'] = array(
3266 3266
         1 => 'Request',
3267 3267
         2 => 'Access',
3268 3268
         3 => 'Invalid',
@@ -3272,25 +3272,25 @@  discard block
 block discarded – undo
3272 3272
     '' => '' ,
3273 3273
     'campaign' => 'Campaign' ,
3274 3274
     'email' => 'Email',
3275
-  );
3275
+    );
3276 3276
 
3277 3277
 $app_list_strings ['emailTemplates_type_list_campaigns'] = array (
3278 3278
     '' => '' ,
3279 3279
     'campaign' => 'Campaign' ,
3280
-  );
3280
+    );
3281 3281
 
3282 3282
 $app_list_strings ['emailTemplates_type_list_no_workflow'] = array (
3283 3283
     '' => '' ,
3284 3284
     'campaign' => 'Campaign' ,
3285 3285
     'email' => 'Email',
3286
-  );
3286
+    );
3287 3287
 $app_strings ['documentation'] = array (
3288 3288
     'LBL_DOCS' => 'Documentation',
3289 3289
     'ULT' => '02_Sugar_Ultimate',
3290
-	'ENT' => '02_Sugar_Enterprise',
3291
-	'CORP' => '03_Sugar_Corporate',
3292
-	'PRO' => '04_Sugar_Professional',
3293
-	'COM' => '05_Sugar_Community_Edition'
3290
+    'ENT' => '02_Sugar_Enterprise',
3291
+    'CORP' => '03_Sugar_Corporate',
3292
+    'PRO' => '04_Sugar_Professional',
3293
+    'COM' => '05_Sugar_Community_Edition'
3294 3294
 );
3295 3295
 
3296 3296
 
Please login to merge, or discard this patch.
include/database/DBManager.php 1 patch
Indentation   +3266 added lines, -3266 removed lines patch added patch discarded remove patch
@@ -97,389 +97,389 @@  discard block
 block discarded – undo
97 97
  */
98 98
 abstract class DBManager
99 99
 {
100
-	/**
101
-	 * Name of database
102
-	 * @var resource
103
-	 */
104
-	public $database = null;
105
-
106
-	/**
107
-	 * Indicates whether we should die when we get an error from the DB
108
-	 */
109
-	protected $dieOnError = false;
110
-
111
-	/**
112
-	 * Indicates whether we should html encode the results from a query by default
113
-	 */
114
-	protected $encode = true;
115
-
116
-	/**
117
-	 * Records the execution time of the last query
118
-	 */
119
-	protected $query_time = 0;
120
-
121
-	/**
122
-	 * Last error message from the DB backend
123
-	 */
124
-	protected $last_error = false;
125
-
126
-	/**
127
-	 * Registry of available result sets
128
-	 */
129
-	protected $lastResult;
130
-
131
-	/**
132
-	 * Current query count
133
-	 */
134
-	private static $queryCount = 0;
135
-
136
-	/**
137
-	 * Query threshold limit
138
-	 */
139
-	private static $queryLimit = 0;
140
-
141
-	/**
142
-	 * Array of prepared statements and their correspoding parsed tokens
143
-	 */
144
-	protected $preparedTokens = array();
145
-
146
-	/**
147
-	 * TimeDate instance
148
-	 * @var TimeDate
149
-	 */
150
-	protected $timedate;
151
-
152
-	/**
153
-	 * PHP Logger
154
-	 * @var Logger
155
-	 */
156
-	protected $log;
157
-
158
-	/**
159
-	 * Table descriptions
160
-	 * @var array
161
-	 */
162
-	protected static $table_descriptions = array();
163
-
164
-	/**
165
-	 * Index descriptions
166
-	 * @var array
167
-	 */
168
-	protected static $index_descriptions = array();
169
-
170
-	/**
171
-	 * Maximum length of identifiers
172
-	 * @abstract
173
-	 * @var array
174
-	 */
175
-	protected $maxNameLengths = array(
176
-		'table' => 64,
177
-		'column' => 64,
178
-		'index' => 64,
179
-		'alias' => 64
180
-	);
181
-
182
-	/**
183
-	 * DB driver priority
184
-	 * Higher priority drivers override lower priority ones
185
-	 * @var int
186
-	 */
187
-	public $priority = 0;
188
-
189
-	/**
190
-	 * Driver name label, for install
191
-	 * @absrtact
192
-	 * @var string
193
-	 */
194
-	public $label = '';
195
-
196
-	/**
197
-	 * Type names map
198
-	 * @abstract
199
-	 * @var array
200
-	 */
201
-	protected $type_map = array();
202
-
203
-	/**
204
-	 * Type classification into:
205
-	 * - int
206
-	 * - bool
207
-	 * - float
208
-	 * - date
209
-	 * @abstract
210
-	 * @var array
211
-	 */
212
-	protected $type_class = array(
213
-			'int'      => 'int',
214
-			'double'   => 'float',
215
-			'float'    => 'float',
216
-			'uint'     => 'int',
217
-			'ulong'    => 'bigint',
218
-			'long'     => 'bigint',
219
-			'short'    => 'int',
220
-			'date'     => 'date',
221
-			'datetime' => 'date',
222
-			'datetimecombo' => 'date',
223
-			'time'     => 'time',
224
-			'bool'     => 'bool',
225
-			'tinyint'  => 'int',
226
-			'currency' => 'float',
227
-			'decimal'  => 'float',
228
-			'decimal2' => 'float',
229
-	);
230
-
231
-	/**
232
-	 * Capabilities this DB supports. Supported list:
233
-	 * affected_rows	Can report query affected rows for UPDATE/DELETE
234
-	 * 					implement getAffectedRowCount()
235
-	 * select_rows		Can report row count for SELECT
236
-	 * 					implement getRowCount()
237
-	 * case_sensitive	Supports case-sensitive text columns
238
-	 * fulltext			Supports fulltext search indexes
239
-	 * inline_keys		Supports defining keys together with the table
240
-	 * auto_increment_sequence Autoincrement support implemented as sequence
241
-	 * limit_subquery   Supports LIMIT clauses in subqueries
242
-	 * create_user		Can create users for Sugar
243
-	 * create_db		Can create databases
244
-	 * collation		Supports setting collations
245
-	 * disable_keys     Supports temporarily disabling keys (for upgrades, etc.)
246
-	 *
247
-	 * @abstract
248
-	 * Special cases:
249
-	 * fix:expandDatabase - needs expandDatabase fix, see expandDatabase.php
250
-	 * TODO: verify if we need these cases
251
-	 */
252
-	protected $capabilities = array();
253
-
254
-	/**
255
-	 * Database options
256
-	 * @var array
257
-	 */
258
-	protected $options = array();
100
+    /**
101
+     * Name of database
102
+     * @var resource
103
+     */
104
+    public $database = null;
105
+
106
+    /**
107
+     * Indicates whether we should die when we get an error from the DB
108
+     */
109
+    protected $dieOnError = false;
110
+
111
+    /**
112
+     * Indicates whether we should html encode the results from a query by default
113
+     */
114
+    protected $encode = true;
115
+
116
+    /**
117
+     * Records the execution time of the last query
118
+     */
119
+    protected $query_time = 0;
120
+
121
+    /**
122
+     * Last error message from the DB backend
123
+     */
124
+    protected $last_error = false;
125
+
126
+    /**
127
+     * Registry of available result sets
128
+     */
129
+    protected $lastResult;
130
+
131
+    /**
132
+     * Current query count
133
+     */
134
+    private static $queryCount = 0;
135
+
136
+    /**
137
+     * Query threshold limit
138
+     */
139
+    private static $queryLimit = 0;
140
+
141
+    /**
142
+     * Array of prepared statements and their correspoding parsed tokens
143
+     */
144
+    protected $preparedTokens = array();
145
+
146
+    /**
147
+     * TimeDate instance
148
+     * @var TimeDate
149
+     */
150
+    protected $timedate;
151
+
152
+    /**
153
+     * PHP Logger
154
+     * @var Logger
155
+     */
156
+    protected $log;
157
+
158
+    /**
159
+     * Table descriptions
160
+     * @var array
161
+     */
162
+    protected static $table_descriptions = array();
163
+
164
+    /**
165
+     * Index descriptions
166
+     * @var array
167
+     */
168
+    protected static $index_descriptions = array();
169
+
170
+    /**
171
+     * Maximum length of identifiers
172
+     * @abstract
173
+     * @var array
174
+     */
175
+    protected $maxNameLengths = array(
176
+        'table' => 64,
177
+        'column' => 64,
178
+        'index' => 64,
179
+        'alias' => 64
180
+    );
181
+
182
+    /**
183
+     * DB driver priority
184
+     * Higher priority drivers override lower priority ones
185
+     * @var int
186
+     */
187
+    public $priority = 0;
188
+
189
+    /**
190
+     * Driver name label, for install
191
+     * @absrtact
192
+     * @var string
193
+     */
194
+    public $label = '';
195
+
196
+    /**
197
+     * Type names map
198
+     * @abstract
199
+     * @var array
200
+     */
201
+    protected $type_map = array();
202
+
203
+    /**
204
+     * Type classification into:
205
+     * - int
206
+     * - bool
207
+     * - float
208
+     * - date
209
+     * @abstract
210
+     * @var array
211
+     */
212
+    protected $type_class = array(
213
+            'int'      => 'int',
214
+            'double'   => 'float',
215
+            'float'    => 'float',
216
+            'uint'     => 'int',
217
+            'ulong'    => 'bigint',
218
+            'long'     => 'bigint',
219
+            'short'    => 'int',
220
+            'date'     => 'date',
221
+            'datetime' => 'date',
222
+            'datetimecombo' => 'date',
223
+            'time'     => 'time',
224
+            'bool'     => 'bool',
225
+            'tinyint'  => 'int',
226
+            'currency' => 'float',
227
+            'decimal'  => 'float',
228
+            'decimal2' => 'float',
229
+    );
230
+
231
+    /**
232
+     * Capabilities this DB supports. Supported list:
233
+     * affected_rows	Can report query affected rows for UPDATE/DELETE
234
+     * 					implement getAffectedRowCount()
235
+     * select_rows		Can report row count for SELECT
236
+     * 					implement getRowCount()
237
+     * case_sensitive	Supports case-sensitive text columns
238
+     * fulltext			Supports fulltext search indexes
239
+     * inline_keys		Supports defining keys together with the table
240
+     * auto_increment_sequence Autoincrement support implemented as sequence
241
+     * limit_subquery   Supports LIMIT clauses in subqueries
242
+     * create_user		Can create users for Sugar
243
+     * create_db		Can create databases
244
+     * collation		Supports setting collations
245
+     * disable_keys     Supports temporarily disabling keys (for upgrades, etc.)
246
+     *
247
+     * @abstract
248
+     * Special cases:
249
+     * fix:expandDatabase - needs expandDatabase fix, see expandDatabase.php
250
+     * TODO: verify if we need these cases
251
+     */
252
+    protected $capabilities = array();
253
+
254
+    /**
255
+     * Database options
256
+     * @var array
257
+     */
258
+    protected $options = array();
259 259
 
260 260
     /**
261 261
      * Create DB Driver
262 262
      */
263
-	public function __construct()
264
-	{
265
-		$this->timedate = TimeDate::getInstance();
266
-		$this->log = isset($GLOBALS['log']) ? $GLOBALS['log'] : null;
267
-		$this->helper = $this; // compatibility
268
-	}
263
+    public function __construct()
264
+    {
265
+        $this->timedate = TimeDate::getInstance();
266
+        $this->log = isset($GLOBALS['log']) ? $GLOBALS['log'] : null;
267
+        $this->helper = $this; // compatibility
268
+    }
269 269
 
270 270
     /**
271 271
      * Wrapper for those trying to access the private and protected class members directly
272 272
      * @param string $p var name
273 273
      * @return mixed
274 274
      */
275
-	public function __get($p)
276
-	{
277
-		$this->log->info('Call to DBManager::$'.$p.' is deprecated');
278
-		return $this->$p;
279
-	}
280
-
281
-	/**
282
-	 * Returns the current database handle
283
-	 * @return resource
284
-	 */
285
-	public function getDatabase()
286
-	{
287
-		$this->checkConnection();
288
-		return $this->database;
289
-	}
290
-
291
-	/**
292
-	 * Returns this instance's DBHelper
293
-	 * Actually now returns $this
294
-	 * @deprecated
295
-	 * @return DBManager
296
-	 */
297
-	public function getHelper()
298
-	{
299
-		return $this;
300
-	}
301
-
302
-	/**
303
-	 * Checks for error happening in the database
304
-	 *
305
-	 * @param  string $msg        message to prepend to the error message
306
-	 * @param  bool   $dieOnError true if we want to die immediately on error
307
-	 * @return bool True if there was an error
308
-	 */
309
-	public function checkError($msg = '', $dieOnError = false)
310
-	{
311
-		if (empty($this->database)) {
312
-			$this->registerError($msg, "Database Is Not Connected", $dieOnError);
313
-			return true;
314
-		}
315
-
316
-		$dberror = $this->lastDbError();
317
-		if($dberror === false) {
318
-    		$this->last_error = false;
319
-	    	return false;
320
-		}
321
-		$this->registerError($msg, $dberror, $dieOnError);
275
+    public function __get($p)
276
+    {
277
+        $this->log->info('Call to DBManager::$'.$p.' is deprecated');
278
+        return $this->$p;
279
+    }
280
+
281
+    /**
282
+     * Returns the current database handle
283
+     * @return resource
284
+     */
285
+    public function getDatabase()
286
+    {
287
+        $this->checkConnection();
288
+        return $this->database;
289
+    }
290
+
291
+    /**
292
+     * Returns this instance's DBHelper
293
+     * Actually now returns $this
294
+     * @deprecated
295
+     * @return DBManager
296
+     */
297
+    public function getHelper()
298
+    {
299
+        return $this;
300
+    }
301
+
302
+    /**
303
+     * Checks for error happening in the database
304
+     *
305
+     * @param  string $msg        message to prepend to the error message
306
+     * @param  bool   $dieOnError true if we want to die immediately on error
307
+     * @return bool True if there was an error
308
+     */
309
+    public function checkError($msg = '', $dieOnError = false)
310
+    {
311
+        if (empty($this->database)) {
312
+            $this->registerError($msg, "Database Is Not Connected", $dieOnError);
313
+            return true;
314
+        }
315
+
316
+        $dberror = $this->lastDbError();
317
+        if($dberror === false) {
318
+            $this->last_error = false;
319
+            return false;
320
+        }
321
+        $this->registerError($msg, $dberror, $dieOnError);
322 322
         return true;
323
-	}
324
-
325
-	/**
326
-	 * Register database error
327
-	 * If die-on-error flag is set, logs the message and dies,
328
-	 * otherwise sets last_error to the message
329
-	 * @param string $userMessage Message from function user
330
-	 * @param string $message Message from SQL driver
331
-	 * @param bool $dieOnError
332
-	 */
333
-	protected function registerError($userMessage, $message, $dieOnError = false)
334
-	{
335
-		if(!empty($message)) {
336
-			if(!empty($userMessage)) {
337
-				$message = "$userMessage: $message";
338
-			}
339
-			if(empty($message)) {
340
-			    $message = "Database error";
341
-			}
342
-			$this->log->fatal($message);
343
-			if ($dieOnError || $this->dieOnError) {
344
-				if(isset($GLOBALS['app_strings']['ERR_DB_FAIL'])) {
345
-					sugar_die($GLOBALS['app_strings']['ERR_DB_FAIL']);
346
-				} else {
347
-					sugar_die("Database error. Please check suitecrm.log for details.");
348
-				}
349
-			} else {
350
-				$this->last_error = $message;
351
-			}
352
-		}
353
-	}
354
-
355
-	/**
356
-	 * Return DB error message for the last query executed
357
-	 * @return string Last error message
358
-	 */
359
-	public function lastError()
360
-	{
361
-		return $this->last_error;
362
-	}
363
-
364
-	/**
365
-	 * This method is called by every method that runs a query.
366
-	 * If slow query dumping is turned on and the query time is beyond
367
-	 * the time limit, we will log the query. This function may do
368
-	 * additional reporting or log in a different area in the future.
369
-	 *
370
-	 * @param  string  $query query to log
371
-	 * @return boolean true if the query was logged, false otherwise
372
-	 */
373
-	protected function dump_slow_queries($query)
374
-	{
375
-		global $sugar_config;
376
-
377
-		$do_the_dump = isset($sugar_config['dump_slow_queries'])
378
-			? $sugar_config['dump_slow_queries'] : false;
379
-		$slow_query_time_msec = isset($sugar_config['slow_query_time_msec'])
380
-			? $sugar_config['slow_query_time_msec'] : 5000;
381
-
382
-		if($do_the_dump) {
383
-			if($slow_query_time_msec < ($this->query_time * 1000)) {
384
-				// Then log both the query and the query time
385
-				$this->log->fatal('Slow Query (time:'.$this->query_time."\n".$query);
386
-				return true;
387
-			}
388
-		}
389
-		return false;
390
-	}
323
+    }
324
+
325
+    /**
326
+     * Register database error
327
+     * If die-on-error flag is set, logs the message and dies,
328
+     * otherwise sets last_error to the message
329
+     * @param string $userMessage Message from function user
330
+     * @param string $message Message from SQL driver
331
+     * @param bool $dieOnError
332
+     */
333
+    protected function registerError($userMessage, $message, $dieOnError = false)
334
+    {
335
+        if(!empty($message)) {
336
+            if(!empty($userMessage)) {
337
+                $message = "$userMessage: $message";
338
+            }
339
+            if(empty($message)) {
340
+                $message = "Database error";
341
+            }
342
+            $this->log->fatal($message);
343
+            if ($dieOnError || $this->dieOnError) {
344
+                if(isset($GLOBALS['app_strings']['ERR_DB_FAIL'])) {
345
+                    sugar_die($GLOBALS['app_strings']['ERR_DB_FAIL']);
346
+                } else {
347
+                    sugar_die("Database error. Please check suitecrm.log for details.");
348
+                }
349
+            } else {
350
+                $this->last_error = $message;
351
+            }
352
+        }
353
+    }
354
+
355
+    /**
356
+     * Return DB error message for the last query executed
357
+     * @return string Last error message
358
+     */
359
+    public function lastError()
360
+    {
361
+        return $this->last_error;
362
+    }
363
+
364
+    /**
365
+     * This method is called by every method that runs a query.
366
+     * If slow query dumping is turned on and the query time is beyond
367
+     * the time limit, we will log the query. This function may do
368
+     * additional reporting or log in a different area in the future.
369
+     *
370
+     * @param  string  $query query to log
371
+     * @return boolean true if the query was logged, false otherwise
372
+     */
373
+    protected function dump_slow_queries($query)
374
+    {
375
+        global $sugar_config;
376
+
377
+        $do_the_dump = isset($sugar_config['dump_slow_queries'])
378
+            ? $sugar_config['dump_slow_queries'] : false;
379
+        $slow_query_time_msec = isset($sugar_config['slow_query_time_msec'])
380
+            ? $sugar_config['slow_query_time_msec'] : 5000;
381
+
382
+        if($do_the_dump) {
383
+            if($slow_query_time_msec < ($this->query_time * 1000)) {
384
+                // Then log both the query and the query time
385
+                $this->log->fatal('Slow Query (time:'.$this->query_time."\n".$query);
386
+                return true;
387
+            }
388
+        }
389
+        return false;
390
+    }
391 391
 
392 392
 /**
393
-	* Scans order by to ensure that any field being ordered by is.
394
-	*
395
-	* It will throw a warning error to the log file - fatal if slow query logging is enabled
396
-	*
397
-	* @param  string $sql         query to be run
398
-	* @param  bool   $object_name optional, object to look up indices in
399
-	* @return bool   true if an index is found false otherwise
400
-	*/
393
+ * Scans order by to ensure that any field being ordered by is.
394
+ *
395
+ * It will throw a warning error to the log file - fatal if slow query logging is enabled
396
+ *
397
+ * @param  string $sql         query to be run
398
+ * @param  bool   $object_name optional, object to look up indices in
399
+ * @return bool   true if an index is found false otherwise
400
+ */
401 401
 protected function checkQuery($sql, $object_name = false)
402 402
 {
403
-	$match = array();
404
-	preg_match_all("'.* FROM ([^ ]*).* ORDER BY (.*)'is", $sql, $match);
405
-	$indices = false;
406
-	if (!empty($match[1][0]))
407
-		$table = $match[1][0];
408
-	else
409
-		return false;
410
-
411
-	if (!empty($object_name) && !empty($GLOBALS['dictionary'][$object_name]))
412
-		$indices = $GLOBALS['dictionary'][$object_name]['indices'];
413
-
414
-	if (empty($indices)) {
415
-		foreach ( $GLOBALS['dictionary'] as $current ) {
416
-			if ($current['table'] == $table){
417
-				$indices = $current['indices'];
418
-				break;
419
-			}
420
-		}
421
-	}
422
-	if (empty($indices)) {
423
-		$this->log->warn('CHECK QUERY: Could not find index definitions for table ' . $table);
424
-		return false;
425
-	}
426
-	if (!empty($match[2][0])) {
427
-		$orderBys = explode(' ', $match[2][0]);
428
-		foreach ($orderBys as $orderBy){
429
-			$orderBy = trim($orderBy);
430
-			if (empty($orderBy))
431
-				continue;
432
-			$orderBy = strtolower($orderBy);
433
-			if ($orderBy == 'asc' || $orderBy == 'desc')
434
-				continue;
435
-
436
-			$orderBy = str_replace(array($table . '.', ','), '', $orderBy);
437
-
438
-			foreach ($indices as $index)
439
-				if (empty($index['db']) || $index['db'] == $this->dbType)
440
-					foreach ($index['fields'] as $field)
441
-						if ($field == $orderBy)
442
-							return true;
443
-
444
-			$warning = 'Missing Index For Order By Table: ' . $table . ' Order By:' . $orderBy ;
445
-			if (!empty($GLOBALS['sugar_config']['dump_slow_queries']))
446
-				$this->log->fatal('CHECK QUERY:' .$warning);
447
-			else
448
-				$this->log->warn('CHECK QUERY:' .$warning);
449
-		}
450
-	}
451
-	return false;
452
-	}
453
-
454
-	/**
455
-	 * Returns the time the last query took to execute
456
-	 *
457
-	 * @return int
458
-	 */
459
-	public function getQueryTime()
460
-	{
461
-		return $this->query_time;
462
-	}
463
-
464
-	/**
465
-	 * Checks the current connection; if it is not connected then reconnect
466
-	 */
467
-	public function checkConnection()
468
-	{
469
-		$this->last_error = '';
470
-		if (!isset($this->database))
471
-			$this->connect();
472
-	}
473
-
474
-	/**
475
-	 * Sets the dieOnError value
476
-	 *
477
-	 * @param bool $value
478
-	 */
479
-	public function setDieOnError($value)
480
-	{
481
-		$this->dieOnError = $value;
482
-	}
403
+    $match = array();
404
+    preg_match_all("'.* FROM ([^ ]*).* ORDER BY (.*)'is", $sql, $match);
405
+    $indices = false;
406
+    if (!empty($match[1][0]))
407
+        $table = $match[1][0];
408
+    else
409
+        return false;
410
+
411
+    if (!empty($object_name) && !empty($GLOBALS['dictionary'][$object_name]))
412
+        $indices = $GLOBALS['dictionary'][$object_name]['indices'];
413
+
414
+    if (empty($indices)) {
415
+        foreach ( $GLOBALS['dictionary'] as $current ) {
416
+            if ($current['table'] == $table){
417
+                $indices = $current['indices'];
418
+                break;
419
+            }
420
+        }
421
+    }
422
+    if (empty($indices)) {
423
+        $this->log->warn('CHECK QUERY: Could not find index definitions for table ' . $table);
424
+        return false;
425
+    }
426
+    if (!empty($match[2][0])) {
427
+        $orderBys = explode(' ', $match[2][0]);
428
+        foreach ($orderBys as $orderBy){
429
+            $orderBy = trim($orderBy);
430
+            if (empty($orderBy))
431
+                continue;
432
+            $orderBy = strtolower($orderBy);
433
+            if ($orderBy == 'asc' || $orderBy == 'desc')
434
+                continue;
435
+
436
+            $orderBy = str_replace(array($table . '.', ','), '', $orderBy);
437
+
438
+            foreach ($indices as $index)
439
+                if (empty($index['db']) || $index['db'] == $this->dbType)
440
+                    foreach ($index['fields'] as $field)
441
+                        if ($field == $orderBy)
442
+                            return true;
443
+
444
+            $warning = 'Missing Index For Order By Table: ' . $table . ' Order By:' . $orderBy ;
445
+            if (!empty($GLOBALS['sugar_config']['dump_slow_queries']))
446
+                $this->log->fatal('CHECK QUERY:' .$warning);
447
+            else
448
+                $this->log->warn('CHECK QUERY:' .$warning);
449
+        }
450
+    }
451
+    return false;
452
+    }
453
+
454
+    /**
455
+     * Returns the time the last query took to execute
456
+     *
457
+     * @return int
458
+     */
459
+    public function getQueryTime()
460
+    {
461
+        return $this->query_time;
462
+    }
463
+
464
+    /**
465
+     * Checks the current connection; if it is not connected then reconnect
466
+     */
467
+    public function checkConnection()
468
+    {
469
+        $this->last_error = '';
470
+        if (!isset($this->database))
471
+            $this->connect();
472
+    }
473
+
474
+    /**
475
+     * Sets the dieOnError value
476
+     *
477
+     * @param bool $value
478
+     */
479
+    public function setDieOnError($value)
480
+    {
481
+        $this->dieOnError = $value;
482
+    }
483 483
 
484 484
     /**
485 485
      * Implements a generic insert for any bean.
@@ -488,67 +488,67 @@  discard block
 block discarded – undo
488 488
      * @return bool query result
489 489
      *
490 490
      */
491
-	public function insert(SugarBean $bean)
492
-	{
493
-		$sql = $this->insertSQL($bean);
494
-		$tablename =  $bean->getTableName();
495
-		$msg = "Error inserting into table: $tablename:";
496
-		return $this->query($sql,true,$msg);
497
-	}
498
-
499
-	/**
500
-	 * Insert data into table by parameter definition
501
-	 * @param string $table Table name
502
-	 * @param array $field_defs Definitions in vardef-like format
503
-	 * @param array $data Key/value to insert
504
-	 * @param array $field_map Fields map from SugarBean
505
-	 * @param bool $execute Execute or return query?
491
+    public function insert(SugarBean $bean)
492
+    {
493
+        $sql = $this->insertSQL($bean);
494
+        $tablename =  $bean->getTableName();
495
+        $msg = "Error inserting into table: $tablename:";
496
+        return $this->query($sql,true,$msg);
497
+    }
498
+
499
+    /**
500
+     * Insert data into table by parameter definition
501
+     * @param string $table Table name
502
+     * @param array $field_defs Definitions in vardef-like format
503
+     * @param array $data Key/value to insert
504
+     * @param array $field_map Fields map from SugarBean
505
+     * @param bool $execute Execute or return query?
506 506
      * @return bool query result
507 507
      */
508
-	public function insertParams($table, $field_defs, $data, $field_map = null, $execute = true)
509
-	{
510
-		$values = array();
511
-		foreach ($field_defs as $field => $fieldDef)
512
-		{
513
-			if (isset($fieldDef['source']) && $fieldDef['source'] != 'db')  continue;
514
-			//custom fields handle there save seperatley
515
-			if(!empty($field_map) && !empty($field_map[$field]['custom_type'])) continue;
516
-
517
-			if(isset($data[$field])) {
518
-				// clean the incoming value..
519
-				$val = from_html($data[$field]);
520
-			} else {
521
-				if(isset($fieldDef['default']) && strlen($fieldDef['default']) > 0) {
522
-					$val = $fieldDef['default'];
523
-				} else {
524
-					$val = null;
525
-				}
526
-			}
527
-
528
-			//handle auto increment values here - we may have to do something like nextval for oracle
529
-			if (!empty($fieldDef['auto_increment'])) {
530
-				$auto = $this->getAutoIncrementSQL($table, $fieldDef['name']);
531
-				if(!empty($auto)) {
532
-					$values[$field] = $auto;
533
-				}
534
-			} elseif ($fieldDef['name'] == 'deleted') {
535
-				$values['deleted'] = (int)$val;
536
-			} else {
537
-				// need to do some thing about types of values
538
-				if(!is_null($val) || !empty($fieldDef['required'])) {
539
-					$values[$field] = $this->massageValue($val, $fieldDef);
540
-				}
541
-			}
542
-		}
543
-
544
-		if (empty($values))
545
-			return $execute?true:''; // no columns set
546
-
547
-		// get the entire sql
548
-		$query = "INSERT INTO $table (".implode(",", array_keys($values)).")
508
+    public function insertParams($table, $field_defs, $data, $field_map = null, $execute = true)
509
+    {
510
+        $values = array();
511
+        foreach ($field_defs as $field => $fieldDef)
512
+        {
513
+            if (isset($fieldDef['source']) && $fieldDef['source'] != 'db')  continue;
514
+            //custom fields handle there save seperatley
515
+            if(!empty($field_map) && !empty($field_map[$field]['custom_type'])) continue;
516
+
517
+            if(isset($data[$field])) {
518
+                // clean the incoming value..
519
+                $val = from_html($data[$field]);
520
+            } else {
521
+                if(isset($fieldDef['default']) && strlen($fieldDef['default']) > 0) {
522
+                    $val = $fieldDef['default'];
523
+                } else {
524
+                    $val = null;
525
+                }
526
+            }
527
+
528
+            //handle auto increment values here - we may have to do something like nextval for oracle
529
+            if (!empty($fieldDef['auto_increment'])) {
530
+                $auto = $this->getAutoIncrementSQL($table, $fieldDef['name']);
531
+                if(!empty($auto)) {
532
+                    $values[$field] = $auto;
533
+                }
534
+            } elseif ($fieldDef['name'] == 'deleted') {
535
+                $values['deleted'] = (int)$val;
536
+            } else {
537
+                // need to do some thing about types of values
538
+                if(!is_null($val) || !empty($fieldDef['required'])) {
539
+                    $values[$field] = $this->massageValue($val, $fieldDef);
540
+                }
541
+            }
542
+        }
543
+
544
+        if (empty($values))
545
+            return $execute?true:''; // no columns set
546
+
547
+        // get the entire sql
548
+        $query = "INSERT INTO $table (".implode(",", array_keys($values)).")
549 549
 					VALUES (".implode(",", $values).")";
550
-		return $execute?$this->query($query):$query;
551
-	}
550
+        return $execute?$this->query($query):$query;
551
+    }
552 552
 
553 553
     /**
554 554
      * Implements a generic update for any bean
@@ -560,13 +560,13 @@  discard block
 block discarded – undo
560 560
      * @return bool query result
561 561
      *
562 562
      */
563
-	public function update(SugarBean $bean, array $where = array())
564
-	{
565
-		$sql = $this->updateSQL($bean, $where);
566
-		$tablename = $bean->getTableName();
567
-		$msg = "Error updating table: $tablename:";
568
-		return $this->query($sql,true,$msg);
569
-	}
563
+    public function update(SugarBean $bean, array $where = array())
564
+    {
565
+        $sql = $this->updateSQL($bean, $where);
566
+        $tablename = $bean->getTableName();
567
+        $msg = "Error updating table: $tablename:";
568
+        return $this->query($sql,true,$msg);
569
+    }
570 570
 
571 571
     /**
572 572
      * Implements a generic delete for any bean identified by id
@@ -577,215 +577,215 @@  discard block
 block discarded – undo
577 577
      * If where is not passed, it defaults to id of table
578 578
      * @return bool query result
579 579
      */
580
-	public function delete(SugarBean $bean, array $where = array())
581
-	{
582
-		$sql = $this->deleteSQL($bean, $where);
583
-		$tableName = $bean->getTableName();
584
-		$msg = "Error deleting from table: ".$tableName. ":";
585
-		return $this->query($sql,true,$msg);
586
-	}
587
-
588
-	/**
589
-	 * Implements a generic retrieve for any bean identified by id
590
-	 *
591
-	 * If we want to pass multiple values for a name, pass it as an array
592
-	 * If where is not passed, it defaults to id of table
593
-	 *
594
-	 * @param  SugarBean   $bean  Sugarbean instance
595
-	 * @param  array    $where values with the keys as names of fields.
596
-	 * @return resource result from the query
597
-	 */
598
-	public function retrieve(SugarBean $bean, array $where = array())
599
-	{
600
-		$sql = $this->retrieveSQL($bean, $where);
601
-		$tableName = $bean->getTableName();
602
-		$msg = "Error retriving values from table:".$tableName. ":";
603
-		return $this->query($sql,true,$msg);
604
-	}
605
-
606
-	/**
607
-	 * Implements a generic retrieve for a collection of beans.
608
-	 *
609
-	 * These beans will be joined in the sql by the key attribute of field defs.
610
-	 * Currently, this function does support outer joins.
611
-	 *
612
-	 * @param  array $beans Sugarbean instance(s)
613
-	 * @param  array $cols  columns to be returned with the keys as names of bean as identified by
614
-	 * get_class of bean. Values of this array is the array of fieldDefs to be returned for a bean.
615
-	 * If an empty array is passed, all columns are selected.
616
-	 * @param  array $where  values with the keys as names of bean as identified by get_class of bean
617
-	 * Each value at the first level is an array of values for that bean identified by name of fields.
618
-	 * If we want to pass multiple values for a name, pass it as an array
619
-	 * If where is not passed, all the rows will be returned.
620
-	 * @return resource
621
-	 */
622
-	public function retrieveView(array $beans, array $cols = array(), array $where = array())
623
-	{
624
-		$sql = $this->retrieveViewSQL($beans, $cols, $where);
625
-		$msg = "Error retriving values from View Collection:";
626
-		return $this->query($sql,true,$msg);
627
-	}
628
-
629
-
630
-	/**
631
-	 * Implements creation of a db table for a bean.
632
-	 *
633
-	 * NOTE: does not handle out-of-table constraints, use createConstraintSQL for that
634
-	 * @param SugarBean $bean  Sugarbean instance
635
-	 */
636
-	public function createTable(SugarBean $bean)
637
-	{
638
-		$sql = $this->createTableSQL($bean);
639
-		$tablename = $bean->getTableName();
640
-		$msg = "Error creating table: $tablename:";
641
-		$this->query($sql,true,$msg);
642
-		if(!$this->supports("inline_keys")) {
643
-		// handle constraints and indices
644
-			$indicesArr = $this->createConstraintSql($bean);
645
-			if (count($indicesArr) > 0)
646
-				foreach ($indicesArr as $indexSql)
647
-					$this->query($indexSql, true, $msg);
648
-		}
649
-	}
650
-
651
-	/**
652
-	 * returns SQL to create constraints or indices
653
-	 *
654
-	 * @param  SugarBean $bean SugarBean instance
655
-	 * @return array list of SQL statements
656
-	 */
657
-	protected function createConstraintSql(SugarBean $bean)
658
-	{
659
-		return $this->getConstraintSql($bean->getIndices(), $bean->getTableName());
660
-	}
661
-
662
-	/**
663
-	 * Implements creation of a db table
664
-	 *
665
-	 * @param string $tablename
666
-	 * @param array  $fieldDefs  Field definitions, in vardef format
667
-	 * @param array  $indices    Index definitions, in vardef format
668
-	 * @param string $engine    Engine parameter, used for MySQL engine so far
580
+    public function delete(SugarBean $bean, array $where = array())
581
+    {
582
+        $sql = $this->deleteSQL($bean, $where);
583
+        $tableName = $bean->getTableName();
584
+        $msg = "Error deleting from table: ".$tableName. ":";
585
+        return $this->query($sql,true,$msg);
586
+    }
587
+
588
+    /**
589
+     * Implements a generic retrieve for any bean identified by id
590
+     *
591
+     * If we want to pass multiple values for a name, pass it as an array
592
+     * If where is not passed, it defaults to id of table
593
+     *
594
+     * @param  SugarBean   $bean  Sugarbean instance
595
+     * @param  array    $where values with the keys as names of fields.
596
+     * @return resource result from the query
597
+     */
598
+    public function retrieve(SugarBean $bean, array $where = array())
599
+    {
600
+        $sql = $this->retrieveSQL($bean, $where);
601
+        $tableName = $bean->getTableName();
602
+        $msg = "Error retriving values from table:".$tableName. ":";
603
+        return $this->query($sql,true,$msg);
604
+    }
605
+
606
+    /**
607
+     * Implements a generic retrieve for a collection of beans.
608
+     *
609
+     * These beans will be joined in the sql by the key attribute of field defs.
610
+     * Currently, this function does support outer joins.
611
+     *
612
+     * @param  array $beans Sugarbean instance(s)
613
+     * @param  array $cols  columns to be returned with the keys as names of bean as identified by
614
+     * get_class of bean. Values of this array is the array of fieldDefs to be returned for a bean.
615
+     * If an empty array is passed, all columns are selected.
616
+     * @param  array $where  values with the keys as names of bean as identified by get_class of bean
617
+     * Each value at the first level is an array of values for that bean identified by name of fields.
618
+     * If we want to pass multiple values for a name, pass it as an array
619
+     * If where is not passed, all the rows will be returned.
620
+     * @return resource
621
+     */
622
+    public function retrieveView(array $beans, array $cols = array(), array $where = array())
623
+    {
624
+        $sql = $this->retrieveViewSQL($beans, $cols, $where);
625
+        $msg = "Error retriving values from View Collection:";
626
+        return $this->query($sql,true,$msg);
627
+    }
628
+
629
+
630
+    /**
631
+     * Implements creation of a db table for a bean.
632
+     *
633
+     * NOTE: does not handle out-of-table constraints, use createConstraintSQL for that
634
+     * @param SugarBean $bean  Sugarbean instance
635
+     */
636
+    public function createTable(SugarBean $bean)
637
+    {
638
+        $sql = $this->createTableSQL($bean);
639
+        $tablename = $bean->getTableName();
640
+        $msg = "Error creating table: $tablename:";
641
+        $this->query($sql,true,$msg);
642
+        if(!$this->supports("inline_keys")) {
643
+        // handle constraints and indices
644
+            $indicesArr = $this->createConstraintSql($bean);
645
+            if (count($indicesArr) > 0)
646
+                foreach ($indicesArr as $indexSql)
647
+                    $this->query($indexSql, true, $msg);
648
+        }
649
+    }
650
+
651
+    /**
652
+     * returns SQL to create constraints or indices
653
+     *
654
+     * @param  SugarBean $bean SugarBean instance
655
+     * @return array list of SQL statements
656
+     */
657
+    protected function createConstraintSql(SugarBean $bean)
658
+    {
659
+        return $this->getConstraintSql($bean->getIndices(), $bean->getTableName());
660
+    }
661
+
662
+    /**
663
+     * Implements creation of a db table
664
+     *
665
+     * @param string $tablename
666
+     * @param array  $fieldDefs  Field definitions, in vardef format
667
+     * @param array  $indices    Index definitions, in vardef format
668
+     * @param string $engine    Engine parameter, used for MySQL engine so far
669 669
      * @todo: refactor engine param to be more generic
670 670
      * @return bool success value
671 671
      */
672
-	public function createTableParams($tablename, $fieldDefs, $indices, $engine = null)
673
-	{
674
-		if (!empty($fieldDefs)) {
675
-			$sql = $this->createTableSQLParams($tablename, $fieldDefs, $indices, $engine);
676
-			$res = true;
677
-			if ($sql) {
678
-				$msg = "Error creating table: $tablename";
679
-				$res = ($res and $this->query($sql,true,$msg));
680
-			}
681
-			if(!$this->supports("inline_keys")) {
682
-				// handle constraints and indices
683
-				$indicesArr = $this->getConstraintSql($indices, $tablename);
684
-				if (count($indicesArr) > 0)
685
-					foreach ($indicesArr as $indexSql)
686
-						$res = ($res and $this->query($indexSql, true, "Error creating indexes"));
687
-			}
688
-			return $res;
689
-		}
690
-		return false;
691
-	}
692
-
693
-	/**
694
-	 * Implements repair of a db table for a bean.
695
-	 *
696
-	 * @param  SugarBean $bean    SugarBean instance
697
-	 * @param  bool   $execute true if we want the action to take place, false if we just want the sql returned
698
-	 * @return string SQL statement or empty string, depending upon $execute
699
-	 */
700
-	public function repairTable(SugarBean $bean, $execute = true)
701
-	{
702
-		$indices   = $bean->getIndices();
703
-		$fielddefs = $bean->getFieldDefinitions();
704
-		$tablename = $bean->getTableName();
705
-
706
-		//Clean the indexes to prevent duplicate definitions
707
-		$new_index = array();
708
-		foreach($indices as $ind_def){
709
-			$new_index[$ind_def['name']] = $ind_def;
710
-		}
711
-		//jc: added this for beans that do not actually have a table, namely
712
-		//ForecastOpportunities
713
-		if($tablename == 'does_not_exist' || $tablename == '')
714
-			return '';
715
-
716
-		global $dictionary;
717
-		$engine=null;
718
-		if (isset($dictionary[$bean->getObjectName()]['engine']) && !empty($dictionary[$bean->getObjectName()]['engine']) )
719
-			$engine = $dictionary[$bean->getObjectName()]['engine'];
720
-
721
-		return $this->repairTableParams($tablename, $fielddefs,$new_index,$execute,$engine);
722
-	}
723
-
724
-	/**
725
-	 * Can this field be null?
726
-	 * Auto-increment and ID fields can not be null
727
-	 * @param array $vardef
672
+    public function createTableParams($tablename, $fieldDefs, $indices, $engine = null)
673
+    {
674
+        if (!empty($fieldDefs)) {
675
+            $sql = $this->createTableSQLParams($tablename, $fieldDefs, $indices, $engine);
676
+            $res = true;
677
+            if ($sql) {
678
+                $msg = "Error creating table: $tablename";
679
+                $res = ($res and $this->query($sql,true,$msg));
680
+            }
681
+            if(!$this->supports("inline_keys")) {
682
+                // handle constraints and indices
683
+                $indicesArr = $this->getConstraintSql($indices, $tablename);
684
+                if (count($indicesArr) > 0)
685
+                    foreach ($indicesArr as $indexSql)
686
+                        $res = ($res and $this->query($indexSql, true, "Error creating indexes"));
687
+            }
688
+            return $res;
689
+        }
690
+        return false;
691
+    }
692
+
693
+    /**
694
+     * Implements repair of a db table for a bean.
695
+     *
696
+     * @param  SugarBean $bean    SugarBean instance
697
+     * @param  bool   $execute true if we want the action to take place, false if we just want the sql returned
698
+     * @return string SQL statement or empty string, depending upon $execute
699
+     */
700
+    public function repairTable(SugarBean $bean, $execute = true)
701
+    {
702
+        $indices   = $bean->getIndices();
703
+        $fielddefs = $bean->getFieldDefinitions();
704
+        $tablename = $bean->getTableName();
705
+
706
+        //Clean the indexes to prevent duplicate definitions
707
+        $new_index = array();
708
+        foreach($indices as $ind_def){
709
+            $new_index[$ind_def['name']] = $ind_def;
710
+        }
711
+        //jc: added this for beans that do not actually have a table, namely
712
+        //ForecastOpportunities
713
+        if($tablename == 'does_not_exist' || $tablename == '')
714
+            return '';
715
+
716
+        global $dictionary;
717
+        $engine=null;
718
+        if (isset($dictionary[$bean->getObjectName()]['engine']) && !empty($dictionary[$bean->getObjectName()]['engine']) )
719
+            $engine = $dictionary[$bean->getObjectName()]['engine'];
720
+
721
+        return $this->repairTableParams($tablename, $fielddefs,$new_index,$execute,$engine);
722
+    }
723
+
724
+    /**
725
+     * Can this field be null?
726
+     * Auto-increment and ID fields can not be null
727
+     * @param array $vardef
728 728
      * @return bool
729 729
      */
730
-	protected function isNullable($vardef)
731
-	{
732
-
733
-		if(isset($vardef['isnull']) && (strtolower($vardef['isnull']) == 'false' || $vardef['isnull'] === false)
734
-			&& !empty($vardef['required'])) {
735
-				/* required + is_null=false => not null */
736
-			return false;
737
-		}
738
-		if(empty($vardef['auto_increment']) && (empty($vardef['type']) || $vardef['type'] != 'id')
739
-					&& (empty($vardef['dbType']) || $vardef['dbType'] != 'id')
740
-					&& (empty($vardef['name']) || ($vardef['name'] != 'id' && $vardef['name'] != 'deleted'))
741
-		) {
742
-			return true;
743
-		}
744
-		return false;
745
-	}
746
-
747
-
748
-	/**
749
-	 * Builds the SQL commands that repair a table structure
750
-	 *
751
-	 * @param  string $tablename
752
-	 * @param  array  $fielddefs Field definitions, in vardef format
753
-	 * @param  array  $indices   Index definitions, in vardef format
754
-	 * @param  bool   $execute   optional, true if we want the queries executed instead of returned
755
-	 * @param  string $engine    optional, MySQL engine
730
+    protected function isNullable($vardef)
731
+    {
732
+
733
+        if(isset($vardef['isnull']) && (strtolower($vardef['isnull']) == 'false' || $vardef['isnull'] === false)
734
+            && !empty($vardef['required'])) {
735
+                /* required + is_null=false => not null */
736
+            return false;
737
+        }
738
+        if(empty($vardef['auto_increment']) && (empty($vardef['type']) || $vardef['type'] != 'id')
739
+                    && (empty($vardef['dbType']) || $vardef['dbType'] != 'id')
740
+                    && (empty($vardef['name']) || ($vardef['name'] != 'id' && $vardef['name'] != 'deleted'))
741
+        ) {
742
+            return true;
743
+        }
744
+        return false;
745
+    }
746
+
747
+
748
+    /**
749
+     * Builds the SQL commands that repair a table structure
750
+     *
751
+     * @param  string $tablename
752
+     * @param  array  $fielddefs Field definitions, in vardef format
753
+     * @param  array  $indices   Index definitions, in vardef format
754
+     * @param  bool   $execute   optional, true if we want the queries executed instead of returned
755
+     * @param  string $engine    optional, MySQL engine
756 756
      * @todo: refactor engine param to be more generic
757 757
      * @return string
758 758
      */
759
-	public function repairTableParams($tablename, $fielddefs,  $indices, $execute = true, $engine = null)
760
-	{
761
-		//jc: had a bug when running the repair if the tablename is blank the repair will
762
-		//fail when it tries to create a repair table
763
-		if ($tablename == '' || empty($fielddefs))
764
-			return '';
765
-
766
-		//if the table does not exist create it and we are done
767
-		$sql = "/* Table : $tablename */\n";
768
-		if (!$this->tableExists($tablename)) {
769
-			$createtablesql = $this->createTableSQLParams($tablename,$fielddefs,$indices,$engine);
770
-			if($execute && $createtablesql){
771
-				$this->createTableParams($tablename,$fielddefs,$indices,$engine);
772
-			}
773
-
774
-			$sql .= "/* MISSING TABLE: {$tablename} */\n";
775
-			$sql .= $createtablesql . "\n";
776
-			return $sql;
777
-		}
778
-
779
-		$compareFieldDefs = $this->get_columns($tablename);
780
-		$compareIndices = $this->get_indices($tablename);
781
-
782
-		$take_action = false;
783
-
784
-		// do column comparisons
785
-		$sql .=	"/*COLUMNS*/\n";
786
-		foreach ($fielddefs as $name => $value) {
787
-			if (isset($value['source']) && $value['source'] != 'db')
788
-				continue;
759
+    public function repairTableParams($tablename, $fielddefs,  $indices, $execute = true, $engine = null)
760
+    {
761
+        //jc: had a bug when running the repair if the tablename is blank the repair will
762
+        //fail when it tries to create a repair table
763
+        if ($tablename == '' || empty($fielddefs))
764
+            return '';
765
+
766
+        //if the table does not exist create it and we are done
767
+        $sql = "/* Table : $tablename */\n";
768
+        if (!$this->tableExists($tablename)) {
769
+            $createtablesql = $this->createTableSQLParams($tablename,$fielddefs,$indices,$engine);
770
+            if($execute && $createtablesql){
771
+                $this->createTableParams($tablename,$fielddefs,$indices,$engine);
772
+            }
773
+
774
+            $sql .= "/* MISSING TABLE: {$tablename} */\n";
775
+            $sql .= $createtablesql . "\n";
776
+            return $sql;
777
+        }
778
+
779
+        $compareFieldDefs = $this->get_columns($tablename);
780
+        $compareIndices = $this->get_indices($tablename);
781
+
782
+        $take_action = false;
783
+
784
+        // do column comparisons
785
+        $sql .=	"/*COLUMNS*/\n";
786
+        foreach ($fielddefs as $name => $value) {
787
+            if (isset($value['source']) && $value['source'] != 'db')
788
+                continue;
789 789
 
790 790
             // Bug #42406. Skipping breaked vardef without type or name
791 791
             if (isset($value['name']) == false || $value['name'] == false)
@@ -799,183 +799,183 @@  discard block
 block discarded – undo
799 799
                 continue;
800 800
             }
801 801
 
802
-			$name = strtolower($value['name']);
803
-			// add or fix the field defs per what the DB is expected to give us back
804
-			$this->massageFieldDef($value,$tablename);
805
-
806
-			$ignorerequired=false;
807
-
808
-			//Do not track requiredness in the DB, auto_increment, ID,
809
-			// and deleted fields are always required in the DB, so don't force those
810
-			if ($this->isNullable($value)) {
811
-				$value['required'] = false;
812
-			}
813
-			//Should match the conditions in DBManager::oneColumnSQLRep for DB required fields, type='id' fields will sometimes
814
-
815
-			//come into this function as 'type' = 'char', 'dbType' = 'id' without required set in $value. Assume they are correct and leave them alone.
816
-			else if (($name == 'id' || $value['type'] == 'id' || (isset($value['dbType']) && $value['dbType'] == 'id'))
817
-				&& (!isset($value['required']) && isset($compareFieldDefs[$name]['required'])))
818
-			{
819
-				$value['required'] = $compareFieldDefs[$name]['required'];
820
-			}
821
-
822
-			if ( !isset($compareFieldDefs[$name]) ) {
823
-				// ok we need this field lets create it
824
-				$sql .=	"/*MISSING IN DATABASE - $name -  ROW*/\n";
825
-				$sql .= $this->addColumnSQL($tablename, $value) .  "\n";
826
-				if ($execute)
827
-					$this->addColumn($tablename, $value);
828
-				$take_action = true;
829
-			} elseif ( !$this->compareVarDefs($compareFieldDefs[$name],$value)) {
830
-				//fields are different lets alter it
831
-				$sql .=	"/*MISMATCH WITH DATABASE - $name -  ROW ";
832
-				foreach($compareFieldDefs[$name] as $rKey => $rValue) {
833
-					$sql .=	"[$rKey] => '$rValue'  ";
834
-				}
835
-				$sql .=	"*/\n";
836
-				$sql .=	"/* VARDEF - $name -  ROW";
837
-				foreach($value as $rKey => $rValue) {
838
-					$sql .=	"[$rKey] => '$rValue'  ";
839
-				}
840
-				$sql .=	"*/\n";
841
-
842
-				//jc: oracle will complain if you try to execute a statement that sets a column to (not) null
843
-				//when it is already (not) null
844
-				if ( isset($value['isnull']) && isset($compareFieldDefs[$name]['isnull']) &&
845
-					$value['isnull'] === $compareFieldDefs[$name]['isnull']) {
846
-					unset($value['required']);
847
-					$ignorerequired=true;
848
-				}
849
-
850
-				//dwheeler: Once a column has been defined as null, we cannot try to force it back to !null
851
-				if ((isset($value['required']) && ($value['required'] === true || $value['required'] == 'true' || $value['required'] === 1))
852
-					&& (empty($compareFieldDefs[$name]['required']) || $compareFieldDefs[$name]['required'] != 'true'))
853
-				{
854
-					$ignorerequired = true;
855
-				}
856
-				$altersql = $this->alterColumnSQL($tablename, $value,$ignorerequired);
857
-				if(is_array($altersql)) {
858
-					$altersql = join("\n", $altersql);
859
-				}
860
-				$sql .= $altersql .  "\n";
861
-				if($execute){
862
-					$this->alterColumn($tablename, $value, $ignorerequired);
863
-				}
864
-				$take_action = true;
865
-			}
866
-		}
867
-
868
-		// do index comparisons
869
-		$sql .=	"/* INDEXES */\n";
870
-		$correctedIndexs = array();
802
+            $name = strtolower($value['name']);
803
+            // add or fix the field defs per what the DB is expected to give us back
804
+            $this->massageFieldDef($value,$tablename);
871 805
 
872
-        $compareIndices_case_insensitive = array();
806
+            $ignorerequired=false;
873 807
 
874
-		// do indices comparisons case-insensitive
875
-		foreach($compareIndices as $k => $value){
876
-			$value['name'] = strtolower($value['name']);
877
-			$compareIndices_case_insensitive[strtolower($k)] = $value;
878
-		}
879
-		$compareIndices = $compareIndices_case_insensitive;
880
-		unset($compareIndices_case_insensitive);
881
-
882
-		foreach ($indices as $value) {
883
-			if (isset($value['source']) && $value['source'] != 'db')
884
-				continue;
885
-
886
-
887
-			$validDBName = $this->getValidDBName($value['name'], true, 'index', true);
888
-			if (isset($compareIndices[$validDBName])) {
889
-				$value['name'] = $validDBName;
890
-			}
891
-		    $name = strtolower($value['name']);
892
-
893
-			//Don't attempt to fix the same index twice in one pass;
894
-			if (isset($correctedIndexs[$name]))
895
-				continue;
896
-
897
-			//don't bother checking primary nothing we can do about them
898
-			if (isset($value['type']) && $value['type'] == 'primary')
899
-				continue;
900
-
901
-			//database helpers do not know how to handle full text indices
902
-			if ($value['type']=='fulltext')
903
-				continue;
904
-
905
-			if ( in_array($value['type'],array('alternate_key','foreign')) )
906
-				$value['type'] = 'index';
907
-
908
-			if ( !isset($compareIndices[$name]) ) {
909
-				//First check if an index exists that doesn't match our name, if so, try to rename it
910
-				$found = false;
911
-				foreach ($compareIndices as $ex_name => $ex_value) {
912
-					if($this->compareVarDefs($ex_value, $value, true)) {
913
-						$found = $ex_name;
914
-						break;
915
-					}
916
-				}
917
-				if ($found) {
918
-					$sql .=	 "/*MISSNAMED INDEX IN DATABASE - $name - $ex_name */\n";
919
-					$rename = $this->renameIndexDefs($ex_value, $value, $tablename);
920
-					if($execute) {
921
-						$this->query($rename, true, "Cannot rename index");
922
-					}
923
-					$sql .= is_array($rename)?join("\n", $rename). "\n":$rename."\n";
924
-
925
-				} else {
926
-					// ok we need this field lets create it
927
-					$sql .=	 "/*MISSING INDEX IN DATABASE - $name -{$value['type']}  ROW */\n";
928
-					$sql .= $this->addIndexes($tablename,array($value), $execute) .  "\n";
929
-				}
930
-				$take_action = true;
931
-				$correctedIndexs[$name] = true;
932
-			} elseif ( !$this->compareVarDefs($compareIndices[$name],$value) ) {
933
-				// fields are different lets alter it
934
-				$sql .=	"/*INDEX MISMATCH WITH DATABASE - $name -  ROW ";
935
-				foreach ($compareIndices[$name] as $n1 => $t1) {
936
-					$sql .=	 "<$n1>";
937
-					if ( $n1 == 'fields' )
938
-						foreach($t1 as $rKey => $rValue)
939
-							$sql .= "[$rKey] => '$rValue'  ";
940
-					else
941
-						$sql .= " $t1 ";
942
-				}
943
-				$sql .=	"*/\n";
944
-				$sql .=	"/* VARDEF - $name -  ROW";
945
-				foreach ($value as $n1 => $t1) {
946
-					$sql .=	"<$n1>";
947
-					if ( $n1 == 'fields' )
948
-						foreach ($t1 as $rKey => $rValue)
949
-							$sql .=	"[$rKey] => '$rValue'  ";
950
-					else
951
-						$sql .= " $t1 ";
952
-				}
953
-				$sql .=	"*/\n";
954
-				$sql .= $this->modifyIndexes($tablename,array($value), $execute) .  "\n";
955
-				$take_action = true;
956
-				$correctedIndexs[$name] = true;
957
-			}
958
-		}
959
-
960
-		return ($take_action === true) ? $sql : '';
961
-	}
808
+            //Do not track requiredness in the DB, auto_increment, ID,
809
+            // and deleted fields are always required in the DB, so don't force those
810
+            if ($this->isNullable($value)) {
811
+                $value['required'] = false;
812
+            }
813
+            //Should match the conditions in DBManager::oneColumnSQLRep for DB required fields, type='id' fields will sometimes
962 814
 
963
-    /**
964
-     * Compares two vardefs
965
-     *
966
-     * @param  array  $fielddef1 This is from the database
967
-     * @param  array  $fielddef2 This is from the vardef
968
-     * @param bool $ignoreName Ignore name-only differences?
969
-     * @return bool   true if they match, false if they don't
970
-     */
971
-	public function compareVarDefs($fielddef1, $fielddef2, $ignoreName = false)
972
-	{
973
-		foreach ( $fielddef1 as $key => $value ) {
974
-			if ($key == 'name' && $ignoreName)
975
-				continue;
976
-            if (isset($fielddef2[$key]))
815
+            //come into this function as 'type' = 'char', 'dbType' = 'id' without required set in $value. Assume they are correct and leave them alone.
816
+            else if (($name == 'id' || $value['type'] == 'id' || (isset($value['dbType']) && $value['dbType'] == 'id'))
817
+                && (!isset($value['required']) && isset($compareFieldDefs[$name]['required'])))
977 818
             {
978
-                if (!is_array($fielddef1[$key]) && !is_array($fielddef2[$key]))
819
+                $value['required'] = $compareFieldDefs[$name]['required'];
820
+            }
821
+
822
+            if ( !isset($compareFieldDefs[$name]) ) {
823
+                // ok we need this field lets create it
824
+                $sql .=	"/*MISSING IN DATABASE - $name -  ROW*/\n";
825
+                $sql .= $this->addColumnSQL($tablename, $value) .  "\n";
826
+                if ($execute)
827
+                    $this->addColumn($tablename, $value);
828
+                $take_action = true;
829
+            } elseif ( !$this->compareVarDefs($compareFieldDefs[$name],$value)) {
830
+                //fields are different lets alter it
831
+                $sql .=	"/*MISMATCH WITH DATABASE - $name -  ROW ";
832
+                foreach($compareFieldDefs[$name] as $rKey => $rValue) {
833
+                    $sql .=	"[$rKey] => '$rValue'  ";
834
+                }
835
+                $sql .=	"*/\n";
836
+                $sql .=	"/* VARDEF - $name -  ROW";
837
+                foreach($value as $rKey => $rValue) {
838
+                    $sql .=	"[$rKey] => '$rValue'  ";
839
+                }
840
+                $sql .=	"*/\n";
841
+
842
+                //jc: oracle will complain if you try to execute a statement that sets a column to (not) null
843
+                //when it is already (not) null
844
+                if ( isset($value['isnull']) && isset($compareFieldDefs[$name]['isnull']) &&
845
+                    $value['isnull'] === $compareFieldDefs[$name]['isnull']) {
846
+                    unset($value['required']);
847
+                    $ignorerequired=true;
848
+                }
849
+
850
+                //dwheeler: Once a column has been defined as null, we cannot try to force it back to !null
851
+                if ((isset($value['required']) && ($value['required'] === true || $value['required'] == 'true' || $value['required'] === 1))
852
+                    && (empty($compareFieldDefs[$name]['required']) || $compareFieldDefs[$name]['required'] != 'true'))
853
+                {
854
+                    $ignorerequired = true;
855
+                }
856
+                $altersql = $this->alterColumnSQL($tablename, $value,$ignorerequired);
857
+                if(is_array($altersql)) {
858
+                    $altersql = join("\n", $altersql);
859
+                }
860
+                $sql .= $altersql .  "\n";
861
+                if($execute){
862
+                    $this->alterColumn($tablename, $value, $ignorerequired);
863
+                }
864
+                $take_action = true;
865
+            }
866
+        }
867
+
868
+        // do index comparisons
869
+        $sql .=	"/* INDEXES */\n";
870
+        $correctedIndexs = array();
871
+
872
+        $compareIndices_case_insensitive = array();
873
+
874
+        // do indices comparisons case-insensitive
875
+        foreach($compareIndices as $k => $value){
876
+            $value['name'] = strtolower($value['name']);
877
+            $compareIndices_case_insensitive[strtolower($k)] = $value;
878
+        }
879
+        $compareIndices = $compareIndices_case_insensitive;
880
+        unset($compareIndices_case_insensitive);
881
+
882
+        foreach ($indices as $value) {
883
+            if (isset($value['source']) && $value['source'] != 'db')
884
+                continue;
885
+
886
+
887
+            $validDBName = $this->getValidDBName($value['name'], true, 'index', true);
888
+            if (isset($compareIndices[$validDBName])) {
889
+                $value['name'] = $validDBName;
890
+            }
891
+            $name = strtolower($value['name']);
892
+
893
+            //Don't attempt to fix the same index twice in one pass;
894
+            if (isset($correctedIndexs[$name]))
895
+                continue;
896
+
897
+            //don't bother checking primary nothing we can do about them
898
+            if (isset($value['type']) && $value['type'] == 'primary')
899
+                continue;
900
+
901
+            //database helpers do not know how to handle full text indices
902
+            if ($value['type']=='fulltext')
903
+                continue;
904
+
905
+            if ( in_array($value['type'],array('alternate_key','foreign')) )
906
+                $value['type'] = 'index';
907
+
908
+            if ( !isset($compareIndices[$name]) ) {
909
+                //First check if an index exists that doesn't match our name, if so, try to rename it
910
+                $found = false;
911
+                foreach ($compareIndices as $ex_name => $ex_value) {
912
+                    if($this->compareVarDefs($ex_value, $value, true)) {
913
+                        $found = $ex_name;
914
+                        break;
915
+                    }
916
+                }
917
+                if ($found) {
918
+                    $sql .=	 "/*MISSNAMED INDEX IN DATABASE - $name - $ex_name */\n";
919
+                    $rename = $this->renameIndexDefs($ex_value, $value, $tablename);
920
+                    if($execute) {
921
+                        $this->query($rename, true, "Cannot rename index");
922
+                    }
923
+                    $sql .= is_array($rename)?join("\n", $rename). "\n":$rename."\n";
924
+
925
+                } else {
926
+                    // ok we need this field lets create it
927
+                    $sql .=	 "/*MISSING INDEX IN DATABASE - $name -{$value['type']}  ROW */\n";
928
+                    $sql .= $this->addIndexes($tablename,array($value), $execute) .  "\n";
929
+                }
930
+                $take_action = true;
931
+                $correctedIndexs[$name] = true;
932
+            } elseif ( !$this->compareVarDefs($compareIndices[$name],$value) ) {
933
+                // fields are different lets alter it
934
+                $sql .=	"/*INDEX MISMATCH WITH DATABASE - $name -  ROW ";
935
+                foreach ($compareIndices[$name] as $n1 => $t1) {
936
+                    $sql .=	 "<$n1>";
937
+                    if ( $n1 == 'fields' )
938
+                        foreach($t1 as $rKey => $rValue)
939
+                            $sql .= "[$rKey] => '$rValue'  ";
940
+                    else
941
+                        $sql .= " $t1 ";
942
+                }
943
+                $sql .=	"*/\n";
944
+                $sql .=	"/* VARDEF - $name -  ROW";
945
+                foreach ($value as $n1 => $t1) {
946
+                    $sql .=	"<$n1>";
947
+                    if ( $n1 == 'fields' )
948
+                        foreach ($t1 as $rKey => $rValue)
949
+                            $sql .=	"[$rKey] => '$rValue'  ";
950
+                    else
951
+                        $sql .= " $t1 ";
952
+                }
953
+                $sql .=	"*/\n";
954
+                $sql .= $this->modifyIndexes($tablename,array($value), $execute) .  "\n";
955
+                $take_action = true;
956
+                $correctedIndexs[$name] = true;
957
+            }
958
+        }
959
+
960
+        return ($take_action === true) ? $sql : '';
961
+    }
962
+
963
+    /**
964
+     * Compares two vardefs
965
+     *
966
+     * @param  array  $fielddef1 This is from the database
967
+     * @param  array  $fielddef2 This is from the vardef
968
+     * @param bool $ignoreName Ignore name-only differences?
969
+     * @return bool   true if they match, false if they don't
970
+     */
971
+    public function compareVarDefs($fielddef1, $fielddef2, $ignoreName = false)
972
+    {
973
+        foreach ( $fielddef1 as $key => $value ) {
974
+            if ($key == 'name' && $ignoreName)
975
+                continue;
976
+            if (isset($fielddef2[$key]))
977
+            {
978
+                if (!is_array($fielddef1[$key]) && !is_array($fielddef2[$key]))
979 979
                 {
980 980
                     if (strtolower($fielddef1[$key]) == strtolower($fielddef2[$key]))
981 981
                     {
@@ -990,64 +990,64 @@  discard block
 block discarded – undo
990 990
                     }
991 991
                 }
992 992
             }
993
-			//Ignore len if its not set in the vardef
994
-			if ($key == 'len' && empty($fielddef2[$key]))
995
-				continue;
993
+            //Ignore len if its not set in the vardef
994
+            if ($key == 'len' && empty($fielddef2[$key]))
995
+                continue;
996 996
             // if the length in db is greather than the vardef, ignore it
997 997
             if ($key == 'len' && ($fielddef1[$key] >= $fielddef2[$key])) {
998 998
                 continue;
999 999
             }
1000
-			return false;
1001
-		}
1002
-
1003
-		return true;
1004
-	}
1005
-
1006
-	/**
1007
-	 * Compare a field in two tables
1008
-	 * @deprecated
1009
-	 * @param  string $name   field name
1010
-	 * @param  string $table1
1011
-	 * @param  string $table2
1012
-	 * @return array  array with keys 'msg','table1','table2'
1013
-	 */
1014
-	public function compareFieldInTables($name, $table1, $table2)
1015
-	{
1016
-		$row1 = $this->describeField($name, $table1);
1017
-		$row2 = $this->describeField($name, $table2);
1018
-		$returnArray = array(
1019
-			'table1' => $row1,
1020
-			'table2' => $row2,
1021
-			'msg'    => 'error',
1022
-			);
1023
-
1024
-		$ignore_filter = array('Key'=>1);
1025
-		if ($row1) {
1026
-			if (!$row2) {
1027
-				// Exists on table1 but not table2
1028
-				$returnArray['msg'] = 'not_exists_table2';
1029
-			}
1030
-			else {
1031
-				if (sizeof($row1) != sizeof($row2)) {
1032
-					$returnArray['msg'] = 'no_match';
1033
-				}
1034
-				else {
1035
-					$returnArray['msg'] = 'match';
1036
-					foreach($row1 as $key => $value){
1037
-						//ignore keys when checking we will check them when we do the index check
1038
-						if( !isset($ignore_filter[$key]) && (!isset($row2[$key]) || $row1[$key] !== $row2[$key])){
1039
-							$returnArray['msg'] = 'no_match';
1040
-						}
1041
-					}
1042
-				}
1043
-			}
1044
-		}
1045
-		else {
1046
-			$returnArray['msg'] = 'not_exists_table1';
1047
-		}
1048
-
1049
-		return $returnArray;
1050
-	}
1000
+            return false;
1001
+        }
1002
+
1003
+        return true;
1004
+    }
1005
+
1006
+    /**
1007
+     * Compare a field in two tables
1008
+     * @deprecated
1009
+     * @param  string $name   field name
1010
+     * @param  string $table1
1011
+     * @param  string $table2
1012
+     * @return array  array with keys 'msg','table1','table2'
1013
+     */
1014
+    public function compareFieldInTables($name, $table1, $table2)
1015
+    {
1016
+        $row1 = $this->describeField($name, $table1);
1017
+        $row2 = $this->describeField($name, $table2);
1018
+        $returnArray = array(
1019
+            'table1' => $row1,
1020
+            'table2' => $row2,
1021
+            'msg'    => 'error',
1022
+            );
1023
+
1024
+        $ignore_filter = array('Key'=>1);
1025
+        if ($row1) {
1026
+            if (!$row2) {
1027
+                // Exists on table1 but not table2
1028
+                $returnArray['msg'] = 'not_exists_table2';
1029
+            }
1030
+            else {
1031
+                if (sizeof($row1) != sizeof($row2)) {
1032
+                    $returnArray['msg'] = 'no_match';
1033
+                }
1034
+                else {
1035
+                    $returnArray['msg'] = 'match';
1036
+                    foreach($row1 as $key => $value){
1037
+                        //ignore keys when checking we will check them when we do the index check
1038
+                        if( !isset($ignore_filter[$key]) && (!isset($row2[$key]) || $row1[$key] !== $row2[$key])){
1039
+                            $returnArray['msg'] = 'no_match';
1040
+                        }
1041
+                    }
1042
+                }
1043
+            }
1044
+        }
1045
+        else {
1046
+            $returnArray['msg'] = 'not_exists_table1';
1047
+        }
1048
+
1049
+        return $returnArray;
1050
+    }
1051 1051
 //
1052 1052
 //    /**
1053 1053
 //     * Compare an index in two different tables
@@ -1097,193 +1097,193 @@  discard block
 block discarded – undo
1097 1097
 //    }
1098 1098
 
1099 1099
 
1100
-	/**
1101
-	 * Creates an index identified by name on the given fields.
1102
-	 *
1103
-	 * @param SugarBean $bean      SugarBean instance
1104
-	 * @param array  $fieldDefs Field definitions, in vardef format
1105
-	 * @param string $name      index name
1106
-	 * @param bool   $unique    optional, true if we want to create an unique index
1100
+    /**
1101
+     * Creates an index identified by name on the given fields.
1102
+     *
1103
+     * @param SugarBean $bean      SugarBean instance
1104
+     * @param array  $fieldDefs Field definitions, in vardef format
1105
+     * @param string $name      index name
1106
+     * @param bool   $unique    optional, true if we want to create an unique index
1107 1107
      * @return bool query result
1108 1108
      */
1109
-	public function createIndex(SugarBean $bean, $fieldDefs, $name, $unique = true)
1110
-	{
1111
-		$sql = $this->createIndexSQL($bean, $fieldDefs, $name, $unique);
1112
-		$tablename = $bean->getTableName();
1113
-		$msg = "Error creating index $name on table: $tablename:";
1114
-		return $this->query($sql,true,$msg);
1115
-	}
1116
-
1117
-	/**
1118
-	 * returns a SQL query that creates the indices as defined in metadata
1119
-	 * @param  array  $indices Assoc array with index definitions from vardefs
1120
-	 * @param  string $table Focus table
1121
-	 * @return array  Array of SQL queries to generate indices
1122
-	 */
1123
-	public function getConstraintSql($indices, $table)
1124
-	{
1125
-		if (!$this->isFieldArray($indices))
1126
-			$indices = array($indices);
1127
-
1128
-		$columns = array();
1129
-
1130
-		foreach ($indices as $index) {
1131
-			if(!empty($index['db']) && $index['db'] != $this->dbType)
1132
-				continue;
1133
-			if (isset($index['source']) && $index['source'] != 'db')
1134
-			continue;
1135
-
1136
-			$sql = $this->add_drop_constraint($table, $index);
1137
-
1138
-			if(!empty($sql)) {
1139
-				$columns[] = $sql;
1140
-			}
1141
-		}
1142
-
1143
-		return $columns;
1144
-	}
1145
-
1146
-	/**
1147
-	 * Adds a new indexes
1148
-	 *
1149
-	 * @param  string $tablename
1150
-	 * @param  array  $indexes   indexes to add
1151
-	 * @param  bool   $execute   true if we want to execute the returned sql statement
1152
-	 * @return string SQL statement
1153
-	 */
1154
-	public function addIndexes($tablename, $indexes, $execute = true)
1155
-	{
1156
-		$alters = $this->getConstraintSql($indexes, $tablename);
1157
-		if ($execute) {
1158
-			foreach($alters as $sql) {
1159
-				$this->query($sql, true, "Error adding index: ");
1160
-			}
1161
-		}
1162
-		if(!empty($alters)) {
1163
-			$sql = join(";\n", $alters).";\n";
1164
-		} else {
1165
-			$sql = '';
1166
-		}
1167
-		return $sql;
1168
-	}
1169
-
1170
-	/**
1171
-	 * Drops indexes
1172
-	 *
1173
-	 * @param  string $tablename
1174
-	 * @param  array  $indexes   indexes to drop
1175
-	 * @param  bool   $execute   true if we want to execute the returned sql statement
1176
-	 * @return string SQL statement
1177
-	 */
1178
-	public function dropIndexes($tablename, $indexes, $execute = true)
1179
-	{
1180
-		$sqls = array();
1181
-		foreach ($indexes as $index) {
1182
-			$name =$index['name'];
1183
-			$sqls[$name] = $this->add_drop_constraint($tablename,$index,true);
1184
-		}
1185
-		if (!empty($sqls) && $execute) {
1186
-			foreach($sqls as $name => $sql) {
1187
-				unset(self::$index_descriptions[$tablename][$name]);
1188
-				$this->query($sql);
1189
-			}
1190
-		}
1191
-		if(!empty($sqls)) {
1192
-			return join(";\n",$sqls).";";
1193
-		} else {
1194
-			return '';
1195
-		}
1196
-	}
1197
-
1198
-	/**
1199
-	 * Modifies indexes
1200
-	 *
1201
-	 * @param  string $tablename
1202
-	 * @param  array  $indexes   indexes to modify
1203
-	 * @param  bool   $execute   true if we want to execute the returned sql statement
1204
-	 * @return string SQL statement
1205
-	 */
1206
-	public function modifyIndexes($tablename, $indexes, $execute = true)
1207
-	{
1208
-		return $this->dropIndexes($tablename, $indexes, $execute)."\n".
1209
-			$this->addIndexes($tablename, $indexes, $execute);
1210
-	}
1211
-
1212
-	/**
1213
-	 * Adds a column to table identified by field def.
1214
-	 *
1215
-	 * @param string $tablename
1216
-	 * @param array  $fieldDefs
1109
+    public function createIndex(SugarBean $bean, $fieldDefs, $name, $unique = true)
1110
+    {
1111
+        $sql = $this->createIndexSQL($bean, $fieldDefs, $name, $unique);
1112
+        $tablename = $bean->getTableName();
1113
+        $msg = "Error creating index $name on table: $tablename:";
1114
+        return $this->query($sql,true,$msg);
1115
+    }
1116
+
1117
+    /**
1118
+     * returns a SQL query that creates the indices as defined in metadata
1119
+     * @param  array  $indices Assoc array with index definitions from vardefs
1120
+     * @param  string $table Focus table
1121
+     * @return array  Array of SQL queries to generate indices
1122
+     */
1123
+    public function getConstraintSql($indices, $table)
1124
+    {
1125
+        if (!$this->isFieldArray($indices))
1126
+            $indices = array($indices);
1127
+
1128
+        $columns = array();
1129
+
1130
+        foreach ($indices as $index) {
1131
+            if(!empty($index['db']) && $index['db'] != $this->dbType)
1132
+                continue;
1133
+            if (isset($index['source']) && $index['source'] != 'db')
1134
+            continue;
1135
+
1136
+            $sql = $this->add_drop_constraint($table, $index);
1137
+
1138
+            if(!empty($sql)) {
1139
+                $columns[] = $sql;
1140
+            }
1141
+        }
1142
+
1143
+        return $columns;
1144
+    }
1145
+
1146
+    /**
1147
+     * Adds a new indexes
1148
+     *
1149
+     * @param  string $tablename
1150
+     * @param  array  $indexes   indexes to add
1151
+     * @param  bool   $execute   true if we want to execute the returned sql statement
1152
+     * @return string SQL statement
1153
+     */
1154
+    public function addIndexes($tablename, $indexes, $execute = true)
1155
+    {
1156
+        $alters = $this->getConstraintSql($indexes, $tablename);
1157
+        if ($execute) {
1158
+            foreach($alters as $sql) {
1159
+                $this->query($sql, true, "Error adding index: ");
1160
+            }
1161
+        }
1162
+        if(!empty($alters)) {
1163
+            $sql = join(";\n", $alters).";\n";
1164
+        } else {
1165
+            $sql = '';
1166
+        }
1167
+        return $sql;
1168
+    }
1169
+
1170
+    /**
1171
+     * Drops indexes
1172
+     *
1173
+     * @param  string $tablename
1174
+     * @param  array  $indexes   indexes to drop
1175
+     * @param  bool   $execute   true if we want to execute the returned sql statement
1176
+     * @return string SQL statement
1177
+     */
1178
+    public function dropIndexes($tablename, $indexes, $execute = true)
1179
+    {
1180
+        $sqls = array();
1181
+        foreach ($indexes as $index) {
1182
+            $name =$index['name'];
1183
+            $sqls[$name] = $this->add_drop_constraint($tablename,$index,true);
1184
+        }
1185
+        if (!empty($sqls) && $execute) {
1186
+            foreach($sqls as $name => $sql) {
1187
+                unset(self::$index_descriptions[$tablename][$name]);
1188
+                $this->query($sql);
1189
+            }
1190
+        }
1191
+        if(!empty($sqls)) {
1192
+            return join(";\n",$sqls).";";
1193
+        } else {
1194
+            return '';
1195
+        }
1196
+    }
1197
+
1198
+    /**
1199
+     * Modifies indexes
1200
+     *
1201
+     * @param  string $tablename
1202
+     * @param  array  $indexes   indexes to modify
1203
+     * @param  bool   $execute   true if we want to execute the returned sql statement
1204
+     * @return string SQL statement
1205
+     */
1206
+    public function modifyIndexes($tablename, $indexes, $execute = true)
1207
+    {
1208
+        return $this->dropIndexes($tablename, $indexes, $execute)."\n".
1209
+            $this->addIndexes($tablename, $indexes, $execute);
1210
+    }
1211
+
1212
+    /**
1213
+     * Adds a column to table identified by field def.
1214
+     *
1215
+     * @param string $tablename
1216
+     * @param array  $fieldDefs
1217 1217
      * @return bool query result
1218 1218
      */
1219
-	public function addColumn($tablename, $fieldDefs)
1220
-	{
1221
-		$sql = $this->addColumnSQL($tablename, $fieldDefs);
1222
-		if ($this->isFieldArray($fieldDefs)){
1223
-			$columns = array();
1224
-			foreach ($fieldDefs as $fieldDef)
1225
-				$columns[] = $fieldDef['name'];
1226
-			$columns = implode(",", $columns);
1227
-		}
1228
-		else {
1229
-			$columns = $fieldDefs['name'];
1230
-		}
1231
-		$msg = "Error adding column(s) $columns on table: $tablename:";
1232
-		return $this->query($sql,true,$msg);
1233
-	}
1234
-
1235
-	/**
1236
-	 * Alters old column identified by oldFieldDef to new fieldDef.
1237
-	 *
1238
-	 * @param string $tablename
1239
-	 * @param array  $newFieldDef
1240
-	 * @param bool   $ignoreRequired optional, true if we are ignoring this being a required field
1219
+    public function addColumn($tablename, $fieldDefs)
1220
+    {
1221
+        $sql = $this->addColumnSQL($tablename, $fieldDefs);
1222
+        if ($this->isFieldArray($fieldDefs)){
1223
+            $columns = array();
1224
+            foreach ($fieldDefs as $fieldDef)
1225
+                $columns[] = $fieldDef['name'];
1226
+            $columns = implode(",", $columns);
1227
+        }
1228
+        else {
1229
+            $columns = $fieldDefs['name'];
1230
+        }
1231
+        $msg = "Error adding column(s) $columns on table: $tablename:";
1232
+        return $this->query($sql,true,$msg);
1233
+    }
1234
+
1235
+    /**
1236
+     * Alters old column identified by oldFieldDef to new fieldDef.
1237
+     *
1238
+     * @param string $tablename
1239
+     * @param array  $newFieldDef
1240
+     * @param bool   $ignoreRequired optional, true if we are ignoring this being a required field
1241 1241
      * @return bool query result
1242 1242
      */
1243
-	public function alterColumn($tablename, $newFieldDef, $ignoreRequired = false)
1244
-	{
1245
-		$sql = $this->alterColumnSQL($tablename, $newFieldDef,$ignoreRequired);
1246
-		if ($this->isFieldArray($newFieldDef)){
1247
-			$columns = array();
1248
-			foreach ($newFieldDef as $fieldDef) {
1249
-				$columns[] = $fieldDef['name'];
1250
-			}
1251
-			$columns = implode(",", $columns);
1252
-		}
1253
-		else {
1254
-			$columns = $newFieldDef['name'];
1255
-		}
1256
-
1257
-		$msg = "Error altering column(s) $columns on table: $tablename:";
1258
-		$res = $this->query($sql,true,$msg);
1259
-		if($res) {
1260
-			$this->getTableDescription($tablename, true); // reload table description after altering
1261
-		}
1262
-		return $res;
1263
-	}
1264
-
1265
-	/**
1266
-	 * Drops the table associated with a bean
1267
-	 *
1268
-	 * @param SugarBean $bean SugarBean instance
1243
+    public function alterColumn($tablename, $newFieldDef, $ignoreRequired = false)
1244
+    {
1245
+        $sql = $this->alterColumnSQL($tablename, $newFieldDef,$ignoreRequired);
1246
+        if ($this->isFieldArray($newFieldDef)){
1247
+            $columns = array();
1248
+            foreach ($newFieldDef as $fieldDef) {
1249
+                $columns[] = $fieldDef['name'];
1250
+            }
1251
+            $columns = implode(",", $columns);
1252
+        }
1253
+        else {
1254
+            $columns = $newFieldDef['name'];
1255
+        }
1256
+
1257
+        $msg = "Error altering column(s) $columns on table: $tablename:";
1258
+        $res = $this->query($sql,true,$msg);
1259
+        if($res) {
1260
+            $this->getTableDescription($tablename, true); // reload table description after altering
1261
+        }
1262
+        return $res;
1263
+    }
1264
+
1265
+    /**
1266
+     * Drops the table associated with a bean
1267
+     *
1268
+     * @param SugarBean $bean SugarBean instance
1269 1269
      * @return bool query result
1270
-	 */
1271
-	public function dropTable(SugarBean $bean)
1272
-	{
1273
-		return $this->dropTableName($bean->getTableName());
1274
-	}
1275
-
1276
-	/**
1277
-	 * Drops the table by name
1278
-	 *
1279
-	 * @param string $name Table name
1270
+     */
1271
+    public function dropTable(SugarBean $bean)
1272
+    {
1273
+        return $this->dropTableName($bean->getTableName());
1274
+    }
1275
+
1276
+    /**
1277
+     * Drops the table by name
1278
+     *
1279
+     * @param string $name Table name
1280 1280
      * @return bool query result
1281
-	 */
1282
-	public function dropTableName($name)
1283
-	{
1284
-		$sql = $this->dropTableNameSQL($name);
1285
-		return $this->query($sql,true,"Error dropping table $name:");
1286
-	}
1281
+     */
1282
+    public function dropTableName($name)
1283
+    {
1284
+        $sql = $this->dropTableNameSQL($name);
1285
+        return $this->query($sql,true,"Error dropping table $name:");
1286
+    }
1287 1287
 
1288 1288
     /**
1289 1289
      * Deletes a column identified by fieldDef.
@@ -1292,13 +1292,13 @@  discard block
 block discarded – undo
1292 1292
      * @param array  $fieldDefs Vardef definition of the field
1293 1293
      * @return bool query result
1294 1294
      */
1295
-	public function deleteColumn(SugarBean $bean, $fieldDefs)
1296
-	{
1297
-		$tablename = $bean->getTableName();
1298
-		$sql = $this->dropColumnSQL($tablename, $fieldDefs);
1299
-		$msg = "Error deleting column(s) on table: $tablename:";
1300
-		return $this->query($sql,true,$msg);
1301
-	}
1295
+    public function deleteColumn(SugarBean $bean, $fieldDefs)
1296
+    {
1297
+        $tablename = $bean->getTableName();
1298
+        $sql = $this->dropColumnSQL($tablename, $fieldDefs);
1299
+        $msg = "Error deleting column(s) on table: $tablename:";
1300
+        return $this->query($sql,true,$msg);
1301
+    }
1302 1302
 
1303 1303
     /**
1304 1304
      * Generate a set of Insert statements based on the bean given
@@ -1313,228 +1313,228 @@  discard block
 block discarded – undo
1313 1313
      * @param bool $is_related_query
1314 1314
      * @return string SQL insert statement
1315 1315
      */
1316
-	public function generateInsertSQL(SugarBean $bean, $select_query, $start, $count = -1, $table, $is_related_query = false)
1317
-	{
1318
-		$this->log->info('call to DBManager::generateInsertSQL() is deprecated');
1319
-		global $sugar_config;
1320
-
1321
-		$rows_found = 0;
1322
-		$count_query = $bean->create_list_count_query($select_query);
1323
-		if(!empty($count_query))
1324
-		{
1325
-			// We have a count query.  Run it and get the results.
1326
-			$result = $this->query($count_query, true, "Error running count query for $this->object_name List: ");
1327
-			$assoc = $this->fetchByAssoc($result);
1328
-			if(!empty($assoc['c']))
1329
-			{
1330
-				$rows_found = $assoc['c'];
1331
-			}
1332
-		}
1333
-		if($count == -1){
1334
-			$count 	= $sugar_config['list_max_entries_per_page'];
1335
-		}
1336
-		$next_offset = $start + $count;
1337
-
1338
-		$result = $this->limitQuery($select_query, $start, $count);
1339
-		// get basic insert
1340
-		$sql = "INSERT INTO ".$table;
1341
-		$custom_sql = "INSERT INTO ".$table."_cstm";
1342
-
1343
-		// get field definitions
1344
-		$fields = $bean->getFieldDefinitions();
1345
-		$custom_fields = array();
1346
-
1347
-		if($bean->hasCustomFields()){
1348
-			foreach ($fields as $fieldDef){
1349
-				if($fieldDef['source'] == 'custom_fields'){
1350
-					$custom_fields[$fieldDef['name']] = $fieldDef['name'];
1351
-				}
1352
-			}
1353
-			if(!empty($custom_fields)){
1354
-				$custom_fields['id_c'] = 'id_c';
1355
-				$id_field = array('name' => 'id_c', 'custom_type' => 'id',);
1356
-				$fields[] = $id_field;
1357
-			}
1358
-		}
1359
-
1360
-		// get column names and values
1361
-		$row_array = array();
1362
-		$columns = array();
1363
-		$cstm_row_array = array();
1364
-		$cstm_columns = array();
1365
-		$built_columns = false;
1366
-		while(($row = $this->fetchByAssoc($result)) != null)
1367
-		{
1368
-			$values = array();
1369
-			$cstm_values = array();
1370
-			if(!$is_related_query){
1371
-				foreach ($fields as $fieldDef)
1372
-				{
1373
-					if(isset($fieldDef['source']) && $fieldDef['source'] != 'db' && $fieldDef['source'] != 'custom_fields') continue;
1374
-					$val = $row[$fieldDef['name']];
1375
-
1376
-					//handle auto increment values here only need to do this on insert not create
1377
-					if ($fieldDef['name'] == 'deleted'){
1378
-							$values['deleted'] = $val;
1379
-							if(!$built_columns){
1380
-							$columns[] = 'deleted';
1381
-						}
1382
-					}
1383
-					else
1384
-					{
1385
-						$type = $fieldDef['type'];
1386
-						if(!empty($fieldDef['custom_type'])){
1387
-							$type = $fieldDef['custom_type'];
1388
-						}
1389
-						// need to do some thing about types of values
1390
-						if($this->dbType == 'mysql' && $val == '' && ($type == 'datetime' ||  $type == 'date' || $type == 'int' || $type == 'currency' || $type == 'decimal')){
1391
-							if(!empty($custom_fields[$fieldDef['name']]))
1392
-								$cstm_values[$fieldDef['name']] = 'null';
1393
-							else
1394
-								$values[$fieldDef['name']] = 'null';
1395
-						}else{
1396
-							if(isset($type) && $type=='int') {
1397
-								if(!empty($custom_fields[$fieldDef['name']]))
1398
-									$cstm_values[$fieldDef['name']] = $GLOBALS['db']->quote(from_html($val));
1399
-								else
1400
-									$values[$fieldDef['name']] = $GLOBALS['db']->quote(from_html($val));
1401
-							} else {
1402
-								if(!empty($custom_fields[$fieldDef['name']]))
1403
-									$cstm_values[$fieldDef['name']] = "'".$GLOBALS['db']->quote(from_html($val))."'";
1404
-								else
1405
-									$values[$fieldDef['name']] = "'".$GLOBALS['db']->quote(from_html($val))."'";
1406
-							}
1407
-						}
1408
-						if(!$built_columns){
1409
-							if(!empty($custom_fields[$fieldDef['name']]))
1410
-								$cstm_columns[] = $fieldDef['name'];
1411
-							else
1412
-								$columns[] = $fieldDef['name'];
1413
-						}
1414
-					}
1415
-
1416
-				}
1417
-			} else {
1418
-			foreach ($row as $key=>$val)
1419
-			{
1420
-					if($key != 'orc_row'){
1421
-						$values[$key] = "'$val'";
1422
-						if(!$built_columns){
1423
-							$columns[] = $key;
1424
-						}
1425
-					}
1426
-			}
1427
-			}
1428
-			$built_columns = true;
1429
-			if(!empty($values)){
1430
-				$row_array[] = $values;
1431
-			}
1432
-			if(!empty($cstm_values) && !empty($cstm_values['id_c']) && (strlen($cstm_values['id_c']) > 7)){
1433
-				$cstm_row_array[] = $cstm_values;
1434
-			}
1435
-		}
1436
-
1437
-		//if (sizeof ($values) == 0) return ""; // no columns set
1438
-
1439
-		// get the entire sql
1440
-		$sql .= "(".implode(",", $columns).") ";
1441
-		$sql .= "VALUES";
1442
-		for($i = 0; $i < count($row_array); $i++){
1443
-			$sql .= " (".implode(",", $row_array[$i]).")";
1444
-			if($i < (count($row_array) - 1)){
1445
-				$sql .= ", ";
1446
-			}
1447
-		}
1448
-		//custom
1449
-		// get the entire sql
1450
-		$custom_sql .= "(".implode(",", $cstm_columns).") ";
1451
-		$custom_sql .= "VALUES";
1452
-
1453
-		for($i = 0; $i < count($cstm_row_array); $i++){
1454
-			$custom_sql .= " (".implode(",", $cstm_row_array[$i]).")";
1455
-			if($i < (count($cstm_row_array) - 1)){
1456
-				$custom_sql .= ", ";
1457
-			}
1458
-		}
1459
-		return array('data' => $sql, 'cstm_sql' => $custom_sql, /*'result_count' => $row_count, */ 'total_count' => $rows_found, 'next_offset' => $next_offset);
1460
-	}
1461
-
1462
-	/**
1463
-	 * @deprecated
1464
-	 * Disconnects all instances
1465
-	 */
1466
-	public function disconnectAll()
1467
-	{
1468
-		DBManagerFactory::disconnectAll();
1469
-	}
1470
-
1471
-	/**
1472
-	 * This function sets the query threshold limit
1473
-	 *
1474
-	 * @param int $limit value of query threshold limit
1475
-	 */
1476
-	public static function setQueryLimit($limit)
1477
-	{
1478
-		//reset the queryCount
1479
-		self::$queryCount = 0;
1480
-		self::$queryLimit = $limit;
1481
-	}
1482
-
1483
-	/**
1484
-	 * Returns the static queryCount value
1485
-	 *
1486
-	 * @return int value of the queryCount static variable
1487
-	 */
1488
-	public static function getQueryCount()
1489
-	{
1490
-		return self::$queryCount;
1491
-	}
1492
-
1493
-
1494
-	/**
1495
-	 * Resets the queryCount value to 0
1496
-	 *
1497
-	 */
1498
-	public static function resetQueryCount()
1499
-	{
1500
-		self::$queryCount = 0;
1501
-	}
1502
-
1503
-	/**
1504
-	 * This function increments the global $sql_queries variable
1505
-	 */
1506
-	public function countQuery()
1507
-	{
1508
-		if (self::$queryLimit != 0 && ++self::$queryCount > self::$queryLimit
1509
-			&&(empty($GLOBALS['current_user']) || !is_admin($GLOBALS['current_user']))) {
1316
+    public function generateInsertSQL(SugarBean $bean, $select_query, $start, $count = -1, $table, $is_related_query = false)
1317
+    {
1318
+        $this->log->info('call to DBManager::generateInsertSQL() is deprecated');
1319
+        global $sugar_config;
1320
+
1321
+        $rows_found = 0;
1322
+        $count_query = $bean->create_list_count_query($select_query);
1323
+        if(!empty($count_query))
1324
+        {
1325
+            // We have a count query.  Run it and get the results.
1326
+            $result = $this->query($count_query, true, "Error running count query for $this->object_name List: ");
1327
+            $assoc = $this->fetchByAssoc($result);
1328
+            if(!empty($assoc['c']))
1329
+            {
1330
+                $rows_found = $assoc['c'];
1331
+            }
1332
+        }
1333
+        if($count == -1){
1334
+            $count 	= $sugar_config['list_max_entries_per_page'];
1335
+        }
1336
+        $next_offset = $start + $count;
1337
+
1338
+        $result = $this->limitQuery($select_query, $start, $count);
1339
+        // get basic insert
1340
+        $sql = "INSERT INTO ".$table;
1341
+        $custom_sql = "INSERT INTO ".$table."_cstm";
1342
+
1343
+        // get field definitions
1344
+        $fields = $bean->getFieldDefinitions();
1345
+        $custom_fields = array();
1346
+
1347
+        if($bean->hasCustomFields()){
1348
+            foreach ($fields as $fieldDef){
1349
+                if($fieldDef['source'] == 'custom_fields'){
1350
+                    $custom_fields[$fieldDef['name']] = $fieldDef['name'];
1351
+                }
1352
+            }
1353
+            if(!empty($custom_fields)){
1354
+                $custom_fields['id_c'] = 'id_c';
1355
+                $id_field = array('name' => 'id_c', 'custom_type' => 'id',);
1356
+                $fields[] = $id_field;
1357
+            }
1358
+        }
1359
+
1360
+        // get column names and values
1361
+        $row_array = array();
1362
+        $columns = array();
1363
+        $cstm_row_array = array();
1364
+        $cstm_columns = array();
1365
+        $built_columns = false;
1366
+        while(($row = $this->fetchByAssoc($result)) != null)
1367
+        {
1368
+            $values = array();
1369
+            $cstm_values = array();
1370
+            if(!$is_related_query){
1371
+                foreach ($fields as $fieldDef)
1372
+                {
1373
+                    if(isset($fieldDef['source']) && $fieldDef['source'] != 'db' && $fieldDef['source'] != 'custom_fields') continue;
1374
+                    $val = $row[$fieldDef['name']];
1375
+
1376
+                    //handle auto increment values here only need to do this on insert not create
1377
+                    if ($fieldDef['name'] == 'deleted'){
1378
+                            $values['deleted'] = $val;
1379
+                            if(!$built_columns){
1380
+                            $columns[] = 'deleted';
1381
+                        }
1382
+                    }
1383
+                    else
1384
+                    {
1385
+                        $type = $fieldDef['type'];
1386
+                        if(!empty($fieldDef['custom_type'])){
1387
+                            $type = $fieldDef['custom_type'];
1388
+                        }
1389
+                        // need to do some thing about types of values
1390
+                        if($this->dbType == 'mysql' && $val == '' && ($type == 'datetime' ||  $type == 'date' || $type == 'int' || $type == 'currency' || $type == 'decimal')){
1391
+                            if(!empty($custom_fields[$fieldDef['name']]))
1392
+                                $cstm_values[$fieldDef['name']] = 'null';
1393
+                            else
1394
+                                $values[$fieldDef['name']] = 'null';
1395
+                        }else{
1396
+                            if(isset($type) && $type=='int') {
1397
+                                if(!empty($custom_fields[$fieldDef['name']]))
1398
+                                    $cstm_values[$fieldDef['name']] = $GLOBALS['db']->quote(from_html($val));
1399
+                                else
1400
+                                    $values[$fieldDef['name']] = $GLOBALS['db']->quote(from_html($val));
1401
+                            } else {
1402
+                                if(!empty($custom_fields[$fieldDef['name']]))
1403
+                                    $cstm_values[$fieldDef['name']] = "'".$GLOBALS['db']->quote(from_html($val))."'";
1404
+                                else
1405
+                                    $values[$fieldDef['name']] = "'".$GLOBALS['db']->quote(from_html($val))."'";
1406
+                            }
1407
+                        }
1408
+                        if(!$built_columns){
1409
+                            if(!empty($custom_fields[$fieldDef['name']]))
1410
+                                $cstm_columns[] = $fieldDef['name'];
1411
+                            else
1412
+                                $columns[] = $fieldDef['name'];
1413
+                        }
1414
+                    }
1415
+
1416
+                }
1417
+            } else {
1418
+            foreach ($row as $key=>$val)
1419
+            {
1420
+                    if($key != 'orc_row'){
1421
+                        $values[$key] = "'$val'";
1422
+                        if(!$built_columns){
1423
+                            $columns[] = $key;
1424
+                        }
1425
+                    }
1426
+            }
1427
+            }
1428
+            $built_columns = true;
1429
+            if(!empty($values)){
1430
+                $row_array[] = $values;
1431
+            }
1432
+            if(!empty($cstm_values) && !empty($cstm_values['id_c']) && (strlen($cstm_values['id_c']) > 7)){
1433
+                $cstm_row_array[] = $cstm_values;
1434
+            }
1435
+        }
1436
+
1437
+        //if (sizeof ($values) == 0) return ""; // no columns set
1438
+
1439
+        // get the entire sql
1440
+        $sql .= "(".implode(",", $columns).") ";
1441
+        $sql .= "VALUES";
1442
+        for($i = 0; $i < count($row_array); $i++){
1443
+            $sql .= " (".implode(",", $row_array[$i]).")";
1444
+            if($i < (count($row_array) - 1)){
1445
+                $sql .= ", ";
1446
+            }
1447
+        }
1448
+        //custom
1449
+        // get the entire sql
1450
+        $custom_sql .= "(".implode(",", $cstm_columns).") ";
1451
+        $custom_sql .= "VALUES";
1452
+
1453
+        for($i = 0; $i < count($cstm_row_array); $i++){
1454
+            $custom_sql .= " (".implode(",", $cstm_row_array[$i]).")";
1455
+            if($i < (count($cstm_row_array) - 1)){
1456
+                $custom_sql .= ", ";
1457
+            }
1458
+        }
1459
+        return array('data' => $sql, 'cstm_sql' => $custom_sql, /*'result_count' => $row_count, */ 'total_count' => $rows_found, 'next_offset' => $next_offset);
1460
+    }
1461
+
1462
+    /**
1463
+     * @deprecated
1464
+     * Disconnects all instances
1465
+     */
1466
+    public function disconnectAll()
1467
+    {
1468
+        DBManagerFactory::disconnectAll();
1469
+    }
1470
+
1471
+    /**
1472
+     * This function sets the query threshold limit
1473
+     *
1474
+     * @param int $limit value of query threshold limit
1475
+     */
1476
+    public static function setQueryLimit($limit)
1477
+    {
1478
+        //reset the queryCount
1479
+        self::$queryCount = 0;
1480
+        self::$queryLimit = $limit;
1481
+    }
1482
+
1483
+    /**
1484
+     * Returns the static queryCount value
1485
+     *
1486
+     * @return int value of the queryCount static variable
1487
+     */
1488
+    public static function getQueryCount()
1489
+    {
1490
+        return self::$queryCount;
1491
+    }
1492
+
1493
+
1494
+    /**
1495
+     * Resets the queryCount value to 0
1496
+     *
1497
+     */
1498
+    public static function resetQueryCount()
1499
+    {
1500
+        self::$queryCount = 0;
1501
+    }
1502
+
1503
+    /**
1504
+     * This function increments the global $sql_queries variable
1505
+     */
1506
+    public function countQuery()
1507
+    {
1508
+        if (self::$queryLimit != 0 && ++self::$queryCount > self::$queryLimit
1509
+            &&(empty($GLOBALS['current_user']) || !is_admin($GLOBALS['current_user']))) {
1510 1510
             require_once('include/resource/ResourceManager.php');
1511 1511
             $resourceManager = ResourceManager::getInstance();
1512 1512
             $resourceManager->notifyObservers('ERR_QUERY_LIMIT');
1513
-		}
1514
-	}
1513
+        }
1514
+    }
1515
+
1516
+    /**
1517
+     * Pre-process string for quoting
1518
+     * @internal
1519
+     * @param string $string
1520
+     * @return string
1521
+     */
1522
+    protected function quoteInternal($string)
1523
+    {
1524
+        return from_html($string);
1525
+    }
1515 1526
 
1516
-	/**
1517
-	 * Pre-process string for quoting
1518
-	 * @internal
1519
-	 * @param string $string
1527
+    /**
1528
+     * Return string properly quoted with ''
1529
+     * @param string $string
1520 1530
      * @return string
1521 1531
      */
1522
-	protected function quoteInternal($string)
1523
-	{
1524
-		return from_html($string);
1525
-	}
1526
-
1527
-	/**
1528
-	 * Return string properly quoted with ''
1529
-	 * @param string $string
1530
-	 * @return string
1531
-	 */
1532
-	public function quoted($string)
1533
-	{
1534
-		return "'".$this->quote($string)."'";
1535
-	}
1536
-
1537
-	/**
1532
+    public function quoted($string)
1533
+    {
1534
+        return "'".$this->quote($string)."'";
1535
+    }
1536
+
1537
+    /**
1538 1538
      * Quote value according to type
1539 1539
      * Numerics aren't quoted
1540 1540
      * Dates are converted and quoted
@@ -1544,13 +1544,13 @@  discard block
 block discarded – undo
1544 1544
      * @return string Quoted value
1545 1545
      */
1546 1546
     public function quoteType($type, $value)
1547
-	{
1548
-	    if($type == 'date') {
1549
-	        return $this->convert($this->quoted($value), "date");
1550
-	    }
1551
-	    if($type == 'time') {
1552
-	        return $this->convert($this->quoted($value), "time");
1553
-	    }
1547
+    {
1548
+        if($type == 'date') {
1549
+            return $this->convert($this->quoted($value), "date");
1550
+        }
1551
+        if($type == 'time') {
1552
+            return $this->convert($this->quoted($value), "time");
1553
+        }
1554 1554
         if(isset($this->type_class[$type]) &&  $this->type_class[$type] == "date") {
1555 1555
             return $this->convert($this->quoted($value), "datetime");
1556 1556
         }
@@ -1559,7 +1559,7 @@  discard block
 block discarded – undo
1559 1559
         }
1560 1560
 
1561 1561
         return $this->quoted($value);
1562
-	}
1562
+    }
1563 1563
 
1564 1564
     /**
1565 1565
      * Quote the strings of the passed in array
@@ -1569,177 +1569,177 @@  discard block
 block discarded – undo
1569 1569
      * @param array $array
1570 1570
      * @return array Quoted strings
1571 1571
      */
1572
-	public function arrayQuote(array &$array)
1573
-	{
1574
-		foreach($array as &$val) {
1575
-			$val = $this->quote($val);
1576
-		}
1577
-		return $array;
1578
-	}
1572
+    public function arrayQuote(array &$array)
1573
+    {
1574
+        foreach($array as &$val) {
1575
+            $val = $this->quote($val);
1576
+        }
1577
+        return $array;
1578
+    }
1579 1579
 
1580 1580
     /**
1581 1581
      * Frees out previous results
1582 1582
      *
1583 1583
      * @param resource|bool $result optional, pass if you want to free a single result instead of all results
1584 1584
      */
1585
-	protected function freeResult($result = false)
1586
-	{
1587
-		if($result) {
1588
-			$this->freeDbResult($result);
1589
-		}
1590
-		if($this->lastResult) {
1591
-			$this->freeDbResult($this->lastResult);
1592
-			$this->lastResult = null;
1593
-		}
1594
-	}
1595
-
1596
-	/**
1597
-	 * @abstract
1598
-	 * Check if query has LIMIT clause
1599
-	 * Relevant for now only for Mysql
1600
-	 * @param string $sql
1601
-	 * @return bool
1602
-	 */
1603
-	protected function hasLimit($sql)
1604
-	{
1605
-	    return false;
1606
-	}
1607
-
1608
-	/**
1609
-	 * Runs a query and returns a single row containing single value
1610
-	 *
1611
-	 * @param  string   $sql        SQL Statement to execute
1612
-	 * @param  bool     $dieOnError True if we want to call die if the query returns errors
1613
-	 * @param  string   $msg        Message to log if error occurs
1614
-	 * @return array    single value from the query
1615
-	 */
1616
-	public function getOne($sql, $dieOnError = false, $msg = '')
1617
-	{
1618
-		$this->log->info("Get One: |$sql|");
1619
-		if(!$this->hasLimit($sql)) {
1620
-		    $queryresult = $this->limitQuery($sql, 0, 1, $dieOnError, $msg);
1621
-		} else {
1622
-		    // support old code that passes LIMIT to sql
1623
-		    // works only for mysql, so do not rely on this
1624
-		    $queryresult = $this->query($sql, $dieOnError, $msg);
1625
-		}
1626
-		$this->checkError($msg.' Get One Failed:' . $sql, $dieOnError);
1627
-		if (!$queryresult) return false;
1628
-		$row = $this->fetchByAssoc($queryresult);
1629
-		if(!empty($row)) {
1630
-			return array_shift($row);
1631
-		}
1632
-		return false;
1633
-	}
1634
-
1635
-	/**
1636
-	 * Runs a query and returns a single row
1637
-	 *
1638
-	 * @param  string   $sql        SQL Statement to execute
1639
-	 * @param  bool     $dieOnError True if we want to call die if the query returns errors
1640
-	 * @param  string   $msg        Message to log if error occurs
1641
-	 * @param  bool     $suppress   Message to log if error occurs
1642
-	 * @return array    single row from the query
1643
-	 */
1644
-	public function fetchOne($sql, $dieOnError = false, $msg = '', $suppress = false)
1645
-	{
1646
-		$this->log->info("Fetch One: |$sql|");
1647
-		$this->checkConnection();
1648
-		$queryresult = $this->query($sql, $dieOnError, $msg);
1649
-		$this->checkError($msg.' Fetch One Failed:' . $sql, $dieOnError);
1650
-
1651
-		if (!$queryresult) return false;
1652
-
1653
-		$row = $this->fetchByAssoc($queryresult);
1654
-		if ( !$row ) return false;
1655
-
1656
-		$this->freeResult($queryresult);
1657
-		return $row;
1658
-	}
1585
+    protected function freeResult($result = false)
1586
+    {
1587
+        if($result) {
1588
+            $this->freeDbResult($result);
1589
+        }
1590
+        if($this->lastResult) {
1591
+            $this->freeDbResult($this->lastResult);
1592
+            $this->lastResult = null;
1593
+        }
1594
+    }
1659 1595
 
1660 1596
     /**
1661
-     * Returns the number of rows affected by the last query
1662 1597
      * @abstract
1663
-	 * See also affected_rows capability, will return 0 unless the DB supports it
1664
-     * @param resource $result query result resource
1665
-     * @return int
1598
+     * Check if query has LIMIT clause
1599
+     * Relevant for now only for Mysql
1600
+     * @param string $sql
1601
+     * @return bool
1666 1602
      */
1667
-	public function getAffectedRowCount($result)
1668
-	{
1669
-		return 0;
1670
-	}
1671
-
1672
-	/**
1673
-	 * Returns the number of rows returned by the result
1674
-	 *
1675
-	 * This function can't be reliably implemented on most DB, do not use it.
1676
-	 * @abstract
1677
-	 * @deprecated
1678
-	 * @param  resource $result
1679
-	 * @return int
1680
-	 */
1681
-	public function getRowCount($result)
1682
-	{
1683
-	    return 0;
1684
-	}
1685
-
1686
-	/**
1687
-     * Get table description
1688
-     * @param string $tablename
1603
+    protected function hasLimit($sql)
1604
+    {
1605
+        return false;
1606
+    }
1607
+
1608
+    /**
1609
+     * Runs a query and returns a single row containing single value
1610
+     *
1611
+     * @param  string   $sql        SQL Statement to execute
1612
+     * @param  bool     $dieOnError True if we want to call die if the query returns errors
1613
+     * @param  string   $msg        Message to log if error occurs
1614
+     * @return array    single value from the query
1615
+     */
1616
+    public function getOne($sql, $dieOnError = false, $msg = '')
1617
+    {
1618
+        $this->log->info("Get One: |$sql|");
1619
+        if(!$this->hasLimit($sql)) {
1620
+            $queryresult = $this->limitQuery($sql, 0, 1, $dieOnError, $msg);
1621
+        } else {
1622
+            // support old code that passes LIMIT to sql
1623
+            // works only for mysql, so do not rely on this
1624
+            $queryresult = $this->query($sql, $dieOnError, $msg);
1625
+        }
1626
+        $this->checkError($msg.' Get One Failed:' . $sql, $dieOnError);
1627
+        if (!$queryresult) return false;
1628
+        $row = $this->fetchByAssoc($queryresult);
1629
+        if(!empty($row)) {
1630
+            return array_shift($row);
1631
+        }
1632
+        return false;
1633
+    }
1634
+
1635
+    /**
1636
+     * Runs a query and returns a single row
1637
+     *
1638
+     * @param  string   $sql        SQL Statement to execute
1639
+     * @param  bool     $dieOnError True if we want to call die if the query returns errors
1640
+     * @param  string   $msg        Message to log if error occurs
1641
+     * @param  bool     $suppress   Message to log if error occurs
1642
+     * @return array    single row from the query
1643
+     */
1644
+    public function fetchOne($sql, $dieOnError = false, $msg = '', $suppress = false)
1645
+    {
1646
+        $this->log->info("Fetch One: |$sql|");
1647
+        $this->checkConnection();
1648
+        $queryresult = $this->query($sql, $dieOnError, $msg);
1649
+        $this->checkError($msg.' Fetch One Failed:' . $sql, $dieOnError);
1650
+
1651
+        if (!$queryresult) return false;
1652
+
1653
+        $row = $this->fetchByAssoc($queryresult);
1654
+        if ( !$row ) return false;
1655
+
1656
+        $this->freeResult($queryresult);
1657
+        return $row;
1658
+    }
1659
+
1660
+    /**
1661
+     * Returns the number of rows affected by the last query
1662
+     * @abstract
1663
+     * See also affected_rows capability, will return 0 unless the DB supports it
1664
+     * @param resource $result query result resource
1665
+     * @return int
1666
+     */
1667
+    public function getAffectedRowCount($result)
1668
+    {
1669
+        return 0;
1670
+    }
1671
+
1672
+    /**
1673
+     * Returns the number of rows returned by the result
1674
+     *
1675
+     * This function can't be reliably implemented on most DB, do not use it.
1676
+     * @abstract
1677
+     * @deprecated
1678
+     * @param  resource $result
1679
+     * @return int
1680
+     */
1681
+    public function getRowCount($result)
1682
+    {
1683
+        return 0;
1684
+    }
1685
+
1686
+    /**
1687
+     * Get table description
1688
+     * @param string $tablename
1689 1689
      * @param bool $reload true means load from DB, false allows using cache
1690 1690
      * @return array Vardef-format table description
1691 1691
      *
1692 1692
      */
1693
-	public function getTableDescription($tablename, $reload = false)
1694
-	{
1695
-		if($reload || empty(self::$table_descriptions[$tablename])) {
1696
-			self::$table_descriptions[$tablename] = $this->get_columns($tablename);
1697
-		}
1698
-		return self::$table_descriptions[$tablename];
1699
-	}
1700
-
1701
-	/**
1702
-	 * Returns the field description for a given field in table
1703
-	 *
1704
-	 * @param  string $name
1705
-	 * @param  string $tablename
1706
-	 * @return array
1707
-	 */
1708
-	protected function describeField($name, $tablename)
1709
-	{
1710
-		$table = $this->getTableDescription($tablename);
1711
-		if(!empty($table) && isset($table[$name]))
1712
-			return 	$table[$name];
1713
-
1714
-		$table = $this->getTableDescription($tablename, true);
1715
-
1716
-		if(isset($table[$name]))
1717
-		return $table[$name];
1718
-
1719
-		return array();
1720
-	}
1721
-
1722
-	/**
1723
-	 * Returns the index description for a given index in table
1724
-	 *
1725
-	 * @param  string $name
1726
-	 * @param  string $tablename
1727
-	 * @return array
1728
-	 */
1729
-	protected function describeIndex($name, $tablename)
1730
-	{
1731
-		if(isset(self::$index_descriptions[$tablename]) && isset(self::$index_descriptions[$tablename]) && isset(self::$index_descriptions[$tablename][$name])){
1732
-			return 	self::$index_descriptions[$tablename][$name];
1733
-		}
1734
-
1735
-		self::$index_descriptions[$tablename] = $this->get_indices($tablename);
1736
-
1737
-		if(isset(self::$index_descriptions[$tablename][$name])){
1738
-			return 	self::$index_descriptions[$tablename][$name];
1739
-		}
1740
-
1741
-		return array();
1742
-	}
1693
+    public function getTableDescription($tablename, $reload = false)
1694
+    {
1695
+        if($reload || empty(self::$table_descriptions[$tablename])) {
1696
+            self::$table_descriptions[$tablename] = $this->get_columns($tablename);
1697
+        }
1698
+        return self::$table_descriptions[$tablename];
1699
+    }
1700
+
1701
+    /**
1702
+     * Returns the field description for a given field in table
1703
+     *
1704
+     * @param  string $name
1705
+     * @param  string $tablename
1706
+     * @return array
1707
+     */
1708
+    protected function describeField($name, $tablename)
1709
+    {
1710
+        $table = $this->getTableDescription($tablename);
1711
+        if(!empty($table) && isset($table[$name]))
1712
+            return 	$table[$name];
1713
+
1714
+        $table = $this->getTableDescription($tablename, true);
1715
+
1716
+        if(isset($table[$name]))
1717
+        return $table[$name];
1718
+
1719
+        return array();
1720
+    }
1721
+
1722
+    /**
1723
+     * Returns the index description for a given index in table
1724
+     *
1725
+     * @param  string $name
1726
+     * @param  string $tablename
1727
+     * @return array
1728
+     */
1729
+    protected function describeIndex($name, $tablename)
1730
+    {
1731
+        if(isset(self::$index_descriptions[$tablename]) && isset(self::$index_descriptions[$tablename]) && isset(self::$index_descriptions[$tablename][$name])){
1732
+            return 	self::$index_descriptions[$tablename][$name];
1733
+        }
1734
+
1735
+        self::$index_descriptions[$tablename] = $this->get_indices($tablename);
1736
+
1737
+        if(isset(self::$index_descriptions[$tablename][$name])){
1738
+            return 	self::$index_descriptions[$tablename][$name];
1739
+        }
1740
+
1741
+        return array();
1742
+    }
1743 1743
 
1744 1744
     /**
1745 1745
      * Truncates a string to a given length
@@ -1749,14 +1749,14 @@  discard block
 block discarded – undo
1749 1749
      * @return string
1750 1750
      *
1751 1751
      */
1752
-	public function truncate($string, $len)
1753
-	{
1754
-		if ( is_numeric($len) && $len > 0)
1755
-		{
1756
-			$string = mb_substr($string,0,(int) $len, "UTF-8");
1757
-		}
1758
-		return $string;
1759
-	}
1752
+    public function truncate($string, $len)
1753
+    {
1754
+        if ( is_numeric($len) && $len > 0)
1755
+        {
1756
+            $string = mb_substr($string,0,(int) $len, "UTF-8");
1757
+        }
1758
+        return $string;
1759
+    }
1760 1760
 
1761 1761
     /**
1762 1762
      * Returns the database string needed for concatinating multiple database strings together
@@ -1766,121 +1766,121 @@  discard block
 block discarded – undo
1766 1766
      * @param string $space Separator between strings, default is single space
1767 1767
      * @return string
1768 1768
      */
1769
-	public function concat($table, array $fields, $space = ' ')
1770
-	{
1771
-		if(empty($fields)) return '';
1772
-		$elems = array();
1773
-		$space = $this->quoted($space);
1774
-		foreach ( $fields as $field ) {
1775
-			if(!empty($elems)) $elems[] = $space;
1776
-			$elems[] = $this->convert("$table.$field", 'IFNULL', array("''"));
1777
-		}
1778
-		$first = array_shift($elems);
1779
-		return "LTRIM(RTRIM(".$this->convert($first, 'CONCAT', $elems)."))";
1780
-	}
1781
-
1782
-	/**
1783
-	 * Given a sql stmt attempt to parse it into the sql and the tokens. Then return the index of this prepared statement
1784
-	 * Tokens can come in the following forms:
1785
-	 * ? - a scalar which will be quoted
1786
-	 * ! - a literal which will not be quoted
1787
-	 * & - binary data to read from a file
1788
-	 *
1789
-	 * @param  string	$sql        The sql to parse
1790
-	 * @return int index of the prepared statement to be used with execute
1791
-	 */
1792
-	public function prepareQuery($sql)
1793
-	{
1794
-		//parse out the tokens
1795
-		$tokens = preg_split('/((?<!\\\)[&?!])/', $sql, -1, PREG_SPLIT_DELIM_CAPTURE);
1796
-
1797
-		//maintain a count of the actual tokens for quick reference in execute
1798
-		$count = 0;
1799
-
1800
-		$sqlStr = '';
1801
-		foreach ($tokens as $key => $val) {
1802
-			switch ($val) {
1803
-				case '?' :
1804
-				case '!' :
1805
-				case '&' :
1806
-					$count++;
1807
-					$sqlStr .= '?';
1808
-					break;
1809
-
1810
-				default :
1811
-					//escape any special characters
1812
-					$tokens[$key] = preg_replace('/\\\([&?!])/', "\\1", $val);
1813
-					$sqlStr .= $tokens[$key];
1814
-					break;
1815
-			} // switch
1816
-		} // foreach
1817
-
1818
-		$this->preparedTokens[] = array('tokens' => $tokens, 'tokenCount' => $count, 'sqlString' => $sqlStr);
1819
-		end($this->preparedTokens);
1820
-		return key($this->preparedTokens);
1821
-	}
1822
-
1823
-	/**
1824
-	 * Takes a prepared stmt index and the data to replace and creates the query and runs it.
1825
-	 *
1826
-	 * @param  int		$stmt       The index of the prepared statement from preparedTokens
1827
-	 * @param  array    $data 		The array of data to replace the tokens with.
1828
-	 * @return resource result set or false on error
1829
-	 */
1830
-	public function executePreparedQuery($stmt, $data = array())
1831
-	{
1832
-		if(!empty($this->preparedTokens[$stmt])){
1833
-			if(!is_array($data)){
1834
-				$data = array($data);
1835
-			}
1836
-
1837
-			$pTokens = $this->preparedTokens[$stmt];
1838
-
1839
-			//ensure that the number of data elements matches the number of replacement tokens
1840
-			//we found in prepare().
1841
-			if(count($data) != $pTokens['tokenCount']){
1842
-				//error the data count did not match the token count
1843
-				return false;
1844
-			}
1845
-
1846
-			$query = '';
1847
-			$dataIndex = 0;
1848
-			$tokens = $pTokens['tokens'];
1849
-			foreach ($tokens as $val) {
1850
-				switch ($val) {
1851
-					case '?':
1852
-						$query .= $this->quote($data[$dataIndex++]);
1853
-						break;
1854
-					case '&':
1855
-						$filename = $data[$dataIndex++];
1856
-						$query .= file_get_contents($filename);
1857
-						break;
1858
-					case '!':
1859
-						$query .= $data[$dataIndex++];
1860
-						break;
1861
-					default:
1862
-						$query .= $val;
1863
-						break;
1864
-				}//switch
1865
-			}//foreach
1866
-			return $this->query($query);
1867
-		}else{
1868
-			return false;
1869
-		}
1870
-	}
1871
-
1872
-	/**
1873
-	 * Run both prepare and execute without the client having to run both individually.
1874
-	 *
1875
-	 * @param  string	$sql        The sql to parse
1876
-	 * @param  array    $data 		The array of data to replace the tokens with.
1877
-	 * @return resource result set or false on error
1878
-	 */
1879
-	public function pQuery($sql, $data = array())
1880
-	{
1881
-		$stmt = $this->prepareQuery($sql);
1882
-		return $this->executePreparedQuery($stmt, $data);
1883
-	}
1769
+    public function concat($table, array $fields, $space = ' ')
1770
+    {
1771
+        if(empty($fields)) return '';
1772
+        $elems = array();
1773
+        $space = $this->quoted($space);
1774
+        foreach ( $fields as $field ) {
1775
+            if(!empty($elems)) $elems[] = $space;
1776
+            $elems[] = $this->convert("$table.$field", 'IFNULL', array("''"));
1777
+        }
1778
+        $first = array_shift($elems);
1779
+        return "LTRIM(RTRIM(".$this->convert($first, 'CONCAT', $elems)."))";
1780
+    }
1781
+
1782
+    /**
1783
+     * Given a sql stmt attempt to parse it into the sql and the tokens. Then return the index of this prepared statement
1784
+     * Tokens can come in the following forms:
1785
+     * ? - a scalar which will be quoted
1786
+     * ! - a literal which will not be quoted
1787
+     * & - binary data to read from a file
1788
+     *
1789
+     * @param  string	$sql        The sql to parse
1790
+     * @return int index of the prepared statement to be used with execute
1791
+     */
1792
+    public function prepareQuery($sql)
1793
+    {
1794
+        //parse out the tokens
1795
+        $tokens = preg_split('/((?<!\\\)[&?!])/', $sql, -1, PREG_SPLIT_DELIM_CAPTURE);
1796
+
1797
+        //maintain a count of the actual tokens for quick reference in execute
1798
+        $count = 0;
1799
+
1800
+        $sqlStr = '';
1801
+        foreach ($tokens as $key => $val) {
1802
+            switch ($val) {
1803
+                case '?' :
1804
+                case '!' :
1805
+                case '&' :
1806
+                    $count++;
1807
+                    $sqlStr .= '?';
1808
+                    break;
1809
+
1810
+                default :
1811
+                    //escape any special characters
1812
+                    $tokens[$key] = preg_replace('/\\\([&?!])/', "\\1", $val);
1813
+                    $sqlStr .= $tokens[$key];
1814
+                    break;
1815
+            } // switch
1816
+        } // foreach
1817
+
1818
+        $this->preparedTokens[] = array('tokens' => $tokens, 'tokenCount' => $count, 'sqlString' => $sqlStr);
1819
+        end($this->preparedTokens);
1820
+        return key($this->preparedTokens);
1821
+    }
1822
+
1823
+    /**
1824
+     * Takes a prepared stmt index and the data to replace and creates the query and runs it.
1825
+     *
1826
+     * @param  int		$stmt       The index of the prepared statement from preparedTokens
1827
+     * @param  array    $data 		The array of data to replace the tokens with.
1828
+     * @return resource result set or false on error
1829
+     */
1830
+    public function executePreparedQuery($stmt, $data = array())
1831
+    {
1832
+        if(!empty($this->preparedTokens[$stmt])){
1833
+            if(!is_array($data)){
1834
+                $data = array($data);
1835
+            }
1836
+
1837
+            $pTokens = $this->preparedTokens[$stmt];
1838
+
1839
+            //ensure that the number of data elements matches the number of replacement tokens
1840
+            //we found in prepare().
1841
+            if(count($data) != $pTokens['tokenCount']){
1842
+                //error the data count did not match the token count
1843
+                return false;
1844
+            }
1845
+
1846
+            $query = '';
1847
+            $dataIndex = 0;
1848
+            $tokens = $pTokens['tokens'];
1849
+            foreach ($tokens as $val) {
1850
+                switch ($val) {
1851
+                    case '?':
1852
+                        $query .= $this->quote($data[$dataIndex++]);
1853
+                        break;
1854
+                    case '&':
1855
+                        $filename = $data[$dataIndex++];
1856
+                        $query .= file_get_contents($filename);
1857
+                        break;
1858
+                    case '!':
1859
+                        $query .= $data[$dataIndex++];
1860
+                        break;
1861
+                    default:
1862
+                        $query .= $val;
1863
+                        break;
1864
+                }//switch
1865
+            }//foreach
1866
+            return $this->query($query);
1867
+        }else{
1868
+            return false;
1869
+        }
1870
+    }
1871
+
1872
+    /**
1873
+     * Run both prepare and execute without the client having to run both individually.
1874
+     *
1875
+     * @param  string	$sql        The sql to parse
1876
+     * @param  array    $data 		The array of data to replace the tokens with.
1877
+     * @return resource result set or false on error
1878
+     */
1879
+    public function pQuery($sql, $data = array())
1880
+    {
1881
+        $stmt = $this->prepareQuery($sql);
1882
+        return $this->executePreparedQuery($stmt, $data);
1883
+    }
1884 1884
 
1885 1885
 /********************** SQL FUNCTIONS ****************************/
1886 1886
     /**
@@ -1890,933 +1890,933 @@  discard block
 block discarded – undo
1890 1890
      * @param SugarBean $bean SugarBean instance
1891 1891
      * @return string SQL Create Table statement
1892 1892
      */
1893
-	public function createTableSQL(SugarBean $bean)
1894
-	{
1895
-		$tablename = $bean->getTableName();
1896
-		$fieldDefs = $bean->getFieldDefinitions();
1897
-		$indices = $bean->getIndices();
1898
-		return $this->createTableSQLParams($tablename, $fieldDefs, $indices);
1899
-	}
1900
-
1901
-	/**
1902
-	 * Generates SQL for insert statement.
1903
-	 *
1904
-	 * @param  SugarBean $bean SugarBean instance
1905
-	 * @return string SQL Create Table statement
1906
-	 */
1907
-	public function insertSQL(SugarBean $bean)
1908
-	{
1909
-		// get column names and values
1910
-		$sql = $this->insertParams($bean->getTableName(), $bean->getFieldDefinitions(), get_object_vars($bean),
1911
-		        isset($bean->field_name_map)?$bean->field_name_map:null, false);
1912
-		return $sql;
1913
-	}
1914
-
1915
-	/**
1916
-	 * Generates SQL for update statement.
1917
-	 *
1918
-	 * @param  SugarBean $bean SugarBean instance
1919
-	 * @param  array  $where Optional, where conditions in an array
1920
-	 * @return string SQL Create Table statement
1921
-	 */
1922
-	public function updateSQL(SugarBean $bean, array $where = array())
1923
-	{
1924
-		$primaryField = $bean->getPrimaryFieldDefinition();
1925
-		$columns = array();
1893
+    public function createTableSQL(SugarBean $bean)
1894
+    {
1895
+        $tablename = $bean->getTableName();
1896
+        $fieldDefs = $bean->getFieldDefinitions();
1897
+        $indices = $bean->getIndices();
1898
+        return $this->createTableSQLParams($tablename, $fieldDefs, $indices);
1899
+    }
1900
+
1901
+    /**
1902
+     * Generates SQL for insert statement.
1903
+     *
1904
+     * @param  SugarBean $bean SugarBean instance
1905
+     * @return string SQL Create Table statement
1906
+     */
1907
+    public function insertSQL(SugarBean $bean)
1908
+    {
1909
+        // get column names and values
1910
+        $sql = $this->insertParams($bean->getTableName(), $bean->getFieldDefinitions(), get_object_vars($bean),
1911
+                isset($bean->field_name_map)?$bean->field_name_map:null, false);
1912
+        return $sql;
1913
+    }
1914
+
1915
+    /**
1916
+     * Generates SQL for update statement.
1917
+     *
1918
+     * @param  SugarBean $bean SugarBean instance
1919
+     * @param  array  $where Optional, where conditions in an array
1920
+     * @return string SQL Create Table statement
1921
+     */
1922
+    public function updateSQL(SugarBean $bean, array $where = array())
1923
+    {
1924
+        $primaryField = $bean->getPrimaryFieldDefinition();
1925
+        $columns = array();
1926 1926
         $fields = $bean->getFieldDefinitions();
1927
-		// get column names and values
1928
-		foreach ($fields as $field => $fieldDef) {
1929
-			if (isset($fieldDef['source']) && $fieldDef['source'] != 'db')  continue;
1930
-			// Do not write out the id field on the update statement.
1931
-    		// We are not allowed to change ids.
1932
-    		if (empty($fieldDef['name']) || $fieldDef['name'] == $primaryField['name']) continue;
1933
-
1934
-    		// If the field is an auto_increment field, then we shouldn't be setting it.  This was added
1935
-    		// specially for Bugs and Cases which have a number associated with them.
1936
-    		if (!empty($bean->field_name_map[$field]['auto_increment'])) continue;
1937
-
1938
-    		//custom fields handle their save separately
1939
-    		if(isset($bean->field_name_map) && !empty($bean->field_name_map[$field]['custom_type']))  continue;
1940
-
1941
-    		// no need to clear deleted since we only update not deleted records anyway
1942
-    		if($fieldDef['name'] == 'deleted' && empty($bean->deleted)) continue;
1943
-
1944
-    		if(isset($bean->$field)) {
1945
-    			$val = from_html($bean->$field);
1946
-    		} else {
1947
-    			continue;
1948
-    		}
1949
-
1950
-    		if(!empty($fieldDef['type']) && $fieldDef['type'] == 'bool'){
1951
-    			$val = $bean->getFieldValue($field);
1952
-    		}
1953
-
1954
-    		if(strlen($val) == 0) {
1955
-    			if(isset($fieldDef['default']) && strlen($fieldDef['default']) > 0) {
1956
-    				$val = $fieldDef['default'];
1957
-    			} else {
1958
-    				$val = null;
1959
-    			}
1960
-    		}
1961
-
1962
-    		if(!empty($val) && !empty($fieldDef['len']) && strlen($val) > $fieldDef['len']) {
1963
-			    $val = $this->truncate($val, $fieldDef['len']);
1964
-			}
1965
-		$columnName = $this->quoteIdentifier($fieldDef['name']);
1966
-    		if(!is_null($val) || !empty($fieldDef['required'])) {
1967
-    			$columns[] = "{$columnName}=".$this->massageValue($val, $fieldDef);
1968
-    		} elseif($this->isNullable($fieldDef)) {
1969
-    			$columns[] = "{$columnName}=NULL";
1970
-    		} else {
1971
-    		    $columns[] = "{$columnName}=".$this->emptyValue($fieldDef['type']);
1972
-    		}
1973
-		}
1974
-
1975
-		if ( sizeof($columns) == 0 )
1976
-			return ""; // no columns set
1977
-
1978
-		// build where clause
1979
-		$where = $this->getWhereClause($bean, $this->updateWhereArray($bean, $where));
1980
-		if(isset($fields['deleted'])) {
1981
-		    $where .= " AND deleted=0";
1982
-		}
1983
-
1984
-		return "UPDATE ".$bean->getTableName()."
1927
+        // get column names and values
1928
+        foreach ($fields as $field => $fieldDef) {
1929
+            if (isset($fieldDef['source']) && $fieldDef['source'] != 'db')  continue;
1930
+            // Do not write out the id field on the update statement.
1931
+            // We are not allowed to change ids.
1932
+            if (empty($fieldDef['name']) || $fieldDef['name'] == $primaryField['name']) continue;
1933
+
1934
+            // If the field is an auto_increment field, then we shouldn't be setting it.  This was added
1935
+            // specially for Bugs and Cases which have a number associated with them.
1936
+            if (!empty($bean->field_name_map[$field]['auto_increment'])) continue;
1937
+
1938
+            //custom fields handle their save separately
1939
+            if(isset($bean->field_name_map) && !empty($bean->field_name_map[$field]['custom_type']))  continue;
1940
+
1941
+            // no need to clear deleted since we only update not deleted records anyway
1942
+            if($fieldDef['name'] == 'deleted' && empty($bean->deleted)) continue;
1943
+
1944
+            if(isset($bean->$field)) {
1945
+                $val = from_html($bean->$field);
1946
+            } else {
1947
+                continue;
1948
+            }
1949
+
1950
+            if(!empty($fieldDef['type']) && $fieldDef['type'] == 'bool'){
1951
+                $val = $bean->getFieldValue($field);
1952
+            }
1953
+
1954
+            if(strlen($val) == 0) {
1955
+                if(isset($fieldDef['default']) && strlen($fieldDef['default']) > 0) {
1956
+                    $val = $fieldDef['default'];
1957
+                } else {
1958
+                    $val = null;
1959
+                }
1960
+            }
1961
+
1962
+            if(!empty($val) && !empty($fieldDef['len']) && strlen($val) > $fieldDef['len']) {
1963
+                $val = $this->truncate($val, $fieldDef['len']);
1964
+            }
1965
+        $columnName = $this->quoteIdentifier($fieldDef['name']);
1966
+            if(!is_null($val) || !empty($fieldDef['required'])) {
1967
+                $columns[] = "{$columnName}=".$this->massageValue($val, $fieldDef);
1968
+            } elseif($this->isNullable($fieldDef)) {
1969
+                $columns[] = "{$columnName}=NULL";
1970
+            } else {
1971
+                $columns[] = "{$columnName}=".$this->emptyValue($fieldDef['type']);
1972
+            }
1973
+        }
1974
+
1975
+        if ( sizeof($columns) == 0 )
1976
+            return ""; // no columns set
1977
+
1978
+        // build where clause
1979
+        $where = $this->getWhereClause($bean, $this->updateWhereArray($bean, $where));
1980
+        if(isset($fields['deleted'])) {
1981
+            $where .= " AND deleted=0";
1982
+        }
1983
+
1984
+        return "UPDATE ".$bean->getTableName()."
1985 1985
 					SET ".implode(",", $columns)."
1986 1986
 					$where";
1987
-	}
1988
-
1989
-	/**
1990
-	 * This method returns a where array so that it has id entry if
1991
-	 * where is not an array or is empty
1992
-	 *
1993
-	 * @param  SugarBean $bean SugarBean instance
1994
-	 * @param  array  $where Optional, where conditions in an array
1995
-	 * @return array
1996
-	 */
1997
-	protected function updateWhereArray(SugarBean $bean, array $where = array())
1998
-	{
1999
-		if (count($where) == 0) {
2000
-			$fieldDef = $bean->getPrimaryFieldDefinition();
2001
-			$primaryColumn = $fieldDef['name'];
2002
-
2003
-			$val = $bean->getFieldValue($fieldDef['name']);
2004
-			if ($val != FALSE){
2005
-				$where[$primaryColumn] = $val;
2006
-			}
2007
-		}
2008
-
2009
-		return $where;
2010
-	}
2011
-
2012
-	/**
2013
-	 * Returns a where clause without the 'where' key word
2014
-	 *
2015
-	 * The clause returned does not have an 'and' at the beginning and the columns
2016
-	 * are joined by 'and'.
2017
-	 *
2018
-	 * @param  string $table table name
2019
-	 * @param  array  $whereArray Optional, where conditions in an array
2020
-	 * @return string
2021
-	 */
2022
-	protected function getColumnWhereClause($table, array $whereArray = array())
2023
-	{
2024
-		$where = array();
2025
-		foreach ($whereArray as $name => $val) {
2026
-			$op = "=";
2027
-			if (is_array($val)) {
2028
-				$op = "IN";
2029
-				$temp = array();
2030
-				foreach ($val as $tval){
2031
-					$temp[] = $this->quoted($tval);
2032
-				}
2033
-				$val = implode(",", $temp);
2034
-				$val = "($val)";
2035
-			} else {
2036
-				$val = $this->quoted($val);
2037
-			}
2038
-
2039
-			$where[] = " $table.$name $op $val";
2040
-		}
2041
-
2042
-		if (!empty($where))
2043
-			return implode(" AND ", $where);
2044
-
2045
-		return '';
2046
-	}
2047
-
2048
-	/**
2049
-	 * This method returns a complete where clause built from the
2050
-	 * where values specified.
2051
-	 *
2052
-	 * @param  SugarBean $bean SugarBean that describes the table
2053
-	 * @param  array  $whereArray Optional, where conditions in an array
2054
-	 * @return string
2055
-	 */
2056
-	protected function getWhereClause(SugarBean $bean, array $whereArray=array())
2057
-	{
2058
-	    return " WHERE " . $this->getColumnWhereClause($bean->getTableName(), $whereArray);
2059
-	}
2060
-
2061
-	/**
2062
-	 * Outputs a correct string for the sql statement according to value
2063
-	 *
2064
-	 * @param  mixed $val
2065
-	 * @param  array $fieldDef field definition
2066
-	 * @return mixed
2067
-	 */
2068
-	public function massageValue($val, $fieldDef)
2069
-	{
2070
-		$type = $this->getFieldType($fieldDef);
2071
-
2072
-		if(isset($this->type_class[$type])) {
2073
-			// handle some known types
2074
-			switch($this->type_class[$type]) {
2075
-				case 'bool':
2076
-				case 'int':
2077
-					if (!empty($fieldDef['required']) && $val == ''){
2078
-						if (isset($fieldDef['default'])){
2079
-							return $fieldDef['default'];
2080
-						}
2081
-						return 0;
2082
-					}
2083
-					return intval($val);
1987
+    }
1988
+
1989
+    /**
1990
+     * This method returns a where array so that it has id entry if
1991
+     * where is not an array or is empty
1992
+     *
1993
+     * @param  SugarBean $bean SugarBean instance
1994
+     * @param  array  $where Optional, where conditions in an array
1995
+     * @return array
1996
+     */
1997
+    protected function updateWhereArray(SugarBean $bean, array $where = array())
1998
+    {
1999
+        if (count($where) == 0) {
2000
+            $fieldDef = $bean->getPrimaryFieldDefinition();
2001
+            $primaryColumn = $fieldDef['name'];
2002
+
2003
+            $val = $bean->getFieldValue($fieldDef['name']);
2004
+            if ($val != FALSE){
2005
+                $where[$primaryColumn] = $val;
2006
+            }
2007
+        }
2008
+
2009
+        return $where;
2010
+    }
2011
+
2012
+    /**
2013
+     * Returns a where clause without the 'where' key word
2014
+     *
2015
+     * The clause returned does not have an 'and' at the beginning and the columns
2016
+     * are joined by 'and'.
2017
+     *
2018
+     * @param  string $table table name
2019
+     * @param  array  $whereArray Optional, where conditions in an array
2020
+     * @return string
2021
+     */
2022
+    protected function getColumnWhereClause($table, array $whereArray = array())
2023
+    {
2024
+        $where = array();
2025
+        foreach ($whereArray as $name => $val) {
2026
+            $op = "=";
2027
+            if (is_array($val)) {
2028
+                $op = "IN";
2029
+                $temp = array();
2030
+                foreach ($val as $tval){
2031
+                    $temp[] = $this->quoted($tval);
2032
+                }
2033
+                $val = implode(",", $temp);
2034
+                $val = "($val)";
2035
+            } else {
2036
+                $val = $this->quoted($val);
2037
+            }
2038
+
2039
+            $where[] = " $table.$name $op $val";
2040
+        }
2041
+
2042
+        if (!empty($where))
2043
+            return implode(" AND ", $where);
2044
+
2045
+        return '';
2046
+    }
2047
+
2048
+    /**
2049
+     * This method returns a complete where clause built from the
2050
+     * where values specified.
2051
+     *
2052
+     * @param  SugarBean $bean SugarBean that describes the table
2053
+     * @param  array  $whereArray Optional, where conditions in an array
2054
+     * @return string
2055
+     */
2056
+    protected function getWhereClause(SugarBean $bean, array $whereArray=array())
2057
+    {
2058
+        return " WHERE " . $this->getColumnWhereClause($bean->getTableName(), $whereArray);
2059
+    }
2060
+
2061
+    /**
2062
+     * Outputs a correct string for the sql statement according to value
2063
+     *
2064
+     * @param  mixed $val
2065
+     * @param  array $fieldDef field definition
2066
+     * @return mixed
2067
+     */
2068
+    public function massageValue($val, $fieldDef)
2069
+    {
2070
+        $type = $this->getFieldType($fieldDef);
2071
+
2072
+        if(isset($this->type_class[$type])) {
2073
+            // handle some known types
2074
+            switch($this->type_class[$type]) {
2075
+                case 'bool':
2076
+                case 'int':
2077
+                    if (!empty($fieldDef['required']) && $val == ''){
2078
+                        if (isset($fieldDef['default'])){
2079
+                            return $fieldDef['default'];
2080
+                        }
2081
+                        return 0;
2082
+                    }
2083
+                    return intval($val);
2084 2084
                 case 'bigint' :
2085 2085
                     $val = (float)$val;
2086
-					if (!empty($fieldDef['required']) && $val == false){
2087
-						if (isset($fieldDef['default'])){
2088
-							return $fieldDef['default'];
2089
-						}
2090
-						return 0;
2091
-					}
2086
+                    if (!empty($fieldDef['required']) && $val == false){
2087
+                        if (isset($fieldDef['default'])){
2088
+                            return $fieldDef['default'];
2089
+                        }
2090
+                        return 0;
2091
+                    }
2092 2092
                     return $val;
2093
-				case 'float':
2094
-					if (!empty($fieldDef['required'])  && $val == ''){
2095
-						if (isset($fieldDef['default'])){
2096
-							return $fieldDef['default'];
2097
-						}
2098
-						return 0;
2099
-					}
2100
-					return floatval($val);
2101
-				case 'time':
2102
-				case 'date':
2103
-					// empty date can't be '', so convert it to either NULL or empty date value
2104
-					if($val == '') {
2105
-						if (!empty($fieldDef['required'])) {
2106
-							if (isset($fieldDef['default'])) {
2107
-								return $fieldDef['default'];
2108
-							}
2109
-							return $this->emptyValue($type);
2110
-						}
2111
-						return "NULL";
2112
-					}
2113
-					break;
2114
-			}
2115
-		} else {
2116
-		    if(!empty($val) && !empty($fieldDef['len']) && strlen($val) > $fieldDef['len']) {
2117
-			    $val = $this->truncate($val, $fieldDef['len']);
2118
-			}
2119
-		}
2120
-
2121
-		if ( is_null($val) ) {
2122
-			if(!empty($fieldDef['required'])) {
2123
-				if (isset($fieldDef['default'])  && $fieldDef['default'] != ''){
2124
-					return $fieldDef['default'];
2125
-				}
2126
-				return $this->emptyValue($type);
2127
-			} else {
2128
-				return "NULL";
2129
-			}
2130
-		}
2093
+                case 'float':
2094
+                    if (!empty($fieldDef['required'])  && $val == ''){
2095
+                        if (isset($fieldDef['default'])){
2096
+                            return $fieldDef['default'];
2097
+                        }
2098
+                        return 0;
2099
+                    }
2100
+                    return floatval($val);
2101
+                case 'time':
2102
+                case 'date':
2103
+                    // empty date can't be '', so convert it to either NULL or empty date value
2104
+                    if($val == '') {
2105
+                        if (!empty($fieldDef['required'])) {
2106
+                            if (isset($fieldDef['default'])) {
2107
+                                return $fieldDef['default'];
2108
+                            }
2109
+                            return $this->emptyValue($type);
2110
+                        }
2111
+                        return "NULL";
2112
+                    }
2113
+                    break;
2114
+            }
2115
+        } else {
2116
+            if(!empty($val) && !empty($fieldDef['len']) && strlen($val) > $fieldDef['len']) {
2117
+                $val = $this->truncate($val, $fieldDef['len']);
2118
+            }
2119
+        }
2120
+
2121
+        if ( is_null($val) ) {
2122
+            if(!empty($fieldDef['required'])) {
2123
+                if (isset($fieldDef['default'])  && $fieldDef['default'] != ''){
2124
+                    return $fieldDef['default'];
2125
+                }
2126
+                return $this->emptyValue($type);
2127
+            } else {
2128
+                return "NULL";
2129
+            }
2130
+        }
2131 2131
         if($type == "datetimecombo") {
2132 2132
             $type = "datetime";
2133 2133
         }
2134
-		return $this->convert($this->quoted($val), $type);
2135
-	}
2136
-
2137
-	/**
2138
-	 * Massages the field defintions to fill in anything else the DB backend may add
2139
-	 *
2140
-	 * @param  array  $fieldDef
2141
-	 * @param  string $tablename
2142
-	 * @return array
2143
-	 */
2144
-	public function massageFieldDef(&$fieldDef, $tablename)
2145
-	{
2146
-		if ( !isset($fieldDef['dbType']) ) {
2147
-			if ( isset($fieldDef['dbtype']) )
2148
-				$fieldDef['dbType'] = $fieldDef['dbtype'];
2149
-			else
2150
-				$fieldDef['dbType'] = $fieldDef['type'];
2151
-		}
2152
-		$type = $this->getColumnType($fieldDef['dbType'],$fieldDef['name'],$tablename);
2153
-		$matches = array();
2134
+        return $this->convert($this->quoted($val), $type);
2135
+    }
2136
+
2137
+    /**
2138
+     * Massages the field defintions to fill in anything else the DB backend may add
2139
+     *
2140
+     * @param  array  $fieldDef
2141
+     * @param  string $tablename
2142
+     * @return array
2143
+     */
2144
+    public function massageFieldDef(&$fieldDef, $tablename)
2145
+    {
2146
+        if ( !isset($fieldDef['dbType']) ) {
2147
+            if ( isset($fieldDef['dbtype']) )
2148
+                $fieldDef['dbType'] = $fieldDef['dbtype'];
2149
+            else
2150
+                $fieldDef['dbType'] = $fieldDef['type'];
2151
+        }
2152
+        $type = $this->getColumnType($fieldDef['dbType'],$fieldDef['name'],$tablename);
2153
+        $matches = array();
2154 2154
         // len can be a number or a string like 'max', for example, nvarchar(max)
2155 2155
         preg_match_all('/(\w+)(?:\(([0-9]+,?[0-9]*|\w+)\)|)/i', $type, $matches);
2156
-		if ( isset($matches[1][0]) )
2157
-			$fieldDef['type'] = $matches[1][0];
2158
-		if ( isset($matches[2][0]) && empty($fieldDef['len']) )
2159
-			$fieldDef['len'] = $matches[2][0];
2160
-		if ( !empty($fieldDef['precision']) && is_numeric($fieldDef['precision']) && !strstr($fieldDef['len'],',') )
2161
-			$fieldDef['len'] .= ",{$fieldDef['precision']}";
2162
-		if (!empty($fieldDef['required']) || ($fieldDef['name'] == 'id' && !isset($fieldDef['required'])) ) {
2163
-			$fieldDef['required'] = 'true';
2164
-		}
2165
-	}
2166
-
2167
-	/**
2168
-	 * Take an SQL statement and produce a list of fields used in that select
2169
-	 * @param string $selectStatement
2170
-	 * @return array
2171
-	 */
2172
-	public function getSelectFieldsFromQuery($selectStatement)
2173
-	{
2174
-		$selectStatement = trim($selectStatement);
2175
-		if (strtoupper(substr($selectStatement, 0, 6)) == "SELECT")
2176
-			$selectStatement = trim(substr($selectStatement, 6));
2177
-
2178
-		//Due to sql functions existing in many selects, we can't use php explode
2179
-		$fields = array();
2180
-		$level = 0;
2181
-		$selectField = "";
2182
-		$strLen = strlen($selectStatement);
2183
-		for($i = 0; $i < $strLen; $i++)
2184
-		{
2185
-			$char = $selectStatement[$i];
2186
-
2187
-			if ($char == "," && $level == 0)
2188
-			{
2189
-				$field = $this->getFieldNameFromSelect(trim($selectField));
2190
-				$fields[$field] = $selectField;
2191
-				$selectField = "";
2192
-			}
2193
-			else if ($char == "("){
2194
-				$level++;
2195
-				$selectField .= $char;
2196
-			}
2197
-			else if($char == ")"){
2198
-				$level--;
2199
-				$selectField .= $char;
2200
-
2201
-
2202
-			}else{
2203
-				$selectField .= $char;
2204
-			}
2205
-
2206
-		}
2207
-		$fields[$this->getFieldNameFromSelect($selectField)] = $selectField;
2208
-		return $fields;
2209
-	}
2210
-
2211
-	/**
2212
-	 * returns the field name used in a select
2213
-	 * @param string $string SELECT query
2156
+        if ( isset($matches[1][0]) )
2157
+            $fieldDef['type'] = $matches[1][0];
2158
+        if ( isset($matches[2][0]) && empty($fieldDef['len']) )
2159
+            $fieldDef['len'] = $matches[2][0];
2160
+        if ( !empty($fieldDef['precision']) && is_numeric($fieldDef['precision']) && !strstr($fieldDef['len'],',') )
2161
+            $fieldDef['len'] .= ",{$fieldDef['precision']}";
2162
+        if (!empty($fieldDef['required']) || ($fieldDef['name'] == 'id' && !isset($fieldDef['required'])) ) {
2163
+            $fieldDef['required'] = 'true';
2164
+        }
2165
+    }
2166
+
2167
+    /**
2168
+     * Take an SQL statement and produce a list of fields used in that select
2169
+     * @param string $selectStatement
2170
+     * @return array
2171
+     */
2172
+    public function getSelectFieldsFromQuery($selectStatement)
2173
+    {
2174
+        $selectStatement = trim($selectStatement);
2175
+        if (strtoupper(substr($selectStatement, 0, 6)) == "SELECT")
2176
+            $selectStatement = trim(substr($selectStatement, 6));
2177
+
2178
+        //Due to sql functions existing in many selects, we can't use php explode
2179
+        $fields = array();
2180
+        $level = 0;
2181
+        $selectField = "";
2182
+        $strLen = strlen($selectStatement);
2183
+        for($i = 0; $i < $strLen; $i++)
2184
+        {
2185
+            $char = $selectStatement[$i];
2186
+
2187
+            if ($char == "," && $level == 0)
2188
+            {
2189
+                $field = $this->getFieldNameFromSelect(trim($selectField));
2190
+                $fields[$field] = $selectField;
2191
+                $selectField = "";
2192
+            }
2193
+            else if ($char == "("){
2194
+                $level++;
2195
+                $selectField .= $char;
2196
+            }
2197
+            else if($char == ")"){
2198
+                $level--;
2199
+                $selectField .= $char;
2200
+
2201
+
2202
+            }else{
2203
+                $selectField .= $char;
2204
+            }
2205
+
2206
+        }
2207
+        $fields[$this->getFieldNameFromSelect($selectField)] = $selectField;
2208
+        return $fields;
2209
+    }
2210
+
2211
+    /**
2212
+     * returns the field name used in a select
2213
+     * @param string $string SELECT query
2214 2214
      * @return string
2215 2215
      */
2216
-	protected function getFieldNameFromSelect($string)
2217
-	{
2218
-		if(strncasecmp($string, "DISTINCT ", 9) == 0) {
2219
-			$string = substr($string, 9);
2220
-		}
2221
-		if (stripos($string, " as ") !== false)
2222
-			//"as" used for an alias
2223
-			return trim(substr($string, strripos($string, " as ") + 4));
2224
-		else if (strrpos($string, " ") != 0)
2225
-			//Space used as a delimiter for an alias
2226
-			return trim(substr($string, strrpos($string, " ")));
2227
-		else if (strpos($string, ".") !== false)
2228
-			//No alias, but a table.field format was used
2229
-			return substr($string, strpos($string, ".") + 1);
2230
-		else
2231
-			//Give up and assume the whole thing is the field name
2232
-			return $string;
2233
-	}
2234
-
2235
-	/**
2236
-	 * Generates SQL for delete statement identified by id.
2237
-	 *
2238
-	 * @param  SugarBean $bean SugarBean instance
2239
-	 * @param  array  $where where conditions in an array
2240
-	 * @return string SQL Update Statement
2241
-	 */
2242
-	public function deleteSQL(SugarBean $bean, array $where)
2243
-	{
2244
-		$where = $this->getWhereClause($bean, $this->updateWhereArray($bean, $where));
2245
-		return "UPDATE ".$bean->getTableName()." SET deleted=1 $where";
2246
-	}
2216
+    protected function getFieldNameFromSelect($string)
2217
+    {
2218
+        if(strncasecmp($string, "DISTINCT ", 9) == 0) {
2219
+            $string = substr($string, 9);
2220
+        }
2221
+        if (stripos($string, " as ") !== false)
2222
+            //"as" used for an alias
2223
+            return trim(substr($string, strripos($string, " as ") + 4));
2224
+        else if (strrpos($string, " ") != 0)
2225
+            //Space used as a delimiter for an alias
2226
+            return trim(substr($string, strrpos($string, " ")));
2227
+        else if (strpos($string, ".") !== false)
2228
+            //No alias, but a table.field format was used
2229
+            return substr($string, strpos($string, ".") + 1);
2230
+        else
2231
+            //Give up and assume the whole thing is the field name
2232
+            return $string;
2233
+    }
2234
+
2235
+    /**
2236
+     * Generates SQL for delete statement identified by id.
2237
+     *
2238
+     * @param  SugarBean $bean SugarBean instance
2239
+     * @param  array  $where where conditions in an array
2240
+     * @return string SQL Update Statement
2241
+     */
2242
+    public function deleteSQL(SugarBean $bean, array $where)
2243
+    {
2244
+        $where = $this->getWhereClause($bean, $this->updateWhereArray($bean, $where));
2245
+        return "UPDATE ".$bean->getTableName()." SET deleted=1 $where";
2246
+    }
2247
+
2248
+    /**
2249
+     * Generates SQL for select statement for any bean identified by id.
2250
+     *
2251
+     * @param  SugarBean $bean SugarBean instance
2252
+     * @param  array  $where where conditions in an array
2253
+     * @return string SQL Select Statement
2254
+     */
2255
+    public function retrieveSQL(SugarBean $bean, array $where)
2256
+    {
2257
+        $where = $this->getWhereClause($bean, $this->updateWhereArray($bean, $where));
2258
+        return "SELECT * FROM ".$bean->getTableName()." $where AND deleted=0";
2259
+    }
2260
+
2261
+    /**
2262
+     * This method implements a generic sql for a collection of beans.
2263
+     *
2264
+     * Currently, this function does not support outer joins.
2265
+     *
2266
+     * @param array $beans Array of values returned by get_class method as the keys and a bean as
2267
+     *      the value for that key. These beans will be joined in the sql by the key
2268
+     *      attribute of field defs.
2269
+     * @param  array $cols Optional, columns to be returned with the keys as names of bean
2270
+     *      as identified by get_class of bean. Values of this array is the array of fieldDefs
2271
+     *      to be returned for a bean. If an empty array is passed, all columns are selected.
2272
+     * @param  array $whereClause Optional, values with the keys as names of bean as identified
2273
+     *      by get_class of bean. Each value at the first level is an array of values for that
2274
+     *      bean identified by name of fields. If we want to pass multiple values for a name,
2275
+     *      pass it as an array. If where is not passed, all the rows will be returned.
2276
+     *
2277
+     * @return string SQL Select Statement
2278
+     */
2279
+    public function retrieveViewSQL(array $beans, array $cols = array(), array $whereClause = array())
2280
+    {
2281
+        $relations = array(); // stores relations between tables as they are discovered
2282
+        $where = $select = array();
2283
+        foreach ($beans as $beanID => $bean) {
2284
+            $tableName = $bean->getTableName();
2285
+            $beanTables[$beanID] = $tableName;
2286
+
2287
+            $table = $beanID;
2288
+            $tables[$table] = $tableName;
2289
+            $aliases[$tableName][] = $table;
2290
+
2291
+            // build part of select for this table
2292
+            if (is_array($cols[$beanID]))
2293
+                foreach ($cols[$beanID] as $def) $select[] = $table.".".$def['name'];
2294
+
2295
+            // build part of where clause
2296
+            if (is_array($whereClause[$beanID])){
2297
+                $where[] = $this->getColumnWhereClause($table, $whereClause[$beanID]);
2298
+            }
2299
+            // initialize so that it can be used properly in form clause generation
2300
+            $table_used_in_from[$table] = false;
2301
+
2302
+            $indices = $bean->getIndices();
2303
+            foreach ($indices as $index){
2304
+                if ($index['type'] == 'foreign') {
2305
+                    $relationship[$table][] = array('foreignTable'=> $index['foreignTable']
2306
+                                                ,'foreignColumn'=>$index['foreignField']
2307
+                                                ,'localColumn'=> $index['fields']
2308
+                                                );
2309
+                }
2310
+            }
2311
+            $where[] = " $table.deleted = 0";
2312
+        }
2313
+
2314
+        // join these clauses
2315
+        $select = !empty($select) ? implode(",", $select) : "*";
2316
+        $where = implode(" AND ", $where);
2317
+
2318
+        // generate the from clause. Use relations array to generate outer joins
2319
+        // all the rest of the tables will be used as a simple from
2320
+        // relations table define relations between table1 and table2 through column on table 1
2321
+        // table2 is assumed to joining through primary key called id
2322
+        $separator = "";
2323
+        $from = ''; $table_used_in_from = array();
2324
+        foreach ($relations as $table1 => $rightsidearray){
2325
+            if ($table_used_in_from[$table1]) continue; // table has been joined
2326
+
2327
+            $from .= $separator." ".$table1;
2328
+            $table_used_in_from[$table1] = true;
2329
+            foreach ($rightsidearray as $tablearray){
2330
+                $table2 = $tablearray['foreignTable']; // get foreign table
2331
+                $tableAlias = $aliases[$table2]; // get a list of aliases for this table
2332
+                foreach ($tableAlias as $table2) {
2333
+                    //choose first alias that does not match
2334
+                    // we are doing this because of self joins.
2335
+                    // in case of self joins, the same table will have many aliases.
2336
+                    if ($table2 != $table1) break;
2337
+                }
2338
+
2339
+                $col = $tablearray['foreingColumn'];
2340
+                $name = $tablearray['localColumn'];
2341
+                $from .= " LEFT JOIN $table on ($table1.$name = $table2.$col)";
2342
+                $table_used_in_from[$table2] = true;
2343
+            }
2344
+            $separator = ",";
2345
+        }
2346
+
2347
+        return "SELECT $select FROM $from WHERE $where";
2348
+    }
2349
+
2350
+    /**
2351
+     * Generates SQL for create index statement for a bean.
2352
+     *
2353
+     * @param  SugarBean $bean SugarBean instance
2354
+     * @param  array  $fields fields used in the index
2355
+     * @param  string $name index name
2356
+     * @param  bool   $unique Optional, set to true if this is an unique index
2357
+     * @return string SQL Select Statement
2358
+     */
2359
+    public function createIndexSQL(SugarBean $bean, array $fields, $name, $unique = true)
2360
+    {
2361
+        $unique = ($unique) ? "unique" : "";
2362
+        $tablename = $bean->getTableName();
2363
+        $columns = array();
2364
+        // get column names
2365
+        foreach ($fields as $fieldDef)
2366
+            $columns[] = $fieldDef['name'];
2367
+
2368
+        if (empty($columns))
2369
+            return "";
2370
+
2371
+        $columns = implode(",", $columns);
2372
+
2373
+        return "CREATE $unique INDEX $name ON $tablename ($columns)";
2374
+    }
2375
+
2376
+    /**
2377
+     * Returns the type of the variable in the field
2378
+     *
2379
+     * @param  array $fieldDef Vardef-format field def
2380
+     * @return string
2381
+     */
2382
+    public function getFieldType($fieldDef)
2383
+    {
2384
+        // get the type for db type. if that is not set,
2385
+        // get it from type. This is done so that
2386
+        // we do not have change a lot of existing code
2387
+        // and add dbtype where type is being used for some special
2388
+        // purposes like referring to foreign table etc.
2389
+        if(!empty($fieldDef['dbType']))
2390
+            return  $fieldDef['dbType'];
2391
+        if(!empty($fieldDef['dbtype']))
2392
+            return  $fieldDef['dbtype'];
2393
+        if (!empty($fieldDef['type']))
2394
+            return  $fieldDef['type'];
2395
+        if (!empty($fieldDef['Type']))
2396
+            return  $fieldDef['Type'];
2397
+        if (!empty($fieldDef['data_type']))
2398
+            return  $fieldDef['data_type'];
2399
+
2400
+        return null;
2401
+    }
2402
+
2403
+    /**
2404
+     * retrieves the different components from the passed column type as it is used in the type mapping and vardefs
2405
+     * type format: <baseType>[(<len>[,<scale>])]
2406
+     * @param string $type Column type
2407
+     * @return array|bool array containing the different components of the passed in type or false in case the type contains illegal characters
2408
+     */
2409
+    public function getTypeParts($type)
2410
+    {
2411
+        if(preg_match("#(?P<type>\w+)\s*(?P<arg>\((?P<len>\w+)\s*(,\s*(?P<scale>\d+))*\))*#", $type, $matches))
2412
+        {
2413
+            $return = array();  // Not returning matches array as such as we don't want to expose the regex make up on the interface
2414
+            $return['baseType'] = $matches['type'];
2415
+            if( isset($matches['arg'])) {
2416
+                $return['arg'] = $matches['arg'];
2417
+            }
2418
+            if( isset($matches['len'])) {
2419
+                $return['len'] = $matches['len'];
2420
+            }
2421
+            if( isset($matches['scale'])) {
2422
+                $return['scale'] = $matches['scale'];
2423
+            }
2424
+            return $return;
2425
+        } else {
2426
+            return false;
2427
+        }
2428
+    }
2429
+
2430
+    /**
2431
+     * Returns the defintion for a single column
2432
+     *
2433
+     * @param  array  $fieldDef Vardef-format field def
2434
+     * @param  bool   $ignoreRequired  Optional, true if we should ignore this being a required field
2435
+     * @param  string $table           Optional, table name
2436
+     * @param  bool   $return_as_array Optional, true if we should return the result as an array instead of sql
2437
+     * @return string or array if $return_as_array is true
2438
+     */
2439
+    protected function oneColumnSQLRep($fieldDef, $ignoreRequired = false, $table = '', $return_as_array = false)
2440
+    {
2441
+        $name = $fieldDef['name'];
2442
+        $type = $this->getFieldType($fieldDef);
2443
+        $colType = $this->getColumnType($type);
2444
+
2445
+        if($parts = $this->getTypeParts($colType))
2446
+        {
2447
+            $colBaseType = $parts['baseType'];
2448
+            $defLen =  isset($parts['len']) ? $parts['len'] : '255'; // Use the mappings length (precision) as default if it exists
2449
+        }
2450
+
2451
+        if(!empty($fieldDef['len'])) {
2452
+            if (in_array($colBaseType, array( 'nvarchar', 'nchar', 'varchar', 'varchar2', 'char',
2453
+                                            'clob', 'blob', 'text'))) {
2454
+                    $colType = "$colBaseType(${fieldDef['len']})";
2455
+            } elseif(($colBaseType == 'decimal' || $colBaseType == 'float')){
2456
+                    if(!empty($fieldDef['precision']) && is_numeric($fieldDef['precision']))
2457
+                        if(strpos($fieldDef['len'],',') === false){
2458
+                            $colType = $colBaseType . "(".$fieldDef['len'].",".$fieldDef['precision'].")";
2459
+                        }else{
2460
+                            $colType = $colBaseType . "(".$fieldDef['len'].")";
2461
+                        }
2462
+                    else
2463
+                            $colType = $colBaseType . "(".$fieldDef['len'].")";
2464
+                }
2465
+        } else {
2466
+            if (in_array($colBaseType, array( 'nvarchar', 'nchar', 'varchar', 'varchar2', 'char'))) {
2467
+                $colType = "$colBaseType($defLen)";
2468
+            }
2469
+        }
2470
+
2471
+        $default = '';
2472
+
2473
+        // Bug #52610 We should have ability don't add DEFAULT part to query for boolean fields
2474
+        if (!empty($fieldDef['no_default']))
2475
+        {
2476
+            // nothing to do
2477
+        }
2478
+        elseif (isset($fieldDef['default']) && strlen($fieldDef['default']) > 0)
2479
+        {
2480
+            $default = " DEFAULT ".$this->quoted($fieldDef['default']);
2481
+        }
2482
+        elseif (!isset($default) && $type == 'bool')
2483
+        {
2484
+            $default = " DEFAULT 0 ";
2485
+        }
2486
+
2487
+        $auto_increment = '';
2488
+        if(!empty($fieldDef['auto_increment']) && $fieldDef['auto_increment'])
2489
+            $auto_increment = $this->setAutoIncrement($table , $fieldDef['name']);
2490
+
2491
+        $required = 'NULL';  // MySQL defaults to NULL, SQL Server defaults to NOT NULL -- must specify
2492
+        //Starting in 6.0, only ID and auto_increment fields will be NOT NULL in the DB.
2493
+        if ((empty($fieldDef['isnull']) || strtolower($fieldDef['isnull']) == 'false') &&
2494
+            (!empty($auto_increment) || $name == 'id' || ($fieldDef['type'] == 'id' && !empty($fieldDef['required'])))) {
2495
+            $required =  "NOT NULL";
2496
+        }
2497
+        // If the field is marked both required & isnull=>false - alwqys make it not null
2498
+        // Use this to ensure primary key fields never defined as null
2499
+        if(isset($fieldDef['isnull']) && (strtolower($fieldDef['isnull']) == 'false' || $fieldDef['isnull'] === false)
2500
+            && !empty($fieldDef['required'])) {
2501
+            $required =  "NOT NULL";
2502
+        }
2503
+        if ($ignoreRequired)
2504
+            $required = "";
2505
+
2506
+        if ( $return_as_array ) {
2507
+            return array(
2508
+                'name' => $name,
2509
+                'colType' => $colType,
2510
+                'colBaseType' => $colBaseType,  // Adding base type for easier processing in derived classes
2511
+                'default' => $default,
2512
+                'required' => $required,
2513
+                'auto_increment' => $auto_increment,
2514
+                'full' => "$name $colType $default $required $auto_increment",
2515
+                );
2516
+        } else {
2517
+            return "$name $colType $default $required $auto_increment";
2518
+        }
2519
+    }
2520
+
2521
+    /**
2522
+     * Returns SQL defintions for all columns in a table
2523
+     *
2524
+     * @param  array  $fieldDefs  Vardef-format field def
2525
+     * @param  bool   $ignoreRequired Optional, true if we should ignor this being a required field
2526
+     * @param  string $tablename      Optional, table name
2527
+     * @return string SQL column definitions
2528
+     */
2529
+    protected function columnSQLRep($fieldDefs, $ignoreRequired = false, $tablename)
2530
+    {
2531
+        $columns = array();
2532
+
2533
+        if ($this->isFieldArray($fieldDefs)) {
2534
+            foreach ($fieldDefs as $fieldDef) {
2535
+                if(!isset($fieldDef['source']) || $fieldDef['source'] == 'db') {
2536
+                    $columns[] = $this->oneColumnSQLRep($fieldDef,false, $tablename);
2537
+                }
2538
+            }
2539
+            $columns = implode(",", $columns);
2540
+        }
2541
+        else {
2542
+            $columns = $this->oneColumnSQLRep($fieldDefs,$ignoreRequired, $tablename);
2543
+        }
2544
+
2545
+        return $columns;
2546
+    }
2547
+
2548
+    /**
2549
+     * Returns the next value for an auto increment
2550
+     * @abstract
2551
+     * @param  string $table Table name
2552
+     * @param  string $field_name Field name
2553
+     * @return string
2554
+     */
2555
+    public function getAutoIncrement($table, $field_name)
2556
+    {
2557
+        return "";
2558
+    }
2559
+
2560
+    /**
2561
+     * Returns the sql for the next value in a sequence
2562
+     * @abstract
2563
+     * @param  string $table  Table name
2564
+     * @param  string $field_name  Field name
2565
+     * @return string
2566
+     */
2567
+    public function getAutoIncrementSQL($table, $field_name)
2568
+    {
2569
+        return "";
2570
+    }
2571
+
2572
+    /**
2573
+     * Either creates an auto increment through queries or returns sql for auto increment
2574
+     * that can be appended to the end of column defination (mysql)
2575
+     * @abstract
2576
+     * @param  string $table Table name
2577
+     * @param  string $field_name Field name
2578
+     * @return string
2579
+     */
2580
+    protected function setAutoIncrement($table, $field_name)
2581
+    {
2582
+        $this->deleteAutoIncrement($table, $field_name);
2583
+        return "";
2584
+    }
2585
+
2586
+    /**
2587
+     * Sets the next auto-increment value of a column to a specific value.
2588
+     * @abstract
2589
+     * @param  string $table Table name
2590
+     * @param  string $field_name Field name
2591
+     * @param  int $start_value  Starting autoincrement value
2592
+     * @return string
2593
+     *
2594
+     */
2595
+    public function setAutoIncrementStart($table, $field_name, $start_value)
2596
+    {
2597
+        return "";
2598
+    }
2599
+
2600
+    /**
2601
+     * Deletes an auto increment
2602
+     * @abstract
2603
+     * @param string $table tablename
2604
+     * @param string $field_name
2605
+     */
2606
+    public function deleteAutoIncrement($table, $field_name)
2607
+    {
2608
+        return;
2609
+    }
2610
+
2611
+    /**
2612
+     * This method generates sql for adding a column to table identified by field def.
2613
+     *
2614
+     * @param  string $tablename
2615
+     * @param  array  $fieldDefs
2616
+     * @return string SQL statement
2617
+     */
2618
+    public function addColumnSQL($tablename, $fieldDefs)
2619
+    {
2620
+        return $this->changeColumnSQL($tablename, $fieldDefs, 'add');
2621
+    }
2622
+
2623
+    /**
2624
+     * This method genrates sql for altering old column identified by oldFieldDef to new fieldDef.
2625
+     *
2626
+     * @param  string $tablename
2627
+     * @param  array  $newFieldDefs
2628
+     * @param  bool  $ignorerequired Optional, true if we should ignor this being a required field
2629
+     * @return string|array SQL statement(s)
2630
+     */
2631
+    public function alterColumnSQL($tablename, $newFieldDefs, $ignorerequired = false)
2632
+    {
2633
+        return $this->changeColumnSQL($tablename, $newFieldDefs, 'modify', $ignorerequired);
2634
+    }
2247 2635
 
2248 2636
     /**
2249
-     * Generates SQL for select statement for any bean identified by id.
2637
+     * Generates SQL for dropping a table.
2250 2638
      *
2251
-     * @param  SugarBean $bean SugarBean instance
2252
-     * @param  array  $where where conditions in an array
2253
-     * @return string SQL Select Statement
2639
+     * @param  SugarBean $bean Sugarbean instance
2640
+     * @return string SQL statement
2254 2641
      */
2255
-	public function retrieveSQL(SugarBean $bean, array $where)
2256
-	{
2257
-		$where = $this->getWhereClause($bean, $this->updateWhereArray($bean, $where));
2258
-		return "SELECT * FROM ".$bean->getTableName()." $where AND deleted=0";
2259
-	}
2642
+    public function dropTableSQL(SugarBean $bean)
2643
+    {
2644
+        return $this->dropTableNameSQL($bean->getTableName());
2645
+    }
2260 2646
 
2261 2647
     /**
2262
-     * This method implements a generic sql for a collection of beans.
2648
+     * Generates SQL for dropping a table.
2263 2649
      *
2264
-     * Currently, this function does not support outer joins.
2650
+     * @param  string $name table name
2651
+     * @return string SQL statement
2652
+     */
2653
+    public function dropTableNameSQL($name)
2654
+    {
2655
+        return "DROP TABLE ".$name;
2656
+    }
2657
+
2658
+    /**
2659
+     * Generates SQL for truncating a table.
2660
+     * @param  string $name  table name
2661
+     * @return string
2662
+     */
2663
+    public function truncateTableSQL($name)
2664
+    {
2665
+        return "TRUNCATE $name";
2666
+    }
2667
+
2668
+    /**
2669
+     * This method generates sql that deletes a column identified by fieldDef.
2265 2670
      *
2266
-     * @param array $beans Array of values returned by get_class method as the keys and a bean as
2267
-     *      the value for that key. These beans will be joined in the sql by the key
2268
-     *      attribute of field defs.
2269
-     * @param  array $cols Optional, columns to be returned with the keys as names of bean
2270
-     *      as identified by get_class of bean. Values of this array is the array of fieldDefs
2271
-     *      to be returned for a bean. If an empty array is passed, all columns are selected.
2272
-     * @param  array $whereClause Optional, values with the keys as names of bean as identified
2273
-     *      by get_class of bean. Each value at the first level is an array of values for that
2274
-     *      bean identified by name of fields. If we want to pass multiple values for a name,
2275
-     *      pass it as an array. If where is not passed, all the rows will be returned.
2671
+     * @param  SugarBean $bean      Sugarbean instance
2672
+     * @param  array  $fieldDefs
2673
+     * @return string SQL statement
2674
+     */
2675
+    public function deleteColumnSQL(SugarBean $bean, $fieldDefs)
2676
+    {
2677
+        return $this->dropColumnSQL($bean->getTableName(), $fieldDefs);
2678
+    }
2679
+
2680
+    /**
2681
+     * This method generates sql that drops a column identified by fieldDef.
2682
+     * Designed to work like the other addColumnSQL() and alterColumnSQL() functions
2276 2683
      *
2277
-     * @return string SQL Select Statement
2684
+     * @param  string $tablename
2685
+     * @param  array  $fieldDefs
2686
+     * @return string SQL statement
2278 2687
      */
2279
-	public function retrieveViewSQL(array $beans, array $cols = array(), array $whereClause = array())
2280
-	{
2281
-		$relations = array(); // stores relations between tables as they are discovered
2282
-		$where = $select = array();
2283
-		foreach ($beans as $beanID => $bean) {
2284
-			$tableName = $bean->getTableName();
2285
-			$beanTables[$beanID] = $tableName;
2286
-
2287
-			$table = $beanID;
2288
-			$tables[$table] = $tableName;
2289
-			$aliases[$tableName][] = $table;
2290
-
2291
-			// build part of select for this table
2292
-			if (is_array($cols[$beanID]))
2293
-				foreach ($cols[$beanID] as $def) $select[] = $table.".".$def['name'];
2294
-
2295
-			// build part of where clause
2296
-			if (is_array($whereClause[$beanID])){
2297
-				$where[] = $this->getColumnWhereClause($table, $whereClause[$beanID]);
2298
-			}
2299
-			// initialize so that it can be used properly in form clause generation
2300
-			$table_used_in_from[$table] = false;
2301
-
2302
-			$indices = $bean->getIndices();
2303
-			foreach ($indices as $index){
2304
-				if ($index['type'] == 'foreign') {
2305
-					$relationship[$table][] = array('foreignTable'=> $index['foreignTable']
2306
-												,'foreignColumn'=>$index['foreignField']
2307
-												,'localColumn'=> $index['fields']
2308
-												);
2309
-				}
2310
-			}
2311
-			$where[] = " $table.deleted = 0";
2312
-		}
2313
-
2314
-		// join these clauses
2315
-		$select = !empty($select) ? implode(",", $select) : "*";
2316
-		$where = implode(" AND ", $where);
2317
-
2318
-		// generate the from clause. Use relations array to generate outer joins
2319
-		// all the rest of the tables will be used as a simple from
2320
-		// relations table define relations between table1 and table2 through column on table 1
2321
-		// table2 is assumed to joining through primary key called id
2322
-		$separator = "";
2323
-		$from = ''; $table_used_in_from = array();
2324
-		foreach ($relations as $table1 => $rightsidearray){
2325
-			if ($table_used_in_from[$table1]) continue; // table has been joined
2326
-
2327
-			$from .= $separator." ".$table1;
2328
-			$table_used_in_from[$table1] = true;
2329
-			foreach ($rightsidearray as $tablearray){
2330
-				$table2 = $tablearray['foreignTable']; // get foreign table
2331
-				$tableAlias = $aliases[$table2]; // get a list of aliases for this table
2332
-				foreach ($tableAlias as $table2) {
2333
-					//choose first alias that does not match
2334
-					// we are doing this because of self joins.
2335
-					// in case of self joins, the same table will have many aliases.
2336
-					if ($table2 != $table1) break;
2337
-				}
2338
-
2339
-				$col = $tablearray['foreingColumn'];
2340
-				$name = $tablearray['localColumn'];
2341
-				$from .= " LEFT JOIN $table on ($table1.$name = $table2.$col)";
2342
-				$table_used_in_from[$table2] = true;
2343
-			}
2344
-			$separator = ",";
2345
-		}
2346
-
2347
-		return "SELECT $select FROM $from WHERE $where";
2348
-	}
2349
-
2350
-	/**
2351
-	 * Generates SQL for create index statement for a bean.
2352
-	 *
2353
-	 * @param  SugarBean $bean SugarBean instance
2354
-	 * @param  array  $fields fields used in the index
2355
-	 * @param  string $name index name
2356
-	 * @param  bool   $unique Optional, set to true if this is an unique index
2357
-	 * @return string SQL Select Statement
2358
-	 */
2359
-	public function createIndexSQL(SugarBean $bean, array $fields, $name, $unique = true)
2360
-	{
2361
-		$unique = ($unique) ? "unique" : "";
2362
-		$tablename = $bean->getTableName();
2363
-		$columns = array();
2364
-		// get column names
2365
-		foreach ($fields as $fieldDef)
2366
-			$columns[] = $fieldDef['name'];
2367
-
2368
-		if (empty($columns))
2369
-			return "";
2370
-
2371
-		$columns = implode(",", $columns);
2372
-
2373
-		return "CREATE $unique INDEX $name ON $tablename ($columns)";
2374
-	}
2375
-
2376
-	/**
2377
-	 * Returns the type of the variable in the field
2378
-	 *
2379
-	 * @param  array $fieldDef Vardef-format field def
2380
-	 * @return string
2381
-	 */
2382
-	public function getFieldType($fieldDef)
2383
-	{
2384
-		// get the type for db type. if that is not set,
2385
-		// get it from type. This is done so that
2386
-		// we do not have change a lot of existing code
2387
-		// and add dbtype where type is being used for some special
2388
-		// purposes like referring to foreign table etc.
2389
-		if(!empty($fieldDef['dbType']))
2390
-			return  $fieldDef['dbType'];
2391
-		if(!empty($fieldDef['dbtype']))
2392
-			return  $fieldDef['dbtype'];
2393
-		if (!empty($fieldDef['type']))
2394
-			return  $fieldDef['type'];
2395
-		if (!empty($fieldDef['Type']))
2396
-			return  $fieldDef['Type'];
2397
-		if (!empty($fieldDef['data_type']))
2398
-			return  $fieldDef['data_type'];
2399
-
2400
-		return null;
2401
-	}
2688
+    public function dropColumnSQL($tablename, $fieldDefs)
2689
+    {
2690
+        return $this->changeColumnSQL($tablename, $fieldDefs, 'drop');
2691
+    }
2402 2692
 
2403 2693
     /**
2404
-     * retrieves the different components from the passed column type as it is used in the type mapping and vardefs
2405
-     * type format: <baseType>[(<len>[,<scale>])]
2406
-     * @param string $type Column type
2407
-     * @return array|bool array containing the different components of the passed in type or false in case the type contains illegal characters
2694
+     * Return a version of $proposed that can be used as a column name in any of our supported databases
2695
+     * Practically this means no longer than 25 characters as the smallest identifier length for our supported DBs is 30 chars for Oracle plus we add on at least four characters in some places (for indicies for example)
2696
+     * @param string|array $name Proposed name for the column
2697
+     * @param bool|string $ensureUnique Ensure the name is unique
2698
+     * @param string $type Name type (table, column)
2699
+     * @param bool $force Force new name
2700
+     * @return string|array Valid column name trimmed to right length and with invalid characters removed
2408 2701
      */
2409
-    public function getTypeParts($type)
2702
+    public function getValidDBName($name, $ensureUnique = false, $type = 'column', $force = false)
2410 2703
     {
2411
-        if(preg_match("#(?P<type>\w+)\s*(?P<arg>\((?P<len>\w+)\s*(,\s*(?P<scale>\d+))*\))*#", $type, $matches))
2412
-        {
2413
-            $return = array();  // Not returning matches array as such as we don't want to expose the regex make up on the interface
2414
-            $return['baseType'] = $matches['type'];
2415
-            if( isset($matches['arg'])) {
2416
-                $return['arg'] = $matches['arg'];
2704
+        if(is_array($name)) {
2705
+            $result = array();
2706
+            foreach($name as $field) {
2707
+                $result[] = $this->getValidDBName($field, $ensureUnique, $type);
2417 2708
             }
2418
-            if( isset($matches['len'])) {
2419
-                $return['len'] = $matches['len'];
2709
+            return $result;
2710
+        } else {
2711
+            if(strchr($name, ".")) {
2712
+                // this is a compound name with dots, handle separately
2713
+                $parts = explode(".", $name);
2714
+                if(count($parts) > 2) {
2715
+                    // some weird name, cut to table.name
2716
+                    array_splice($parts, 0, count($parts)-2);
2717
+                }
2718
+                $parts = $this->getValidDBName($parts, $ensureUnique, $type, $force);
2719
+                return join(".", $parts);
2420 2720
             }
2421
-            if( isset($matches['scale'])) {
2422
-                $return['scale'] = $matches['scale'];
2721
+            // first strip any invalid characters - all but word chars (which is alphanumeric and _)
2722
+            $name = preg_replace( '/[^\w]+/i', '', $name ) ;
2723
+            $len = strlen( $name ) ;
2724
+            $maxLen = empty($this->maxNameLengths[$type]) ? $this->maxNameLengths[$type]['column'] : $this->maxNameLengths[$type];
2725
+            if ($len <= $maxLen && !$force) {
2726
+                return strtolower($name);
2727
+            }
2728
+            if ($ensureUnique) {
2729
+                $md5str = md5($name);
2730
+                $tail = substr ( $name, -11) ;
2731
+                $temp = substr($md5str , strlen($md5str)-4 );
2732
+                $result = substr( $name, 0, 10) . $temp . $tail ;
2733
+            } else {
2734
+                $result = substr( $name, 0, 11) . substr( $name, 11 - $maxLen);
2423 2735
             }
2424
-            return $return;
2425
-        } else {
2426
-            return false;
2427
-        }
2428
-    }
2429
-
2430
-	/**
2431
-	 * Returns the defintion for a single column
2432
-	 *
2433
-	 * @param  array  $fieldDef Vardef-format field def
2434
-	 * @param  bool   $ignoreRequired  Optional, true if we should ignore this being a required field
2435
-	 * @param  string $table           Optional, table name
2436
-	 * @param  bool   $return_as_array Optional, true if we should return the result as an array instead of sql
2437
-	 * @return string or array if $return_as_array is true
2438
-	 */
2439
-	protected function oneColumnSQLRep($fieldDef, $ignoreRequired = false, $table = '', $return_as_array = false)
2440
-	{
2441
-		$name = $fieldDef['name'];
2442
-		$type = $this->getFieldType($fieldDef);
2443
-        $colType = $this->getColumnType($type);
2444 2736
 
2445
-        if($parts = $this->getTypeParts($colType))
2446
-        {
2447
-            $colBaseType = $parts['baseType'];
2448
-            $defLen =  isset($parts['len']) ? $parts['len'] : '255'; // Use the mappings length (precision) as default if it exists
2737
+            return strtolower( $result ) ;
2449 2738
         }
2739
+    }
2450 2740
 
2451
-        if(!empty($fieldDef['len'])) {
2452
-            if (in_array($colBaseType, array( 'nvarchar', 'nchar', 'varchar', 'varchar2', 'char',
2453
-                                          'clob', 'blob', 'text'))) {
2454
-          	    $colType = "$colBaseType(${fieldDef['len']})";
2455
-            } elseif(($colBaseType == 'decimal' || $colBaseType == 'float')){
2456
-                  if(!empty($fieldDef['precision']) && is_numeric($fieldDef['precision']))
2457
-                      if(strpos($fieldDef['len'],',') === false){
2458
-                          $colType = $colBaseType . "(".$fieldDef['len'].",".$fieldDef['precision'].")";
2459
-                      }else{
2460
-                          $colType = $colBaseType . "(".$fieldDef['len'].")";
2461
-                      }
2462
-                  else
2463
-                          $colType = $colBaseType . "(".$fieldDef['len'].")";
2464
-              }
2465
-        } else {
2466
-            if (in_array($colBaseType, array( 'nvarchar', 'nchar', 'varchar', 'varchar2', 'char'))) {
2467
-                $colType = "$colBaseType($defLen)";
2468
-            }
2469
-        }
2741
+    /**
2742
+     * Returns the valid type for a column given the type in fieldDef
2743
+     *
2744
+     * @param  string $type field type
2745
+     * @return string valid type for the given field
2746
+     */
2747
+    public function getColumnType($type)
2748
+    {
2749
+        return isset($this->type_map[$type])?$this->type_map[$type]:$type;
2750
+    }
2470 2751
 
2471
-        $default = '';
2752
+    /**
2753
+     * Checks to see if passed array is truely an array of defitions
2754
+     *
2755
+     * Such an array may have type as a key but it will point to an array
2756
+     * for a true array of definitions an to a col type for a definition only
2757
+     *
2758
+     * @param  mixed $defArray
2759
+     * @return bool
2760
+     */
2761
+    public function isFieldArray($defArray)
2762
+    {
2763
+        if ( !is_array($defArray) )
2764
+            return false;
2472 2765
 
2473
-        // Bug #52610 We should have ability don't add DEFAULT part to query for boolean fields
2474
-        if (!empty($fieldDef['no_default']))
2475
-        {
2476
-            // nothing to do
2477
-        }
2478
-        elseif (isset($fieldDef['default']) && strlen($fieldDef['default']) > 0)
2479
-        {
2480
-            $default = " DEFAULT ".$this->quoted($fieldDef['default']);
2481
-        }
2482
-        elseif (!isset($default) && $type == 'bool')
2483
-        {
2484
-            $default = " DEFAULT 0 ";
2766
+        if ( isset($defArray['type']) ){
2767
+            // type key exists. May be an array of defs or a simple definition
2768
+            return is_array($defArray['type']); // type is not an array => definition else array
2485 2769
         }
2486 2770
 
2487
-		$auto_increment = '';
2488
-		if(!empty($fieldDef['auto_increment']) && $fieldDef['auto_increment'])
2489
-			$auto_increment = $this->setAutoIncrement($table , $fieldDef['name']);
2490
-
2491
-		$required = 'NULL';  // MySQL defaults to NULL, SQL Server defaults to NOT NULL -- must specify
2492
-		//Starting in 6.0, only ID and auto_increment fields will be NOT NULL in the DB.
2493
-		if ((empty($fieldDef['isnull']) || strtolower($fieldDef['isnull']) == 'false') &&
2494
-			(!empty($auto_increment) || $name == 'id' || ($fieldDef['type'] == 'id' && !empty($fieldDef['required'])))) {
2495
-			$required =  "NOT NULL";
2496
-		}
2497
-		// If the field is marked both required & isnull=>false - alwqys make it not null
2498
-		// Use this to ensure primary key fields never defined as null
2499
-		if(isset($fieldDef['isnull']) && (strtolower($fieldDef['isnull']) == 'false' || $fieldDef['isnull'] === false)
2500
-			&& !empty($fieldDef['required'])) {
2501
-			$required =  "NOT NULL";
2502
-		}
2503
-		if ($ignoreRequired)
2504
-			$required = "";
2505
-
2506
-		if ( $return_as_array ) {
2507
-			return array(
2508
-				'name' => $name,
2509
-				'colType' => $colType,
2510
-                'colBaseType' => $colBaseType,  // Adding base type for easier processing in derived classes
2511
-				'default' => $default,
2512
-				'required' => $required,
2513
-				'auto_increment' => $auto_increment,
2514
-				'full' => "$name $colType $default $required $auto_increment",
2515
-				);
2516
-		} else {
2517
-			return "$name $colType $default $required $auto_increment";
2518
-		}
2519
-	}
2520
-
2521
-	/**
2522
-	 * Returns SQL defintions for all columns in a table
2523
-	 *
2524
-	 * @param  array  $fieldDefs  Vardef-format field def
2525
-	 * @param  bool   $ignoreRequired Optional, true if we should ignor this being a required field
2526
-	 * @param  string $tablename      Optional, table name
2527
-	 * @return string SQL column definitions
2528
-	 */
2529
-	protected function columnSQLRep($fieldDefs, $ignoreRequired = false, $tablename)
2530
-	{
2531
-		$columns = array();
2532
-
2533
-		if ($this->isFieldArray($fieldDefs)) {
2534
-			foreach ($fieldDefs as $fieldDef) {
2535
-				if(!isset($fieldDef['source']) || $fieldDef['source'] == 'db') {
2536
-					$columns[] = $this->oneColumnSQLRep($fieldDef,false, $tablename);
2537
-				}
2538
-			}
2539
-			$columns = implode(",", $columns);
2540
-		}
2541
-		else {
2542
-			$columns = $this->oneColumnSQLRep($fieldDefs,$ignoreRequired, $tablename);
2543
-		}
2544
-
2545
-		return $columns;
2546
-	}
2547
-
2548
-	/**
2549
-	 * Returns the next value for an auto increment
2550
-	 * @abstract
2551
-	 * @param  string $table Table name
2552
-	 * @param  string $field_name Field name
2553
-	 * @return string
2554
-	 */
2555
-	public function getAutoIncrement($table, $field_name)
2556
-	{
2557
-		return "";
2558
-	}
2559
-
2560
-	/**
2561
-	 * Returns the sql for the next value in a sequence
2562
-	 * @abstract
2563
-	 * @param  string $table  Table name
2564
-	 * @param  string $field_name  Field name
2565
-	 * @return string
2566
-	 */
2567
-	public function getAutoIncrementSQL($table, $field_name)
2568
-	{
2569
-		return "";
2570
-	}
2571
-
2572
-	/**
2573
-	 * Either creates an auto increment through queries or returns sql for auto increment
2574
-	 * that can be appended to the end of column defination (mysql)
2575
-	 * @abstract
2576
-	 * @param  string $table Table name
2577
-	 * @param  string $field_name Field name
2578
-	 * @return string
2579
-	 */
2580
-	protected function setAutoIncrement($table, $field_name)
2581
-	{
2582
-		$this->deleteAutoIncrement($table, $field_name);
2583
-		return "";
2584
-	}
2771
+        // type does not exist. Must be array of definitions
2772
+        return true;
2773
+    }
2585 2774
 
2586 2775
     /**
2587
-     * Sets the next auto-increment value of a column to a specific value.
2588
-     * @abstract
2589
-     * @param  string $table Table name
2590
-     * @param  string $field_name Field name
2591
-     * @param  int $start_value  Starting autoincrement value
2592
-     * @return string
2776
+     * returns true if the type can be mapped to a valid column type
2593 2777
      *
2778
+     * @param  string $type
2779
+     * @return bool
2594 2780
      */
2595
-	public function setAutoIncrementStart($table, $field_name, $start_value)
2596
-	{
2597
-		return "";
2598
-	}
2599
-
2600
-	/**
2601
-	 * Deletes an auto increment
2602
-	 * @abstract
2603
-	 * @param string $table tablename
2604
-	 * @param string $field_name
2605
-	 */
2606
-	public function deleteAutoIncrement($table, $field_name)
2607
-	{
2608
-		return;
2609
-	}
2610
-
2611
-	/**
2612
-	 * This method generates sql for adding a column to table identified by field def.
2613
-	 *
2614
-	 * @param  string $tablename
2615
-	 * @param  array  $fieldDefs
2616
-	 * @return string SQL statement
2617
-	 */
2618
-	public function addColumnSQL($tablename, $fieldDefs)
2619
-	{
2620
-	    return $this->changeColumnSQL($tablename, $fieldDefs, 'add');
2621
-	}
2622
-
2623
-	/**
2624
-	 * This method genrates sql for altering old column identified by oldFieldDef to new fieldDef.
2625
-	 *
2626
-	 * @param  string $tablename
2627
-	 * @param  array  $newFieldDefs
2628
-	 * @param  bool  $ignorerequired Optional, true if we should ignor this being a required field
2629
-	 * @return string|array SQL statement(s)
2630
-	 */
2631
-	public function alterColumnSQL($tablename, $newFieldDefs, $ignorerequired = false)
2632
-	{
2633
-		return $this->changeColumnSQL($tablename, $newFieldDefs, 'modify', $ignorerequired);
2634
-	}
2635
-
2636
-	/**
2637
-	 * Generates SQL for dropping a table.
2638
-	 *
2639
-	 * @param  SugarBean $bean Sugarbean instance
2640
-	 * @return string SQL statement
2641
-	 */
2642
-	public function dropTableSQL(SugarBean $bean)
2643
-	{
2644
-		return $this->dropTableNameSQL($bean->getTableName());
2645
-	}
2646
-
2647
-	/**
2648
-	 * Generates SQL for dropping a table.
2649
-	 *
2650
-	 * @param  string $name table name
2651
-	 * @return string SQL statement
2652
-	 */
2653
-	public function dropTableNameSQL($name)
2654
-	{
2655
-		return "DROP TABLE ".$name;
2656
-	}
2657
-
2658
-	/**
2659
-	 * Generates SQL for truncating a table.
2660
-	 * @param  string $name  table name
2661
-	 * @return string
2662
-	 */
2663
-	public function truncateTableSQL($name)
2664
-	{
2665
-		return "TRUNCATE $name";
2666
-	}
2667
-
2668
-	/**
2669
-	 * This method generates sql that deletes a column identified by fieldDef.
2670
-	 *
2671
-	 * @param  SugarBean $bean      Sugarbean instance
2672
-	 * @param  array  $fieldDefs
2673
-	 * @return string SQL statement
2674
-	 */
2675
-	public function deleteColumnSQL(SugarBean $bean, $fieldDefs)
2676
-	{
2677
-		return $this->dropColumnSQL($bean->getTableName(), $fieldDefs);
2678
-	}
2679
-
2680
-	/**
2681
-	 * This method generates sql that drops a column identified by fieldDef.
2682
-	 * Designed to work like the other addColumnSQL() and alterColumnSQL() functions
2683
-	 *
2684
-	 * @param  string $tablename
2685
-	 * @param  array  $fieldDefs
2686
-	 * @return string SQL statement
2687
-	 */
2688
-	public function dropColumnSQL($tablename, $fieldDefs)
2689
-	{
2690
-		return $this->changeColumnSQL($tablename, $fieldDefs, 'drop');
2691
-	}
2781
+    protected function validColumnType($type)
2782
+    {
2783
+        $type = $this->getColumnType($type);
2784
+        return !empty($type);
2785
+    }
2692 2786
 
2693 2787
     /**
2694
-     * Return a version of $proposed that can be used as a column name in any of our supported databases
2695
-     * Practically this means no longer than 25 characters as the smallest identifier length for our supported DBs is 30 chars for Oracle plus we add on at least four characters in some places (for indicies for example)
2696
-     * @param string|array $name Proposed name for the column
2697
-     * @param bool|string $ensureUnique Ensure the name is unique
2698
-     * @param string $type Name type (table, column)
2699
-     * @param bool $force Force new name
2700
-     * @return string|array Valid column name trimmed to right length and with invalid characters removed
2701
-     */
2702
-	public function getValidDBName($name, $ensureUnique = false, $type = 'column', $force = false)
2703
-	{
2704
-		if(is_array($name)) {
2705
-			$result = array();
2706
-			foreach($name as $field) {
2707
-				$result[] = $this->getValidDBName($field, $ensureUnique, $type);
2708
-			}
2709
-			return $result;
2710
-		} else {
2711
-		    if(strchr($name, ".")) {
2712
-		        // this is a compound name with dots, handle separately
2713
-		        $parts = explode(".", $name);
2714
-		        if(count($parts) > 2) {
2715
-		            // some weird name, cut to table.name
2716
-		            array_splice($parts, 0, count($parts)-2);
2717
-		        }
2718
-		        $parts = $this->getValidDBName($parts, $ensureUnique, $type, $force);
2719
-                return join(".", $parts);
2720
-		    }
2721
-			// first strip any invalid characters - all but word chars (which is alphanumeric and _)
2722
-			$name = preg_replace( '/[^\w]+/i', '', $name ) ;
2723
-			$len = strlen( $name ) ;
2724
-			$maxLen = empty($this->maxNameLengths[$type]) ? $this->maxNameLengths[$type]['column'] : $this->maxNameLengths[$type];
2725
-			if ($len <= $maxLen && !$force) {
2726
-				return strtolower($name);
2727
-			}
2728
-			if ($ensureUnique) {
2729
-				$md5str = md5($name);
2730
-				$tail = substr ( $name, -11) ;
2731
-				$temp = substr($md5str , strlen($md5str)-4 );
2732
-				$result = substr( $name, 0, 10) . $temp . $tail ;
2733
-			} else {
2734
-				$result = substr( $name, 0, 11) . substr( $name, 11 - $maxLen);
2735
-			}
2736
-
2737
-			return strtolower( $result ) ;
2738
-		}
2739
-	}
2740
-
2741
-	/**
2742
-	 * Returns the valid type for a column given the type in fieldDef
2743
-	 *
2744
-	 * @param  string $type field type
2745
-	 * @return string valid type for the given field
2746
-	 */
2747
-	public function getColumnType($type)
2748
-	{
2749
-		return isset($this->type_map[$type])?$this->type_map[$type]:$type;
2750
-	}
2751
-
2752
-	/**
2753
-	 * Checks to see if passed array is truely an array of defitions
2754
-	 *
2755
-	 * Such an array may have type as a key but it will point to an array
2756
-	 * for a true array of definitions an to a col type for a definition only
2757
-	 *
2758
-	 * @param  mixed $defArray
2759
-	 * @return bool
2760
-	 */
2761
-	public function isFieldArray($defArray)
2762
-	{
2763
-		if ( !is_array($defArray) )
2764
-			return false;
2765
-
2766
-		if ( isset($defArray['type']) ){
2767
-			// type key exists. May be an array of defs or a simple definition
2768
-			return is_array($defArray['type']); // type is not an array => definition else array
2769
-		}
2770
-
2771
-		// type does not exist. Must be array of definitions
2772
-		return true;
2773
-	}
2774
-
2775
-	/**
2776
-	 * returns true if the type can be mapped to a valid column type
2777
-	 *
2778
-	 * @param  string $type
2779
-	 * @return bool
2780
-	 */
2781
-	protected function validColumnType($type)
2782
-	{
2783
-		$type = $this->getColumnType($type);
2784
-		return !empty($type);
2785
-	}
2786
-
2787
-	/**
2788
-	 * Generate query for audit table
2789
-	 * @param SugarBean $bean SugarBean that was changed
2790
-	 * @param array $changes List of changes, contains 'before' and 'after'
2788
+     * Generate query for audit table
2789
+     * @param SugarBean $bean SugarBean that was changed
2790
+     * @param array $changes List of changes, contains 'before' and 'after'
2791 2791
      * @return string  Audit table INSERT query
2792 2792
      */
2793
-	protected function auditSQL(SugarBean $bean, $changes)
2794
-	{
2795
-		global $current_user;
2796
-		$sql = "INSERT INTO ".$bean->get_audit_table_name();
2797
-		//get field defs for the audit table.
2798
-		require('metadata/audit_templateMetaData.php');
2799
-		$fieldDefs = $dictionary['audit']['fields'];
2800
-
2801
-		$values=array();
2802
-		$values['id'] = $this->massageValue(create_guid(), $fieldDefs['id']);
2803
-		$values['parent_id']= $this->massageValue($bean->id, $fieldDefs['parent_id']);
2804
-		$values['field_name']= $this->massageValue($changes['field_name'], $fieldDefs['field_name']);
2805
-		$values['data_type'] = $this->massageValue($changes['data_type'], $fieldDefs['data_type']);
2806
-		if ($changes['data_type']=='text') {
2807
-			$values['before_value_text'] = $this->massageValue($changes['before'], $fieldDefs['before_value_text']);
2808
-			$values['after_value_text'] = $this->massageValue($changes['after'], $fieldDefs['after_value_text']);
2809
-		} else {
2810
-			$values['before_value_string'] = $this->massageValue($changes['before'], $fieldDefs['before_value_string']);
2811
-			$values['after_value_string'] = $this->massageValue($changes['after'], $fieldDefs['after_value_string']);
2812
-		}
2813
-		$values['date_created'] = $this->massageValue(TimeDate::getInstance()->nowDb(), $fieldDefs['date_created'] );
2814
-		$values['created_by'] = $this->massageValue($current_user->id, $fieldDefs['created_by']);
2815
-
2816
-		$sql .= "(".implode(",", array_keys($values)).") ";
2817
-		$sql .= "VALUES(".implode(",", $values).")";
2818
-		return $sql;
2819
-	}
2793
+    protected function auditSQL(SugarBean $bean, $changes)
2794
+    {
2795
+        global $current_user;
2796
+        $sql = "INSERT INTO ".$bean->get_audit_table_name();
2797
+        //get field defs for the audit table.
2798
+        require('metadata/audit_templateMetaData.php');
2799
+        $fieldDefs = $dictionary['audit']['fields'];
2800
+
2801
+        $values=array();
2802
+        $values['id'] = $this->massageValue(create_guid(), $fieldDefs['id']);
2803
+        $values['parent_id']= $this->massageValue($bean->id, $fieldDefs['parent_id']);
2804
+        $values['field_name']= $this->massageValue($changes['field_name'], $fieldDefs['field_name']);
2805
+        $values['data_type'] = $this->massageValue($changes['data_type'], $fieldDefs['data_type']);
2806
+        if ($changes['data_type']=='text') {
2807
+            $values['before_value_text'] = $this->massageValue($changes['before'], $fieldDefs['before_value_text']);
2808
+            $values['after_value_text'] = $this->massageValue($changes['after'], $fieldDefs['after_value_text']);
2809
+        } else {
2810
+            $values['before_value_string'] = $this->massageValue($changes['before'], $fieldDefs['before_value_string']);
2811
+            $values['after_value_string'] = $this->massageValue($changes['after'], $fieldDefs['after_value_string']);
2812
+        }
2813
+        $values['date_created'] = $this->massageValue(TimeDate::getInstance()->nowDb(), $fieldDefs['date_created'] );
2814
+        $values['created_by'] = $this->massageValue($current_user->id, $fieldDefs['created_by']);
2815
+
2816
+        $sql .= "(".implode(",", array_keys($values)).") ";
2817
+        $sql .= "VALUES(".implode(",", $values).")";
2818
+        return $sql;
2819
+    }
2820 2820
 
2821 2821
     /**
2822 2822
      * Saves changes to module's audit table
@@ -2826,10 +2826,10 @@  discard block
 block discarded – undo
2826 2826
      * @return bool query result
2827 2827
      *
2828 2828
      */
2829
-	public function save_audit_records(SugarBean $bean, $changes)
2830
-	{
2831
-		return $this->query($this->auditSQL($bean, $changes));
2832
-	}
2829
+    public function save_audit_records(SugarBean $bean, $changes)
2830
+    {
2831
+        return $this->query($this->auditSQL($bean, $changes));
2832
+    }
2833 2833
 
2834 2834
     /**
2835 2835
      * Finds fields whose value has changed.
@@ -2841,7 +2841,7 @@  discard block
 block discarded – undo
2841 2841
      * @return array
2842 2842
      */
2843 2843
     public function getDataChanges(SugarBean &$bean, array $field_filter = null)
2844
-	{
2844
+    {
2845 2845
         $changed_values=array();
2846 2846
 
2847 2847
         $fetched_row = array();
@@ -2918,10 +2918,10 @@  discard block
 block discarded – undo
2918 2918
                         }
2919 2919
                     }
2920 2920
                 }
2921
-			}
2922
-		}
2923
-		return $changed_values;
2924
-	}
2921
+            }
2922
+        }
2923
+        return $changed_values;
2924
+    }
2925 2925
 
2926 2926
     /**
2927 2927
      * Uses the audit enabled fields array to find fields whose value has changed.
@@ -2937,40 +2937,40 @@  discard block
 block discarded – undo
2937 2937
         return $this->getDataChanges($bean, array_keys($audit_fields));
2938 2938
     }
2939 2939
 
2940
-	/**
2941
-	 * Setup FT indexing
2942
-	 * @abstract
2943
-	 */
2944
-	public function full_text_indexing_setup()
2945
-	{
2946
-		// Most DBs have nothing to setup, so provide default empty function
2947
-	}
2948
-
2949
-	/**
2950
-	 * Quotes a string for storing in the database
2951
-	 * @deprecated
2952
-	 * Return value will be not surrounded by quotes
2953
-	 *
2954
-	 * @param  string $string
2955
-	 * @return string
2956
-	 */
2957
-	public function escape_quote($string)
2958
-	{
2959
-		return $this->quote($string);
2960
-	}
2961
-
2962
-	/**
2963
-	 * Quotes a string for storing in the database
2964
-	 * @deprecated
2965
-	 * Return value will be not surrounded by quotes
2966
-	 *
2967
-	 * @param  string $string
2968
-	 * @return string
2969
-	 */
2970
-	public function quoteFormEmail($string)
2971
-	{
2972
-		return $this->quote($string);
2973
-	}
2940
+    /**
2941
+     * Setup FT indexing
2942
+     * @abstract
2943
+     */
2944
+    public function full_text_indexing_setup()
2945
+    {
2946
+        // Most DBs have nothing to setup, so provide default empty function
2947
+    }
2948
+
2949
+    /**
2950
+     * Quotes a string for storing in the database
2951
+     * @deprecated
2952
+     * Return value will be not surrounded by quotes
2953
+     *
2954
+     * @param  string $string
2955
+     * @return string
2956
+     */
2957
+    public function escape_quote($string)
2958
+    {
2959
+        return $this->quote($string);
2960
+    }
2961
+
2962
+    /**
2963
+     * Quotes a string for storing in the database
2964
+     * @deprecated
2965
+     * Return value will be not surrounded by quotes
2966
+     *
2967
+     * @param  string $string
2968
+     * @return string
2969
+     */
2970
+    public function quoteFormEmail($string)
2971
+    {
2972
+        return $this->quote($string);
2973
+    }
2974 2974
 
2975 2975
     /**
2976 2976
      * Renames an index using fields definition
@@ -2980,49 +2980,49 @@  discard block
 block discarded – undo
2980 2980
      * @param  string $table_name
2981 2981
      * @return string SQL statement
2982 2982
      */
2983
-	public function renameIndexDefs($old_definition, $new_definition, $table_name)
2984
-	{
2985
-		return array($this->add_drop_constraint($table_name,$old_definition,true),
2986
-				$this->add_drop_constraint($table_name,$new_definition), false);
2987
-	}
2983
+    public function renameIndexDefs($old_definition, $new_definition, $table_name)
2984
+    {
2985
+        return array($this->add_drop_constraint($table_name,$old_definition,true),
2986
+                $this->add_drop_constraint($table_name,$new_definition), false);
2987
+    }
2988 2988
 
2989
-	/**
2990
-	 * Check if type is boolean
2991
-	 * @param string $type
2989
+    /**
2990
+     * Check if type is boolean
2991
+     * @param string $type
2992 2992
      * @return bool
2993 2993
      */
2994
-	public function isBooleanType($type)
2995
-	{
2996
-		return 'bool' == $type;
2997
-	}
2994
+    public function isBooleanType($type)
2995
+    {
2996
+        return 'bool' == $type;
2997
+    }
2998 2998
 
2999
-	/**
3000
-	 * Get truth value for boolean type
3001
-	 * Allows 'off' to mean false, along with all 'empty' values
3002
-	 * @param mixed $val
2999
+    /**
3000
+     * Get truth value for boolean type
3001
+     * Allows 'off' to mean false, along with all 'empty' values
3002
+     * @param mixed $val
3003 3003
      * @return bool
3004
-	 */
3005
-	protected function _getBooleanValue($val)
3006
-	{
3007
-		//need to put the === sign here otherwise true == 'non empty string'
3008
-		if (empty($val) or $val==='off')
3009
-			return false;
3010
-
3011
-		return true;
3012
-	}
3013
-
3014
-	/**
3015
-	 * Check if type is a number
3016
-	 * @param string $type
3004
+     */
3005
+    protected function _getBooleanValue($val)
3006
+    {
3007
+        //need to put the === sign here otherwise true == 'non empty string'
3008
+        if (empty($val) or $val==='off')
3009
+            return false;
3010
+
3011
+        return true;
3012
+    }
3013
+
3014
+    /**
3015
+     * Check if type is a number
3016
+     * @param string $type
3017 3017
      * @return bool
3018
-	 */
3019
-	public function isNumericType($type)
3020
-	{
3021
-	    if(isset($this->type_class[$type]) && ($this->type_class[$type] == 'int' || $this->type_class[$type] == 'float')) {
3022
-	        return true;
3023
-	    }
3024
-		return false;
3025
-	}
3018
+     */
3019
+    public function isNumericType($type)
3020
+    {
3021
+        if(isset($this->type_class[$type]) && ($this->type_class[$type] == 'int' || $this->type_class[$type] == 'float')) {
3022
+            return true;
3023
+        }
3024
+        return false;
3025
+    }
3026 3026
 
3027 3027
     /**
3028 3028
      * Check if the value is empty value for this type
@@ -3030,272 +3030,272 @@  discard block
 block discarded – undo
3030 3030
      * @param string $type Type (one of vardef types)
3031 3031
      * @return bool true if the value if empty
3032 3032
      */
3033
-	protected function _emptyValue($val, $type)
3034
-	{
3035
-		if (empty($val))
3036
-			return true;
3037
-
3038
-		if($this->emptyValue($type) == $val) {
3039
-			return true;
3040
-		}
3041
-		switch ($type) {
3042
-			case 'decimal':
3043
-			case 'decimal2':
3044
-			case 'int':
3045
-			case 'double':
3046
-			case 'float':
3047
-			case 'uint':
3048
-			case 'ulong':
3049
-			case 'long':
3050
-			case 'short':
3051
-				return ($val == 0);
3052
-			case 'date':
3053
-				if ($val == '0000-00-00')
3054
-					return true;
3055
-				if ($val == 'NULL')
3056
-					return true;
3057
-				return false;
3058
-		}
3059
-
3060
-		return false;
3061
-	}
3062
-
3063
-	/**
3033
+    protected function _emptyValue($val, $type)
3034
+    {
3035
+        if (empty($val))
3036
+            return true;
3037
+
3038
+        if($this->emptyValue($type) == $val) {
3039
+            return true;
3040
+        }
3041
+        switch ($type) {
3042
+            case 'decimal':
3043
+            case 'decimal2':
3044
+            case 'int':
3045
+            case 'double':
3046
+            case 'float':
3047
+            case 'uint':
3048
+            case 'ulong':
3049
+            case 'long':
3050
+            case 'short':
3051
+                return ($val == 0);
3052
+            case 'date':
3053
+                if ($val == '0000-00-00')
3054
+                    return true;
3055
+                if ($val == 'NULL')
3056
+                    return true;
3057
+                return false;
3058
+        }
3059
+
3060
+        return false;
3061
+    }
3062
+
3063
+    /**
3064 3064
      * @abstract
3065
-	 * Does this type represent text (i.e., non-varchar) value?
3066
-	 * @param string $type
3065
+     * Does this type represent text (i.e., non-varchar) value?
3066
+     * @param string $type
3067 3067
      * @return bool
3068
-	 */
3069
-	public function isTextType($type)
3070
-	{
3071
-		return false;
3072
-	}
3073
-
3074
-	/**
3075
-	 * Check if this DB supports certain capability
3076
-	 * See $this->capabilities for the list
3077
-	 * @param string $cap
3068
+     */
3069
+    public function isTextType($type)
3070
+    {
3071
+        return false;
3072
+    }
3073
+
3074
+    /**
3075
+     * Check if this DB supports certain capability
3076
+     * See $this->capabilities for the list
3077
+     * @param string $cap
3078 3078
      * @return bool
3079
-	 */
3080
-	public function supports($cap)
3081
-	{
3082
-		return !empty($this->capabilities[$cap]);
3083
-	}
3084
-
3085
-	/**
3086
-	 * Create ORDER BY clause for ENUM type field
3087
-	 * @param string $order_by Field name
3088
-	 * @param array $values Possible enum value
3089
-	 * @param string $order_dir Order direction, ASC or DESC
3079
+     */
3080
+    public function supports($cap)
3081
+    {
3082
+        return !empty($this->capabilities[$cap]);
3083
+    }
3084
+
3085
+    /**
3086
+     * Create ORDER BY clause for ENUM type field
3087
+     * @param string $order_by Field name
3088
+     * @param array $values Possible enum value
3089
+     * @param string $order_dir Order direction, ASC or DESC
3090 3090
      * @return string
3091 3091
      */
3092
-	public function orderByEnum($order_by, $values, $order_dir)
3093
-	{
3094
-		$i = 0;
3095
-		$order_by_arr = array();
3096
-		foreach ($values as $key => $value) {
3097
-			if($key == '') {
3098
-				$order_by_arr[] = "WHEN ($order_by='' OR $order_by IS NULL) THEN $i";
3099
-			} else {
3100
-				$order_by_arr[] = "WHEN $order_by=".$this->quoted($key)." THEN $i";
3101
-			}
3102
-			$i++;
3103
-		}
3104
-		return "CASE ".implode("\n", $order_by_arr)." ELSE $i END $order_dir\n";
3105
-	}
3106
-
3107
-	/**
3108
-	 * Return representation of an empty value depending on type
3109
-	 * The value is fully quoted, converted, etc.
3110
-	 * @param string $type
3092
+    public function orderByEnum($order_by, $values, $order_dir)
3093
+    {
3094
+        $i = 0;
3095
+        $order_by_arr = array();
3096
+        foreach ($values as $key => $value) {
3097
+            if($key == '') {
3098
+                $order_by_arr[] = "WHEN ($order_by='' OR $order_by IS NULL) THEN $i";
3099
+            } else {
3100
+                $order_by_arr[] = "WHEN $order_by=".$this->quoted($key)." THEN $i";
3101
+            }
3102
+            $i++;
3103
+        }
3104
+        return "CASE ".implode("\n", $order_by_arr)." ELSE $i END $order_dir\n";
3105
+    }
3106
+
3107
+    /**
3108
+     * Return representation of an empty value depending on type
3109
+     * The value is fully quoted, converted, etc.
3110
+     * @param string $type
3111 3111
      * @return mixed Empty value
3112 3112
      */
3113
-	public function emptyValue($type)
3114
-	{
3115
-		if(isset($this->type_class[$type]) && ($this->type_class[$type] == 'bool' || $this->type_class[$type] == 'int' || $this->type_class[$type] == 'float')) {
3116
-			return 0;
3117
-		}
3113
+    public function emptyValue($type)
3114
+    {
3115
+        if(isset($this->type_class[$type]) && ($this->type_class[$type] == 'bool' || $this->type_class[$type] == 'int' || $this->type_class[$type] == 'float')) {
3116
+            return 0;
3117
+        }
3118 3118
 
3119
-		return "''";
3120
-	}
3119
+        return "''";
3120
+    }
3121 3121
 
3122
-	/**
3123
-	 * List of available collation settings
3122
+    /**
3123
+     * List of available collation settings
3124 3124
      * @abstract
3125
-	 * @return string
3126
-	 */
3127
-	public function getDefaultCollation()
3128
-	{
3129
-		return null;
3130
-	}
3131
-
3132
-	/**
3133
-	 * List of available collation settings
3125
+     * @return string
3126
+     */
3127
+    public function getDefaultCollation()
3128
+    {
3129
+        return null;
3130
+    }
3131
+
3132
+    /**
3133
+     * List of available collation settings
3134 3134
      * @abstract
3135
-	 * @return array
3136
-	 */
3137
-	public function getCollationList()
3138
-	{
3139
-		return null;
3140
-	}
3141
-
3142
-	/**
3143
-	 * Returns the number of columns in a table
3144
-	 *
3145
-	 * @param  string $table_name
3146
-	 * @return int
3147
-	 */
3148
-	public function number_of_columns($table_name)
3149
-	{
3150
-		$table = $this->getTableDescription($table_name);
3151
-		return count($table);
3152
-	}
3153
-
3154
-	/**
3155
-	 * Return limit query based on given query
3156
-	 * @param string $sql
3157
-	 * @param int $start
3158
-	 * @param int $count
3159
-	 * @param bool $dieOnError
3160
-	 * @param string $msg
3135
+     * @return array
3136
+     */
3137
+    public function getCollationList()
3138
+    {
3139
+        return null;
3140
+    }
3141
+
3142
+    /**
3143
+     * Returns the number of columns in a table
3144
+     *
3145
+     * @param  string $table_name
3146
+     * @return int
3147
+     */
3148
+    public function number_of_columns($table_name)
3149
+    {
3150
+        $table = $this->getTableDescription($table_name);
3151
+        return count($table);
3152
+    }
3153
+
3154
+    /**
3155
+     * Return limit query based on given query
3156
+     * @param string $sql
3157
+     * @param int $start
3158
+     * @param int $count
3159
+     * @param bool $dieOnError
3160
+     * @param string $msg
3161 3161
      * @return resource|bool query result
3162 3162
      * @see DBManager::limitQuery()
3163
-	 */
3164
-	public function limitQuerySql($sql, $start, $count, $dieOnError=false, $msg='')
3165
-	{
3166
-		return $this->limitQuery($sql,$start,$count,$dieOnError,$msg,false);
3167
-	}
3168
-
3169
-	/**
3170
-	 * Return current time in format fit for insertion into DB (with quotes)
3171
-	 * @return string
3172
-	 */
3173
-	public function now()
3174
-	{
3175
-		return $this->convert($this->quoted(TimeDate::getInstance()->nowDb()), "datetime");
3176
-	}
3177
-
3178
-	/**
3179
-	 * Check if connecting user has certain privilege
3180
-	 * @param string $privilege
3163
+     */
3164
+    public function limitQuerySql($sql, $start, $count, $dieOnError=false, $msg='')
3165
+    {
3166
+        return $this->limitQuery($sql,$start,$count,$dieOnError,$msg,false);
3167
+    }
3168
+
3169
+    /**
3170
+     * Return current time in format fit for insertion into DB (with quotes)
3171
+     * @return string
3172
+     */
3173
+    public function now()
3174
+    {
3175
+        return $this->convert($this->quoted(TimeDate::getInstance()->nowDb()), "datetime");
3176
+    }
3177
+
3178
+    /**
3179
+     * Check if connecting user has certain privilege
3180
+     * @param string $privilege
3181 3181
      * @return bool Privilege allowed?
3182 3182
      */
3183
-	public function checkPrivilege($privilege)
3184
-	{
3185
-		switch($privilege) {
3186
-			case "CREATE TABLE":
3187
-				$this->query("CREATE TABLE temp (id varchar(36))");
3188
-				break;
3189
-			case "DROP TABLE":
3190
-				$sql = $this->dropTableNameSQL("temp");
3191
-				$this->query($sql);
3192
-				break;
3193
-			case "INSERT":
3194
-				$this->query("INSERT INTO temp (id) VALUES ('abcdef0123456789abcdef0123456789abcd')");
3195
-				break;
3196
-			case "UPDATE":
3197
-				$this->query("UPDATE temp SET id = '100000000000000000000000000000000000' WHERE id = 'abcdef0123456789abcdef0123456789abcd'");
3198
-				break;
3199
-			case 'SELECT':
3200
-				return $this->getOne('SELECT id FROM temp WHERE id=\'100000000000000000000000000000000000\'', false);
3201
-			case 'DELETE':
3202
-				$this->query("DELETE FROM temp WHERE id = '100000000000000000000000000000000000'");
3203
-				break;
3204
-			case "ADD COLUMN":
3205
-				$test = array("test" => array("name" => "test", "type" => "varchar", "len" => 50));
3206
-				$sql = 	$this->changeColumnSQL("temp", $test, "add");
3207
-				$this->query($sql);
3208
-				break;
3209
-			case "CHANGE COLUMN":
3210
-				$test = array("test" => array("name" => "test", "type" => "varchar", "len" => 100));
3211
-				$sql = 	$this->changeColumnSQL("temp", $test, "modify");
3212
-				$this->query($sql);
3213
-				break;
3214
-			case "DROP COLUMN":
3215
-				$test = array("test" => array("name" => "test", "type" => "varchar", "len" => 100));
3216
-				$sql = 	$this->changeColumnSQL("temp", $test, "drop");
3217
-				$this->query($sql);
3218
-				break;
3219
-			default:
3220
-				return false;
3221
-		}
3222
-		if($this->checkError("Checking privileges")) {
3223
-			return false;
3224
-		}
3225
-		return true;
3226
-	}
3227
-
3228
-	/**
3229
-	 * Check if the query is a select query
3230
-	 * @param string $query
3183
+    public function checkPrivilege($privilege)
3184
+    {
3185
+        switch($privilege) {
3186
+            case "CREATE TABLE":
3187
+                $this->query("CREATE TABLE temp (id varchar(36))");
3188
+                break;
3189
+            case "DROP TABLE":
3190
+                $sql = $this->dropTableNameSQL("temp");
3191
+                $this->query($sql);
3192
+                break;
3193
+            case "INSERT":
3194
+                $this->query("INSERT INTO temp (id) VALUES ('abcdef0123456789abcdef0123456789abcd')");
3195
+                break;
3196
+            case "UPDATE":
3197
+                $this->query("UPDATE temp SET id = '100000000000000000000000000000000000' WHERE id = 'abcdef0123456789abcdef0123456789abcd'");
3198
+                break;
3199
+            case 'SELECT':
3200
+                return $this->getOne('SELECT id FROM temp WHERE id=\'100000000000000000000000000000000000\'', false);
3201
+            case 'DELETE':
3202
+                $this->query("DELETE FROM temp WHERE id = '100000000000000000000000000000000000'");
3203
+                break;
3204
+            case "ADD COLUMN":
3205
+                $test = array("test" => array("name" => "test", "type" => "varchar", "len" => 50));
3206
+                $sql = 	$this->changeColumnSQL("temp", $test, "add");
3207
+                $this->query($sql);
3208
+                break;
3209
+            case "CHANGE COLUMN":
3210
+                $test = array("test" => array("name" => "test", "type" => "varchar", "len" => 100));
3211
+                $sql = 	$this->changeColumnSQL("temp", $test, "modify");
3212
+                $this->query($sql);
3213
+                break;
3214
+            case "DROP COLUMN":
3215
+                $test = array("test" => array("name" => "test", "type" => "varchar", "len" => 100));
3216
+                $sql = 	$this->changeColumnSQL("temp", $test, "drop");
3217
+                $this->query($sql);
3218
+                break;
3219
+            default:
3220
+                return false;
3221
+        }
3222
+        if($this->checkError("Checking privileges")) {
3223
+            return false;
3224
+        }
3225
+        return true;
3226
+    }
3227
+
3228
+    /**
3229
+     * Check if the query is a select query
3230
+     * @param string $query
3231 3231
      * @return bool  Is query SELECT?
3232 3232
      */
3233
-	protected function isSelect($query)
3234
-	{
3235
-		$query = trim($query);
3236
-		$select_check = strpos(strtolower($query), strtolower("SELECT"));
3237
-		//Checks to see if there is union select which is valid
3238
-		$select_check2 = strpos(strtolower($query), strtolower("(SELECT"));
3239
-		if($select_check==0 || $select_check2==0){
3240
-			//Returning false means query is ok!
3241
-			return true;
3242
-		}
3243
-		return false;
3244
-	}
3245
-
3246
-	/**
3247
-	 * Parse fulltext search query with mysql syntax:
3248
-	 *  terms quoted by ""
3249
-	 *  + means the term must be included
3250
-	 *  - means the term must be excluded
3251
-	 *  * or % at the end means wildcard
3252
-	 * @param string $query
3253
-	 * @return array of 3 elements - query terms, mandatory terms and excluded terms
3254
-	 */
3255
-	public function parseFulltextQuery($query)
3256
-	{
3257
-		/* split on space or comma, double quotes with \ for escape */
3258
-		if(strpbrk($query, " ,")) {
3259
-			// ("([^"]*?)"|[^" ,]+)((, )+)?
3260
-			// '/([^" ,]+|".*?[^\\\\]")(,|\s)\s*/'
3261
-			if(!preg_match_all('/("([^"]*?)"|[^"\s,]+)((,\s)+)?/', $query, $m)) {
3262
-				return false;
3263
-			}
3264
-			$qterms = $m[1];
3265
-		} else {
3266
-			$qterms = array($query);
3267
-		}
3268
-		$terms = $must_terms = $not_terms = array();
3269
-		foreach($qterms as $item) {
3270
-			if($item[0] == '"') {
3271
-				$item = trim($item, '"');
3272
-			}
3273
-			if($item[0] == '+') {
3233
+    protected function isSelect($query)
3234
+    {
3235
+        $query = trim($query);
3236
+        $select_check = strpos(strtolower($query), strtolower("SELECT"));
3237
+        //Checks to see if there is union select which is valid
3238
+        $select_check2 = strpos(strtolower($query), strtolower("(SELECT"));
3239
+        if($select_check==0 || $select_check2==0){
3240
+            //Returning false means query is ok!
3241
+            return true;
3242
+        }
3243
+        return false;
3244
+    }
3245
+
3246
+    /**
3247
+     * Parse fulltext search query with mysql syntax:
3248
+     *  terms quoted by ""
3249
+     *  + means the term must be included
3250
+     *  - means the term must be excluded
3251
+     *  * or % at the end means wildcard
3252
+     * @param string $query
3253
+     * @return array of 3 elements - query terms, mandatory terms and excluded terms
3254
+     */
3255
+    public function parseFulltextQuery($query)
3256
+    {
3257
+        /* split on space or comma, double quotes with \ for escape */
3258
+        if(strpbrk($query, " ,")) {
3259
+            // ("([^"]*?)"|[^" ,]+)((, )+)?
3260
+            // '/([^" ,]+|".*?[^\\\\]")(,|\s)\s*/'
3261
+            if(!preg_match_all('/("([^"]*?)"|[^"\s,]+)((,\s)+)?/', $query, $m)) {
3262
+                return false;
3263
+            }
3264
+            $qterms = $m[1];
3265
+        } else {
3266
+            $qterms = array($query);
3267
+        }
3268
+        $terms = $must_terms = $not_terms = array();
3269
+        foreach($qterms as $item) {
3270
+            if($item[0] == '"') {
3271
+                $item = trim($item, '"');
3272
+            }
3273
+            if($item[0] == '+') {
3274 3274
                 if (strlen($item) > 1) {
3275 3275
                     $must_terms[] = substr($item, 1);
3276 3276
                 }
3277 3277
                 continue;
3278
-			}
3279
-			if($item[0] == '-') {
3278
+            }
3279
+            if($item[0] == '-') {
3280 3280
                 if (strlen($item) > 1) {
3281
-				    $not_terms[] = substr($item, 1);
3281
+                    $not_terms[] = substr($item, 1);
3282 3282
                 }
3283 3283
                 continue;
3284
-			}
3285
-			$terms[] = $item;
3286
-		}
3287
-		return array($terms, $must_terms, $not_terms);
3288
-	}
3284
+            }
3285
+            $terms[] = $item;
3286
+        }
3287
+        return array($terms, $must_terms, $not_terms);
3288
+    }
3289 3289
 
3290 3290
     // Methods to check respective queries
3291
-	protected $standardQueries = array(
3292
-		'ALTER TABLE' => 'verifyAlterTable',
3293
-		'DROP TABLE' => 'verifyDropTable',
3294
-		'CREATE TABLE' => 'verifyCreateTable',
3295
-		'INSERT INTO' => 'verifyInsertInto',
3296
-		'UPDATE' => 'verifyUpdate',
3297
-		'DELETE FROM' => 'verifyDeleteFrom',
3298
-	);
3291
+    protected $standardQueries = array(
3292
+        'ALTER TABLE' => 'verifyAlterTable',
3293
+        'DROP TABLE' => 'verifyDropTable',
3294
+        'CREATE TABLE' => 'verifyCreateTable',
3295
+        'INSERT INTO' => 'verifyInsertInto',
3296
+        'UPDATE' => 'verifyUpdate',
3297
+        'DELETE FROM' => 'verifyDeleteFrom',
3298
+    );
3299 3299
 
3300 3300
 
3301 3301
     /**
@@ -3303,8 +3303,8 @@  discard block
 block discarded – undo
3303 3303
      * @param string $query SQL query
3304 3304
      * @return string
3305 3305
      */
3306
-	protected function extractTableName($query)
3307
-	{
3306
+    protected function extractTableName($query)
3307
+    {
3308 3308
         $query = preg_replace('/[^A-Za-z0-9_\s]/', "", $query);
3309 3309
         $query = trim(str_replace(array_keys($this->standardQueries), '', $query));
3310 3310
 
@@ -3313,7 +3313,7 @@  discard block
 block discarded – undo
3313 3313
         $table = substr($query, 0, $end);
3314 3314
 
3315 3315
         return $table;
3316
-	}
3316
+    }
3317 3317
 
3318 3318
     /**
3319 3319
      * Verify SQl statement using per-DB verification function
@@ -3322,284 +3322,284 @@  discard block
 block discarded – undo
3322 3322
      * @param array $skipTables List of blacklisted tables that aren't checked
3323 3323
      * @return string
3324 3324
      */
3325
-	public function verifySQLStatement($query, $skipTables)
3326
-	{
3327
-		$query = trim($query);
3328
-		foreach($this->standardQueries as $qstart => $check) {
3329
-			if(strncasecmp($qstart, $query, strlen($qstart)) == 0) {
3330
-				if(is_callable(array($this, $check))) {
3331
-					$table = $this->extractTableName($query);
3332
-					if(!in_array($table, $skipTables)) {
3333
-						return call_user_func(array($this, $check), $table, $query);
3334
-					} else {
3335
-						$this->log->debug("Skipping table $table as blacklisted");
3336
-					}
3337
-				} else {
3338
-					$this->log->debug("No verification for $qstart on {$this->dbType}");
3339
-				}
3340
-				break;
3341
-			}
3342
-		}
3343
-		return "";
3344
-	}
3345
-
3346
-	/**
3347
-	 * Tests an CREATE TABLE query
3348
-	 * @param string $table The table name to get DDL
3349
-	 * @param string $query The query to test.
3350
-	 * @return string Non-empty if error found
3351
-	 */
3352
-	protected function verifyCreateTable($table, $query)
3353
-	{
3354
-		$this->log->debug('verifying CREATE statement...');
3355
-
3356
-		// rewrite DDL with _temp name
3357
-		$this->log->debug('testing query: ['.$query.']');
3358
-		$tempname = $table."__uw_temp";
3359
-		$tempTableQuery = str_replace("CREATE TABLE {$table}", "CREATE TABLE $tempname", $query);
3360
-
3361
-		if(strpos($tempTableQuery, '__uw_temp') === false) {
3362
-			return 'Could not use a temp table to test query!';
3363
-		}
3364
-
3365
-		$this->query($tempTableQuery, false, "Preflight Failed for: {$query}");
3366
-
3367
-		$error = $this->lastError(); // empty on no-errors
3368
-		if(!empty($error)) {
3369
-			return $error;
3370
-		}
3371
-
3372
-		// check if table exists
3373
-		$this->log->debug('testing for table: '.$table);
3374
-		if(!$this->tableExists($tempname)) {
3375
-			return "Failed to create temp table!";
3376
-		}
3377
-
3378
-		$this->dropTableName($tempname);
3379
-		return '';
3380
-	}
3381
-
3382
-	/**
3383
-	 * Execute multiple queries one after another
3384
-	 * @param array $sqls Queries
3385
-	 * @param bool $dieOnError Die on error, passed to query()
3386
-	 * @param string $msg Error message, passed to query()
3387
-	 * @param bool $suppress Supress errors, passed to query()
3388
-	 * @return resource|bool result set or success/failure bool
3389
-	 */
3390
-	public function queryArray(array $sqls, $dieOnError = false, $msg = '', $suppress = false)
3391
-	{
3392
-		$last = true;
3393
-		foreach($sqls as $sql) {
3394
-			if(!($last = $this->query($sql, $dieOnError, $msg, $suppress))) {
3395
-				break;
3396
-			}
3397
-		}
3398
-		return $last;
3399
-	}
3400
-
3401
-	/**
3402
-	 * Fetches the next row in the query result into an associative array
3403
-	 *
3404
-	 * @param  resource $result
3405
-	 * @param  bool $encode Need to HTML-encode the result?
3406
-	 * @return array    returns false if there are no more rows available to fetch
3407
-	 */
3408
-	public function fetchByAssoc($result, $encode = true)
3409
-	{
3410
-	    if (empty($result))	return false;
3411
-
3412
-	    if(is_int($encode) && func_num_args() == 3) {
3413
-	        // old API: $result, $rowNum, $encode
3414
-	        $GLOBALS['log']->deprecated("Using row number in fetchByAssoc is not portable and no longer supported. Please fix your code.");
3415
-	        $encode = func_get_arg(2);
3416
-	    }
3417
-	    $row = $this->fetchRow($result);
3418
-	    if (!empty($row) && $encode && $this->encode) {
3419
-	    	return array_map('to_html', $row);
3420
-	    } else {
3421
-	       return $row;
3422
-	    }
3423
-	}
3424
-
3425
-	/**
3426
-	 * Get DB driver name used for install/upgrade scripts
3427
-	 * @return string
3428
-	 */
3429
-	public function getScriptName()
3430
-	{
3431
-		// Usually the same name as dbType
3432
-		return $this->dbType;
3433
-	}
3434
-
3435
-	/**
3436
-	 * Set database options
3437
-	 * Options are usually db-dependant and derive from $config['dbconfigoption']
3438
-	 * @param array $options
3439
-	 * @return DBManager
3440
-	 */
3441
-	public function setOptions($options)
3442
-	{
3443
-	    $this->options = $options;
3444
-	    return $this;
3445
-	}
3446
-
3447
-	/**
3448
-	 * Get DB options
3449
-	 * @return array
3450
-	 */
3451
-	public function getOptions()
3452
-	{
3453
-	    return $this->options;
3454
-	}
3455
-
3456
-	/**
3457
-	 * Get DB option by name
3458
-	 * @param string $option Option name
3459
-	 * @return mixed Option value or null if doesn't exist
3460
-	 */
3461
-	public function getOption($option)
3462
-	{
3463
-	    if(isset($this->options[$option])) {
3464
-	        return $this->options[$option];
3465
-	    }
3466
-	    return null;
3467
-	}
3468
-
3469
-	/**
3470
-	 * Commits pending changes to the database when the driver is setup to support transactions.
3471
-	 * Note that the default implementation is applicable for transaction-less or auto commit scenarios.
3472
-	 * @abstract
3473
-	 * @return bool true if commit succeeded, false if it failed
3474
-	 */
3475
-	public function commit()
3476
-	{
3477
-		$this->log->info("DBManager.commit() stub");
3478
-		return true;
3479
-	}
3480
-
3481
-	/**
3482
-	 * Rollsback pending changes to the database when the driver is setup to support transactions.
3483
-	 * Note that the default implementation is applicable for transaction-less or auto commit scenarios.
3484
-	 * Since rollbacks cannot be done, this implementation always returns false.
3485
-	 * @abstract
3486
-	 * @return bool true if rollback succeeded, false if it failed
3487
-	 */
3488
-	public function rollback()
3489
-	{
3490
-		$this->log->info("DBManager.rollback() stub");
3491
-		return false;
3492
-	}
3493
-
3494
-	/**
3495
-	 * Check if this DB name is valid
3496
-	 *
3497
-	 * @param string $name
3498
-	 * @return bool
3499
-	 */
3500
-	public function isDatabaseNameValid($name)
3501
-	{
3502
-		// Generic case - no slashes, no dots
3503
-		return preg_match('#[/.\\\\]#', $name)==0;
3504
-	}
3505
-
3506
-	/**
3507
-	 * Check special requirements for DB installation.
3508
-	 * @abstract
3509
-	 * If everything is OK, return true.
3510
-	 * If something's wrong, return array of error code and parameters
3511
-	 * @return mixed
3512
-	 */
3513
-	public function canInstall()
3514
-	{
3515
-		return true;
3516
-	}
3517
-
3518
-	/**
3519
-	 * @abstract
3325
+    public function verifySQLStatement($query, $skipTables)
3326
+    {
3327
+        $query = trim($query);
3328
+        foreach($this->standardQueries as $qstart => $check) {
3329
+            if(strncasecmp($qstart, $query, strlen($qstart)) == 0) {
3330
+                if(is_callable(array($this, $check))) {
3331
+                    $table = $this->extractTableName($query);
3332
+                    if(!in_array($table, $skipTables)) {
3333
+                        return call_user_func(array($this, $check), $table, $query);
3334
+                    } else {
3335
+                        $this->log->debug("Skipping table $table as blacklisted");
3336
+                    }
3337
+                } else {
3338
+                    $this->log->debug("No verification for $qstart on {$this->dbType}");
3339
+                }
3340
+                break;
3341
+            }
3342
+        }
3343
+        return "";
3344
+    }
3345
+
3346
+    /**
3347
+     * Tests an CREATE TABLE query
3348
+     * @param string $table The table name to get DDL
3349
+     * @param string $query The query to test.
3350
+     * @return string Non-empty if error found
3351
+     */
3352
+    protected function verifyCreateTable($table, $query)
3353
+    {
3354
+        $this->log->debug('verifying CREATE statement...');
3355
+
3356
+        // rewrite DDL with _temp name
3357
+        $this->log->debug('testing query: ['.$query.']');
3358
+        $tempname = $table."__uw_temp";
3359
+        $tempTableQuery = str_replace("CREATE TABLE {$table}", "CREATE TABLE $tempname", $query);
3360
+
3361
+        if(strpos($tempTableQuery, '__uw_temp') === false) {
3362
+            return 'Could not use a temp table to test query!';
3363
+        }
3364
+
3365
+        $this->query($tempTableQuery, false, "Preflight Failed for: {$query}");
3366
+
3367
+        $error = $this->lastError(); // empty on no-errors
3368
+        if(!empty($error)) {
3369
+            return $error;
3370
+        }
3371
+
3372
+        // check if table exists
3373
+        $this->log->debug('testing for table: '.$table);
3374
+        if(!$this->tableExists($tempname)) {
3375
+            return "Failed to create temp table!";
3376
+        }
3377
+
3378
+        $this->dropTableName($tempname);
3379
+        return '';
3380
+    }
3381
+
3382
+    /**
3383
+     * Execute multiple queries one after another
3384
+     * @param array $sqls Queries
3385
+     * @param bool $dieOnError Die on error, passed to query()
3386
+     * @param string $msg Error message, passed to query()
3387
+     * @param bool $suppress Supress errors, passed to query()
3388
+     * @return resource|bool result set or success/failure bool
3389
+     */
3390
+    public function queryArray(array $sqls, $dieOnError = false, $msg = '', $suppress = false)
3391
+    {
3392
+        $last = true;
3393
+        foreach($sqls as $sql) {
3394
+            if(!($last = $this->query($sql, $dieOnError, $msg, $suppress))) {
3395
+                break;
3396
+            }
3397
+        }
3398
+        return $last;
3399
+    }
3400
+
3401
+    /**
3402
+     * Fetches the next row in the query result into an associative array
3403
+     *
3404
+     * @param  resource $result
3405
+     * @param  bool $encode Need to HTML-encode the result?
3406
+     * @return array    returns false if there are no more rows available to fetch
3407
+     */
3408
+    public function fetchByAssoc($result, $encode = true)
3409
+    {
3410
+        if (empty($result))	return false;
3411
+
3412
+        if(is_int($encode) && func_num_args() == 3) {
3413
+            // old API: $result, $rowNum, $encode
3414
+            $GLOBALS['log']->deprecated("Using row number in fetchByAssoc is not portable and no longer supported. Please fix your code.");
3415
+            $encode = func_get_arg(2);
3416
+        }
3417
+        $row = $this->fetchRow($result);
3418
+        if (!empty($row) && $encode && $this->encode) {
3419
+            return array_map('to_html', $row);
3420
+        } else {
3421
+            return $row;
3422
+        }
3423
+    }
3424
+
3425
+    /**
3426
+     * Get DB driver name used for install/upgrade scripts
3427
+     * @return string
3428
+     */
3429
+    public function getScriptName()
3430
+    {
3431
+        // Usually the same name as dbType
3432
+        return $this->dbType;
3433
+    }
3434
+
3435
+    /**
3436
+     * Set database options
3437
+     * Options are usually db-dependant and derive from $config['dbconfigoption']
3438
+     * @param array $options
3439
+     * @return DBManager
3440
+     */
3441
+    public function setOptions($options)
3442
+    {
3443
+        $this->options = $options;
3444
+        return $this;
3445
+    }
3446
+
3447
+    /**
3448
+     * Get DB options
3449
+     * @return array
3450
+     */
3451
+    public function getOptions()
3452
+    {
3453
+        return $this->options;
3454
+    }
3455
+
3456
+    /**
3457
+     * Get DB option by name
3458
+     * @param string $option Option name
3459
+     * @return mixed Option value or null if doesn't exist
3460
+     */
3461
+    public function getOption($option)
3462
+    {
3463
+        if(isset($this->options[$option])) {
3464
+            return $this->options[$option];
3465
+        }
3466
+        return null;
3467
+    }
3468
+
3469
+    /**
3470
+     * Commits pending changes to the database when the driver is setup to support transactions.
3471
+     * Note that the default implementation is applicable for transaction-less or auto commit scenarios.
3472
+     * @abstract
3473
+     * @return bool true if commit succeeded, false if it failed
3474
+     */
3475
+    public function commit()
3476
+    {
3477
+        $this->log->info("DBManager.commit() stub");
3478
+        return true;
3479
+    }
3480
+
3481
+    /**
3482
+     * Rollsback pending changes to the database when the driver is setup to support transactions.
3483
+     * Note that the default implementation is applicable for transaction-less or auto commit scenarios.
3484
+     * Since rollbacks cannot be done, this implementation always returns false.
3485
+     * @abstract
3486
+     * @return bool true if rollback succeeded, false if it failed
3487
+     */
3488
+    public function rollback()
3489
+    {
3490
+        $this->log->info("DBManager.rollback() stub");
3491
+        return false;
3492
+    }
3493
+
3494
+    /**
3495
+     * Check if this DB name is valid
3496
+     *
3497
+     * @param string $name
3498
+     * @return bool
3499
+     */
3500
+    public function isDatabaseNameValid($name)
3501
+    {
3502
+        // Generic case - no slashes, no dots
3503
+        return preg_match('#[/.\\\\]#', $name)==0;
3504
+    }
3505
+
3506
+    /**
3507
+     * Check special requirements for DB installation.
3508
+     * @abstract
3509
+     * If everything is OK, return true.
3510
+     * If something's wrong, return array of error code and parameters
3511
+     * @return mixed
3512
+     */
3513
+    public function canInstall()
3514
+    {
3515
+        return true;
3516
+    }
3517
+
3518
+    /**
3519
+     * @abstract
3520 3520
      * Code run on new database before installing
3521
-	 */
3522
-	public function preInstall()
3523
-	{
3524
-	}
3521
+     */
3522
+    public function preInstall()
3523
+    {
3524
+    }
3525
+
3526
+    /**
3527
+     * @abstract
3528
+     * Code run on new database after installing
3529
+     */
3530
+    public function postInstall()
3531
+    {
3532
+    }
3533
+
3534
+    /**
3535
+     * Disable keys on the table
3536
+     * @abstract
3537
+     * @param string $tableName
3538
+     */
3539
+    public function disableKeys($tableName)
3540
+    {
3541
+    }
3525 3542
 
3526
-	/**
3543
+    /**
3544
+     * Re-enable keys on the table
3527 3545
      * @abstract
3528
-	 * Code run on new database after installing
3529
-	 */
3530
-	public function postInstall()
3531
-	{
3532
-	}
3533
-
3534
-	/**
3535
-	 * Disable keys on the table
3536
-	 * @abstract
3537
-	 * @param string $tableName
3538
-	 */
3539
-	public function disableKeys($tableName)
3540
-	{
3541
-	}
3542
-
3543
-	/**
3544
-	 * Re-enable keys on the table
3545
-	 * @abstract
3546
-	 * @param string $tableName
3547
-	 */
3548
-	public function enableKeys($tableName)
3549
-	{
3550
-	}
3551
-
3552
-	/**
3553
-	 * Quote string in DB-specific manner
3554
-	 * @param string $string
3555
-	 * @return string
3556
-	 */
3557
-	abstract public function quote($string);
3546
+     * @param string $tableName
3547
+     */
3548
+    public function enableKeys($tableName)
3549
+    {
3550
+    }
3551
+
3552
+    /**
3553
+     * Quote string in DB-specific manner
3554
+     * @param string $string
3555
+     * @return string
3556
+     */
3557
+    abstract public function quote($string);
3558 3558
 
3559 3559
     abstract public function quoteIdentifier($string);
3560 3560
 
3561
-	/**
3562
-	 * Use when you need to convert a database string to a different value; this function does it in a
3563
-	 * database-backend aware way
3564
-	 * Supported conversions:
3565
-	 *      today		return current date
3566
-	 *      left		Take substring from the left
3567
-	 *      date_format	Format date as string, supports %Y-%m-%d, %Y-%m, %Y
3561
+    /**
3562
+     * Use when you need to convert a database string to a different value; this function does it in a
3563
+     * database-backend aware way
3564
+     * Supported conversions:
3565
+     *      today		return current date
3566
+     *      left		Take substring from the left
3567
+     *      date_format	Format date as string, supports %Y-%m-%d, %Y-%m, %Y
3568 3568
      *      time_format Format time as string
3569 3569
      *      date        Convert date string to datetime value
3570 3570
      *      time        Convert time string to datetime value
3571
-	 *      datetime	Convert datetime string to datetime value
3572
-	 *      ifnull		If var is null, use default value
3573
-	 *      concat		Concatenate strings
3574
-	 *      quarter		Quarter number of the date
3575
-	 *      length		Length of string
3576
-	 *      month		Month number of the date
3577
-	 *      add_date	Add specified interval to a date
3571
+     *      datetime	Convert datetime string to datetime value
3572
+     *      ifnull		If var is null, use default value
3573
+     *      concat		Concatenate strings
3574
+     *      quarter		Quarter number of the date
3575
+     *      length		Length of string
3576
+     *      month		Month number of the date
3577
+     *      add_date	Add specified interval to a date
3578 3578
      *      add_time    Add time interval to a date
3579 3579
      *      text2char   Convert text field to varchar
3580
-	 *
3581
-	 * @param string $string database string to convert
3582
-	 * @param string $type type of conversion to do
3583
-	 * @param array  $additional_parameters optional, additional parameters to pass to the db function
3584
-	 * @return string
3585
-	 */
3586
-	abstract public function convert($string, $type, array $additional_parameters = array());
3587
-
3588
-	/**
3589
-	 * Converts from Database data to app data
3590
-	 *
3591
-	 * Supported types
3592
-	 * - date
3593
-	 * - time
3594
-	 * - datetime
3580
+     *
3581
+     * @param string $string database string to convert
3582
+     * @param string $type type of conversion to do
3583
+     * @param array  $additional_parameters optional, additional parameters to pass to the db function
3584
+     * @return string
3585
+     */
3586
+    abstract public function convert($string, $type, array $additional_parameters = array());
3587
+
3588
+    /**
3589
+     * Converts from Database data to app data
3590
+     *
3591
+     * Supported types
3592
+     * - date
3593
+     * - time
3594
+     * - datetime
3595 3595
      * - datetimecombo
3596 3596
      * - timestamp
3597
-	 *
3598
-	 * @param string $string database string to convert
3599
-	 * @param string $type type of conversion to do
3600
-	 * @return string
3601
-	 */
3602
-	abstract public function fromConvert($string, $type);
3597
+     *
3598
+     * @param string $string database string to convert
3599
+     * @param string $type type of conversion to do
3600
+     * @return string
3601
+     */
3602
+    abstract public function fromConvert($string, $type);
3603 3603
 
3604 3604
     /**
3605 3605
      * Parses and runs queries
@@ -3611,7 +3611,7 @@  discard block
 block discarded – undo
3611 3611
      * @param  bool     $keepResult Keep query result in the object?
3612 3612
      * @return resource|bool result set or success/failure bool
3613 3613
      */
3614
-	abstract public function query($sql, $dieOnError = false, $msg = '', $suppress = false, $keepResult = false);
3614
+    abstract public function query($sql, $dieOnError = false, $msg = '', $suppress = false, $keepResult = false);
3615 3615
 
3616 3616
     /**
3617 3617
      * Runs a limit query: one where we specify where to start getting records and how many to get
@@ -3624,173 +3624,173 @@  discard block
 block discarded – undo
3624 3624
      * @param  bool     $execute Execute or return SQL?
3625 3625
      * @return resource query result
3626 3626
      */
3627
-	abstract function limitQuery($sql, $start, $count, $dieOnError = false, $msg = '', $execute = true);
3628
-
3629
-
3630
-	/**
3631
-	 * Free Database result
3632
-	 * @param resource $dbResult
3633
-	 */
3634
-	abstract protected function freeDbResult($dbResult);
3635
-
3636
-	/**
3637
-	 * Rename column in the DB
3638
-	 * @param string $tablename
3639
-	 * @param string $column
3640
-	 * @param string $newname
3641
-	 */
3642
-	abstract function renameColumnSQL($tablename, $column, $newname);
3643
-
3644
-	/**
3645
-	 * Returns definitions of all indies for passed table.
3646
-	 *
3647
-	 * return will is a multi-dimensional array that
3648
-	 * categorizes the index definition by types, unique, primary and index.
3649
-	 * <code>
3650
-	 * <?php
3651
-	 * array(                                                              O
3652
-	 *       'index1'=> array (
3653
-	 *           'name'   => 'index1',
3654
-	 *           'type'   => 'primary',
3655
-	 *           'fields' => array('field1','field2')
3656
-	 *           )
3657
-	 *       )
3658
-	 * ?>
3659
-	 * </code>
3660
-	 * This format is similar to how indicies are defined in vardef file.
3661
-	 *
3662
-	 * @param  string $tablename
3663
-	 * @return array
3664
-	 */
3665
-	abstract public function get_indices($tablename);
3666
-
3667
-	/**
3668
-	 * Returns definitions of all indies for passed table.
3669
-	 *
3670
-	 * return will is a multi-dimensional array that
3671
-	 * categorizes the index definition by types, unique, primary and index.
3672
-	 * <code>
3673
-	 * <?php
3674
-	 * array(
3675
-	 *       'field1'=> array (
3676
-	 *           'name'   => 'field1',
3677
-	 *           'type'   => 'varchar',
3678
-	 *           'len' => '200'
3679
-	 *           )
3680
-	 *       )
3681
-	 * ?>
3682
-	 * </code>
3683
-	 * This format is similar to how indicies are defined in vardef file.
3684
-	 *
3685
-	 * @param  string $tablename
3686
-	 * @return array
3687
-	 */
3688
-	abstract public function get_columns($tablename);
3689
-
3690
-	/**
3691
-	 * Generates alter constraint statement given a table name and vardef definition.
3692
-	 *
3693
-	 * Supports both adding and droping a constraint.
3694
-	 *
3695
-	 * @param  string $table      tablename
3696
-	 * @param  array  $definition field definition
3697
-	 * @param  bool   $drop       true if we are dropping the constraint, false if we are adding it
3698
-	 * @return string SQL statement
3699
-	 */
3700
-	abstract public function add_drop_constraint($table, $definition, $drop = false);
3701
-
3702
-	/**
3703
-	 * Returns the description of fields based on the result
3704
-	 *
3705
-	 * @param  resource $result
3706
-	 * @param  boolean  $make_lower_case
3707
-	 * @return array field array
3708
-	 */
3709
-	abstract public function getFieldsArray($result, $make_lower_case = false);
3710
-
3711
-	/**
3712
-	 * Returns an array of tables for this database
3713
-	 *
3714
-	 * @return	array|false 	an array of with table names, false if no tables found
3715
-	 */
3716
-	abstract public function getTablesArray();
3717
-
3718
-	/**
3719
-	 * Return's the version of the database
3720
-	 *
3721
-	 * @return string
3722
-	 */
3723
-	abstract public function version();
3724
-
3725
-	/**
3726
-	 * Checks if a table with the name $tableName exists
3727
-	 * and returns true if it does or false otherwise
3728
-	 *
3729
-	 * @param  string $tableName
3730
-	 * @return bool
3731
-	 */
3732
-	abstract public function tableExists($tableName);
3733
-
3734
-	/**
3735
-	 * Fetches the next row in the query result into an associative array
3736
-	 *
3737
-	 * @param  resource $result
3738
-	 * @return array    returns false if there are no more rows available to fetch
3739
-	 */
3740
-	abstract public function fetchRow($result);
3741
-
3742
-	/**
3743
-	 * Connects to the database backend
3744
-	 *
3745
-	 * Takes in the database settings and opens a database connection based on those
3746
-	 * will open either a persistent or non-persistent connection.
3747
-	 * If a persistent connection is desired but not available it will defualt to non-persistent
3748
-	 *
3749
-	 * configOptions must include
3750
-	 * db_host_name - server ip
3751
-	 * db_user_name - database user name
3752
-	 * db_password - database password
3753
-	 *
3754
-	 * @param array   $configOptions
3755
-	 * @param boolean $dieOnError
3756
-	 */
3757
-	abstract public function connect(array $configOptions = null, $dieOnError = false);
3758
-
3759
-	/**
3760
-	 * Generates sql for create table statement for a bean.
3761
-	 *
3762
-	 * @param  string $tablename
3763
-	 * @param  array  $fieldDefs
3764
-	 * @param  array  $indices
3765
-	 * @return string SQL Create Table statement
3766
-	 */
3767
-	abstract public function createTableSQLParams($tablename, $fieldDefs, $indices);
3768
-
3769
-	/**
3770
-	 * Generates the SQL for changing columns
3771
-	 *
3772
-	 * @param string $tablename
3773
-	 * @param array  $fieldDefs
3774
-	 * @param string $action
3775
-	 * @param bool   $ignoreRequired Optional, true if we should ignor this being a required field
3776
-	 * @return string|array
3777
-	 */
3778
-	abstract protected function changeColumnSQL($tablename, $fieldDefs, $action, $ignoreRequired = false);
3779
-
3780
-	/**
3781
-	 * Disconnects from the database
3782
-	 *
3783
-	 * Also handles any cleanup needed
3784
-	 */
3785
-	abstract public function disconnect();
3786
-
3787
-	/**
3788
-	 * Get last database error
3789
-	 * This function should return last error as reported by DB driver
3790
-	 * and should return false if no error condition happened
3791
-	 * @return string|false Error message or false if no error happened
3792
-	 */
3793
-	abstract public function lastDbError();
3627
+    abstract function limitQuery($sql, $start, $count, $dieOnError = false, $msg = '', $execute = true);
3628
+
3629
+
3630
+    /**
3631
+     * Free Database result
3632
+     * @param resource $dbResult
3633
+     */
3634
+    abstract protected function freeDbResult($dbResult);
3635
+
3636
+    /**
3637
+     * Rename column in the DB
3638
+     * @param string $tablename
3639
+     * @param string $column
3640
+     * @param string $newname
3641
+     */
3642
+    abstract function renameColumnSQL($tablename, $column, $newname);
3643
+
3644
+    /**
3645
+     * Returns definitions of all indies for passed table.
3646
+     *
3647
+     * return will is a multi-dimensional array that
3648
+     * categorizes the index definition by types, unique, primary and index.
3649
+     * <code>
3650
+     * <?php
3651
+     * array(                                                              O
3652
+     *       'index1'=> array (
3653
+     *           'name'   => 'index1',
3654
+     *           'type'   => 'primary',
3655
+     *           'fields' => array('field1','field2')
3656
+     *           )
3657
+     *       )
3658
+     * ?>
3659
+     * </code>
3660
+     * This format is similar to how indicies are defined in vardef file.
3661
+     *
3662
+     * @param  string $tablename
3663
+     * @return array
3664
+     */
3665
+    abstract public function get_indices($tablename);
3666
+
3667
+    /**
3668
+     * Returns definitions of all indies for passed table.
3669
+     *
3670
+     * return will is a multi-dimensional array that
3671
+     * categorizes the index definition by types, unique, primary and index.
3672
+     * <code>
3673
+     * <?php
3674
+     * array(
3675
+     *       'field1'=> array (
3676
+     *           'name'   => 'field1',
3677
+     *           'type'   => 'varchar',
3678
+     *           'len' => '200'
3679
+     *           )
3680
+     *       )
3681
+     * ?>
3682
+     * </code>
3683
+     * This format is similar to how indicies are defined in vardef file.
3684
+     *
3685
+     * @param  string $tablename
3686
+     * @return array
3687
+     */
3688
+    abstract public function get_columns($tablename);
3689
+
3690
+    /**
3691
+     * Generates alter constraint statement given a table name and vardef definition.
3692
+     *
3693
+     * Supports both adding and droping a constraint.
3694
+     *
3695
+     * @param  string $table      tablename
3696
+     * @param  array  $definition field definition
3697
+     * @param  bool   $drop       true if we are dropping the constraint, false if we are adding it
3698
+     * @return string SQL statement
3699
+     */
3700
+    abstract public function add_drop_constraint($table, $definition, $drop = false);
3701
+
3702
+    /**
3703
+     * Returns the description of fields based on the result
3704
+     *
3705
+     * @param  resource $result
3706
+     * @param  boolean  $make_lower_case
3707
+     * @return array field array
3708
+     */
3709
+    abstract public function getFieldsArray($result, $make_lower_case = false);
3710
+
3711
+    /**
3712
+     * Returns an array of tables for this database
3713
+     *
3714
+     * @return	array|false 	an array of with table names, false if no tables found
3715
+     */
3716
+    abstract public function getTablesArray();
3717
+
3718
+    /**
3719
+     * Return's the version of the database
3720
+     *
3721
+     * @return string
3722
+     */
3723
+    abstract public function version();
3724
+
3725
+    /**
3726
+     * Checks if a table with the name $tableName exists
3727
+     * and returns true if it does or false otherwise
3728
+     *
3729
+     * @param  string $tableName
3730
+     * @return bool
3731
+     */
3732
+    abstract public function tableExists($tableName);
3733
+
3734
+    /**
3735
+     * Fetches the next row in the query result into an associative array
3736
+     *
3737
+     * @param  resource $result
3738
+     * @return array    returns false if there are no more rows available to fetch
3739
+     */
3740
+    abstract public function fetchRow($result);
3741
+
3742
+    /**
3743
+     * Connects to the database backend
3744
+     *
3745
+     * Takes in the database settings and opens a database connection based on those
3746
+     * will open either a persistent or non-persistent connection.
3747
+     * If a persistent connection is desired but not available it will defualt to non-persistent
3748
+     *
3749
+     * configOptions must include
3750
+     * db_host_name - server ip
3751
+     * db_user_name - database user name
3752
+     * db_password - database password
3753
+     *
3754
+     * @param array   $configOptions
3755
+     * @param boolean $dieOnError
3756
+     */
3757
+    abstract public function connect(array $configOptions = null, $dieOnError = false);
3758
+
3759
+    /**
3760
+     * Generates sql for create table statement for a bean.
3761
+     *
3762
+     * @param  string $tablename
3763
+     * @param  array  $fieldDefs
3764
+     * @param  array  $indices
3765
+     * @return string SQL Create Table statement
3766
+     */
3767
+    abstract public function createTableSQLParams($tablename, $fieldDefs, $indices);
3768
+
3769
+    /**
3770
+     * Generates the SQL for changing columns
3771
+     *
3772
+     * @param string $tablename
3773
+     * @param array  $fieldDefs
3774
+     * @param string $action
3775
+     * @param bool   $ignoreRequired Optional, true if we should ignor this being a required field
3776
+     * @return string|array
3777
+     */
3778
+    abstract protected function changeColumnSQL($tablename, $fieldDefs, $action, $ignoreRequired = false);
3779
+
3780
+    /**
3781
+     * Disconnects from the database
3782
+     *
3783
+     * Also handles any cleanup needed
3784
+     */
3785
+    abstract public function disconnect();
3786
+
3787
+    /**
3788
+     * Get last database error
3789
+     * This function should return last error as reported by DB driver
3790
+     * and should return false if no error condition happened
3791
+     * @return string|false Error message or false if no error happened
3792
+     */
3793
+    abstract public function lastDbError();
3794 3794
 
3795 3795
     /**
3796 3796
      * Check if this query is valid
@@ -3798,82 +3798,82 @@  discard block
 block discarded – undo
3798 3798
      * @param string $query
3799 3799
      * @return bool
3800 3800
      */
3801
-	abstract public function validateQuery($query);
3802
-
3803
-	/**
3804
-	 * Check if this driver can be used
3805
-	 * @return bool
3806
-	 */
3807
-	abstract public function valid();
3808
-
3809
-	/**
3810
-	 * Check if certain database exists
3811
-	 * @param string $dbname
3812
-	 */
3813
-	abstract public function dbExists($dbname);
3814
-
3815
-	/**
3816
-	 * Get tables like expression
3817
-	 * @param string $like Expression describing tables
3818
-	 * @return array
3819
-	 */
3820
-	abstract public function tablesLike($like);
3821
-
3822
-	/**
3823
-	 * Create a database
3824
-	 * @param string $dbname
3825
-	 */
3826
-	abstract public function createDatabase($dbname);
3827
-
3828
-	/**
3829
-	 * Drop a database
3830
-	 * @param string $dbname
3831
-	 */
3832
-	abstract public function dropDatabase($dbname);
3833
-
3834
-	/**
3835
-	 * Get database configuration information (DB-dependent)
3836
-	 * @return array|null
3837
-	 */
3838
-	abstract public function getDbInfo();
3839
-
3840
-	/**
3841
-	 * Check if certain DB user exists
3842
-	 * @param string $username
3843
-	 */
3844
-	abstract public function userExists($username);
3845
-
3846
-	/**
3847
-	 * Create DB user
3848
-	 * @param string $database_name
3849
-	 * @param string $host_name
3850
-	 * @param string $user
3851
-	 * @param string $password
3852
-	 */
3853
-	abstract public function createDbUser($database_name, $host_name, $user, $password);
3854
-
3855
-	/**
3856
-	 * Check if the database supports fulltext indexing
3857
-	 * Note that database driver can be capable of supporting FT (see supports('fulltext))
3858
-	 * but particular instance can still have it disabled
3859
-	 * @return bool
3860
-	 */
3861
-	abstract public function full_text_indexing_installed();
3862
-
3863
-	/**
3864
-	 * Generate fulltext query from set of terms
3865
-	 * @param string $field Field to search against
3866
-	 * @param array $terms Search terms that may be or not be in the result
3867
-	 * @param array $must_terms Search terms that have to be in the result
3868
-	 * @param array $exclude_terms Search terms that have to be not in the result
3869
-	 */
3870
-	abstract public function getFulltextQuery($field, $terms, $must_terms = array(), $exclude_terms = array());
3871
-
3872
-	/**
3873
-	 * Get install configuration for this DB
3874
-	 * @return array
3875
-	 */
3876
-	abstract public function installConfig();
3801
+    abstract public function validateQuery($query);
3802
+
3803
+    /**
3804
+     * Check if this driver can be used
3805
+     * @return bool
3806
+     */
3807
+    abstract public function valid();
3808
+
3809
+    /**
3810
+     * Check if certain database exists
3811
+     * @param string $dbname
3812
+     */
3813
+    abstract public function dbExists($dbname);
3814
+
3815
+    /**
3816
+     * Get tables like expression
3817
+     * @param string $like Expression describing tables
3818
+     * @return array
3819
+     */
3820
+    abstract public function tablesLike($like);
3821
+
3822
+    /**
3823
+     * Create a database
3824
+     * @param string $dbname
3825
+     */
3826
+    abstract public function createDatabase($dbname);
3827
+
3828
+    /**
3829
+     * Drop a database
3830
+     * @param string $dbname
3831
+     */
3832
+    abstract public function dropDatabase($dbname);
3833
+
3834
+    /**
3835
+     * Get database configuration information (DB-dependent)
3836
+     * @return array|null
3837
+     */
3838
+    abstract public function getDbInfo();
3839
+
3840
+    /**
3841
+     * Check if certain DB user exists
3842
+     * @param string $username
3843
+     */
3844
+    abstract public function userExists($username);
3845
+
3846
+    /**
3847
+     * Create DB user
3848
+     * @param string $database_name
3849
+     * @param string $host_name
3850
+     * @param string $user
3851
+     * @param string $password
3852
+     */
3853
+    abstract public function createDbUser($database_name, $host_name, $user, $password);
3854
+
3855
+    /**
3856
+     * Check if the database supports fulltext indexing
3857
+     * Note that database driver can be capable of supporting FT (see supports('fulltext))
3858
+     * but particular instance can still have it disabled
3859
+     * @return bool
3860
+     */
3861
+    abstract public function full_text_indexing_installed();
3862
+
3863
+    /**
3864
+     * Generate fulltext query from set of terms
3865
+     * @param string $field Field to search against
3866
+     * @param array $terms Search terms that may be or not be in the result
3867
+     * @param array $must_terms Search terms that have to be in the result
3868
+     * @param array $exclude_terms Search terms that have to be not in the result
3869
+     */
3870
+    abstract public function getFulltextQuery($field, $terms, $must_terms = array(), $exclude_terms = array());
3871
+
3872
+    /**
3873
+     * Get install configuration for this DB
3874
+     * @return array
3875
+     */
3876
+    abstract public function installConfig();
3877 3877
 
3878 3878
     /**
3879 3879
      * Returns a DB specific FROM clause which can be used to select against functions.
@@ -3890,5 +3890,5 @@  discard block
 block discarded – undo
3890 3890
      * @abstract
3891 3891
      * @return string
3892 3892
      */
3893
-	abstract public function getGuidSQL();
3893
+    abstract public function getGuidSQL();
3894 3894
 }
Please login to merge, or discard this patch.
include/database/MysqliManager.php 1 patch
Indentation   +252 added lines, -252 removed lines patch added patch discarded remove patch
@@ -98,51 +98,51 @@  discard block
 block discarded – undo
98 98
  */
99 99
 class MysqliManager extends MysqlManager
100 100
 {
101
-	/**
102
-	 * @see DBManager::$dbType
103
-	 */
104
-	public $dbType = 'mysql';
105
-	public $variant = 'mysqli';
106
-	public $priority = 10;
107
-	public $label = 'LBL_MYSQLI';
108
-
109
-	/**
110
-	 * @see DBManager::$backendFunctions
111
-	 */
112
-	protected $backendFunctions = array(
113
-		'free_result'        => 'mysqli_free_result',
114
-		'close'              => 'mysqli_close',
115
-		'row_count'          => 'mysqli_num_rows',
116
-		'affected_row_count' => 'mysqli_affected_rows',
117
-		);
118
-
119
-	/**
120
-	 * @see MysqlManager::query()
121
-	 */
122
-	public function query($sql, $dieOnError = false, $msg = '', $suppress = false, $keepResult = false)
123
-	{
124
-		if(is_array($sql)) {
125
-			return $this->queryArray($sql, $dieOnError, $msg, $suppress);
101
+    /**
102
+     * @see DBManager::$dbType
103
+     */
104
+    public $dbType = 'mysql';
105
+    public $variant = 'mysqli';
106
+    public $priority = 10;
107
+    public $label = 'LBL_MYSQLI';
108
+
109
+    /**
110
+     * @see DBManager::$backendFunctions
111
+     */
112
+    protected $backendFunctions = array(
113
+        'free_result'        => 'mysqli_free_result',
114
+        'close'              => 'mysqli_close',
115
+        'row_count'          => 'mysqli_num_rows',
116
+        'affected_row_count' => 'mysqli_affected_rows',
117
+        );
118
+
119
+    /**
120
+     * @see MysqlManager::query()
121
+     */
122
+    public function query($sql, $dieOnError = false, $msg = '', $suppress = false, $keepResult = false)
123
+    {
124
+        if(is_array($sql)) {
125
+            return $this->queryArray($sql, $dieOnError, $msg, $suppress);
126 126
         }
127 127
 
128
-		static $queryMD5 = array();
128
+        static $queryMD5 = array();
129 129
 
130
-		parent::countQuery($sql);
131
-		$GLOBALS['log']->info('Query:' . $sql);
132
-		$this->checkConnection();
133
-		$this->query_time = microtime(true);
134
-		$this->lastsql = $sql;
135
-		$result = $suppress?@mysqli_query($this->database,$sql):mysqli_query($this->database,$sql);
136
-		$md5 = md5($sql);
130
+        parent::countQuery($sql);
131
+        $GLOBALS['log']->info('Query:' . $sql);
132
+        $this->checkConnection();
133
+        $this->query_time = microtime(true);
134
+        $this->lastsql = $sql;
135
+        $result = $suppress?@mysqli_query($this->database,$sql):mysqli_query($this->database,$sql);
136
+        $md5 = md5($sql);
137 137
 
138
-		if (empty($queryMD5[$md5]))
139
-			$queryMD5[$md5] = true;
138
+        if (empty($queryMD5[$md5]))
139
+            $queryMD5[$md5] = true;
140 140
 
141
-		$this->query_time = microtime(true) - $this->query_time;
142
-		$GLOBALS['log']->info('Query Execution Time:'.$this->query_time);
141
+        $this->query_time = microtime(true) - $this->query_time;
142
+        $GLOBALS['log']->info('Query Execution Time:'.$this->query_time);
143 143
 
144
-		// This is some heavy duty debugging, leave commented out unless you need this:
145
-		/*
144
+        // This is some heavy duty debugging, leave commented out unless you need this:
145
+        /*
146 146
 		$bt = debug_backtrace();
147 147
 		for ( $i = count($bt) ; $i-- ; $i > 0 ) {
148 148
 			if ( strpos('MysqliManager.php',$bt[$i]['file']) === false ) {
@@ -154,228 +154,228 @@  discard block
 block discarded – undo
154 154
 		*/
155 155
 
156 156
 
157
-		if($keepResult)
158
-			$this->lastResult = $result;
159
-		$this->checkError($msg.' Query Failed: ' . $sql, $dieOnError);
160
-
161
-		return $result;
162
-	}
163
-
164
-	/**
165
-	 * Returns the number of rows affected by the last query
166
-	 *
167
-	 * @return int
168
-	 */
169
-	public function getAffectedRowCount($result)
170
-	{
171
-		return mysqli_affected_rows($this->getDatabase());
172
-	}
173
-
174
-	/**
175
-	 * Returns the number of rows returned by the result
176
-	 *
177
-	 * This function can't be reliably implemented on most DB, do not use it.
178
-	 * @abstract
179
-	 * @deprecated
180
-	 * @param  resource $result
181
-	 * @return int
182
-	 */
183
-	public function getRowCount($result)
184
-	{
185
-	    return mysqli_num_rows($result);
186
-	}
157
+        if($keepResult)
158
+            $this->lastResult = $result;
159
+        $this->checkError($msg.' Query Failed: ' . $sql, $dieOnError);
187 160
 
161
+        return $result;
162
+    }
188 163
 
189 164
     /**
190
-	 * Disconnects from the database
191
-	 *
192
-	 * Also handles any cleanup needed
193
-	 */
194
-	public function disconnect()
195
-	{
196
-		if(isset($GLOBALS['log']) && !is_null($GLOBALS['log'])) {
197
-			$GLOBALS['log']->debug('Calling MySQLi::disconnect()');
198
-		}
199
-		if(!empty($this->database)){
200
-			$this->freeResult();
201
-			mysqli_close($this->database);
202
-			$this->database = null;
203
-		}
204
-	}
205
-
206
-	/**
207
-	 * @see DBManager::freeDbResult()
208
-	 */
209
-	protected function freeDbResult($dbResult)
210
-	{
211
-		if(!empty($dbResult))
212
-			mysqli_free_result($dbResult);
213
-	}
214
-
215
-	/**
216
-	 * @see DBManager::getFieldsArray()
217
-	 */
218
-	public function getFieldsArray($result, $make_lower_case = false)
219
-	{
220
-		$field_array = array();
221
-
222
-		if (!isset($result) || empty($result))
223
-			return 0;
224
-
225
-		$i = 0;
226
-		while ($i < mysqli_num_fields($result)) {
227
-			$meta = mysqli_fetch_field_direct($result, $i);
228
-			if (!$meta)
229
-				return 0;
230
-
231
-			if($make_lower_case == true)
232
-				$meta->name = strtolower($meta->name);
233
-
234
-			$field_array[] = $meta->name;
235
-
236
-			$i++;
237
-		}
165
+     * Returns the number of rows affected by the last query
166
+     *
167
+     * @return int
168
+     */
169
+    public function getAffectedRowCount($result)
170
+    {
171
+        return mysqli_affected_rows($this->getDatabase());
172
+    }
173
+
174
+    /**
175
+     * Returns the number of rows returned by the result
176
+     *
177
+     * This function can't be reliably implemented on most DB, do not use it.
178
+     * @abstract
179
+     * @deprecated
180
+     * @param  resource $result
181
+     * @return int
182
+     */
183
+    public function getRowCount($result)
184
+    {
185
+        return mysqli_num_rows($result);
186
+    }
187
+
188
+
189
+    /**
190
+     * Disconnects from the database
191
+     *
192
+     * Also handles any cleanup needed
193
+     */
194
+    public function disconnect()
195
+    {
196
+        if(isset($GLOBALS['log']) && !is_null($GLOBALS['log'])) {
197
+            $GLOBALS['log']->debug('Calling MySQLi::disconnect()');
198
+        }
199
+        if(!empty($this->database)){
200
+            $this->freeResult();
201
+            mysqli_close($this->database);
202
+            $this->database = null;
203
+        }
204
+    }
205
+
206
+    /**
207
+     * @see DBManager::freeDbResult()
208
+     */
209
+    protected function freeDbResult($dbResult)
210
+    {
211
+        if(!empty($dbResult))
212
+            mysqli_free_result($dbResult);
213
+    }
214
+
215
+    /**
216
+     * @see DBManager::getFieldsArray()
217
+     */
218
+    public function getFieldsArray($result, $make_lower_case = false)
219
+    {
220
+        $field_array = array();
221
+
222
+        if (!isset($result) || empty($result))
223
+            return 0;
224
+
225
+        $i = 0;
226
+        while ($i < mysqli_num_fields($result)) {
227
+            $meta = mysqli_fetch_field_direct($result, $i);
228
+            if (!$meta)
229
+                return 0;
230
+
231
+            if($make_lower_case == true)
232
+                $meta->name = strtolower($meta->name);
233
+
234
+            $field_array[] = $meta->name;
235
+
236
+            $i++;
237
+        }
238
+
239
+        return $field_array;
240
+    }
241
+
242
+    /**
243
+     * @see DBManager::fetchRow()
244
+     */
245
+    public function fetchRow($result)
246
+    {
247
+        if (empty($result))	return false;
248
+
249
+        $row = mysqli_fetch_assoc($result);
250
+        if($row == null) $row = false; //Make sure MySQLi driver results are consistent with other database drivers
251
+        return $row;
252
+    }
238 253
 
239
-		return $field_array;
240
-	}
241
-
242
-	/**
243
-	 * @see DBManager::fetchRow()
244
-	 */
245
-	public function fetchRow($result)
246
-	{
247
-		if (empty($result))	return false;
248
-
249
-		$row = mysqli_fetch_assoc($result);
250
-		if($row == null) $row = false; //Make sure MySQLi driver results are consistent with other database drivers
251
-		return $row;
252
-	}
253
-
254
-	/**
255
-	 * @see DBManager::quote()
256
-	 */
257
-	public function quote($string)
258
-	{
259
-		return mysqli_real_escape_string($this->getDatabase(),$this->quoteInternal($string));
260
-	}
261
-
262
-	/**
263
-	 * @see DBManager::connect()
264
-	 */
265
-	public function connect(array $configOptions = null, $dieOnError = false)
266
-	{
267
-		global $sugar_config;
268
-
269
-		if (is_null($configOptions))
270
-			$configOptions = $sugar_config['dbconfig'];
271
-
272
-		if(!isset($this->database)) {
273
-
274
-			//mysqli connector has a separate parameter for port.. We need to separate it out from the host name
275
-			$dbhost=$configOptions['db_host_name'];
254
+    /**
255
+     * @see DBManager::quote()
256
+     */
257
+    public function quote($string)
258
+    {
259
+        return mysqli_real_escape_string($this->getDatabase(),$this->quoteInternal($string));
260
+    }
261
+
262
+    /**
263
+     * @see DBManager::connect()
264
+     */
265
+    public function connect(array $configOptions = null, $dieOnError = false)
266
+    {
267
+        global $sugar_config;
268
+
269
+        if (is_null($configOptions))
270
+            $configOptions = $sugar_config['dbconfig'];
271
+
272
+        if(!isset($this->database)) {
273
+
274
+            //mysqli connector has a separate parameter for port.. We need to separate it out from the host name
275
+            $dbhost=$configOptions['db_host_name'];
276 276
             $dbport=isset($configOptions['db_port']) ? ($configOptions['db_port'] == '' ? null : $configOptions['db_port']) : null;
277 277
 			
278
-			$pos=strpos($configOptions['db_host_name'],':');
279
-			if ($pos !== false) {
280
-				$dbhost=substr($configOptions['db_host_name'],0,$pos);
281
-				$dbport=substr($configOptions['db_host_name'],$pos+1);
282
-			}
283
-
284
-			$this->database = @mysqli_connect($dbhost,$configOptions['db_user_name'],$configOptions['db_password'],isset($configOptions['db_name'])?$configOptions['db_name']:'',$dbport);
285
-			if(empty($this->database)) {
286
-				$GLOBALS['log']->fatal("Could not connect to DB server ".$dbhost." as ".$configOptions['db_user_name'].". port " .$dbport . ": " . mysqli_connect_error());
287
-				if($dieOnError) {
288
-					if(isset($GLOBALS['app_strings']['ERR_NO_DB'])) {
289
-						sugar_die($GLOBALS['app_strings']['ERR_NO_DB']);
290
-					} else {
291
-						sugar_die("Could not connect to the database. Please refer to suitecrm.log for details.");
292
-					}
293
-				} else {
294
-					return false;
295
-				}
296
-			}
297
-		}
278
+            $pos=strpos($configOptions['db_host_name'],':');
279
+            if ($pos !== false) {
280
+                $dbhost=substr($configOptions['db_host_name'],0,$pos);
281
+                $dbport=substr($configOptions['db_host_name'],$pos+1);
282
+            }
283
+
284
+            $this->database = @mysqli_connect($dbhost,$configOptions['db_user_name'],$configOptions['db_password'],isset($configOptions['db_name'])?$configOptions['db_name']:'',$dbport);
285
+            if(empty($this->database)) {
286
+                $GLOBALS['log']->fatal("Could not connect to DB server ".$dbhost." as ".$configOptions['db_user_name'].". port " .$dbport . ": " . mysqli_connect_error());
287
+                if($dieOnError) {
288
+                    if(isset($GLOBALS['app_strings']['ERR_NO_DB'])) {
289
+                        sugar_die($GLOBALS['app_strings']['ERR_NO_DB']);
290
+                    } else {
291
+                        sugar_die("Could not connect to the database. Please refer to suitecrm.log for details.");
292
+                    }
293
+                } else {
294
+                    return false;
295
+                }
296
+            }
297
+        }
298 298
 
299
-		if(!empty($configOptions['db_name']) && !@mysqli_select_db($this->database,$configOptions['db_name'])) {
300
-			$GLOBALS['log']->fatal( "Unable to select database {$configOptions['db_name']}: " . mysqli_connect_error());
301
-			if($dieOnError) {
302
-					if(isset($GLOBALS['app_strings']['ERR_NO_DB'])) {
303
-						sugar_die($GLOBALS['app_strings']['ERR_NO_DB']);
304
-					} else {
305
-						sugar_die("Could not connect to the database. Please refer to suitecrm.log for details.");
306
-					}
307
-			} else {
308
-				return false;
309
-			}
310
-	    }
299
+        if(!empty($configOptions['db_name']) && !@mysqli_select_db($this->database,$configOptions['db_name'])) {
300
+            $GLOBALS['log']->fatal( "Unable to select database {$configOptions['db_name']}: " . mysqli_connect_error());
301
+            if($dieOnError) {
302
+                    if(isset($GLOBALS['app_strings']['ERR_NO_DB'])) {
303
+                        sugar_die($GLOBALS['app_strings']['ERR_NO_DB']);
304
+                    } else {
305
+                        sugar_die("Could not connect to the database. Please refer to suitecrm.log for details.");
306
+                    }
307
+            } else {
308
+                return false;
309
+            }
310
+        }
311 311
 
312
-		// cn: using direct calls to prevent this from spamming the Logs
312
+        // cn: using direct calls to prevent this from spamming the Logs
313 313
 	    
314
-	    $collation = $this->getOption('collation');
315
-	    if(!empty($collation)) {
316
-	    	$names = "SET NAMES 'utf8' COLLATE '$collation'";
317
-	    	mysqli_query($this->database,$names);
318
-		}
319
-	    mysqli_set_charset ($this->database , "utf8" );
320
-
321
-		if($this->checkError('Could Not Connect', $dieOnError))
322
-			$GLOBALS['log']->info("connected to db");
323
-
324
-		$this->connectOptions = $configOptions;
325
-		return true;
326
-	}
327
-
328
-	/**
329
-	 * (non-PHPdoc)
330
-	 * @see MysqlManager::lastDbError()
331
-	 */
332
-	public function lastDbError()
333
-	{
334
-		if($this->database) {
335
-		    if(mysqli_errno($this->database)) {
336
-			    return "MySQL error ".mysqli_errno($this->database).": ".mysqli_error($this->database);
337
-		    }
338
-		} else {
339
-			$err =  mysqli_connect_error();
340
-			if($err) {
341
-			    return $err;
342
-			}
343
-		}
314
+        $collation = $this->getOption('collation');
315
+        if(!empty($collation)) {
316
+            $names = "SET NAMES 'utf8' COLLATE '$collation'";
317
+            mysqli_query($this->database,$names);
318
+        }
319
+        mysqli_set_charset ($this->database , "utf8" );
344 320
 
345
-		return false;
346
-	}
321
+        if($this->checkError('Could Not Connect', $dieOnError))
322
+            $GLOBALS['log']->info("connected to db");
347 323
 
348
-	public function getDbInfo()
349
-	{
350
-		$charsets = $this->getCharsetInfo();
351
-		$charset_str = array();
352
-		foreach($charsets as $name => $value) {
353
-			$charset_str[] = "$name = $value";
354
-		}
355
-		return array(
356
-			"MySQLi Version" => @mysqli_get_client_info(),
357
-			"MySQLi Host Info" => @mysqli_get_host_info($this->database),
358
-			"MySQLi Server Info" => @mysqli_get_server_info($this->database),
359
-			"MySQLi Client Encoding" =>  @mysqli_client_encoding($this->database),
360
-			"MySQL Character Set Settings" => join(", ", $charset_str),
361
-		);
362
-	}
363
-
364
-	/**
365
-	 * Select database
366
-	 * @param string $dbname
367
-	 */
368
-	protected function selectDb($dbname)
369
-	{
370
-		return mysqli_select_db($this->getDatabase(), $dbname);
371
-	}
372
-
373
-	/**
374
-	 * Check if this driver can be used
375
-	 * @return bool
376
-	 */
377
-	public function valid()
378
-	{
379
-		return function_exists("mysqli_connect") && empty($GLOBALS['sugar_config']['mysqli_disabled']);
380
-	}
324
+        $this->connectOptions = $configOptions;
325
+        return true;
326
+    }
327
+
328
+    /**
329
+     * (non-PHPdoc)
330
+     * @see MysqlManager::lastDbError()
331
+     */
332
+    public function lastDbError()
333
+    {
334
+        if($this->database) {
335
+            if(mysqli_errno($this->database)) {
336
+                return "MySQL error ".mysqli_errno($this->database).": ".mysqli_error($this->database);
337
+            }
338
+        } else {
339
+            $err =  mysqli_connect_error();
340
+            if($err) {
341
+                return $err;
342
+            }
343
+        }
344
+
345
+        return false;
346
+    }
347
+
348
+    public function getDbInfo()
349
+    {
350
+        $charsets = $this->getCharsetInfo();
351
+        $charset_str = array();
352
+        foreach($charsets as $name => $value) {
353
+            $charset_str[] = "$name = $value";
354
+        }
355
+        return array(
356
+            "MySQLi Version" => @mysqli_get_client_info(),
357
+            "MySQLi Host Info" => @mysqli_get_host_info($this->database),
358
+            "MySQLi Server Info" => @mysqli_get_server_info($this->database),
359
+            "MySQLi Client Encoding" =>  @mysqli_client_encoding($this->database),
360
+            "MySQL Character Set Settings" => join(", ", $charset_str),
361
+        );
362
+    }
363
+
364
+    /**
365
+     * Select database
366
+     * @param string $dbname
367
+     */
368
+    protected function selectDb($dbname)
369
+    {
370
+        return mysqli_select_db($this->getDatabase(), $dbname);
371
+    }
372
+
373
+    /**
374
+     * Check if this driver can be used
375
+     * @return bool
376
+     */
377
+    public function valid()
378
+    {
379
+        return function_exists("mysqli_connect") && empty($GLOBALS['sugar_config']['mysqli_disabled']);
380
+    }
381 381
 }
Please login to merge, or discard this patch.