8 if ( !is_object($instance) ){
22 $expr = substr($expr,1);
29 if ( !$oldval ) $oldval = 0;
30 $expr = preg_replace(
'/\$\$/', $oldval, $expr);
31 if ( preg_match(
'/^[\+\-\*\/]/', $expr) ){
35 $expr = $oldval.$expr;
38 if ( !preg_match(
'/^[0-9\.\*\+\/\-\^\(\) ]+$/', $expr) ){
39 throw new Exception(
"Invalid arithmetic expression.");
41 @eval(
'$expr='.$expr.
';');
50 return date($expr, $oldtime);
55 $expr = preg_replace(
'/\$\$/', $oldval, $expr);
62 function copy($record, $vals=array(), $force=
true){
64 foreach ($vals as $k=>$v){
65 if ( strpos($v,
'=') === 0 ){
66 $vals[$k] = $this->
evaluate($v, $k, $record);
70 $del = $record->_table->getDelegate();
71 if ( isset($del) and method_exists($del,
'beforeCopy') ){
72 $res = $del->beforeCopy($record, $vals);
77 $this->warnings = array();
84 $res = df_query($query);
86 return PEAR::raiseError(
"Failed to copy record '".$record->getTitle().
"' due to an SQL error:".mysql_error());
93 if ( $auto_field_id = $record->_table->getAutoIncrementField()) {
94 $insert_id = df_insert_id();
95 $copied =& df_get_record($record->_table->tablename, array($auto_field_id=>$insert_id));
98 $ret =
new Dataface_Record($record->_table->tablename, array_merge($record->vals(), $vals));
101 if ( isset($del) and method_exists($del,
'afterCopy')){
102 $res = $del->afterCopy($record, $ret);
130 if ( !$record->checkPermission(
'view') || !$dummy->checkPermission(
'edit') ){
134 $copy_fields = array_keys($record->_table->fields());
141 if ( !$record->checkPermission(
'view', array(
'field'=>
$fieldname))
142 || !$dummy->checkPermission(
'edit', array(
'field'=>
$fieldname)) ){
143 $this->warnings[] =
Dataface_Error::permissionDenied(
"The field '$fieldname' could not be copied for record '".$record->getTitle().
"' because of insufficient permissions.");
144 unset($copy_fields[$key]);
152 if ( !$force and $failed ){
153 return Dataface_Error::permissionDenied(
"Failed to copy the record '".$record->getTitle().
"' due to insufficient permissions on one or more of the columns.");
157 $auto_inc_field = $record->_table->getAutoIncrementField();
158 if ( $auto_inc_field ){
159 $key = array_search($auto_inc_field, $copy_fields);
160 if ( $key !==
false ) unset($copy_fields[$key]);
165 $sql[] =
"insert into `".$record->_table->tablename.
"`";
166 $sql[] =
"(`".implode(
'`,`', $copy_fields).
"`)";
168 $copy_values = array();
169 foreach ($copy_fields as $key=>$val){
170 if ( isset($vals[$val]) ){
171 $copy_values[$key] =
"'".addslashes($dummy->getSerializedValue($val)).
"' as `$val`";
173 $copy_values[$key] =
"`".$val.
"`";
176 $sql[] =
"select ".implode(
', ', $copy_values).
" from `".$record->_table->tablename.
"`";
179 $keys = array_keys($record->_table->keys());
181 foreach (
$keys as $key_fieldname){
182 $q[$key_fieldname] = $record->strval($key_fieldname);
184 $where = $qb->_where($q);
185 $where = $qb->_secure($where);
187 return implode(
' ', $sql);