Completed
Push — console-installer ( e2b50d...6ce748 )
by Adam
22:30
created
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.
modules/Users/language/en_us.lang.php 1 patch
Indentation   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -48,8 +48,8 @@  discard block
 block discarded – undo
48 48
 $mod_strings = array (
49 49
     'LBL_DELETE_USER_CONFIRM'           => 'When the User record is deleted, the corresponding Employee record will also be deleted. After the user is deleted, any workflow definitions and reports involving the user might need to be updated.<br/><br/> Deleting a User record cannot be undone.',
50 50
 
51
-	'LBL_DELETE_GROUP_CONFIRM'          => 'Are you sure you want to delete this Group User? Click OK to delete the User record.<br/>After clicking OK, you will be given the ability to reassign records assigned to the Group User to another user.',
52
-	'LBL_DELETE_PORTAL_CONFIRM'         => 'Are you sure you want to delete this Portal API User? Click OK to delete the User record.',
51
+    'LBL_DELETE_GROUP_CONFIRM'          => 'Are you sure you want to delete this Group User? Click OK to delete the User record.<br/>After clicking OK, you will be given the ability to reassign records assigned to the Group User to another user.',
52
+    'LBL_DELETE_PORTAL_CONFIRM'         => 'Are you sure you want to delete this Portal API User? Click OK to delete the User record.',
53 53
 
54 54
 
55 55
     'LNK_IMPORT_USERS' => 'Import Users',
@@ -598,7 +598,7 @@  discard block
 block discarded – undo
598 598
     'LBL_ENABLE_NOTIFICATIONS' => 'Enable Desktop Notifications',
599 599
     'LBL_LIST_NONINHERITABLE' => "Not Inheritable",
600 600
     'LBL_PRIMARY_GROUP' => "Primary Group",
601
-	'LBL_PASSWORD_MIS_MATCH' => 'mis-match',
601
+    'LBL_PASSWORD_MIS_MATCH' => 'mis-match',
602 602
 ); // END STRINGS DEFS
603 603
 
604 604
 ?>
Please login to merge, or discard this patch.
modules/Meetings/metadata/editviewdefs.php 1 patch
Indentation   +82 added lines, -82 removed lines patch added patch discarded remove patch
@@ -39,134 +39,134 @@  discard block
 block discarded – undo
39 39
 
40 40
 $viewdefs ['Meetings'] =
41 41
 array (
42
-  'EditView' =>
43
-  array (
42
+    'EditView' =>
43
+    array (
44 44
     'templateMeta' =>
45 45
     array (
46 46
         'includes' => array(
47 47
             array('file' => 'modules/Reminders/Reminders.js'),
48 48
         ),
49
-      'maxColumns' => '2',
50
-      'form' =>
51
-      array (
49
+        'maxColumns' => '2',
50
+        'form' =>
51
+        array (
52 52
         'hidden' =>
53 53
         array (
54
-          0 => '<input type="hidden" name="isSaveAndNew" value="false">',
54
+            0 => '<input type="hidden" name="isSaveAndNew" value="false">',
55 55
         ),
56 56
         'buttons' =>
57 57
         array (
58
-          0 =>
59
-          array (
60
-			'customCode' => '<input title="{$APP.LBL_SAVE_BUTTON_TITLE}" id ="SAVE_HEADER" accessKey="{$APP.LBL_SAVE_BUTTON_KEY}" class="button primary" onclick="SUGAR.meetings.fill_invitees();document.EditView.action.value=\'Save\'; document.EditView.return_action.value=\'DetailView\'; {if isset($smarty.request.isDuplicate) && $smarty.request.isDuplicate eq "true"}document.EditView.return_id.value=\'\'; {/if} formSubmitCheck();"type="submit" name="button" value="{$APP.LBL_SAVE_BUTTON_LABEL}">',
61
-		  ),
62
-          1 => 'CANCEL',
63
-          2 =>
64
-          array (
65
-             'customCode' => '<input title="{$MOD.LBL_SEND_BUTTON_TITLE}" id="save_and_send_invites_header" class="button" onclick="document.EditView.send_invites.value=\'1\';SUGAR.meetings.fill_invitees();document.EditView.action.value=\'Save\';document.EditView.return_action.value=\'EditView\';document.EditView.return_module.value=\'{$smarty.request.return_module}\'; formSubmitCheck();"type="button" name="button" value="{$MOD.LBL_SEND_BUTTON_LABEL}">',
66
-		  ),
67
-          3 => 
68
-          array (
58
+            0 =>
59
+            array (
60
+            'customCode' => '<input title="{$APP.LBL_SAVE_BUTTON_TITLE}" id ="SAVE_HEADER" accessKey="{$APP.LBL_SAVE_BUTTON_KEY}" class="button primary" onclick="SUGAR.meetings.fill_invitees();document.EditView.action.value=\'Save\'; document.EditView.return_action.value=\'DetailView\'; {if isset($smarty.request.isDuplicate) && $smarty.request.isDuplicate eq "true"}document.EditView.return_id.value=\'\'; {/if} formSubmitCheck();"type="submit" name="button" value="{$APP.LBL_SAVE_BUTTON_LABEL}">',
61
+            ),
62
+            1 => 'CANCEL',
63
+            2 =>
64
+            array (
65
+                'customCode' => '<input title="{$MOD.LBL_SEND_BUTTON_TITLE}" id="save_and_send_invites_header" class="button" onclick="document.EditView.send_invites.value=\'1\';SUGAR.meetings.fill_invitees();document.EditView.action.value=\'Save\';document.EditView.return_action.value=\'EditView\';document.EditView.return_module.value=\'{$smarty.request.return_module}\'; formSubmitCheck();"type="button" name="button" value="{$MOD.LBL_SEND_BUTTON_LABEL}">',
66
+            ),
67
+            3 => 
68
+            array (
69 69
             'customCode' => '{if $fields.status.value != "Held"}<input title="{$APP.LBL_CLOSE_AND_CREATE_BUTTON_TITLE}" id="close_and_create_new_header" class="button" onclick="SUGAR.meetings.fill_invitees(); document.EditView.status.value=\'Held\'; document.EditView.action.value=\'Save\'; document.EditView.return_module.value=\'Meetings\'; document.EditView.isDuplicate.value=true; document.EditView.isSaveAndNew.value=true; document.EditView.return_action.value=\'EditView\'; document.EditView.return_id.value=\'{$fields.id.value}\'; formSubmitCheck();"type="button" name="button" value="{$APP.LBL_CLOSE_AND_CREATE_BUTTON_LABEL}">{/if}',
70
-           ),
70
+            ),
71 71
         ),
72 72
         'headerTpl' => 'modules/Meetings/tpls/header.tpl',
73 73
 
74
-          'buttons_footer' =>
74
+            'buttons_footer' =>
75 75
         array (
76
-          0 =>
77
-          array (
78
-			'customCode' => '<input title="{$APP.LBL_SAVE_BUTTON_TITLE}" id ="SAVE_FOOTER" accessKey="{$APP.LBL_SAVE_BUTTON_KEY}" class="button primary" onclick="SUGAR.meetings.fill_invitees();document.EditView.action.value=\'Save\'; document.EditView.return_action.value=\'DetailView\'; {if isset($smarty.request.isDuplicate) && $smarty.request.isDuplicate eq "true"}document.EditView.return_id.value=\'\'; {/if} formSubmitCheck();"type="button" name="button" value="{$APP.LBL_SAVE_BUTTON_LABEL}">',
79
-		  ),
80
-          1 => 'CANCEL',
81
-          2 =>
82
-          array (
83
-             'customCode' => '<input title="{$MOD.LBL_SEND_BUTTON_TITLE}" id="save_and_send_invites_footer" class="button" onclick="document.EditView.send_invites.value=\'1\';SUGAR.meetings.fill_invitees();document.EditView.action.value=\'Save\';document.EditView.return_action.value=\'EditView\';document.EditView.return_module.value=\'{$smarty.request.return_module}\'; formSubmitCheck();"type="button" name="button" value="{$MOD.LBL_SEND_BUTTON_LABEL}">',
84
-		  ),
85
-          3 =>
86
-          array (
76
+            0 =>
77
+            array (
78
+            'customCode' => '<input title="{$APP.LBL_SAVE_BUTTON_TITLE}" id ="SAVE_FOOTER" accessKey="{$APP.LBL_SAVE_BUTTON_KEY}" class="button primary" onclick="SUGAR.meetings.fill_invitees();document.EditView.action.value=\'Save\'; document.EditView.return_action.value=\'DetailView\'; {if isset($smarty.request.isDuplicate) && $smarty.request.isDuplicate eq "true"}document.EditView.return_id.value=\'\'; {/if} formSubmitCheck();"type="button" name="button" value="{$APP.LBL_SAVE_BUTTON_LABEL}">',
79
+            ),
80
+            1 => 'CANCEL',
81
+            2 =>
82
+            array (
83
+                'customCode' => '<input title="{$MOD.LBL_SEND_BUTTON_TITLE}" id="save_and_send_invites_footer" class="button" onclick="document.EditView.send_invites.value=\'1\';SUGAR.meetings.fill_invitees();document.EditView.action.value=\'Save\';document.EditView.return_action.value=\'EditView\';document.EditView.return_module.value=\'{$smarty.request.return_module}\'; formSubmitCheck();"type="button" name="button" value="{$MOD.LBL_SEND_BUTTON_LABEL}">',
84
+            ),
85
+            3 =>
86
+            array (
87 87
             'customCode' => '{if $fields.status.value != "Held"}<input title="{$APP.LBL_CLOSE_AND_CREATE_BUTTON_TITLE}" id="close_and_create_new_footer" class="button" onclick="SUGAR.meetings.fill_invitees(); document.EditView.status.value=\'Held\'; document.EditView.action.value=\'Save\'; document.EditView.return_module.value=\'Meetings\'; document.EditView.isDuplicate.value=true; document.EditView.isSaveAndNew.value=true; document.EditView.return_action.value=\'EditView\'; document.EditView.return_id.value=\'{$fields.id.value}\'; formSubmitCheck();"type="button" name="button" value="{$APP.LBL_CLOSE_AND_CREATE_BUTTON_LABEL}">{/if}',
88
-           ),
88
+            ),
89 89
         ),
90 90
         'footerTpl' => 'modules/Meetings/tpls/footer.tpl',
91
-      ),
92
-      'widths' =>
93
-      array (
91
+        ),
92
+        'widths' =>
93
+        array (
94 94
         0 =>
95 95
         array (
96
-          'label' => '10',
97
-          'field' => '30',
96
+            'label' => '10',
97
+            'field' => '30',
98 98
         ),
99 99
         1 =>
100 100
         array (
101
-          'label' => '10',
102
-          'field' => '30',
101
+            'label' => '10',
102
+            'field' => '30',
103
+        ),
103 104
         ),
104
-      ),
105
-      'javascript' => '<script type="text/javascript">{$JSON_CONFIG_JAVASCRIPT}</script>
105
+        'javascript' => '<script type="text/javascript">{$JSON_CONFIG_JAVASCRIPT}</script>
106 106
 {sugar_getscript file="cache/include/javascript/sugar_grp_jsolait.js"}
107 107
 <script>toggle_portal_flag();function toggle_portal_flag()  {ldelim} {$TOGGLE_JS} {rdelim} 
108 108
 function formSubmitCheck(){ldelim}if(check_form(\'EditView\')){ldelim}document.EditView.submit();{rdelim}{rdelim}</script>',
109
-      'useTabs' => false,
109
+        'useTabs' => false,
110 110
     ),
111 111
     'panels' =>
112 112
     array (
113
-      'lbl_meeting_information' =>
114
-      array (
113
+        'lbl_meeting_information' =>
115 114
         array (
116
-          array (
115
+        array (
116
+            array (
117 117
             'name' => 'name',
118 118
 
119
-          ),
120
-          array (
119
+            ),
120
+            array (
121 121
             'name' => 'status',
122 122
             'fields' =>
123 123
             array (
124
-              array (
124
+                array (
125 125
                 'name' => 'status',
126
-              ),
126
+                ),
127
+            ),
127 128
             ),
128
-         ),
129
-      ),
129
+        ),
130 130
       
131 131
       
132
-      array (
133
-          array (
132
+        array (
133
+            array (
134 134
             'name' => 'date_start',
135 135
             'type' => 'datetimecombo',
136 136
             'displayParams' =>
137 137
             array (
138
-              'required' => true,
139
-              'updateCallback' => 'SugarWidgetScheduler.update_time();',
138
+                'required' => true,
139
+                'updateCallback' => 'SugarWidgetScheduler.update_time();',
140
+            ),
140 141
             ),
141
-          ),
142 142
           
143
-          array (
143
+            array (
144 144
             'name' => 'parent_name',
145 145
             'label' => 'LBL_LIST_RELATED_TO',
146
-          ),
146
+            ),
147 147
         ),
148 148
         
149 149
         
150
-      array (
151
-          array (
150
+        array (
151
+            array (
152 152
             'name' => 'date_end',
153 153
             'type' => 'datetimecombo',
154 154
             'displayParams' =>
155 155
             array (
156
-              'required' => true,
157
-              'updateCallback' => 'SugarWidgetScheduler.update_time();',
156
+                'required' => true,
157
+                'updateCallback' => 'SugarWidgetScheduler.update_time();',
158
+            ),
158 159
             ),
159
-          ),
160 160
           
161
-          array (
161
+            array (
162 162
             'name' => 'location',
163 163
             'comment' => 'Meeting location',
164 164
             'label' => 'LBL_LOCATION',
165
-          ),
165
+            ),
166 166
         ),      
167 167
         
168 168
         array(        
169
-          array (
169
+            array (
170 170
             'name' => 'duration',
171 171
             'customCode' => '
172 172
                 @@FIELD@@
@@ -184,7 +184,7 @@  discard block
 block discarded – undo
184 184
                 </script>            
185 185
             ',
186 186
             'customCodeReadOnly' => '{$fields.duration_hours.value}{$MOD.LBL_HOURS_ABBREV} {$fields.duration_minutes.value}{$MOD.LBL_MINSS_ABBREV} ',
187
-          ),
187
+            ),
188 188
         ),
189 189
 //        array (
190 190
 //          array (
@@ -193,31 +193,31 @@  discard block
 block discarded – undo
193 193
 //            'label' => 'LBL_REMINDER',
194 194
 //          ),
195 195
 //        ),
196
-          array(
197
-              array (
198
-                  'name' => 'reminders',
199
-                  'customCode' => '{include file="modules/Reminders/tpls/reminders.tpl"}',
200
-                  'label' => 'LBL_REMINDERS',
201
-              ),
202
-          ),
196
+            array(
197
+                array (
198
+                    'name' => 'reminders',
199
+                    'customCode' => '{include file="modules/Reminders/tpls/reminders.tpl"}',
200
+                    'label' => 'LBL_REMINDERS',
201
+                ),
202
+            ),
203 203
         array (
204
-          array (
204
+            array (
205 205
             'name' => 'description',
206 206
             'comment' => 'Full text of the note',
207 207
             'label' => 'LBL_DESCRIPTION',
208
-          ),
208
+            ),
209
+        ),
209 210
         ),
210
-      ),
211
-      'LBL_PANEL_ASSIGNMENT' =>
212
-      array (
211
+        'LBL_PANEL_ASSIGNMENT' =>
213 212
         array (
214
-          array (
213
+        array (
214
+            array (
215 215
             'name' => 'assigned_user_name',
216 216
             'label' => 'LBL_ASSIGNED_TO_NAME',
217
-          ),
217
+            ),
218 218
         ),
219
-      ),
219
+        ),
220
+    ),
220 221
     ),
221
-  ),
222 222
 );
223 223
 ?>
Please login to merge, or discard this patch.
modules/AM_ProjectTemplates/controller.php 1 patch
Indentation   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -31,12 +31,12 @@
 block discarded – undo
31 31
         $template_id = $_POST['template_id'];
32 32
         $project_start = $_POST['start_date'];
33 33
         //Get project start date
34
-		if($project_start!='')
35
-		{
36
-			$dateformat = $current_user->getPreference('datef');
37
-			$startdate = DateTime::createFromFormat($dateformat, $project_start);
38
-			$start = $startdate->format('Y-m-d');
39
-		}
34
+        if($project_start!='')
35
+        {
36
+            $dateformat = $current_user->getPreference('datef');
37
+            $startdate = DateTime::createFromFormat($dateformat, $project_start);
38
+            $start = $startdate->format('Y-m-d');
39
+        }
40 40
         $duration_unit = 'Days';
41 41
 
42 42
 
Please login to merge, or discard this patch.
modules/EmailTemplates/PopupDocumentsCampaignTemplate.php 1 patch
Indentation   +25 added lines, -25 removed lines patch added patch discarded remove patch
@@ -49,25 +49,25 @@  discard block
 block discarded – undo
49 49
 
50 50
 class DocumentPopupPicker extends Popup_Picker {
51 51
 
52
-	public function __construct()
53
-	{
54
-	}
55
-
56
-	public function _get_where_clause() {
57
-		$where = '';
58
-		if(isset($_REQUEST['query']))
59
-		{
60
-			$where_clauses = array();
61
-			append_where_clause($where_clauses, "document_name", "documents.document_name");
62
-			append_where_clause($where_clauses, "category_id", "documents.category_id");
63
-			append_where_clause($where_clauses, "subcategory_id", "documents.subcategory_id");
64
-			append_where_clause($where_clauses, "template_type", "documents.template_type");
65
-			append_where_clause($where_clauses, "is_template", "documents.is_template");
66
-
67
-			$where = generate_where_statement($where_clauses);
68
-		}
69
-		return $where;
70
-	}
52
+    public function __construct()
53
+    {
54
+    }
55
+
56
+    public function _get_where_clause() {
57
+        $where = '';
58
+        if(isset($_REQUEST['query']))
59
+        {
60
+            $where_clauses = array();
61
+            append_where_clause($where_clauses, "document_name", "documents.document_name");
62
+            append_where_clause($where_clauses, "category_id", "documents.category_id");
63
+            append_where_clause($where_clauses, "subcategory_id", "documents.subcategory_id");
64
+            append_where_clause($where_clauses, "template_type", "documents.template_type");
65
+            append_where_clause($where_clauses, "is_template", "documents.is_template");
66
+
67
+            $where = generate_where_statement($where_clauses);
68
+        }
69
+        return $where;
70
+    }
71 71
 
72 72
 }
73 73
 
@@ -101,14 +101,14 @@  discard block
 block discarded – undo
101 101
 $button  = "<form action='index.php' method='post' name='form' id='form'>\n";
102 102
 if(!$hide_clear_button)
103 103
 {
104
-	$button .= "<input type='button' name='button' class='button' onclick=\"send_back('','');\" title='"
105
-		.$app_strings['LBL_CLEAR_BUTTON_TITLE']."' value='  "
106
-		.$app_strings['LBL_CLEAR_BUTTON_LABEL']."  ' />\n";
104
+    $button .= "<input type='button' name='button' class='button' onclick=\"send_back('','');\" title='"
105
+        .$app_strings['LBL_CLEAR_BUTTON_TITLE']."' value='  "
106
+        .$app_strings['LBL_CLEAR_BUTTON_LABEL']."  ' />\n";
107 107
 }
108 108
 $button .= "<input type='submit' name='button' class='button' onclick=\"window.close();\" title='"
109
-	.$app_strings['LBL_CANCEL_BUTTON_TITLE']."' accesskey='"
110
-	.$app_strings['LBL_CANCEL_BUTTON_KEY']."' value='  "
111
-	.$app_strings['LBL_CANCEL_BUTTON_LABEL']."  ' />\n";
109
+    .$app_strings['LBL_CANCEL_BUTTON_TITLE']."' accesskey='"
110
+    .$app_strings['LBL_CANCEL_BUTTON_KEY']."' value='  "
111
+    .$app_strings['LBL_CANCEL_BUTTON_LABEL']."  ' />\n";
112 112
 $button .= "</form>\n";
113 113
 
114 114
 
Please login to merge, or discard this patch.
modules/Campaigns/WizardNewsletterSave.php 1 patch
Indentation   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -64,7 +64,7 @@  discard block
 block discarded – undo
64 64
     $campaign_focus = populateFromPost('', $campaign_focus);
65 65
 
66 66
     foreach($camp_steps as $step){
67
-       $campaign_focus =  populate_wizard_bean_from_request($campaign_focus,$step);
67
+        $campaign_focus =  populate_wizard_bean_from_request($campaign_focus,$step);
68 68
     }
69 69
 
70 70
     switch($_REQUEST['currentstep']) {
@@ -226,7 +226,7 @@  discard block
 block discarded – undo
226 226
                         $action = 'WizardMarketing';
227 227
                         $redirectToTargetList = '&redirectToTargetList=1';
228 228
                         break;
229
-                     case 'exit':
229
+                        case 'exit':
230 230
                          $action = 'WizardMarketing';
231 231
                         break;
232 232
                 }
@@ -413,15 +413,15 @@  discard block
 block discarded – undo
413 413
  */
414 414
 function populate_wizard_bean_from_request($bean,$prefix){
415 415
     foreach($_REQUEST as $key=> $val){
416
-     $key = trim($key);
417
-     if((strstr($key, $prefix )) && (strpos($key, $prefix )== 0)){
418
-          $field  =substr($key, strlen($prefix)) ;
419
-          if(isset($_REQUEST[$key]) && !empty($_REQUEST[$key])){
420
-              //echo "prefix is $prefix, field is $field,    key is $key,   and value is $val<br>";
421
-              $value = $_REQUEST[$key];
422
-              $bean->$field = $value;
423
-          }
424
-     }
416
+        $key = trim($key);
417
+        if((strstr($key, $prefix )) && (strpos($key, $prefix )== 0)){
418
+            $field  =substr($key, strlen($prefix)) ;
419
+            if(isset($_REQUEST[$key]) && !empty($_REQUEST[$key])){
420
+                //echo "prefix is $prefix, field is $field,    key is $key,   and value is $val<br>";
421
+                $value = $_REQUEST[$key];
422
+                $bean->$field = $value;
423
+            }
424
+        }
425 425
     }
426 426
 
427 427
     return $bean;
@@ -447,7 +447,7 @@  discard block
 block discarded – undo
447 447
         if($pl_subs->name == $_REQUEST['wiz_step3_subscription_name']){
448 448
             $pl_list[] = $pl_subs;
449 449
             $create_new = false;
450
-       }
450
+        }
451 451
 
452 452
     }
453 453
     //create new bio if one was not retrieved successfully
@@ -475,7 +475,7 @@  discard block
 block discarded – undo
475 475
         if($pl_un_subs->name == $_REQUEST['wiz_step3_unsubscription_name']){
476 476
             $pl_list[] = $pl_un_subs;
477 477
             $create_new = false;
478
-       }
478
+        }
479 479
 
480 480
     }
481 481
     //create new bean if one was not retrieved successfully
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,157 +275,157 @@  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',
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 331
     'LBL_CUSTOMIZE_LOCALE'              => 'Customize Locale Settings',
332
-	'LBL_LOCALE_UI'						=> 'User Interface',
333
-
334
-	'LBL_ML_ACTION'						=> 'Action',
335
-	'LBL_ML_DESCRIPTION'				=> 'Description',
336
-	'LBL_ML_INSTALLED'					=> 'Date Installed',
337
-	'LBL_ML_NAME'						=> 'Name',
338
-	'LBL_ML_PUBLISHED'					=> 'Date Published',
339
-	'LBL_ML_TYPE'						=> 'Type',
340
-	'LBL_ML_UNINSTALLABLE'				=> 'Uninstallable',
341
-	'LBL_ML_VERSION'					=> 'Version',
342
-	'LBL_MSSQL'							=> 'SQL Server',
343
-	'LBL_MSSQL2'                        => 'SQL Server (FreeTDS)',
344
-	'LBL_MSSQL_SQLSRV'				    => 'SQL Server (Microsoft SQL Server Driver for PHP)',
345
-	'LBL_MYSQL'							=> 'MySQL',
332
+    'LBL_LOCALE_UI'						=> 'User Interface',
333
+
334
+    'LBL_ML_ACTION'						=> 'Action',
335
+    'LBL_ML_DESCRIPTION'				=> 'Description',
336
+    'LBL_ML_INSTALLED'					=> 'Date Installed',
337
+    'LBL_ML_NAME'						=> 'Name',
338
+    'LBL_ML_PUBLISHED'					=> 'Date Published',
339
+    'LBL_ML_TYPE'						=> 'Type',
340
+    'LBL_ML_UNINSTALLABLE'				=> 'Uninstallable',
341
+    'LBL_ML_VERSION'					=> 'Version',
342
+    'LBL_MSSQL'							=> 'SQL Server',
343
+    'LBL_MSSQL2'                        => 'SQL Server (FreeTDS)',
344
+    'LBL_MSSQL_SQLSRV'				    => 'SQL Server (Microsoft SQL Server Driver for PHP)',
345
+    'LBL_MYSQL'							=> 'MySQL',
346 346
     'LBL_MYSQLI'						=> 'MySQL (mysqli extension)',
347
-	'LBL_IBM_DB2'						=> 'IBM DB2',
348
-	'LBL_NEXT'							=> 'Next',
349
-	'LBL_NO'							=> 'No',
347
+    'LBL_IBM_DB2'						=> 'IBM DB2',
348
+    'LBL_NEXT'							=> 'Next',
349
+    'LBL_NO'							=> 'No',
350 350
     'LBL_ORACLE'						=> 'Oracle',
351
-	'LBL_PERFORM_ADMIN_PASSWORD'		=> 'Setting site admin password',
352
-	'LBL_PERFORM_AUDIT_TABLE'			=> 'audit table / ',
353
-	'LBL_PERFORM_CONFIG_PHP'			=> 'Creating SuiteCRM configuration file',
354
-	'LBL_PERFORM_CREATE_DB_1'			=> '<b>Creating the database</b> ',
355
-	'LBL_PERFORM_CREATE_DB_2'			=> ' <b>on</b> ',
356
-	'LBL_PERFORM_CREATE_DB_USER'		=> 'Creating the Database username and password...',
357
-	'LBL_PERFORM_CREATE_DEFAULT'		=> 'Creating default SuiteCRM data',
358
-	'LBL_PERFORM_CREATE_LOCALHOST'		=> 'Creating the Database username and password for localhost...',
359
-	'LBL_PERFORM_CREATE_RELATIONSHIPS'	=> 'Creating SuiteCRM relationship tables',
360
-	'LBL_PERFORM_CREATING'				=> 'creating / ',
361
-	'LBL_PERFORM_DEFAULT_REPORTS'		=> 'Creating default reports',
362
-	'LBL_PERFORM_DEFAULT_SCHEDULER'		=> 'Creating default scheduler jobs',
363
-	'LBL_PERFORM_DEFAULT_SETTINGS'		=> 'Inserting default settings',
364
-	'LBL_PERFORM_DEFAULT_USERS'			=> 'Creating default users',
365
-	'LBL_PERFORM_DEMO_DATA'				=> 'Populating the database tables with demo data (this may take a little while)',
366
-	'LBL_PERFORM_DONE'					=> 'done<br>',
367
-	'LBL_PERFORM_DROPPING'				=> 'dropping / ',
368
-	'LBL_PERFORM_FINISH'				=> 'Finish',
369
-	'LBL_PERFORM_LICENSE_SETTINGS'		=> 'Updating license information',
370
-	'LBL_PERFORM_OUTRO_1'				=> 'The setup of SuiteCRM ',
371
-	'LBL_PERFORM_OUTRO_2'				=> ' is now complete!',
372
-	'LBL_PERFORM_OUTRO_3'				=> 'Total time: ',
373
-	'LBL_PERFORM_OUTRO_4'				=> ' seconds.',
374
-	'LBL_PERFORM_OUTRO_5'				=> 'Approximate memory used: ',
375
-	'LBL_PERFORM_OUTRO_6'				=> ' bytes.',
376
-	'LBL_PERFORM_OUTRO_7'				=> 'Your system is now installed and configured for use.',
377
-	'LBL_PERFORM_REL_META'				=> 'relationship meta ... ',
378
-	'LBL_PERFORM_SUCCESS'				=> 'Success!',
379
-	'LBL_PERFORM_TABLES'				=> 'Creating SuiteCRM application tables, audit tables and relationship metadata',
380
-	'LBL_PERFORM_TITLE'					=> 'Perform Setup',
381
-	'LBL_PRINT'							=> 'Print',
382
-	'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.',
383
-	'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.',
384
-	'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.',
385
-	'LBL_REG_TITLE'						=> 'Registration',
351
+    'LBL_PERFORM_ADMIN_PASSWORD'		=> 'Setting site admin password',
352
+    'LBL_PERFORM_AUDIT_TABLE'			=> 'audit table / ',
353
+    'LBL_PERFORM_CONFIG_PHP'			=> 'Creating SuiteCRM configuration file',
354
+    'LBL_PERFORM_CREATE_DB_1'			=> '<b>Creating the database</b> ',
355
+    'LBL_PERFORM_CREATE_DB_2'			=> ' <b>on</b> ',
356
+    'LBL_PERFORM_CREATE_DB_USER'		=> 'Creating the Database username and password...',
357
+    'LBL_PERFORM_CREATE_DEFAULT'		=> 'Creating default SuiteCRM data',
358
+    'LBL_PERFORM_CREATE_LOCALHOST'		=> 'Creating the Database username and password for localhost...',
359
+    'LBL_PERFORM_CREATE_RELATIONSHIPS'	=> 'Creating SuiteCRM relationship tables',
360
+    'LBL_PERFORM_CREATING'				=> 'creating / ',
361
+    'LBL_PERFORM_DEFAULT_REPORTS'		=> 'Creating default reports',
362
+    'LBL_PERFORM_DEFAULT_SCHEDULER'		=> 'Creating default scheduler jobs',
363
+    'LBL_PERFORM_DEFAULT_SETTINGS'		=> 'Inserting default settings',
364
+    'LBL_PERFORM_DEFAULT_USERS'			=> 'Creating default users',
365
+    'LBL_PERFORM_DEMO_DATA'				=> 'Populating the database tables with demo data (this may take a little while)',
366
+    'LBL_PERFORM_DONE'					=> 'done<br>',
367
+    'LBL_PERFORM_DROPPING'				=> 'dropping / ',
368
+    'LBL_PERFORM_FINISH'				=> 'Finish',
369
+    'LBL_PERFORM_LICENSE_SETTINGS'		=> 'Updating license information',
370
+    'LBL_PERFORM_OUTRO_1'				=> 'The setup of SuiteCRM ',
371
+    'LBL_PERFORM_OUTRO_2'				=> ' is now complete!',
372
+    'LBL_PERFORM_OUTRO_3'				=> 'Total time: ',
373
+    'LBL_PERFORM_OUTRO_4'				=> ' seconds.',
374
+    'LBL_PERFORM_OUTRO_5'				=> 'Approximate memory used: ',
375
+    'LBL_PERFORM_OUTRO_6'				=> ' bytes.',
376
+    'LBL_PERFORM_OUTRO_7'				=> 'Your system is now installed and configured for use.',
377
+    'LBL_PERFORM_REL_META'				=> 'relationship meta ... ',
378
+    'LBL_PERFORM_SUCCESS'				=> 'Success!',
379
+    'LBL_PERFORM_TABLES'				=> 'Creating SuiteCRM application tables, audit tables and relationship metadata',
380
+    'LBL_PERFORM_TITLE'					=> 'Perform Setup',
381
+    'LBL_PRINT'							=> 'Print',
382
+    '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.',
383
+    '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.',
384
+    '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.',
385
+    'LBL_REG_TITLE'						=> 'Registration',
386 386
     'LBL_REG_NO_THANKS'                 => 'No Thanks',
387 387
     'LBL_REG_SKIP_THIS_STEP'            => 'Skip this Step',
388
-	'LBL_REQUIRED'						=> '* Required field',
388
+    'LBL_REQUIRED'						=> '* Required field',
389 389
 
390 390
     'LBL_SITECFG_ADMIN_Name'            => 'SuiteCRM Application Admin Name',
391
-	'LBL_SITECFG_ADMIN_PASS_2'			=> 'Re-enter SuiteCRM Admin User Password',
392
-	'LBL_SITECFG_ADMIN_PASS_WARN'		=> 'Caution: This will override the admin password of any previous installation.',
393
-	'LBL_SITECFG_ADMIN_PASS'			=> 'SuiteCRM Admin User Password',
394
-	'LBL_SITECFG_APP_ID'				=> 'Application ID',
395
-	'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.',
396
-	'LBL_SITECFG_CUSTOM_ID'				=> 'Provide Your Own Application ID',
397
-	'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.',
398
-	'LBL_SITECFG_CUSTOM_LOG'			=> 'Use a Custom Log Directory',
399
-	'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.',
400
-	'LBL_SITECFG_CUSTOM_SESSION'		=> 'Use a Custom Session Directory for SuiteCRM',
401
-	'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.',
402
-	'LBL_SITECFG_FIX_ERRORS'			=> '<b>Please fix the following errors before proceeding:</b>',
403
-	'LBL_SITECFG_LOG_DIR'				=> 'Log Directory',
404
-	'LBL_SITECFG_SESSION_PATH'			=> 'Path to Session Directory<br>(must be writable)',
405
-	'LBL_SITECFG_SITE_SECURITY'			=> 'Select Security Options',
406
-	'LBL_SITECFG_SUGAR_UP_DIRECTIONS'	=> 'If selected, the system will periodically check for updated versions of the application.',
407
-	'LBL_SITECFG_SUGAR_UP'				=> 'Automatically Check For Updates?',
408
-	'LBL_SITECFG_SUGAR_UPDATES'			=> 'SuiteCRM Updates Config',
409
-	'LBL_SITECFG_TITLE'					=> 'Site Configuration',
391
+    'LBL_SITECFG_ADMIN_PASS_2'			=> 'Re-enter SuiteCRM Admin User Password',
392
+    'LBL_SITECFG_ADMIN_PASS_WARN'		=> 'Caution: This will override the admin password of any previous installation.',
393
+    'LBL_SITECFG_ADMIN_PASS'			=> 'SuiteCRM Admin User Password',
394
+    'LBL_SITECFG_APP_ID'				=> 'Application ID',
395
+    '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.',
396
+    'LBL_SITECFG_CUSTOM_ID'				=> 'Provide Your Own Application ID',
397
+    '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.',
398
+    'LBL_SITECFG_CUSTOM_LOG'			=> 'Use a Custom Log Directory',
399
+    '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.',
400
+    'LBL_SITECFG_CUSTOM_SESSION'		=> 'Use a Custom Session Directory for SuiteCRM',
401
+    '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.',
402
+    'LBL_SITECFG_FIX_ERRORS'			=> '<b>Please fix the following errors before proceeding:</b>',
403
+    'LBL_SITECFG_LOG_DIR'				=> 'Log Directory',
404
+    'LBL_SITECFG_SESSION_PATH'			=> 'Path to Session Directory<br>(must be writable)',
405
+    'LBL_SITECFG_SITE_SECURITY'			=> 'Select Security Options',
406
+    'LBL_SITECFG_SUGAR_UP_DIRECTIONS'	=> 'If selected, the system will periodically check for updated versions of the application.',
407
+    'LBL_SITECFG_SUGAR_UP'				=> 'Automatically Check For Updates?',
408
+    'LBL_SITECFG_SUGAR_UPDATES'			=> 'SuiteCRM Updates Config',
409
+    'LBL_SITECFG_TITLE'					=> 'Site Configuration',
410 410
     'LBL_SITECFG_TITLE2'                => 'Identify Administration User',
411 411
     'LBL_SITECFG_SECURITY_TITLE'        => 'Site Security',
412
-	'LBL_SITECFG_URL'					=> 'URL of SuiteCRM Instance',
413
-	'LBL_SITECFG_USE_DEFAULTS'			=> 'Use Defaults?',
414
-	'LBL_SITECFG_ANONSTATS'             => 'Send Anonymous Usage Statistics?',
415
-	'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.',
412
+    'LBL_SITECFG_URL'					=> 'URL of SuiteCRM Instance',
413
+    'LBL_SITECFG_USE_DEFAULTS'			=> 'Use Defaults?',
414
+    'LBL_SITECFG_ANONSTATS'             => 'Send Anonymous Usage Statistics?',
415
+    '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.',
416 416
     '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.',
417 417
     '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.',
418 418
     '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.',
419 419
     '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.',
420 420
     'LBL_SPRITE_SUPPORT'                => 'Sprite Support',
421
-	'LBL_SYSTEM_CREDS'                  => 'System Credentials',
421
+    'LBL_SYSTEM_CREDS'                  => 'System Credentials',
422 422
     'LBL_SYSTEM_ENV'                    => 'System Environment',
423
-	'LBL_START'							=> 'Start',
423
+    'LBL_START'							=> 'Start',
424 424
     'LBL_SHOW_PASS'                     => 'Show Passwords',
425 425
     'LBL_HIDE_PASS'                     => 'Hide Passwords',
426 426
     'LBL_HIDDEN'                        => '<i>(hidden)</i>',
427
-	'LBL_STEP1' => 'Step 1 of 2 - Pre-Installation requirements',
428
-	'LBL_STEP2' => 'Step 2 of 2 - Configuration',
427
+    'LBL_STEP1' => 'Step 1 of 2 - Pre-Installation requirements',
428
+    'LBL_STEP2' => 'Step 2 of 2 - Configuration',
429 429
 //    'LBL_STEP1'                         => 'Step 1 of 8 - Pre-Installation requirements',
430 430
 //    'LBL_STEP2'                         => 'Step 2 of 8 - License Agreement',
431 431
 //    'LBL_STEP3'                         => 'Step 3 of 8 - Installation Type',
@@ -435,11 +435,11 @@  discard block
 block discarded – undo
435 435
 //    'LBL_STEP7'                         => 'Step 7 of 8 - Confirm Settings',
436 436
 //    'LBL_STEP8'                         => 'Step 8 of 8 - Installation Successful',
437 437
 //	'LBL_NO_THANKS'						=> 'Continue to installer',
438
-	'LBL_CHOOSE_LANG'					=> '<b>Choose your language</b>',
439
-	'LBL_STEP'							=> 'Step',
440
-	'LBL_TITLE_WELCOME'					=> 'Welcome to the SuiteCRM ',
441
-	'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.',
442
-	'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>.',
438
+    'LBL_CHOOSE_LANG'					=> '<b>Choose your language</b>',
439
+    'LBL_STEP'							=> 'Step',
440
+    'LBL_TITLE_WELCOME'					=> 'Welcome to the SuiteCRM ',
441
+    '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.',
442
+    '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>.',
443 443
     //welcome page variables
444 444
     'LBL_TITLE_ARE_YOU_READY'            => 'Are you ready to install?',
445 445
     'REQUIRED_SYS_COMP' => 'Required System Components',
@@ -522,20 +522,20 @@  discard block
 block discarded – undo
522 522
                                 ',
523 523
     '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.',
524 524
 
525
-	'LBL_WELCOME_CHOOSE_LANGUAGE'		=> '<b>Choose your language</b>',
526
-	'LBL_WELCOME_SETUP_WIZARD'			=> 'Setup Wizard',
527
-	'LBL_WELCOME_TITLE_WELCOME'			=> 'Welcome to the SuiteCRM ',
528
-	'LBL_WELCOME_TITLE'					=> 'SuiteCRM Setup Wizard',
529
-	'LBL_WIZARD_TITLE'					=> 'SuiteCRM Setup Wizard: ',
530
-	'LBL_YES'							=> 'Yes',
525
+    'LBL_WELCOME_CHOOSE_LANGUAGE'		=> '<b>Choose your language</b>',
526
+    'LBL_WELCOME_SETUP_WIZARD'			=> 'Setup Wizard',
527
+    'LBL_WELCOME_TITLE_WELCOME'			=> 'Welcome to the SuiteCRM ',
528
+    'LBL_WELCOME_TITLE'					=> 'SuiteCRM Setup Wizard',
529
+    'LBL_WIZARD_TITLE'					=> 'SuiteCRM Setup Wizard: ',
530
+    'LBL_YES'							=> 'Yes',
531 531
     'LBL_YES_MULTI'                     => 'Yes - Multibyte',
532
-	// OOTB Scheduler Job Names:
533
-	'LBL_OOTB_WORKFLOW'		=> 'Process Workflow Tasks',
534
-	'LBL_OOTB_REPORTS'		=> 'Run Report Generation Scheduled Tasks',
535
-	'LBL_OOTB_IE'			=> 'Check Inbound Mailboxes',
536
-	'LBL_OOTB_BOUNCE'		=> 'Run Nightly Process Bounced Campaign Emails',
532
+    // OOTB Scheduler Job Names:
533
+    'LBL_OOTB_WORKFLOW'		=> 'Process Workflow Tasks',
534
+    'LBL_OOTB_REPORTS'		=> 'Run Report Generation Scheduled Tasks',
535
+    'LBL_OOTB_IE'			=> 'Check Inbound Mailboxes',
536
+    'LBL_OOTB_BOUNCE'		=> 'Run Nightly Process Bounced Campaign Emails',
537 537
     'LBL_OOTB_CAMPAIGN'		=> 'Run Nightly Mass Email Campaigns',
538
-	'LBL_OOTB_PRUNE'		=> 'Prune Database on 1st of Month',
538
+    'LBL_OOTB_PRUNE'		=> 'Prune Database on 1st of Month',
539 539
     'LBL_OOTB_TRACKER'		=> 'Prune tracker tables',
540 540
     'LBL_OOTB_SUGARFEEDS'   => 'Prune SuiteCRM Feed Tables',
541 541
     'LBL_OOTB_SEND_EMAIL_REMINDERS'	=> 'Run Email Reminder Notifications',
@@ -549,19 +549,19 @@  discard block
 block discarded – undo
549 549
     'LBL_PATCH_1'           => 'If you would like to skip this step, click Next.',
550 550
     'LBL_PATCH_TITLE'       => 'System Patch',
551 551
     'LBL_PATCH_READY'       => 'The following patch(es) are ready to be installed:',
552
-	'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.
552
+    '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 553
 											<br><br>A common misconfiguration is that the <b>'session.save_path'</b> directive is not pointing to a valid directory.  <br>
554 554
 											<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.",
555
-	'LBL_SESSION_ERR_TITLE'				=> 'PHP Sessions Configuration Error',
556
-	'LBL_SYSTEM_NAME'=>'System Name',
555
+    'LBL_SESSION_ERR_TITLE'				=> 'PHP Sessions Configuration Error',
556
+    'LBL_SYSTEM_NAME'=>'System Name',
557 557
     'LBL_COLLATION' => 'Collation Settings',
558
-	'LBL_REQUIRED_SYSTEM_NAME'=>'Provide a System Name for the SuiteCRM instance.',
559
-	'LBL_PATCH_UPLOAD' => 'Select a patch file from your local computer',
560
-	'LBL_INCOMPATIBLE_PHP_VERSION' => 'Php version 5 or above is required.',
561
-	'LBL_MINIMUM_PHP_VERSION' => 'Minimum Php version required is 5.1.0. Recommended Php version is 5.2.x.',
562
-	'LBL_YOUR_PHP_VERSION' => '(Your current php version is ',
563
-	'LBL_RECOMMENDED_PHP_VERSION' =>' Recommended php version is 5.2.x)',
564
-	'LBL_BACKWARD_COMPATIBILITY_ON' => 'Php Backward Compatibility mode is turned on. Set zend.ze1_compatibility_mode to Off for proceeding further',
558
+    'LBL_REQUIRED_SYSTEM_NAME'=>'Provide a System Name for the SuiteCRM instance.',
559
+    'LBL_PATCH_UPLOAD' => 'Select a patch file from your local computer',
560
+    'LBL_INCOMPATIBLE_PHP_VERSION' => 'Php version 5 or above is required.',
561
+    'LBL_MINIMUM_PHP_VERSION' => 'Minimum Php version required is 5.1.0. Recommended Php version is 5.2.x.',
562
+    'LBL_YOUR_PHP_VERSION' => '(Your current php version is ',
563
+    'LBL_RECOMMENDED_PHP_VERSION' =>' Recommended php version is 5.2.x)',
564
+    'LBL_BACKWARD_COMPATIBILITY_ON' => 'Php Backward Compatibility mode is turned on. Set zend.ze1_compatibility_mode to Off for proceeding further',
565 565
     'LBL_STREAM' => 'PHP allows to use stream',
566 566
 
567 567
     'advanced_password_new_account_email' => array(
@@ -593,92 +593,92 @@  discard block
 block discarded – undo
593 593
         'name' => 'Forgot Password email',
594 594
         ),
595 595
 
596
-	// SMTP settings
597
-
598
-	'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.',
599
-	'LBL_CHOOSE_EMAIL_PROVIDER'        => 'Choose your Email provider:',
600
-
601
-	'LBL_SMTPTYPE_GMAIL'                    => 'Gmail',
602
-	'LBL_SMTPTYPE_YAHOO'                    => 'Yahoo! Mail',
603
-	'LBL_SMTPTYPE_EXCHANGE'                 => 'Microsoft Exchange',
604
-	'LBL_SMTPTYPE_OTHER'                  => 'Other',
605
-	'LBL_MAIL_SMTP_SETTINGS'           => 'SMTP Server Specification',
606
-	'LBL_MAIL_SMTPSERVER'				=> 'SMTP Server:',
607
-	'LBL_MAIL_SMTPPORT'					=> 'SMTP Port:',
608
-	'LBL_MAIL_SMTPAUTH_REQ'				=> 'Use SMTP Authentication?',
609
-	'LBL_EMAIL_SMTP_SSL_OR_TLS'         => 'Enable SMTP over SSL or TLS?',
610
-	'LBL_GMAIL_SMTPUSER'					=> 'Gmail Email Address:',
611
-	'LBL_GMAIL_SMTPPASS'					=> 'Gmail Password:',
612
-	'LBL_ALLOW_DEFAULT_SELECTION'           => 'Allow users to use this account for outgoing email:',
613
-	'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.',
614
-
615
-	'LBL_YAHOOMAIL_SMTPPASS'					=> 'Yahoo! Mail Password:',
616
-	'LBL_YAHOOMAIL_SMTPUSER'					=> 'Yahoo! Mail ID:',
617
-
618
-	'LBL_EXCHANGE_SMTPPASS'					=> 'Exchange Password:',
619
-	'LBL_EXCHANGE_SMTPUSER'					=> 'Exchange Username:',
620
-	'LBL_EXCHANGE_SMTPPORT'					=> 'Exchange Server Port:',
621
-	'LBL_EXCHANGE_SMTPSERVER'				=> 'Exchange Server:',
622
-
623
-
624
-	'LBL_MAIL_SMTPUSER'					=> 'SMTP Username:',
625
-	'LBL_MAIL_SMTPPASS'					=> 'SMTP Password:',
626
-
627
-	// Branding
628
-
629
-	'LBL_WIZARD_SYSTEM_TITLE' => 'Branding',
630
-	'LBL_WIZARD_SYSTEM_DESC' => 'Provide your organization\'s name and logo in order to brand your SuiteCRM.',
631
-	'SYSTEM_NAME_WIZARD'=>'Name:',
632
-	'SYSTEM_NAME_HELP'=>'This is the name that displays in the title bar of your browser.',
633
-	'NEW_LOGO'=>'Select Logo:',
634
-	'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.',
635
-	'COMPANY_LOGO_UPLOAD_BTN' => 'Upload',
636
-	'CURRENT_LOGO'=>'Current Logo:',
596
+    // SMTP settings
597
+
598
+    '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.',
599
+    'LBL_CHOOSE_EMAIL_PROVIDER'        => 'Choose your Email provider:',
600
+
601
+    'LBL_SMTPTYPE_GMAIL'                    => 'Gmail',
602
+    'LBL_SMTPTYPE_YAHOO'                    => 'Yahoo! Mail',
603
+    'LBL_SMTPTYPE_EXCHANGE'                 => 'Microsoft Exchange',
604
+    'LBL_SMTPTYPE_OTHER'                  => 'Other',
605
+    'LBL_MAIL_SMTP_SETTINGS'           => 'SMTP Server Specification',
606
+    'LBL_MAIL_SMTPSERVER'				=> 'SMTP Server:',
607
+    'LBL_MAIL_SMTPPORT'					=> 'SMTP Port:',
608
+    'LBL_MAIL_SMTPAUTH_REQ'				=> 'Use SMTP Authentication?',
609
+    'LBL_EMAIL_SMTP_SSL_OR_TLS'         => 'Enable SMTP over SSL or TLS?',
610
+    'LBL_GMAIL_SMTPUSER'					=> 'Gmail Email Address:',
611
+    'LBL_GMAIL_SMTPPASS'					=> 'Gmail Password:',
612
+    'LBL_ALLOW_DEFAULT_SELECTION'           => 'Allow users to use this account for outgoing email:',
613
+    '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.',
614
+
615
+    'LBL_YAHOOMAIL_SMTPPASS'					=> 'Yahoo! Mail Password:',
616
+    'LBL_YAHOOMAIL_SMTPUSER'					=> 'Yahoo! Mail ID:',
617
+
618
+    'LBL_EXCHANGE_SMTPPASS'					=> 'Exchange Password:',
619
+    'LBL_EXCHANGE_SMTPUSER'					=> 'Exchange Username:',
620
+    'LBL_EXCHANGE_SMTPPORT'					=> 'Exchange Server Port:',
621
+    'LBL_EXCHANGE_SMTPSERVER'				=> 'Exchange Server:',
622
+
623
+
624
+    'LBL_MAIL_SMTPUSER'					=> 'SMTP Username:',
625
+    'LBL_MAIL_SMTPPASS'					=> 'SMTP Password:',
626
+
627
+    // Branding
628
+
629
+    'LBL_WIZARD_SYSTEM_TITLE' => 'Branding',
630
+    'LBL_WIZARD_SYSTEM_DESC' => 'Provide your organization\'s name and logo in order to brand your SuiteCRM.',
631
+    'SYSTEM_NAME_WIZARD'=>'Name:',
632
+    'SYSTEM_NAME_HELP'=>'This is the name that displays in the title bar of your browser.',
633
+    'NEW_LOGO'=>'Select Logo:',
634
+    '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.',
635
+    'COMPANY_LOGO_UPLOAD_BTN' => 'Upload',
636
+    'CURRENT_LOGO'=>'Current Logo:',
637 637
     'CURRENT_LOGO_HELP'=>'This logo is displayed in the left-hand corner of the footer of the SuiteCRM application.',
638 638
 
639
-	// System Local Settings
640
-
641
-
642
-	'LBL_LOCALE_TITLE' => 'System Locale Settings',
643
-	'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.',
644
-	'LBL_DATE_FORMAT' => 'Date Format:',
645
-	'LBL_TIME_FORMAT' => 'Time Format:',
646
-		'LBL_TIMEZONE' => 'Time Zone:',
647
-	'LBL_LANGUAGE'=>'Language:',
648
-	'LBL_CURRENCY'=>'Currency:',
649
-	'LBL_CURRENCY_SYMBOL'=>'Currency Symbol:',
650
-	'LBL_CURRENCY_ISO4217' => 'ISO 4217 Currency Code:',
651
-	'LBL_NUMBER_GROUPING_SEP' => '1000s separator:',
652
-	'LBL_DECIMAL_SEP' => 'Decimal symbol:',
653
-	'LBL_NAME_FORMAT' => 'Name Format:',
654
-	'UPLOAD_LOGO' => 'Please wait, logo uploading..',
655
-	'ERR_UPLOAD_FILETYPE' => 'File type do not allowed, please upload a jpeg or png.',
656
-	'ERR_LANG_UPLOAD_UNKNOWN' => 'Unknown file upload error occured.',
657
-	'ERR_UPLOAD_FILE_UPLOAD_ERR_INI_SIZE' => 'The uploaded file exceeds the upload_max_filesize directive in php.ini.',
658
-	'ERR_UPLOAD_FILE_UPLOAD_ERR_FORM_SIZE' => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.',
659
-	'ERR_UPLOAD_FILE_UPLOAD_ERR_PARTIAL' => 'The uploaded file was only partially uploaded.',
660
-	'ERR_UPLOAD_FILE_UPLOAD_ERR_NO_FILE' => 'No file was uploaded.',
661
-	'ERR_UPLOAD_FILE_UPLOAD_ERR_NO_TMP_DIR' => 'Missing a temporary folder.',
662
-	'ERR_UPLOAD_FILE_UPLOAD_ERR_CANT_WRITE' => 'Failed to write file to disk.',
663
-	'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.',
664
-
665
-	'LBL_INSTALL_PROCESS' => 'Install...',
666
-
667
-	'LBL_EMAIL_ADDRESS' => 'Email Address:',
668
-	'ERR_ADMIN_EMAIL' => 'Administrator Email Address is incorrect.',
669
-	'ERR_SITE_URL' => 'Site URL is required.',
670
-
671
-	'STAT_CONFIGURATION' => 'Configuration relationships...',
672
-	'STAT_CREATE_DB' => 'Create database...',
673
-	//'STAT_CREATE_DB_TABLE' => 'Create database... (table: %s)',
674
-	'STAT_CREATE_DEFAULT_SETTINGS' => 'Create default settings...',
675
-	'STAT_INSTALL_FINISH' => 'Install finish...',
676
-	'STAT_INSTALL_FINISH_LOGIN' => 'Installation process finished, <a href="%s">please log in...</a>',
677
-	'LBL_LICENCE_TOOLTIP' => 'Please accept license first',
678
-
679
-	'LBL_MORE_OPTIONS_TITLE' => 'More options',
680
-	'LBL_START' => '',
681
-	'LBL_DB_CONN_ERR' => 'Database error'
639
+    // System Local Settings
640
+
641
+
642
+    'LBL_LOCALE_TITLE' => 'System Locale Settings',
643
+    '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.',
644
+    'LBL_DATE_FORMAT' => 'Date Format:',
645
+    'LBL_TIME_FORMAT' => 'Time Format:',
646
+        'LBL_TIMEZONE' => 'Time Zone:',
647
+    'LBL_LANGUAGE'=>'Language:',
648
+    'LBL_CURRENCY'=>'Currency:',
649
+    'LBL_CURRENCY_SYMBOL'=>'Currency Symbol:',
650
+    'LBL_CURRENCY_ISO4217' => 'ISO 4217 Currency Code:',
651
+    'LBL_NUMBER_GROUPING_SEP' => '1000s separator:',
652
+    'LBL_DECIMAL_SEP' => 'Decimal symbol:',
653
+    'LBL_NAME_FORMAT' => 'Name Format:',
654
+    'UPLOAD_LOGO' => 'Please wait, logo uploading..',
655
+    'ERR_UPLOAD_FILETYPE' => 'File type do not allowed, please upload a jpeg or png.',
656
+    'ERR_LANG_UPLOAD_UNKNOWN' => 'Unknown file upload error occured.',
657
+    'ERR_UPLOAD_FILE_UPLOAD_ERR_INI_SIZE' => 'The uploaded file exceeds the upload_max_filesize directive in php.ini.',
658
+    'ERR_UPLOAD_FILE_UPLOAD_ERR_FORM_SIZE' => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.',
659
+    'ERR_UPLOAD_FILE_UPLOAD_ERR_PARTIAL' => 'The uploaded file was only partially uploaded.',
660
+    'ERR_UPLOAD_FILE_UPLOAD_ERR_NO_FILE' => 'No file was uploaded.',
661
+    'ERR_UPLOAD_FILE_UPLOAD_ERR_NO_TMP_DIR' => 'Missing a temporary folder.',
662
+    'ERR_UPLOAD_FILE_UPLOAD_ERR_CANT_WRITE' => 'Failed to write file to disk.',
663
+    '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.',
664
+
665
+    'LBL_INSTALL_PROCESS' => 'Install...',
666
+
667
+    'LBL_EMAIL_ADDRESS' => 'Email Address:',
668
+    'ERR_ADMIN_EMAIL' => 'Administrator Email Address is incorrect.',
669
+    'ERR_SITE_URL' => 'Site URL is required.',
670
+
671
+    'STAT_CONFIGURATION' => 'Configuration relationships...',
672
+    'STAT_CREATE_DB' => 'Create database...',
673
+    //'STAT_CREATE_DB_TABLE' => 'Create database... (table: %s)',
674
+    'STAT_CREATE_DEFAULT_SETTINGS' => 'Create default settings...',
675
+    'STAT_INSTALL_FINISH' => 'Install finish...',
676
+    'STAT_INSTALL_FINISH_LOGIN' => 'Installation process finished, <a href="%s">please log in...</a>',
677
+    'LBL_LICENCE_TOOLTIP' => 'Please accept license first',
678
+
679
+    'LBL_MORE_OPTIONS_TITLE' => 'More options',
680
+    'LBL_START' => '',
681
+    'LBL_DB_CONN_ERR' => 'Database error'
682 682
 
683 683
 
684 684
 );
Please login to merge, or discard this patch.
include/InlineEditing/InlineEditing.php 1 patch
Indentation   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -427,7 +427,7 @@  discard block
 block discarded – undo
427 427
     }
428 428
 
429 429
     //if field is of type radio.
430
-     if ($vardef['type'] == "radioenum" || $vardef['type'] == "enum" || $vardef['type'] == "dynamicenum") {
430
+        if ($vardef['type'] == "radioenum" || $vardef['type'] == "enum" || $vardef['type'] == "dynamicenum") {
431 431
         $value = $app_list_strings[$vardef['options']][$value];
432 432
     }
433 433
 
@@ -476,10 +476,10 @@  discard block
 block discarded – undo
476 476
             $value .= "</a>";
477 477
         }
478 478
     }
479
-	if($vardef['type'] == "url")
480
-	{
481
-		$value = '<a href='.$value.' target="_blank">'.$value.'</a>';
482
-	}
479
+    if($vardef['type'] == "url")
480
+    {
481
+        $value = '<a href='.$value.' target="_blank">'.$value.'</a>';
482
+    }
483 483
 
484 484
     return $value;
485 485
 }
Please login to merge, or discard this patch.
tests/tests/modules/Contacts/ContactTest.php 1 patch
Indentation   +211 added lines, -211 removed lines patch added patch discarded remove patch
@@ -2,68 +2,68 @@  discard block
 block discarded – undo
2 2
 
3 3
 class ContactTest extends PHPUnit_Framework_TestCase {
4 4
 
5
-	public function testContact() {
5
+    public function testContact() {
6 6
 
7
-		//execute the contructor and check for the Object type and  attributes
8
-		$contact = new Contact();
9
-		$this->assertInstanceOf('Contact',$contact);
10
-		$this->assertInstanceOf('Person',$contact);
11
-		$this->assertInstanceOf('SugarBean',$contact);
7
+        //execute the contructor and check for the Object type and  attributes
8
+        $contact = new Contact();
9
+        $this->assertInstanceOf('Contact',$contact);
10
+        $this->assertInstanceOf('Person',$contact);
11
+        $this->assertInstanceOf('SugarBean',$contact);
12 12
 
13
-		$this->assertAttributeEquals('Contacts', 'module_dir', $contact);
14
-		$this->assertAttributeEquals('Contact', 'object_name', $contact);
15
-		$this->assertAttributeEquals('contacts', 'table_name', $contact);
16
-		$this->assertAttributeEquals('accounts_contacts', 'rel_account_table', $contact);
17
-		$this->assertAttributeEquals('opportunities_contacts', 'rel_opportunity_table', $contact);
18
-		$this->assertAttributeEquals(true, 'importable', $contact);
19
-		$this->assertAttributeEquals(true, 'new_schema', $contact);
13
+        $this->assertAttributeEquals('Contacts', 'module_dir', $contact);
14
+        $this->assertAttributeEquals('Contact', 'object_name', $contact);
15
+        $this->assertAttributeEquals('contacts', 'table_name', $contact);
16
+        $this->assertAttributeEquals('accounts_contacts', 'rel_account_table', $contact);
17
+        $this->assertAttributeEquals('opportunities_contacts', 'rel_opportunity_table', $contact);
18
+        $this->assertAttributeEquals(true, 'importable', $contact);
19
+        $this->assertAttributeEquals(true, 'new_schema', $contact);
20 20
 
21
-	}
21
+    }
22 22
 
23
-	public function testadd_list_count_joins()
24
-	{
25
-		error_reporting(E_ERROR | E_PARSE);
23
+    public function testadd_list_count_joins()
24
+    {
25
+        error_reporting(E_ERROR | E_PARSE);
26 26
 
27
-		$contact = new Contact();
27
+        $contact = new Contact();
28 28
 
29
-		//test with empty strings
30
-		$query = "";
31
-		$contact->add_list_count_joins($query, '');
32
-		$this->assertEquals(" LEFT JOIN contacts_cstm ON contacts.id = contacts_cstm.id_c ",$query);
29
+        //test with empty strings
30
+        $query = "";
31
+        $contact->add_list_count_joins($query, '');
32
+        $this->assertEquals(" LEFT JOIN contacts_cstm ON contacts.id = contacts_cstm.id_c ",$query);
33 33
 
34 34
 
35
-		//test with valid string
36
-		$query = "";
37
-		$expected = "\n	            LEFT JOIN accounts_contacts\n	            ON contacts.id=accounts_contacts.contact_id\n	            LEFT JOIN accounts\n	            ON accounts_contacts.account_id=accounts.id\n                    LEFT JOIN contacts_cstm ON contacts.id = contacts_cstm.id_c ";
38
-		$contact->add_list_count_joins($query, 'accounts.name');
39
-		$query = preg_replace('/\s+/', '', $query);
40
-		$expected =preg_replace('/\s+/', '', $expected);
41
-		$this->assertSame($expected,$query);
35
+        //test with valid string
36
+        $query = "";
37
+        $expected = "\n	            LEFT JOIN accounts_contacts\n	            ON contacts.id=accounts_contacts.contact_id\n	            LEFT JOIN accounts\n	            ON accounts_contacts.account_id=accounts.id\n                    LEFT JOIN contacts_cstm ON contacts.id = contacts_cstm.id_c ";
38
+        $contact->add_list_count_joins($query, 'accounts.name');
39
+        $query = preg_replace('/\s+/', '', $query);
40
+        $expected =preg_replace('/\s+/', '', $expected);
41
+        $this->assertSame($expected,$query);
42 42
 		
43
-		//test with valid string
44
-		$query = "";
45
-		$expected = "\n	            LEFT JOIN accounts_contacts\n	            ON contacts.id=accounts_contacts.contact_id\n	            LEFT JOIN accounts\n	            ON accounts_contacts.account_id=accounts.id\n	                 LEFT JOIN contacts_cstm ON contacts.id = contacts_cstm.id_c ";
46
-		$contact->add_list_count_joins($query, 'contacts.name');
47
-		$this->assertSame(" LEFT JOIN contacts_cstm ON contacts.id = contacts_cstm.id_c ",$query);
43
+        //test with valid string
44
+        $query = "";
45
+        $expected = "\n	            LEFT JOIN accounts_contacts\n	            ON contacts.id=accounts_contacts.contact_id\n	            LEFT JOIN accounts\n	            ON accounts_contacts.account_id=accounts.id\n	                 LEFT JOIN contacts_cstm ON contacts.id = contacts_cstm.id_c ";
46
+        $contact->add_list_count_joins($query, 'contacts.name');
47
+        $this->assertSame(" LEFT JOIN contacts_cstm ON contacts.id = contacts_cstm.id_c ",$query);
48 48
 
49 49
 
50
-	}
50
+    }
51 51
 
52
-	public function testlistviewACLHelper()
53
-	{
54
-		$contact = new Contact();
52
+    public function testlistviewACLHelper()
53
+    {
54
+        $contact = new Contact();
55 55
 
56
-		$expected = array( "MAIN"=>"a", "ACCOUNT"=>"a");
57
-		$actual = $contact->listviewACLHelper();
58
-		$this->assertSame($expected,$actual);
56
+        $expected = array( "MAIN"=>"a", "ACCOUNT"=>"a");
57
+        $actual = $contact->listviewACLHelper();
58
+        $this->assertSame($expected,$actual);
59 59
 
60
-	}
60
+    }
61 61
 
62 62
     /**
63 63
      * @todo: NEEDS FIXING!
64 64
      */
65
-	public function testcreate_new_list_query()
66
-	{
65
+    public function testcreate_new_list_query()
66
+    {
67 67
         /*
68 68
 		$contact = new Contact();
69 69
 
@@ -79,239 +79,239 @@  discard block
 block discarded – undo
79 79
 		$this->assertSame($expected,$actual);
80 80
 		*/
81 81
         $this->assertTrue(true, "NEEDS FIXING!");
82
-	}
82
+    }
83 83
 
84 84
 
85
-	public function testaddress_popup_create_new_list_query()
86
-	{
85
+    public function testaddress_popup_create_new_list_query()
86
+    {
87 87
 
88
-		$contact = new Contact();
88
+        $contact = new Contact();
89 89
 
90
-		//test with empty string params
91
-		$expected = "SELECT LTRIM(RTRIM(CONCAT(IFNULL(contacts.first_name,''),'',IFNULL(contacts.last_name,'')))) name, \n				contacts.*,\n                accounts.name as account_name,\n                accounts.id as account_id,\n                accounts.assigned_user_id account_id_owner,\n                users.user_name as assigned_user_name ,contacts_cstm.*\n                FROM contacts LEFT JOIN users\n	                    ON contacts.assigned_user_id=users.id\n	                    LEFT JOIN accounts_contacts\n	                    ON contacts.id=accounts_contacts.contact_id  and accounts_contacts.deleted = 0\n	                    LEFT JOIN accounts\n	                    ON accounts_contacts.account_id=accounts.id AND accounts.deleted=0 LEFT JOIN email_addr_bean_rel eabl  ON eabl.bean_id = contacts.id AND eabl.bean_module = 'Contacts' and eabl.primary_address = 1 and eabl.deleted=0 LEFT JOIN email_addresses ea ON (ea.id = eabl.email_address_id)  LEFT JOIN contacts_cstm ON contacts.id = contacts_cstm.id_c where  contacts.deleted=0 ";
92
-		$actual = $contact->address_popup_create_new_list_query('','');
93
-		$this->assertSame($expected,$actual);
90
+        //test with empty string params
91
+        $expected = "SELECT LTRIM(RTRIM(CONCAT(IFNULL(contacts.first_name,''),'',IFNULL(contacts.last_name,'')))) name, \n				contacts.*,\n                accounts.name as account_name,\n                accounts.id as account_id,\n                accounts.assigned_user_id account_id_owner,\n                users.user_name as assigned_user_name ,contacts_cstm.*\n                FROM contacts LEFT JOIN users\n	                    ON contacts.assigned_user_id=users.id\n	                    LEFT JOIN accounts_contacts\n	                    ON contacts.id=accounts_contacts.contact_id  and accounts_contacts.deleted = 0\n	                    LEFT JOIN accounts\n	                    ON accounts_contacts.account_id=accounts.id AND accounts.deleted=0 LEFT JOIN email_addr_bean_rel eabl  ON eabl.bean_id = contacts.id AND eabl.bean_module = 'Contacts' and eabl.primary_address = 1 and eabl.deleted=0 LEFT JOIN email_addresses ea ON (ea.id = eabl.email_address_id)  LEFT JOIN contacts_cstm ON contacts.id = contacts_cstm.id_c where  contacts.deleted=0 ";
92
+        $actual = $contact->address_popup_create_new_list_query('','');
93
+        $this->assertSame($expected,$actual);
94 94
 
95 95
 
96
-		//test with valid string params
97
-		$expected = "SELECT LTRIM(RTRIM(CONCAT(IFNULL(contacts.first_name,''),'',IFNULL(contacts.last_name,'')))) name, \n				contacts.*,\n                accounts.name as account_name,\n                accounts.id as account_id,\n                accounts.assigned_user_id account_id_owner,\n                users.user_name as assigned_user_name ,contacts_cstm.*\n                FROM contacts LEFT JOIN users\n	                    ON contacts.assigned_user_id=users.id\n	                    LEFT JOIN accounts_contacts\n	                    ON contacts.id=accounts_contacts.contact_id  and accounts_contacts.deleted = 0\n	                    LEFT JOIN accounts\n	                    ON accounts_contacts.account_id=accounts.id AND accounts.deleted=0 LEFT JOIN email_addr_bean_rel eabl  ON eabl.bean_id = contacts.id AND eabl.bean_module = 'Contacts' and eabl.primary_address = 1 and eabl.deleted=0 LEFT JOIN email_addresses ea ON (ea.id = eabl.email_address_id)  LEFT JOIN contacts_cstm ON contacts.id = contacts_cstm.id_c where (contacts.name=\"\") AND  contacts.deleted=0 ";
98
-		$actual = $contact->address_popup_create_new_list_query('contacts.id','contacts.name=""');
99
-		$this->assertSame($expected,$actual);
96
+        //test with valid string params
97
+        $expected = "SELECT LTRIM(RTRIM(CONCAT(IFNULL(contacts.first_name,''),'',IFNULL(contacts.last_name,'')))) name, \n				contacts.*,\n                accounts.name as account_name,\n                accounts.id as account_id,\n                accounts.assigned_user_id account_id_owner,\n                users.user_name as assigned_user_name ,contacts_cstm.*\n                FROM contacts LEFT JOIN users\n	                    ON contacts.assigned_user_id=users.id\n	                    LEFT JOIN accounts_contacts\n	                    ON contacts.id=accounts_contacts.contact_id  and accounts_contacts.deleted = 0\n	                    LEFT JOIN accounts\n	                    ON accounts_contacts.account_id=accounts.id AND accounts.deleted=0 LEFT JOIN email_addr_bean_rel eabl  ON eabl.bean_id = contacts.id AND eabl.bean_module = 'Contacts' and eabl.primary_address = 1 and eabl.deleted=0 LEFT JOIN email_addresses ea ON (ea.id = eabl.email_address_id)  LEFT JOIN contacts_cstm ON contacts.id = contacts_cstm.id_c where (contacts.name=\"\") AND  contacts.deleted=0 ";
98
+        $actual = $contact->address_popup_create_new_list_query('contacts.id','contacts.name=""');
99
+        $this->assertSame($expected,$actual);
100 100
 
101
-	}
101
+    }
102 102
 
103
-	public function testcreate_export_query()
104
-	{
105
-		$contact = new Contact();
103
+    public function testcreate_export_query()
104
+    {
105
+        $contact = new Contact();
106 106
 
107
-		//test with empty string params
108
-		$expected = "SELECT\n                                contacts.*,\n                                email_addresses.email_address email_address,\n                                '' email_addresses_non_primary, accounts.name as account_name,\n                                users.user_name as assigned_user_name ,contacts_cstm.jjwg_maps_lng_c,contacts_cstm.jjwg_maps_lat_c,contacts_cstm.jjwg_maps_geocode_status_c,contacts_cstm.jjwg_maps_address_c FROM contacts LEFT JOIN users\n	                                ON contacts.assigned_user_id=users.id LEFT JOIN accounts_contacts\n	                                ON ( contacts.id=accounts_contacts.contact_id and (accounts_contacts.deleted is null or accounts_contacts.deleted = 0))\n	                                LEFT JOIN accounts\n	                                ON accounts_contacts.account_id=accounts.id  LEFT JOIN  email_addr_bean_rel on contacts.id = email_addr_bean_rel.bean_id and email_addr_bean_rel.bean_module='Contacts' and email_addr_bean_rel.deleted=0 and email_addr_bean_rel.primary_address=1  LEFT JOIN email_addresses on email_addresses.id = email_addr_bean_rel.email_address_id  LEFT JOIN contacts_cstm ON contacts.id = contacts_cstm.id_c where ( accounts.deleted IS NULL OR accounts.deleted=0 )\n                      AND contacts.deleted=0 ";
109
-		$actual = $contact->create_export_query('','');
110
-		$this->assertSame($expected,$actual);
107
+        //test with empty string params
108
+        $expected = "SELECT\n                                contacts.*,\n                                email_addresses.email_address email_address,\n                                '' email_addresses_non_primary, accounts.name as account_name,\n                                users.user_name as assigned_user_name ,contacts_cstm.jjwg_maps_lng_c,contacts_cstm.jjwg_maps_lat_c,contacts_cstm.jjwg_maps_geocode_status_c,contacts_cstm.jjwg_maps_address_c FROM contacts LEFT JOIN users\n	                                ON contacts.assigned_user_id=users.id LEFT JOIN accounts_contacts\n	                                ON ( contacts.id=accounts_contacts.contact_id and (accounts_contacts.deleted is null or accounts_contacts.deleted = 0))\n	                                LEFT JOIN accounts\n	                                ON accounts_contacts.account_id=accounts.id  LEFT JOIN  email_addr_bean_rel on contacts.id = email_addr_bean_rel.bean_id and email_addr_bean_rel.bean_module='Contacts' and email_addr_bean_rel.deleted=0 and email_addr_bean_rel.primary_address=1  LEFT JOIN email_addresses on email_addresses.id = email_addr_bean_rel.email_address_id  LEFT JOIN contacts_cstm ON contacts.id = contacts_cstm.id_c where ( accounts.deleted IS NULL OR accounts.deleted=0 )\n                      AND contacts.deleted=0 ";
109
+        $actual = $contact->create_export_query('','');
110
+        $this->assertSame($expected,$actual);
111 111
 
112 112
 
113
-		//test with valid string params
114
-		$expected = "SELECT\n                                contacts.*,\n                                email_addresses.email_address email_address,\n                                '' email_addresses_non_primary, accounts.name as account_name,\n                                users.user_name as assigned_user_name ,contacts_cstm.jjwg_maps_lng_c,contacts_cstm.jjwg_maps_lat_c,contacts_cstm.jjwg_maps_geocode_status_c,contacts_cstm.jjwg_maps_address_c FROM contacts LEFT JOIN users\n	                                ON contacts.assigned_user_id=users.id LEFT JOIN accounts_contacts\n	                                ON ( contacts.id=accounts_contacts.contact_id and (accounts_contacts.deleted is null or accounts_contacts.deleted = 0))\n	                                LEFT JOIN accounts\n	                                ON accounts_contacts.account_id=accounts.id  LEFT JOIN  email_addr_bean_rel on contacts.id = email_addr_bean_rel.bean_id and email_addr_bean_rel.bean_module='Contacts' and email_addr_bean_rel.deleted=0 and email_addr_bean_rel.primary_address=1  LEFT JOIN email_addresses on email_addresses.id = email_addr_bean_rel.email_address_id  LEFT JOIN contacts_cstm ON contacts.id = contacts_cstm.id_c where (contacts.name=\"\") AND ( accounts.deleted IS NULL OR accounts.deleted=0 )\n                      AND contacts.deleted=0 ";
115
-		$actual = $contact->create_export_query('contacts.id','contacts.name=""');
116
-		$this->assertSame($expected,$actual);
113
+        //test with valid string params
114
+        $expected = "SELECT\n                                contacts.*,\n                                email_addresses.email_address email_address,\n                                '' email_addresses_non_primary, accounts.name as account_name,\n                                users.user_name as assigned_user_name ,contacts_cstm.jjwg_maps_lng_c,contacts_cstm.jjwg_maps_lat_c,contacts_cstm.jjwg_maps_geocode_status_c,contacts_cstm.jjwg_maps_address_c FROM contacts LEFT JOIN users\n	                                ON contacts.assigned_user_id=users.id LEFT JOIN accounts_contacts\n	                                ON ( contacts.id=accounts_contacts.contact_id and (accounts_contacts.deleted is null or accounts_contacts.deleted = 0))\n	                                LEFT JOIN accounts\n	                                ON accounts_contacts.account_id=accounts.id  LEFT JOIN  email_addr_bean_rel on contacts.id = email_addr_bean_rel.bean_id and email_addr_bean_rel.bean_module='Contacts' and email_addr_bean_rel.deleted=0 and email_addr_bean_rel.primary_address=1  LEFT JOIN email_addresses on email_addresses.id = email_addr_bean_rel.email_address_id  LEFT JOIN contacts_cstm ON contacts.id = contacts_cstm.id_c where (contacts.name=\"\") AND ( accounts.deleted IS NULL OR accounts.deleted=0 )\n                      AND contacts.deleted=0 ";
115
+        $actual = $contact->create_export_query('contacts.id','contacts.name=""');
116
+        $this->assertSame($expected,$actual);
117 117
 
118
-	}
118
+    }
119 119
 
120
-	public function testfill_in_additional_list_fields() {
120
+    public function testfill_in_additional_list_fields() {
121 121
 
122
-		$contact = new Contact();
122
+        $contact = new Contact();
123 123
 
124
-		//test with attributes preset and verify attributes are set accordingly
125
-		$contact->first_name = "firstn";
126
-		$contact->last_name = "lastn";
127
-		$contact->email1 = "[email protected]";
128
-		$contact->email2 = "[email protected]";
124
+        //test with attributes preset and verify attributes are set accordingly
125
+        $contact->first_name = "firstn";
126
+        $contact->last_name = "lastn";
127
+        $contact->email1 = "[email protected]";
128
+        $contact->email2 = "[email protected]";
129 129
 
130 130
 
131
-		$contact->fill_in_additional_list_fields();
131
+        $contact->fill_in_additional_list_fields();
132 132
 
133
-		$this->assertEquals("firstn lastn",$contact->full_name);
134
-		$this->assertEquals("firstn lastn &lt;[email protected]&gt;",$contact->email_and_name1);
135
-		$this->assertEquals("firstn lastn &lt;[email protected]&gt;",$contact->email_and_name2);
133
+        $this->assertEquals("firstn lastn",$contact->full_name);
134
+        $this->assertEquals("firstn lastn &lt;[email protected]&gt;",$contact->email_and_name1);
135
+        $this->assertEquals("firstn lastn &lt;[email protected]&gt;",$contact->email_and_name2);
136 136
 
137
-	}
137
+    }
138 138
 
139
-	public function testfill_in_additional_detail_fields() {
139
+    public function testfill_in_additional_detail_fields() {
140 140
 
141
-		$contact = new Contact();
141
+        $contact = new Contact();
142 142
 
143
-		//test with attributes preset and verify attributes are set accordingly
144
-		$contact->id = "1";
143
+        //test with attributes preset and verify attributes are set accordingly
144
+        $contact->id = "1";
145 145
 
146
-		$contact->fill_in_additional_detail_fields();
146
+        $contact->fill_in_additional_detail_fields();
147 147
 
148
-		$this->assertEquals("",$contact->account_name);
149
-		$this->assertEquals("",$contact->account_id);
150
-		$this->assertEquals("",$contact->report_to_name);
148
+        $this->assertEquals("",$contact->account_name);
149
+        $this->assertEquals("",$contact->account_id);
150
+        $this->assertEquals("",$contact->report_to_name);
151 151
 
152
-	}
152
+    }
153 153
 
154 154
 
155
-	public function testload_contacts_users_relationship(){
155
+    public function testload_contacts_users_relationship(){
156 156
 
157
-		$contact = new Contact();
157
+        $contact = new Contact();
158 158
 
159
-		//execute the method and test if it works and does not throws an exception.
160
-		try {
161
-			$contact->load_contacts_users_relationship();
162
-			$this->assertTrue(true);
163
-		}
164
-		catch (Exception $e) {
165
-			$this->fail();
166
-		}
159
+        //execute the method and test if it works and does not throws an exception.
160
+        try {
161
+            $contact->load_contacts_users_relationship();
162
+            $this->assertTrue(true);
163
+        }
164
+        catch (Exception $e) {
165
+            $this->fail();
166
+        }
167 167
 
168
-	}
168
+    }
169 169
 
170
-	public function testget_list_view_data() {
170
+    public function testget_list_view_data() {
171 171
 
172
-		$contact = new Contact();
172
+        $contact = new Contact();
173 173
 
174
-		//test with attributes preset and verify attributes are set accordingly
175
-		$contact->first_name = "first";
176
-		$contact->last_name = "last";
177
-
178
-		$expected = array (
179
-					  'NAME' => 'first last',
180
-					  'DELETED' => 0,
181
-					  'FIRST_NAME' => 'first',
182
-					  'LAST_NAME' => 'last',
183
-					  'FULL_NAME' => 'first last',
184
-					  'DO_NOT_CALL' => '0',
185
-					  'PORTAL_USER_TYPE' => 'Single user',
186
-					  'ENCODED_NAME' => 'first last',
187
-					  'EMAIL1' => '',
188
-					  'EMAIL1_LINK' => '<a href=\'javascript:void(0);\' onclick=\'SUGAR.quickCompose.init({"fullComposeUrl":"contact_id=\\u0026parent_type=Contacts\\u0026parent_id=\\u0026parent_name=first+last\\u0026to_addrs_ids=\\u0026to_addrs_names=first+last\\u0026to_addrs_emails=\\u0026to_email_addrs=first+last%26nbsp%3B%26lt%3B%26gt%3B\\u0026return_module=Contacts\\u0026return_action=ListView\\u0026return_id=","composePackage":{"contact_id":"","parent_type":"Contacts","parent_id":"","parent_name":"first last","to_addrs_ids":"","to_addrs_names":"first last","to_addrs_emails":"","to_email_addrs":"first last \\u003C\\u003E","return_module":"Contacts","return_action":"ListView","return_id":""}});\' class=\'\'>',
189
-					  'EMAIL_AND_NAME1' => 'first last &lt;&gt;',
190
-					);
191
-
192
-		$actual = $contact->get_list_view_data();
193
-		//$this->assertSame($expected, $actual);
194
-		$this->assertEquals($expected['NAME'], $actual['NAME']);
195
-		$this->assertEquals($expected['FIRST_NAME'], $actual['FIRST_NAME']);
196
-		$this->assertEquals($expected['LAST_NAME'], $actual['LAST_NAME']);
197
-		$this->assertEquals($expected['FULL_NAME'], $actual['FULL_NAME']);
198
-		$this->assertEquals($expected['ENCODED_NAME'], $actual['ENCODED_NAME']);
199
-		$this->assertEquals($expected['EMAIL_AND_NAME1'], $actual['EMAIL_AND_NAME1']);
200
-
201
-	}
202
-
203
-
204
-	public function testbuild_generic_where_clause ()
205
-	{
174
+        //test with attributes preset and verify attributes are set accordingly
175
+        $contact->first_name = "first";
176
+        $contact->last_name = "last";
206 177
 
207
-		$contact = new Contact();
178
+        $expected = array (
179
+                        'NAME' => 'first last',
180
+                        'DELETED' => 0,
181
+                        'FIRST_NAME' => 'first',
182
+                        'LAST_NAME' => 'last',
183
+                        'FULL_NAME' => 'first last',
184
+                        'DO_NOT_CALL' => '0',
185
+                        'PORTAL_USER_TYPE' => 'Single user',
186
+                        'ENCODED_NAME' => 'first last',
187
+                        'EMAIL1' => '',
188
+                        'EMAIL1_LINK' => '<a href=\'javascript:void(0);\' onclick=\'SUGAR.quickCompose.init({"fullComposeUrl":"contact_id=\\u0026parent_type=Contacts\\u0026parent_id=\\u0026parent_name=first+last\\u0026to_addrs_ids=\\u0026to_addrs_names=first+last\\u0026to_addrs_emails=\\u0026to_email_addrs=first+last%26nbsp%3B%26lt%3B%26gt%3B\\u0026return_module=Contacts\\u0026return_action=ListView\\u0026return_id=","composePackage":{"contact_id":"","parent_type":"Contacts","parent_id":"","parent_name":"first last","to_addrs_ids":"","to_addrs_names":"first last","to_addrs_emails":"","to_email_addrs":"first last \\u003C\\u003E","return_module":"Contacts","return_action":"ListView","return_id":""}});\' class=\'\'>',
189
+                        'EMAIL_AND_NAME1' => 'first last &lt;&gt;',
190
+                    );
208 191
 
209
-		//test with string
210
-		$expected = "contacts.last_name like 'test%' or contacts.first_name like 'test%' or accounts.name like 'test%' or contacts.assistant like 'test%' or ea.email_address like 'test%'";
211
-		$actual = $contact->build_generic_where_clause('test');
212
-		$this->assertSame($expected,$actual);
192
+        $actual = $contact->get_list_view_data();
193
+        //$this->assertSame($expected, $actual);
194
+        $this->assertEquals($expected['NAME'], $actual['NAME']);
195
+        $this->assertEquals($expected['FIRST_NAME'], $actual['FIRST_NAME']);
196
+        $this->assertEquals($expected['LAST_NAME'], $actual['LAST_NAME']);
197
+        $this->assertEquals($expected['FULL_NAME'], $actual['FULL_NAME']);
198
+        $this->assertEquals($expected['ENCODED_NAME'], $actual['ENCODED_NAME']);
199
+        $this->assertEquals($expected['EMAIL_AND_NAME1'], $actual['EMAIL_AND_NAME1']);
213 200
 
201
+    }
214 202
 
215
-		//test with number
216
-		$expected = "contacts.last_name like '1%' or contacts.first_name like '1%' or accounts.name like '1%' or contacts.assistant like '1%' or ea.email_address like '1%' or contacts.phone_home like '%1%' or contacts.phone_mobile like '%1%' or contacts.phone_work like '%1%' or contacts.phone_other like '%1%' or contacts.phone_fax like '%1%' or contacts.assistant_phone like '%1%'";
217
-		$actual = $contact->build_generic_where_clause(1);
218
-		$this->assertSame($expected,$actual);
219 203
 
220
-	}
204
+    public function testbuild_generic_where_clause ()
205
+    {
221 206
 
222
-	public function testset_notification_body()
223
-	{
224
-		$contact = new Contact();
207
+        $contact = new Contact();
225 208
 
226
-		//test with attributes preset and verify attributes are set accordingly
227
-		$contact->first_name = "first";
228
-		$contact->last_name = "last";
229
-		$contact->description = "some text";
230
-		$contact->fill_in_additional_list_fields();
209
+        //test with string
210
+        $expected = "contacts.last_name like 'test%' or contacts.first_name like 'test%' or accounts.name like 'test%' or contacts.assistant like 'test%' or ea.email_address like 'test%'";
211
+        $actual = $contact->build_generic_where_clause('test');
212
+        $this->assertSame($expected,$actual);
231 213
 
232
-		$result = $contact->set_notification_body(new Sugar_Smarty(), $contact);
233 214
 
234
-		$this->assertEquals($contact->full_name ,$result->_tpl_vars['CONTACT_NAME']);
235
-		$this->assertEquals($contact->description ,$result->_tpl_vars['CONTACT_DESCRIPTION']);
215
+        //test with number
216
+        $expected = "contacts.last_name like '1%' or contacts.first_name like '1%' or accounts.name like '1%' or contacts.assistant like '1%' or ea.email_address like '1%' or contacts.phone_home like '%1%' or contacts.phone_mobile like '%1%' or contacts.phone_work like '%1%' or contacts.phone_other like '%1%' or contacts.phone_fax like '%1%' or contacts.assistant_phone like '%1%'";
217
+        $actual = $contact->build_generic_where_clause(1);
218
+        $this->assertSame($expected,$actual);
236 219
 
237
-	}
220
+    }
238 221
 
239
-	public function testget_contact_id_by_email()
240
-	{
241
-		$contact = new Contact();
222
+    public function testset_notification_body()
223
+    {
224
+        $contact = new Contact();
242 225
 
243
-		$result = $contact->get_contact_id_by_email("");
244
-		$this->assertEquals(null,$result);
226
+        //test with attributes preset and verify attributes are set accordingly
227
+        $contact->first_name = "first";
228
+        $contact->last_name = "last";
229
+        $contact->description = "some text";
230
+        $contact->fill_in_additional_list_fields();
245 231
 
232
+        $result = $contact->set_notification_body(new Sugar_Smarty(), $contact);
246 233
 
247
-		//$result = $contact->get_contact_id_by_email("[email protected]");
248
-		//$this->assertEquals(null,$result);
234
+        $this->assertEquals($contact->full_name ,$result->_tpl_vars['CONTACT_NAME']);
235
+        $this->assertEquals($contact->description ,$result->_tpl_vars['CONTACT_DESCRIPTION']);
249 236
 
250
-		$this->markTestSkipped('Invalid Columns(email1,email2) in Query ');
237
+    }
251 238
 
252
-	}
239
+    public function testget_contact_id_by_email()
240
+    {
241
+        $contact = new Contact();
253 242
 
254
-	public function testsave_relationship_changes() {
243
+        $result = $contact->get_contact_id_by_email("");
244
+        $this->assertEquals(null,$result);
255 245
 
256
-		$contact = new Contact();
257 246
 
258
-		//execute the method and test if it works and does not throws an exception.
259
-		try {
260
-			$contact->save_relationship_changes(true);
261
-			$contact->save_relationship_changes(false);
262
-			$this->assertTrue(true);
263
-		}
264
-		catch (Exception $e) {
265
-			$this->fail();
266
-		}
247
+        //$result = $contact->get_contact_id_by_email("[email protected]");
248
+        //$this->assertEquals(null,$result);
267 249
 
268
-	}
250
+        $this->markTestSkipped('Invalid Columns(email1,email2) in Query ');
269 251
 
270
-	public function testbean_implements()
271
-	{
272
-		$contact = new Contact();
273
-		$this->assertEquals(false, $contact->bean_implements('')); //test with blank value
274
-		$this->assertEquals(false, $contact->bean_implements('test')); //test with invalid value
275
-		$this->assertEquals(true, $contact->bean_implements('ACL')); //test with valid value
276
-	}
252
+    }
277 253
 
278
-	public function testget_unlinked_email_query()
279
-	{
280
-		$contact = new Contact();
254
+    public function testsave_relationship_changes() {
281 255
 
282
-		//execute the method and verify that it retunrs expected results
283
-		$expected = "SELECT emails.id FROM emails  JOIN (select DISTINCT email_id from emails_email_addr_rel eear\n\n	join email_addr_bean_rel eabr on eabr.bean_id ='' and eabr.bean_module = 'Contacts' and\n	eabr.email_address_id = eear.email_address_id and eabr.deleted=0\n	where eear.deleted=0 and eear.email_id not in\n	(select eb.email_id from emails_beans eb where eb.bean_module ='Contacts' and eb.bean_id = '')\n	) derivedemails on derivedemails.email_id = emails.id";
284
-		$actual = $contact->get_unlinked_email_query();
285
-		$this->assertSame($expected,$actual);
256
+        $contact = new Contact();
257
+
258
+        //execute the method and test if it works and does not throws an exception.
259
+        try {
260
+            $contact->save_relationship_changes(true);
261
+            $contact->save_relationship_changes(false);
262
+            $this->assertTrue(true);
263
+        }
264
+        catch (Exception $e) {
265
+            $this->fail();
266
+        }
267
+
268
+    }
269
+
270
+    public function testbean_implements()
271
+    {
272
+        $contact = new Contact();
273
+        $this->assertEquals(false, $contact->bean_implements('')); //test with blank value
274
+        $this->assertEquals(false, $contact->bean_implements('test')); //test with invalid value
275
+        $this->assertEquals(true, $contact->bean_implements('ACL')); //test with valid value
276
+    }
277
+
278
+    public function testget_unlinked_email_query()
279
+    {
280
+        $contact = new Contact();
281
+
282
+        //execute the method and verify that it retunrs expected results
283
+        $expected = "SELECT emails.id FROM emails  JOIN (select DISTINCT email_id from emails_email_addr_rel eear\n\n	join email_addr_bean_rel eabr on eabr.bean_id ='' and eabr.bean_module = 'Contacts' and\n	eabr.email_address_id = eear.email_address_id and eabr.deleted=0\n	where eear.deleted=0 and eear.email_id not in\n	(select eb.email_id from emails_beans eb where eb.bean_module ='Contacts' and eb.bean_id = '')\n	) derivedemails on derivedemails.email_id = emails.id";
284
+        $actual = $contact->get_unlinked_email_query();
285
+        $this->assertSame($expected,$actual);
286 286
 
287
-	}
287
+    }
288 288
 
289 289
 
290 290
     public function testprocess_sync_to_outlook()
291 291
     {
292
-    	$contact = new Contact();
292
+        $contact = new Contact();
293 293
 
294
-    	//execute the method and test if it works and does not throws an exception.
295
-    	try {
296
-   			$contact->process_sync_to_outlook("all");
297
-    		$this->assertTrue(true);
298
-    	}
299
-    	catch (Exception $e) {
300
-    		$this->fail();
301
-    	}
294
+        //execute the method and test if it works and does not throws an exception.
295
+        try {
296
+                $contact->process_sync_to_outlook("all");
297
+            $this->assertTrue(true);
298
+        }
299
+        catch (Exception $e) {
300
+            $this->fail();
301
+        }
302 302
 
303 303
 
304
-    	//execute the method and test if it works and does not throws an exception.
305
-    	try {
306
-    		$contact->process_sync_to_outlook("1");
307
-    		$this->assertTrue(true);
308
-    	}
309
-    	catch (Exception $e) {
310
-    		$this->fail();
311
-    	}
304
+        //execute the method and test if it works and does not throws an exception.
305
+        try {
306
+            $contact->process_sync_to_outlook("1");
307
+            $this->assertTrue(true);
308
+        }
309
+        catch (Exception $e) {
310
+            $this->fail();
311
+        }
312 312
 
313 313
 
314 314
 
315
-	}
315
+    }
316 316
 
317 317
 }
Please login to merge, or discard this patch.