28 require_once DOL_DOCUMENT_ROOT.
'/core/db/DoliDB.class.php';
47 const WEEK_MONDAY_FIRST = 1;
49 const WEEK_FIRST_WEEKDAY = 4;
68 if (!empty($conf->db->character_set)) {
69 $this->forcecharset = $conf->db->character_set;
71 if (!empty($conf->db->dolibarr_main_db_collation)) {
72 $this->forcecollate = $conf->db->dolibarr_main_db_collation;
75 $this->database_user = $user;
76 $this->database_host = $host;
77 $this->database_port = $port;
79 $this->transaction_opened = 0;
103 $this->
db = $this->
connect($host, $user, $pass, $name, $port);
106 $this->connected =
true;
108 $this->database_selected =
true;
109 $this->database_name = $name;
122 $this->connected =
false;
124 $this->database_selected =
false;
125 $this->database_name =
'';
127 dol_syslog(get_class($this).
"::DoliDBSqlite3 : Error Connect ".$this->
error, LOG_ERR);
144 if (preg_match(
'/^--\s\$Id/i', $line)) {
148 if (preg_match(
'/^#/i', $line) || preg_match(
'/^$/i', $line) || preg_match(
'/^--/i', $line)) {
152 if (
$type ==
'auto') {
153 if (preg_match(
'/ALTER TABLE/i', $line)) {
155 } elseif (preg_match(
'/CREATE TABLE/i', $line)) {
157 } elseif (preg_match(
'/DROP TABLE/i', $line)) {
162 if (
$type ==
'dml') {
163 $line = preg_replace(
'/\s/',
' ', $line);
166 if (preg_match(
'/(ISAM|innodb)/i', $line)) {
167 $line = preg_replace(
'/\)[\s\t]*type[\s\t]*=[\s\t]*(MyISAM|innodb);/i',
');', $line);
168 $line = preg_replace(
'/\)[\s\t]*engine[\s\t]*=[\s\t]*(MyISAM|innodb);/i',
');', $line);
169 $line = preg_replace(
'/,$/',
'', $line);
173 if (preg_match(
'/[\s\t\(]*(\w*)[\s\t]+int.*auto_increment/i', $line, $reg)) {
174 $newline = preg_replace(
'/([\s\t\(]*)([a-zA-Z_0-9]*)[\s\t]+int.*auto_increment[^,]*/i',
'\\1 \\2 integer PRIMARY KEY AUTOINCREMENT', $line);
180 $line = str_replace(
'tinyint',
'smallint', $line);
183 $line = preg_replace(
'/(int\w+|smallint)\s+unsigned/i',
'\\1', $line);
186 $line = preg_replace(
'/\w*blob/i',
'text', $line);
189 $line = preg_replace(
'/tinytext/i',
'text', $line);
190 $line = preg_replace(
'/mediumtext/i',
'text', $line);
194 $line = preg_replace(
'/datetime not null/i',
'datetime', $line);
195 $line = preg_replace(
'/datetime/i',
'timestamp', $line);
198 $line = preg_replace(
'/^double/i',
'numeric', $line);
199 $line = preg_replace(
'/(\s*)double/i',
'\\1numeric', $line);
201 $line = preg_replace(
'/^float/i',
'numeric', $line);
202 $line = preg_replace(
'/(\s*)float/i',
'\\1numeric', $line);
205 if (preg_match(
'/unique index\s*\((\w+\s*,\s*\w+)\)/i', $line)) {
206 $line = preg_replace(
'/unique index\s*\((\w+\s*,\s*\w+)\)/i',
'UNIQUE\(\\1\)', $line);
210 $line = preg_replace(
'/AFTER [a-z0-9_]+/i',
'', $line);
213 $line = preg_replace(
'/ALTER TABLE [a-z0-9_]+ DROP INDEX/i',
'DROP INDEX', $line);
216 if (preg_match(
'/ALTER TABLE ([a-z0-9_]+) CHANGE(?: COLUMN)? ([a-z0-9_]+) ([a-z0-9_]+)(.*)$/i', $line, $reg)) {
217 $line =
"-- ".$line.
" replaced by --\n";
218 $line .=
"ALTER TABLE ".$reg[1].
" RENAME COLUMN ".$reg[2].
" TO ".$reg[3];
222 if (preg_match(
'/ALTER TABLE ([a-z0-9_]+) MODIFY(?: COLUMN)? ([a-z0-9_]+) (.*)$/i', $line, $reg)) {
223 $line =
"-- ".$line.
" replaced by --\n";
225 $newreg3 = preg_replace(
'/ DEFAULT NULL/i',
'', $newreg3);
226 $newreg3 = preg_replace(
'/ NOT NULL/i',
'', $newreg3);
227 $newreg3 = preg_replace(
'/ NULL/i',
'', $newreg3);
228 $newreg3 = preg_replace(
'/ DEFAULT 0/i',
'', $newreg3);
229 $newreg3 = preg_replace(
'/ DEFAULT \'[0-9a-zA-Z_@]*\'/i',
'', $newreg3);
230 $line .=
"ALTER TABLE ".$reg[1].
" ALTER COLUMN ".$reg[2].
" TYPE ".$newreg3;
236 if (preg_match(
'/ALTER\s+TABLE\s*(.*)\s*ADD\s+PRIMARY\s+KEY\s*(.*)\s*\((.*)$/i', $line, $reg)) {
237 $line =
"-- ".$line.
" replaced by --\n";
238 $line .=
"CREATE UNIQUE INDEX ".$reg[2].
" ON ".$reg[1].
"(".$reg[3];
243 if (preg_match(
'/ALTER\s+TABLE\s*(.*)\s*DROP\s+FOREIGN\s+KEY\s*(.*)$/i', $line, $reg)) {
244 $line =
"-- ".$line.
" replaced by --\n";
245 $line .=
"ALTER TABLE ".$reg[1].
" DROP CONSTRAINT ".$reg[2];
250 if (preg_match(
'/ALTER\s+TABLE\s*(.*)\s*ADD\s+(UNIQUE INDEX|INDEX|UNIQUE)\s+(.*)\s*\(([\w,\s]+)\)/i', $line, $reg)) {
251 $fieldlist = $reg[4];
253 $tablename = $reg[1];
254 $line =
"-- ".$line.
" replaced by --\n";
255 $line .=
"CREATE ".(preg_match(
'/UNIQUE/', $reg[2]) ?
'UNIQUE ' :
'').
"INDEX ".$idxname.
" ON ".$tablename.
" (".$fieldlist.
")";
257 if (preg_match(
'/ALTER\s+TABLE\s*(.*)\s*ADD\s+CONSTRAINT\s+(.*)\s*FOREIGN\s+KEY\s*\(([\w,\s]+)\)\s*REFERENCES\s+(\w+)\s*\(([\w,\s]+)\)/i', $line, $reg)) {
259 dol_syslog(get_class().
'::query line emptied');
270 if (preg_match(
'/DELETE FROM ([a-z_]+) USING ([a-z_]+), ([a-z_]+)/i', $line, $reg)) {
271 if ($reg[1] == $reg[2]) {
272 $line = preg_replace(
'/DELETE FROM ([a-z_]+) USING ([a-z_]+), ([a-z_]+)/i',
'DELETE FROM \\1 USING \\3', $line);
277 $line = preg_replace(
'/FROM\s*\((([a-z_]+)\s+as\s+([a-z_]+)\s*)\)/i',
'FROM \\1', $line);
281 $line = preg_replace(
'/FROM\s*\(([a-z_]+\s+as\s+[a-z_]+)\s*,\s*([a-z_]+\s+as\s+[a-z_]+\s*)\)/i',
'FROM \\1, \\2', $line);
285 $line = preg_replace(
'/FROM\s*\(([a-z_]+\s+as\s+[a-z_]+)\s*,\s*([a-z_]+\s+as\s+[a-z_]+\s*),\s*([a-z_]+\s+as\s+[a-z_]+\s*)\)/i',
'FROM \\1, \\2, \\3', $line);
304 dol_syslog(get_class($this).
"::select_db database=".$database, LOG_DEBUG);
322 public function connect($host, $login, $passwd, $name, $port = 0)
324 global $main_data_dir;
326 dol_syslog(get_class($this).
"::connect name=".$name, LOG_DEBUG);
328 $dir = $main_data_dir;
330 $dir = DOL_DATA_ROOT;
334 $database_name = $dir.
'/database_'.$name.
'.sdb';
338 $this->
db =
new SQLite3($database_name);
341 $this->
error = self::LABEL.
' '.$e->getMessage().
' current dir='.$database_name;
357 $tmp = $this->
db->version();
358 return $tmp[
'versionString'];
368 return 'sqlite3 php driver';
381 if ($this->transaction_opened > 0) {
382 dol_syslog(get_class($this).
"::close Closing a connection with an opened transaction depth=".$this->transaction_opened, LOG_ERR);
384 $this->connected =
false;
402 public function query($query, $usesavepoint = 0,
$type =
'auto', $result_mode = 0)
404 global $conf, $dolibarr_main_db_readonly;
408 $query = trim($query);
414 if (preg_match(
'/ALTER\s+TABLE\s*(.*)\s*ADD\s+CONSTRAINT\s+(.*)\s*FOREIGN\s+KEY\s*\(([\w,\s]+)\)\s*REFERENCES\s+(\w+)\s*\(([\w,\s]+)\)/i', $query, $reg)) {
419 $foreignFields = $reg[5];
420 $foreignTable = $reg[4];
421 $localfields = $reg[3];
422 $constraintname = trim($reg[2]);
423 $tablename = trim($reg[1]);
425 $descTable = $this->
db->querySingle(
"SELECT sql FROM sqlite_master WHERE name='".$this->
escape($tablename).
"'");
428 $this->
query(
"ALTER TABLE ".$tablename.
" RENAME TO tmp_".$tablename);
433 $descTable = substr($descTable, 0, strlen($descTable) - 1);
434 $descTable .=
", CONSTRAINT ".$constraintname.
" FOREIGN KEY (".$localfields.
") REFERENCES ".$foreignTable.
"(".$foreignFields.
")";
440 $this->
query($descTable);
443 $this->
query(
"INSERT INTO ".$tablename.
" SELECT * FROM tmp_".$tablename);
446 $this->
query(
"DROP TABLE tmp_".$tablename);
455 if (!in_array($query, array(
'BEGIN',
'COMMIT',
'ROLLBACK'))) {
456 $SYSLOG_SQL_LIMIT = 10000;
457 dol_syslog(
'sql='.substr($query, 0, $SYSLOG_SQL_LIMIT), LOG_DEBUG);
463 if (!empty($dolibarr_main_db_readonly)) {
464 if (preg_match(
'/^(INSERT|UPDATE|REPLACE|DELETE|CREATE|ALTER|TRUNCATE|DROP)/i', $query)) {
465 $this->
lasterror =
'Application in read-only mode';
475 $ret = $this->
db->query($query);
477 $ret->queryString = $query;
480 $this->
error = $this->
db->lastErrorMsg();
483 if (!preg_match(
"/^COMMIT/i", $query) && !preg_match(
"/^ROLLBACK/i", $query)) {
485 if (!is_object($ret) || $this->
error) {
490 dol_syslog(get_class($this).
"::query SQL Error query: ".$query, LOG_ERR);
492 $errormsg = get_class($this).
"::query SQL Error message: ".$this->lasterror;
494 if (preg_match(
'/[0-9]/', $this->
lasterrno)) {
495 $errormsg .=
' ('.$this->lasterrno.
')';
498 if ($conf->global->SYSLOG_LEVEL < LOG_DEBUG) {
499 dol_syslog(get_class($this).
"::query SQL Error query: ".$query, LOG_ERR);
501 dol_syslog(get_class($this).
"::query SQL Error message: ".$errormsg, LOG_ERR);
504 $this->_results = $ret;
521 if (!is_object($resultset)) {
522 $resultset = $this->_results;
525 $ret = $resultset->fetchArray(SQLITE3_ASSOC);
527 return (
object) $ret;
544 if (!is_object($resultset)) {
545 $resultset = $this->_results;
548 $ret = $resultset->fetchArray(SQLITE3_ASSOC);
563 if (!is_bool($resultset)) {
564 if (!is_object($resultset)) {
565 $resultset = $this->_results;
567 return $resultset->fetchArray(SQLITE3_NUM);
588 if (!is_object($resultset)) {
589 $resultset = $this->_results;
591 if (preg_match(
"/^SELECT/i", $resultset->queryString)) {
592 return $this->
db->querySingle(
"SELECT count(*) FROM (".$resultset->queryString.
") q");
611 if (!is_object($resultset)) {
612 $resultset = $this->_results;
614 if (preg_match(
"/^SELECT/i", $resultset->queryString)) {
619 return $this->
db->changes();
629 public function free($resultset =
null)
632 if (!is_object($resultset)) {
633 $resultset = $this->_results;
636 if ($resultset && is_object($resultset)) {
637 $resultset->finalize();
649 return Sqlite3::escapeString($stringtoencode);
661 return str_replace(
'_',
'\_', (
string) $stringtoencode);
672 return str_replace(array(
'\\',
'_',
'%'), array(
'\\\\',
'\_',
'\%'), (
string) $stringtoencode);
682 if (!$this->connected) {
684 return 'DB_ERROR_FAILED_TO_CONNECT';
719 $errno = $this->
db->lastErrorCode();
720 if ($errno ==
'HY000' || $errno == 0) {
721 if (preg_match(
'/table.*already exists/i', $this->
error)) {
722 return 'DB_ERROR_TABLE_ALREADY_EXISTS';
723 } elseif (preg_match(
'/index.*already exists/i', $this->
error)) {
724 return 'DB_ERROR_KEY_NAME_ALREADY_EXISTS';
725 } elseif (preg_match(
'/syntax error/i', $this->
error)) {
726 return 'DB_ERROR_SYNTAX';
729 if ($errno ==
'23000') {
730 if (preg_match(
'/column.* not unique/i', $this->
error)) {
731 return 'DB_ERROR_RECORD_ALREADY_EXISTS';
732 } elseif (preg_match(
'/PRIMARY KEY must be unique/i', $this->
error)) {
733 return 'DB_ERROR_RECORD_ALREADY_EXISTS';
740 return ($errno ?
'DB_ERROR_'.$errno :
'0');
751 if (!$this->connected) {
753 return 'Not connected. Check setup parameters in conf/conf.php file and your sqlite version';
770 return $this->
db->lastInsertRowId();
781 public function encrypt($fieldorvalue, $withQuotes = 1)
786 $cryptType = (!empty($conf->db->dolibarr_main_db_encryption) ? $conf->db->dolibarr_main_db_encryption : 0);
789 $cryptKey = (!empty($conf->db->dolibarr_main_db_cryptkey) ? $conf->db->dolibarr_main_db_cryptkey :
'');
791 $escapedstringwithquotes = ($withQuotes ?
"'" :
"").$this->
escape($fieldorvalue).($withQuotes ?
"'" :
"");
793 if ($cryptType && !empty($cryptKey)) {
794 if ($cryptType == 2) {
795 $escapedstringwithquotes =
"AES_ENCRYPT(".$escapedstringwithquotes.
", '".$this->
escape($cryptKey).
"')";
796 } elseif ($cryptType == 1) {
797 $escapedstringwithquotes =
"DES_ENCRYPT(".$escapedstringwithquotes.
", '".$this->
escape($cryptKey).
"')";
801 return $escapedstringwithquotes;
815 $cryptType = ($conf->db->dolibarr_main_db_encryption ? $conf->db->dolibarr_main_db_encryption : 0);
818 $cryptKey = (!empty($conf->db->dolibarr_main_db_cryptkey) ? $conf->db->dolibarr_main_db_cryptkey :
'');
822 if ($cryptType && !empty($cryptKey)) {
823 if ($cryptType == 2) {
824 $return =
'AES_DECRYPT('.$value.
',\''.$cryptKey.
'\')
';
825 } elseif ($cryptType == 1) {
826 $return = 'DES_DECRYPT(
'.$value.',\
''.$cryptKey.
'\')
';
834 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
840 public function DDLGetConnectId()
847 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
859 public function DDLCreateDb($database, $charset = '', $collation = '', $owner = '')
862 if (empty($charset)) {
863 $charset = $this->forcecharset;
865 if (empty($collation)) {
866 $collation = $this->forcecollate;
869 // ALTER DATABASE dolibarr_db DEFAULT CHARACTER SET latin DEFAULT COLLATE latin1_swedish_ci
870 $sql = "CREATE DATABASE ".$this->escape($database);
871 $sql .= " DEFAULT CHARACTER SET ".$this->escape($charset)." DEFAULT COLLATE ".$this->escape($collation);
873 dol_syslog($sql, LOG_DEBUG);
874 $ret = $this->query($sql);
879 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
887 public function DDLListTables($database, $table = '')
890 $listtables = array();
894 $tmptable = preg_replace('/[^a-z0-9\.\-\_%]/i
', '', $table);
896 $like = "LIKE '".$this->escape($tmptable)."'";
898 $tmpdatabase = preg_replace('/[^a-z0-9\.\-\_]/i
', '', $database);
900 $sql = "SHOW TABLES FROM ".$tmpdatabase." ".$like.";";
902 $result = $this->query($sql);
904 while ($row = $this->fetch_row($result)) {
905 $listtables[] = $row[0];
911 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
919 public function DDLInfoTable($table)
922 $infotables = array();
924 $tmptable = preg_replace('/[^a-z0-9\.\-\_]/i
', '', $table);
926 $sql = "SHOW FULL COLUMNS FROM ".$tmptable.";";
928 dol_syslog($sql, LOG_DEBUG);
929 $result = $this->query($sql);
931 while ($row = $this->fetch_row($result)) {
932 $infotables[] = $row;
938 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
951 public function DDLCreateTable($table, $fields, $primary_key, $type, $unique_keys = null, $fulltext_keys = null, $keys = null)
954 // FIXME: $fulltext_keys parameter is unused
956 // cles recherchees dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra
957 // ex. : $fields['rowid'] = array('type'=>'int','value
'=>'11
','null'=>'not
null','extra
'=> 'auto_increment
');
958 $sql = "create table ".$table."(";
960 foreach ($fields as $field_name => $field_desc) {
961 $sqlfields[$i] = $field_name." ";
962 $sqlfields[$i] .= $field_desc['type'];
963 if (preg_match("/^[^\s]/i", $field_desc['value
'])) {
964 $sqlfields[$i] .= "(".$field_desc['value
'].")";
965 } elseif (preg_match("/^[^\s]/i", $field_desc['attribute
'])) {
966 $sqlfields[$i] .= " ".$field_desc['attribute
'];
967 } elseif (preg_match("/^[^\s]/i", $field_desc['default'])) {
968 if (preg_match("/null/i", $field_desc['default'])) {
969 $sqlfields[$i] .= " default ".$field_desc['default'];
971 $sqlfields[$i] .= " default '".$this->escape($field_desc['default'])."'";
973 } elseif (preg_match("/^[^\s]/i", $field_desc['null'])) {
974 $sqlfields[$i] .= " ".$field_desc['null'];
975 } elseif (preg_match("/^[^\s]/i", $field_desc['extra
'])) {
976 $sqlfields[$i] .= " ".$field_desc['extra
'];
980 if ($primary_key != "") {
981 $pk = "primary key(".$primary_key.")";
984 if (is_array($unique_keys)) {
986 foreach ($unique_keys as $key => $value) {
987 $sqluq[$i] = "UNIQUE KEY '".$key."' ('".$this->escape($value)."')";
991 if (is_array($keys)) {
993 foreach ($keys as $key => $value) {
994 $sqlk[$i] = "KEY ".$key." (".$value.")";
998 $sql .= implode(',
', $sqlfields);
999 if ($primary_key != "") {
1002 if (is_array($unique_keys)) {
1003 $sql .= ",".implode(',
', $sqluq);
1005 if (is_array($keys)) {
1006 $sql .= ",".implode(',
', $sqlk);
1008 $sql .= ") type=".$type;
1010 dol_syslog($sql, LOG_DEBUG);
1011 if (!$this -> query($sql)) {
1017 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1024 public function DDLDropTable($table)
1027 $tmptable = preg_replace('/[^a-z0-9\.\-\_]/i
', '', $table);
1029 $sql = "DROP TABLE ".$tmptable;
1031 if (!$this->query($sql)) {
1038 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1046 public function DDLDescTable($table, $field = "")
1049 $sql = "DESC ".$table." ".$field;
1051 dol_syslog(get_class($this)."::DDLDescTable ".$sql, LOG_DEBUG);
1052 $this->_results = $this->query($sql);
1053 return $this->_results;
1056 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1066 public function DDLAddField($table, $field_name, $field_desc, $field_position = "")
1069 // cles recherchees dans le tableau des descriptions (field_desc) : type,value,attribute,null,default,extra
1070 // ex. : $field_desc = array('type'=>'int','value
'=>'11
','null'=>'not
null','extra
'=> 'auto_increment
');
1071 $sql = "ALTER TABLE ".$table." ADD ".$field_name." ";
1072 $sql .= $field_desc['type'];
1073 if (preg_match("/^[^\s]/i", $field_desc['value
'])) {
1074 if (!in_array($field_desc['type'], array('date
', 'datetime
'))) {
1075 $sql .= "(".$field_desc['value
'].")";
1078 if (preg_match("/^[^\s]/i", $field_desc['attribute
'])) {
1079 $sql .= " ".$field_desc['attribute
'];
1081 if (preg_match("/^[^\s]/i", $field_desc['null'])) {
1082 $sql .= " ".$field_desc['null'];
1084 if (preg_match("/^[^\s]/i", $field_desc['default'])) {
1085 if (preg_match("/null/i", $field_desc['default'])) {
1086 $sql .= " default ".$field_desc['default'];
1088 $sql .= " default '".$this->escape($field_desc['default'])."'";
1091 if (preg_match("/^[^\s]/i", $field_desc['extra
'])) {
1092 $sql .= " ".$field_desc['extra
'];
1094 $sql .= " ".$field_position;
1096 dol_syslog(get_class($this)."::DDLAddField ".$sql, LOG_DEBUG);
1097 if (!$this->query($sql)) {
1103 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1112 public function DDLUpdateField($table, $field_name, $field_desc)
1115 $sql = "ALTER TABLE ".$table;
1116 $sql .= " MODIFY COLUMN ".$field_name." ".$field_desc['type'];
1117 if ($field_desc['type'] == 'tinyint
' || $field_desc['type'] == 'int' || $field_desc['type'] == 'varchar
') {
1118 $sql .= "(".$field_desc['value
'].")";
1121 dol_syslog(get_class($this)."::DDLUpdateField ".$sql, LOG_DEBUG);
1122 if (!$this->query($sql)) {
1128 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1136 public function DDLDropField($table, $field_name)
1139 $tmp_field_name = preg_replace('/[^a-z0-9\.\-\_]/i
', '', $field_name);
1141 $sql = "ALTER TABLE ".$table." DROP COLUMN `".$tmp_field_name."`";
1142 if (!$this->query($sql)) {
1143 $this->error = $this->lasterror();
1150 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1160 public function DDLCreateUser($dolibarr_main_db_host, $dolibarr_main_db_user, $dolibarr_main_db_pass, $dolibarr_main_db_name)
1163 $sql = "INSERT INTO user ";
1164 $sql .= "(Host,User,password,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Index_Priv,Alter_priv,Lock_tables_priv)";
1165 $sql .= " VALUES ('".$this->escape($dolibarr_main_db_host)."','".$this->escape($dolibarr_main_db_user)."',password('".addslashes($dolibarr_main_db_pass)."')";
1166 $sql .= ",'Y
','Y
','Y
','Y
','Y
','Y
','Y
','Y
','Y
')";
1168 dol_syslog(get_class($this)."::DDLCreateUser", LOG_DEBUG); // No sql to avoid password in log
1169 $resql = $this->query($sql);
1174 $sql = "INSERT INTO db ";
1175 $sql .= "(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Index_Priv,Alter_priv,Lock_tables_priv)";
1176 $sql .= " VALUES ('".$this->escape($dolibarr_main_db_host)."','".$this->escape($dolibarr_main_db_name)."','".addslashes($dolibarr_main_db_user)."'";
1177 $sql .= ",'Y
','Y
','Y
','Y
','Y
','Y
','Y
','Y
','Y
')";
1179 dol_syslog(get_class($this)."::DDLCreateUser", LOG_DEBUG);
1180 $resql = $this->query($sql);
1185 $sql = "FLUSH Privileges";
1187 dol_syslog(get_class($this)."::DDLCreateUser", LOG_DEBUG);
1188 $resql = $this->query($sql);
1200 public function getDefaultCharacterSetDatabase()
1210 public function getListOfCharacterSet()
1214 $liste[$i]['charset
'] = 'UTF-8
';
1224 public function getDefaultCollationDatabase()
1234 public function getListOfCollation()
1238 $liste[$i]['charset
'] = 'UTF-8
';
1248 public function getPathOfDump()
1250 // FIXME: not for SQLite
1251 $fullpathofdump = '/pathtomysqldump/mysqldump
';
1253 $resql = $this->query('SHOW VARIABLES LIKE \
'basedir\'');
1256 $basedir = $liste[
'Value'];
1257 $fullpathofdump = $basedir.(preg_match(
'/\/$/', $basedir) ?
'' :
'/').
'bin/mysqldump';
1259 return $fullpathofdump;
1270 $fullpathofimport =
'/pathtomysql/mysql';
1272 $resql = $this->
query(
'SHOW VARIABLES LIKE \'basedir\'');
1275 $basedir = $liste[
'Value'];
1276 $fullpathofimport = $basedir.(preg_match(
'/\/$/', $basedir) ?
'' :
'/').
'bin/mysql';
1278 return $fullpathofimport;
1291 if (!isset($pragmas)) {
1296 'application_id',
'auto_vacuum',
'automatic_index',
'busy_timeout',
'cache_size',
1297 'cache_spill',
'case_sensitive_like',
'checkpoint_fullsync',
'collation_list',
1298 'compile_options',
'data_version',
1299 'defer_foreign_keys',
'encoding',
'foreign_key_check',
'freelist_count',
1300 'full_column_names',
'fullsync',
'ingore_check_constraints',
'integrity_check',
1301 'journal_mode',
'journal_size_limit',
'legacy_file_format',
'locking_mode',
1302 'max_page_count',
'page_count',
'page_size',
'parser_trace',
1303 'query_only',
'quick_check',
'read_uncommitted',
'recursive_triggers',
1304 'reverse_unordered_selects',
'schema_version',
'user_version',
1305 'secure_delete',
'short_column_names',
'shrink_memory',
'soft_heap_limit',
1306 'synchronous',
'temp_store',
'threads',
1307 'vdbe_addoptrace',
'vdbe_debug',
'vdbe_listing',
'vdbe_trace',
1308 'wal_autocheckpoint',
1313 foreach ($pragmas as $var) {
1314 $sql =
"PRAGMA $var";
1319 $result[$var] = $obj[0];
1322 $result[$var] =
'FAIL';
1362 $newname = preg_replace(
'/_/',
'', $name);
1363 $localname = __CLASS__.
'::db'.$newname;
1364 $reflectClass =
new ReflectionClass(__CLASS__);
1365 $reflectFunction = $reflectClass->getMethod(
'db'.$newname);
1366 if ($arg_count < 0) {
1367 $arg_count = $reflectFunction->getNumberOfParameters();
1369 if (!$this->
db->createFunction($name, $localname, $arg_count)) {
1370 $this->
error =
"unable to create custom function '$name'";
1388 if ($y == 0 && $month == 0) {
1391 $num = (365 * $y + 31 * ($month - 1) + $day);
1395 $num -= floor(($month * 4 + 23) / 10);
1397 $temp = floor(($y / 100 + 1) * 3 / 4);
1398 return $num + floor($y / 4) - $temp;
1412 $ret = floor(($daynr + 5 + ($sunday_first_day_of_week ? 1 : 0)) % 7);
1426 return (($year & 3) == 0 && ($year % 100 || ($year % 400 == 0 && $year)) ? 366 : 365);
1440 private static function calc_week($year, $month, $day, $week_behaviour, &$calc_year)
1445 $monday_first = ($week_behaviour & self::WEEK_MONDAY_FIRST) ? 1 : 0;
1446 $week_year = ($week_behaviour & self::WEEK_YEAR) ? 1 : 0;
1447 $first_weekday = ($week_behaviour & self::WEEK_FIRST_WEEKDAY) ? 1 : 0;
1452 if ($month == 1 && $day <= 7 - $weekday) {
1453 if (!$week_year && (($first_weekday && $weekday != 0) || (!$first_weekday && $weekday >= 4))) {
1459 $weekday = ($weekday + 53 * 7 - $days) % 7;
1462 if (($first_weekday && $weekday != 0) || (!$first_weekday && $weekday >= 4)) {
1463 $days = $daynr - ($first_daynr + (7 - $weekday));
1465 $days = $daynr - ($first_daynr - $weekday);
1468 if ($week_year && $days >= 52 * 7) {
1470 if ((!$first_weekday && $weekday < 4) || ($first_weekday && $weekday == 0)) {
1475 return floor($days / 7 + 1);