@ 2017-11-25T19:38:08Z <?php
ini_set('mbstring.language', 'Russian');
function db(){
static $db = null;
if(!$db){
$db = new SQLite3(__DIR__.'/contacts2.db');
$db->busyTimeout(60*60*1000);
register_shutdown_function(array($db, 'close'));
}
return $db;
}
function db_query_result($query, array $args = array()){
$q = db()->prepare($query);
foreach($args as $n => $v){
$q->bindValue(':'.$n, $v);
}
return $q->execute();
}
function db_query_generator($query, array $args = array()){
$r = db_query_result($query, $args);
while(($d = $r->fetchArray(SQLITE3_ASSOC)) !== false){
yield $d;
}
}
function db_query_array($query, array $args = array(), $key = '"{$d[\'_id\']}"'){
$dd = array();
foreach(db_query_generator($query, $args) as $d){
$k = eval("return $key;");
$dd[$k] = $d;
}
return $dd;
}
$data = array();
$foreigns = array(
'data' => array(
'package' => array('packages', 'package_id'),
'mimetype' => array('mimetypes', 'mimetype_id'),
'raw_contact' => array('raw_contacts', 'raw_contact_id'),
),
'raw_contacts' => array(
'contact' => array('contacts', 'contact_id'),
'account' => array('accounts', 'account_id'),
),
'contacts' => array(
'name_raw_contact' => array('raw_contacts', 'name_raw_contact_id'),
'photo' => array('data', 'photo_id'),
'photo_file' => array('photo_files', 'photo_file_id'),
'status_update' => array('data', 'status_update_id'),
)
);
foreach(array(
'contacts',
'raw_contacts',
'data',
'photo_files',
'accounts',
'mimetypes',
'packages',
'_sync_state',
'stream_items',
'stream_item_photos',
'groups',
'agg_exceptions',
'visible_contacts',
'default_directory',
'calls',
'voicemail_status',
'emergency',
'directories',
'v1_settings',
) as $table){
/*
$dir = 'contacts2/'.$table;
@mkdir($dir, 0777, true);
*/
//$data[$table] = array();
foreach(db_query_generator('select * from `'.$table.'`') as $d){
/*
$f = "{$dir}/{$d['_id']}.php";
$writen = file_put_contents($f, '<?php return '.var_export($d, true).';');
if(!$writen){
echo "cant write $f\r\n";
fgets(STDIN);
}
*/
if(!empty($foreigns[$table]))
foreach($foreigns[$table] as $prop_name => $target_table_and_id_prop_name){
$d[$prop_name] = null;
list($target_table, $id_prop_name) = $target_table_and_id_prop_name;
if($d[$id_prop_name]){
//$d[$prop_name] = &$data[$target_table][ $d[$id_prop_name] ];
$idx[$table][$d['_id']][$prop_name] = &$data[$target_table][ $d[$id_prop_name] ];
$idx[$target_table][ $d[$id_prop_name] ][$table][ $d['_id'] ] = &$data[$table][ $d['_id'] ];
}
}
$data[$table][$d['_id']] = $d;
}
}
foreach(array_keys($data) as $table){
$dd = &$data[$table];
foreach(array_keys($dd) as $id){
$d = &$dd[$id];
if(!empty($idx[$table][$id]))
foreach(array_keys($idx[$table][$id]) as $prop_name){
$d[$prop_name] = &$idx[$table][$id][$prop_name];
}
}
}
function vc_escape_arg($arg){
if(is_string($arg)){
return strtr($arg, array("\r\n" => '\\n', "\n" => '\\n', ',' => '\\,', ';' => '\\;', ':' => '\\:', ));
}elseif(is_float($arg)){
return sprintf('%.7f', $arg);
}
return (string) $arg;
}
function vc_line($type, $args, array $params = array()){
if(!is_array($args)) $args = array($args);
// v 3.0 charset detecting
foreach($args as $arg)
if(is_string($arg) && !isset($params['CHARSET'])){
$charset = mb_detect_encoding($args[0], 'auto');
if($charset != 'ASCII') $params['CHARSET'] = $charset;
}
/**/
$s = $type;
foreach($params as $k => $v){
$s .= ';'.$k.'='.(is_array($v) ? join(',', $v) : $v);
}
$s .= ':'.join(';', array_map('vc_escape_arg', $args));
return $s;
}
function vc(array $rows){
$rows = array_merge(
array(
array('BEGIN','VCARD'),
array('VERSION','3.0'),
),
$rows,
array(
array('END','VCARD'),
)
);
$s = '';
foreach($rows as $row){
$s .= call_user_func_array('vc_line', $row)."\r\n";
}
return $s;
}
$vcs = '';
foreach($data['contacts'] as $contact_id => $d){
$rows = array();
//var_dump($contact);
if(!empty($d['name_raw_contact']['_id'])){
//var_dump(array_filter($d['name_raw_contact'], 'is_scalar'));
$rows[] = array('FN', $d['name_raw_contact']['display_name']);
$rows[] = array('N', explode(', ', $d['name_raw_contact']['display_name_alt']));
}
if(!empty($d['raw_contacts']))
foreach($d['raw_contacts'] as $rc_id => $rc){
echo "RAW CONTACT:\r\n";
var_dump(array_filter($rc, 'is_scalar'));
if($rc['data'])
foreach($rc['data'] as $dt_id => $dt){
switch($dt['mimetype']['mimetype']){
case 'vnd.android.cursor.item/email_v2':
if($dt['data1']){
$rows[] = array('EMAIL', $dt['data1'], array('TYPE'=>'INTERNET'));
}
break;
case 'vnd.android.cursor.item/phone_v2':
if($dt['data4']){
$rows[] = array('TEL', $dt['data4']/*, array('TYPE'=>'VOICE,CELL,HOME,WORK,MSG')*/);
}
break;
case 'vnd.android.cursor.item/vnd.org.telegram.messenger.android.profile':
if($dt['data3']){
$rows[] = array('TEL', $dt['data3'], array('TYPE'=>'MSG'));
}
break;
case 'vnd.android.cursor.item/website':
if($dt['data1']){
$rows[] = array('URL', $dt['data1']);
}
break;
case 'vnd.android.cursor.item/note':
if($dt['data1']){
$rows[] = array('NOTE', $dt['data1']);
}
break;
case 'vnd.android.cursor.item/nickname':
if($dt['data1']){
$rows[] = array('NICKNAME', $dt['data1']);
}
break;
case 'vnd.android.cursor.item/photo':
if($dt['data15']){
// PHOTO;ENCODING=b;TYPE=JPEG:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvc
$it = getimagesizefromstring($dt['data15']);
// echo "PHOTO INFO:\r\n";
// var_dump($it);
$tt = array(
IMAGETYPE_GIF => 'GIF',
IMAGETYPE_JPEG => 'JPEG',
IMAGETYPE_PNG => 'PNG',
// IMAGETYPE_GIF => 'GIF',
);
if($it && isset($tt[ $it[2] ])){
$rows[] = array('PHOTO', base64_encode($dt['data15']), array(
'ENCODING' => 'b',
'TYPE' => $tt[ $it[2] ],
));
}
}
break;
case 'vnd.android.cursor.item/contact_event':
if(preg_match('#^(\d{4})(\d{2})(\d{2})$#', $dt['data1'], $t)){
$rows[] = array('BDAY', "{$t[1]}-{$t[2]}-{$t[3]}");
}
break;
case 'vnd.android.cursor.item/organization':
if($dt['data1']){
$rows[] = array('ORG', $dt['data1']);
}
break;
case 'vnd.android.cursor.item/postal-address_v2':
if($dt['data1']){
$rows[] = array('ADR', array('','',$dt['data4'],$dt['data7'],$dt['data8'],$dt['data9'],$dt['data10']));
// $dt['data2'] == '2' => TYPE=WORK
}
break;
case 'vnd.android.cursor.item/name':
break;
case 'vnd.com.google.cursor.item/contact_misc':
break;
case 'vnd.android.cursor.item/group_membership':
break;
case 'vnd.android.cursor.item/identity':
break;
default:
echo "UNKNOWN DATA $dt_id ({$dt['mimetype']['mimetype']}):\r\n";
var_dump(array_filter($dt, 'is_scalar'));
fgets(STDIN);
}
}
}
if($rows){
echo $vc = vc($rows);
$vcs .= $vc;
}
//fgets(STDIN);
//break;
}
file_put_contents('contacts2.vcf', $vcs);
Enable javascript to submit You have javascript disabled. You will not be able to edit any code.
Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).
Version System time (s) User time (s) Memory (MiB) 8.3.4 0.016 0.000 19.26 8.3.3 0.007 0.010 19.29 8.3.2 0.008 0.000 20.75 8.3.1 0.004 0.004 22.32 8.3.0 0.003 0.005 24.02 8.2.17 0.011 0.004 19.66 8.2.16 0.011 0.004 20.67 8.2.15 0.008 0.000 24.18 8.2.14 0.008 0.011 24.66 8.2.13 0.008 0.000 21.02 8.2.12 0.008 0.000 26.35 8.2.11 0.003 0.006 22.48 8.2.10 0.006 0.006 18.34 8.2.9 0.003 0.006 18.42 8.2.8 0.005 0.003 19.54 8.2.7 0.004 0.004 18.25 8.2.6 0.000 0.008 18.53 8.2.5 0.007 0.004 18.13 8.2.4 0.000 0.008 18.97 8.2.3 0.008 0.000 18.79 8.2.2 0.005 0.003 18.70 8.2.1 0.000 0.009 18.61 8.2.0 0.007 0.000 18.76 8.1.27 0.004 0.004 24.66 8.1.26 0.004 0.004 26.35 8.1.25 0.004 0.004 28.09 8.1.24 0.003 0.006 20.78 8.1.23 0.003 0.009 18.33 8.1.22 0.005 0.003 18.18 8.1.21 0.000 0.008 18.77 8.1.20 0.000 0.010 18.10 8.1.19 0.004 0.004 17.86 8.1.18 0.005 0.003 18.21 8.1.17 0.006 0.003 19.13 8.1.16 0.003 0.006 19.63 8.1.15 0.006 0.003 20.79 8.1.14 0.008 0.000 19.84 8.1.13 0.000 0.008 19.70 8.1.12 0.004 0.004 18.11 8.1.11 0.006 0.003 18.12 8.1.10 0.000 0.007 18.04 8.1.9 0.003 0.005 18.07 8.1.8 0.007 0.000 18.02 8.1.7 0.002 0.005 18.07 8.1.6 0.005 0.003 18.21 8.1.5 0.000 0.010 18.14 8.1.4 0.003 0.009 18.14 8.1.3 0.000 0.009 18.30 8.1.2 0.003 0.006 18.27 8.1.1 0.000 0.009 18.05 8.1.0 0.010 0.003 18.13 8.0.30 0.000 0.008 18.77 8.0.29 0.000 0.009 17.38 8.0.28 0.000 0.007 19.09 8.0.27 0.010 0.000 19.21 8.0.26 0.000 0.008 18.96 8.0.25 0.000 0.008 17.60 8.0.24 0.004 0.004 17.61 8.0.23 0.008 0.000 17.62 8.0.22 0.004 0.004 17.55 8.0.21 0.003 0.005 17.54 8.0.20 0.007 0.000 17.61 8.0.19 0.005 0.005 17.57 8.0.18 0.009 0.000 17.45 8.0.17 0.007 0.000 17.59 8.0.16 0.003 0.006 17.54 8.0.15 0.005 0.003 17.54 8.0.14 0.006 0.003 17.48 8.0.13 0.006 0.000 13.90 8.0.12 0.008 0.000 17.55 8.0.11 0.005 0.003 17.49 8.0.10 0.000 0.008 17.67 8.0.9 0.004 0.004 17.65 8.0.8 0.004 0.012 17.59 8.0.7 0.006 0.003 17.73 8.0.6 0.003 0.006 17.65 8.0.5 0.004 0.004 17.69 8.0.3 0.013 0.007 17.68 8.0.2 0.009 0.010 17.69 8.0.1 0.008 0.000 17.79 8.0.0 0.014 0.007 17.45 7.4.33 0.003 0.003 15.55 7.4.32 0.000 0.007 17.24 7.4.30 0.005 0.003 17.31 7.4.29 0.005 0.005 17.32 7.4.28 0.004 0.005 17.14 7.4.27 0.003 0.004 17.32 7.4.26 0.003 0.005 17.14 7.4.25 0.004 0.004 17.32 7.4.24 0.005 0.002 17.14 7.4.23 0.007 0.000 17.22 7.4.22 0.007 0.010 17.00 7.4.21 0.003 0.015 16.95 7.4.20 0.000 0.007 17.38 7.4.16 0.010 0.010 17.24 7.4.15 0.013 0.006 17.40 7.4.14 0.009 0.012 17.86 7.4.13 0.014 0.007 17.03 7.4.12 0.012 0.008 17.17 7.4.11 0.013 0.007 17.25 7.4.10 0.012 0.006 17.23 7.4.9 0.004 0.014 17.26 7.4.8 0.016 0.007 19.39 7.4.7 0.014 0.007 17.30 7.4.6 0.011 0.007 17.38 7.4.5 0.004 0.011 17.00 7.4.4 0.008 0.012 17.52 7.4.3 0.013 0.007 17.20 7.4.0 0.004 0.011 15.25 7.3.33 0.003 0.003 13.85 7.3.32 0.007 0.000 13.73 7.3.31 0.002 0.005 16.95 7.3.30 0.003 0.003 16.91 7.3.29 0.010 0.006 16.91 7.3.28 0.009 0.010 16.87 7.3.27 0.011 0.008 17.40 7.3.26 0.007 0.011 16.93 7.3.25 0.012 0.008 16.97 7.3.24 0.007 0.011 16.99 7.3.23 0.009 0.009 16.91 7.3.21 0.007 0.011 16.96 7.3.20 0.010 0.009 17.12 7.3.19 0.009 0.017 17.17 7.3.18 0.006 0.015 17.04 7.3.17 0.010 0.013 16.96 7.3.16 0.006 0.012 17.13 7.3.1 0.009 0.009 16.95 7.3.0 0.004 0.008 17.00 7.2.33 0.016 0.010 17.11 7.2.32 0.008 0.019 17.09 7.2.31 0.014 0.005 17.27 7.2.30 0.012 0.015 17.09 7.2.29 0.010 0.007 17.03 7.2.13 0.008 0.004 16.83 7.2.12 0.012 0.003 16.81 7.2.11 0.006 0.009 16.83 7.2.10 0.010 0.007 16.90 7.2.9 0.003 0.012 17.12 7.2.8 0.010 0.010 16.76 7.2.7 0.008 0.008 16.98 7.2.6 0.010 0.007 17.16 7.2.5 0.011 0.007 17.27 7.2.4 0.013 0.003 16.82 7.2.3 0.004 0.008 17.09 7.2.2 0.009 0.006 17.02 7.2.1 0.007 0.011 17.01 7.2.0 0.004 0.008 17.10 7.1.25 0.007 0.007 15.86 7.1.20 0.006 0.006 16.12 7.1.12 0.079 0.009 17.20 7.1.11 0.107 0.003 16.51 7.1.10 0.070 0.010 16.79 7.1.9 0.067 0.007 16.88 7.1.8 0.053 0.010 16.66 7.1.7 0.124 0.010 15.92 7.1.6 0.060 0.013 33.64 7.1.5 0.056 0.020 33.47 7.1.4 0.060 0.015 33.13 7.1.3 0.071 0.016 33.28 7.1.2 0.050 0.016 33.30 7.1.1 0.054 0.006 15.10 7.1.0 0.051 0.007 15.32 7.0.25 0.058 0.014 16.22 7.0.24 0.065 0.013 16.25 7.0.23 0.078 0.007 16.53 7.0.22 0.052 0.011 16.43 7.0.21 0.058 0.014 15.26 7.0.20 0.053 0.009 15.36 7.0.19 0.052 0.010 15.27 7.0.18 0.044 0.014 14.93 7.0.17 0.054 0.007 14.78 7.0.16 0.049 0.010 14.64 7.0.15 0.053 0.007 14.84 7.0.14 0.041 0.013 15.16 7.0.13 0.047 0.010 15.10 7.0.12 0.058 0.006 14.95 7.0.11 0.043 0.007 14.97 7.0.10 0.043 0.011 14.86 7.0.9 0.088 0.013 14.96 7.0.8 0.043 0.014 15.11 7.0.7 0.046 0.007 15.08 7.0.6 0.036 0.013 14.71 7.0.5 0.086 0.010 14.96 7.0.4 0.046 0.007 15.05 7.0.3 0.074 0.013 15.02 7.0.2 0.056 0.000 15.05 7.0.1 0.055 0.013 15.10 7.0.0 0.047 0.016 15.17
preferences:dark mode live preview
54.78 ms | 400 KiB | 5 Q