晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/akaindir/www/crm/modules/WSAPP/synclib/connectors/ |
Upload File : |
<?php
/* +***********************************************************************************
* The contents of this file are subject to the vtiger CRM Public License Version 1.0
* ("License"); You may not use this file except in compliance with the License
* The Original Code is: vtiger CRM Open Source
* The Initial Developer of the Original Code is vtiger.
* Portions created by vtiger are Copyright (C) vtiger.
* All Rights Reserved.
************************************************************************************ */
require_once 'modules/WSAPP/synclib/connectors/BaseConnector.php';
require_once 'modules/WSAPP/api/ws/Get.php';
require_once 'modules/WSAPP/synclib/models/VtigerModel.php';
require_once 'modules/WSAPP/synclib/models/PullResultModel.php';
require_once 'modules/WSAPP/api/ws/Map.php';
require_once 'modules/WSAPP/api/ws/Put.php';
require_once 'include/Zend/Json.php';
require_once 'include/database/PearDatabase.php';
require_once 'include/Webservices/Utils.php';
class WSAPP_VtigerConnector extends WSAPP_BaseConnector {
protected $name;
protected $db;
protected $nextSyncSate;
function __construct() {
$this->db = PearDatabase::getInstance();
}
public function getDbInstance() {
return $this->db;
}
public function getName() {
return $this->name;
}
public function setName($name) {
$this->name = $name;
return $this;
}
public function getSyncTrackerHandlerName() {
return 'vtigerSyncLib';
}
public function getUser() {
return $this->getSynchronizeController()->user;
}
public function getRecordModelFromData($data) {
return $this->getSynchronizeController()->getSourceRecordModel($data);
}
public function getSyncState() {
$result = null;
if($this->getSynchronizeController()->getSyncType() == "app"){
$result = $this->db->pquery("SELECT * FROM vtiger_wsapp_sync_state WHERE name=?", array($this->getName()));
} else {
$result = $this->db->pquery("SELECT * FROM vtiger_wsapp_sync_state WHERE name=? and userid=?", array($this->getName(), $this->getSynchronizeController()->user->id));//$this->getSYnchronizeController()->getSyncType();
}
if ($this->db->num_rows($result) <= 0) {
return $this->intialSync();
}
$rowData = $this->db->raw_query_result_rowdata($result);
$stateValues = Zend_Json::decode($rowData['stateencodedvalues']);
$model = WSAPP_SyncStateModel::getInstanceFromQueryResult($stateValues);
return $model;
}
public function moreRecordsExits() {
$syncState = $this->getSyncState();
return $syncState->get('more');
}
public function intialSync() {
$registrationDetails = $this->registerWithTracker();
return $this->getSyncStateModelFromTrackerRegisterDetails($registrationDetails);
}
private function getSyncStateModelFromTrackerRegisterDetails($registerDetails) {
$syncStateModel = new WSAPP_SyncStateModel();
$syncStateModel->setSyncTrackerId($registerDetails['key'])->setSyncToken(strtotime('10 years ago'))->setType($this->getSynchronizeController()->getSourceType());
return $syncStateModel;
}
function registerWithTracker() {
return wsapp_register($this->getSyncTrackerHandlerName(), $this->getSynchronizeController()->getSyncType(), $this->user);
}
function updateSyncState(WSAPP_SyncStateModel $syncStateModel) {
$encodedValues = Zend_Json::encode(array('synctrackerid' => $syncStateModel->getSyncTrackerId(), 'synctoken' => $syncStateModel->getSyncToken(), 'more' => $syncStateModel->get('more')));
$query = 'INSERT INTO vtiger_wsapp_sync_state(stateencodedvalues,name,userid) VALUES (?,?,?)';
$parameters = array($encodedValues, $this->getName(), $this->getSynchronizeController()->user->id);
if ($this->isSyncStateExists()) {
$query = '';
$parameters = array();
if($this->getSynchronizeController()->getSyncType() == "app"){
$query = 'UPDATE vtiger_wsapp_sync_state SET stateencodedvalues=? where name=?';
$parameters = array($encodedValues, $this->getName());
}else {
$query = 'UPDATE vtiger_wsapp_sync_state SET stateencodedvalues=? where name=? and userid=?';
$parameters = array($encodedValues, $this->getName(), $this->getSynchronizeController()->user->id);
}
}
$result = $this->db->pquery($query, $parameters);
if ($result) {
return true;
}
return false;
}
function isSyncStateExists() {
$result = null;
if($this->getSynchronizeController()->getSyncType() == "app"){
$result = $this->db->pquery('SELECT 1 FROM vtiger_wsapp_sync_state where name=?', array($this->getName()));
} else {
$result = $this->db->pquery('SELECT 1 FROM vtiger_wsapp_sync_state where name=? and userid=?', array($this->getName(), $this->getSynchronizeController()->user->id));
}
return ($this->db->num_rows($result) > 0) ? true : false;
}
public function pull(WSAPP_SyncStateModel $syncStateModel) {
$syncTrackerId = $syncStateModel->getSyncTrackerId();
$prevSyncToken = $syncStateModel->getSyncToken();
$recordModels = array();
$records = wsapp_get($syncTrackerId, $syncStateModel->getType(), $prevSyncToken, $this->getSynchronizeController()->user);
$createdRecords = $records['created'];
$updatedRecords = $records['updated'];
$deletedRecords = $records['deleted'];
$clientID2ServerIDMap = $records['client2serverIdMap'];
if(is_array($createdRecords)) {
foreach ($createdRecords as $record) {
$model = $this->getRecordModelFromData($record);
$recordModels[] = $model->setMode(WSAPP_SyncRecordModel::WSAPP_CREATE_MODE)->setType($this->getSynchronizeController()->getSourceType());
}
}
if(is_array($updatedRecords)) {
foreach ($updatedRecords as $record) {
$model = $this->getRecordModelFromData($record);
$recordModels[] = $model->setMode(WSAPP_SyncRecordModel::WSAPP_UPDATE_MODE)->setType($this->getSynchronizeController()->getSourceType());
}
}
if(is_array($deletedRecords)) {
foreach ($deletedRecords as $record) {
$model = $this->getRecordModelFromData($record);
//For WSAPP Logs
$clientId = $record['_id'];
$model->set('_serverid', $clientID2ServerIDMap[$clientId]);
//END
$recordModels[] = $model->setMode(WSAPP_SyncRecordModel::WSAPP_DELETE_MODE)->setType($this->getSynchronizeController()->getSourceType());
}
}
$nextSyncState = clone $syncStateModel;
$nextSyncState->setSyncToken($records['lastModifiedTime'])->set('more', $records['more']);
$pullResultModel = new WSAPP_PullResultModel();
$pullResultModel->setPulledRecords($recordModels)->setNextSyncState($nextSyncState)->setPrevSyncState($syncStateModel);
$this->nextSyncSate = $nextSyncState;
return $recordModels;
}
public function push($recordList, $syncStateModel) {
$pushResult = wsapp_put($syncStateModel->getSyncTrackerId(), $this->convertToPushSyncTrackerFormat($recordList), $this->getSynchronizeController()->user);
$pushResponseRecordList = array();
$clientID2ServerIDMap = $pushResult['client2serverIdMap'];
foreach ($pushResult as $mode => $records) {
if ($mode == 'created') {
$recordMode = WSAPP_SyncRecordModel::WSAPP_CREATE_MODE;
} else if ($mode == 'updated') {
$recordMode = WSAPP_SyncRecordModel::WSAPP_UPDATE_MODE;
} else if ($mode == 'deleted') {
$recordMode = WSAPP_SyncRecordModel::WSAPP_DELETE_MODE;
} else {
$recordMode = 'skipped';
}
foreach ($records as $record) {
$clientid = $record['_id'];
$record['_serverid'] = $clientID2ServerIDMap[$clientid]; //For WSAPP Logs
$pushResponseRecordList[] = $this->getRecordModelFromData($record)->setMode($recordMode)->setType($this->getSynchronizeController()->getSourceType());
}
}
return $pushResponseRecordList;
}
public function postEvent($type, $synchronizedRecords, $syncStateModel) {
if ($type == WSAPP_SynchronizeController::WSAPP_SYNCHRONIZECONTROLLER_PULL_EVENT) {
$this->map($synchronizedRecords, $syncStateModel);
$this->updateSyncState($this->nextSyncSate);
}
}
public function map($synchronizedRecords, $syncStateModel) {
$mapFormatedRecords = array();
$mapFormatedRecords['create'] = array();
$mapFormatedRecords['update'] = array();
$mapFormatedRecords['delete'] = array();
foreach ($synchronizedRecords as $sourceAndTargetRecord) {
$sourceRecord = $sourceAndTargetRecord['source'];
$destinationRecord = $sourceAndTargetRecord['target'];
if ($destinationRecord->isCreateMode()) {
$mapFormatedRecords['create'][$destinationRecord->getId()] = array('serverid' => $sourceRecord->getId(),
'modifiedtime' => $destinationRecord->getModifiedTime(),
'_modifiedtime' => $sourceRecord->getModifiedTime());
} else if ($destinationRecord->isDeleteMode()) {
$mapFormatedRecords['delete'][] = $destinationRecord->getId();
} else {
$mapFormatedRecords['update'][$destinationRecord->getId()] = array('serverid' => $sourceRecord->getId(),
'modifiedtime' => $destinationRecord->getModifiedTime(),
'_modifiedtime' => $sourceRecord->getModifiedTime());
}
}
wsapp_map($syncStateModel->getSyncTrackerId(), $mapFormatedRecords, $this->getSynchronizeController()->user);
}
public function convertToPushSyncTrackerFormat($recordList) {
$syncTrackerRecordList = array();
foreach ($recordList as $record) {
$syncTrackerRecord = array();
$syncTrackerRecord['module'] = $record->getType();
;
$syncTrackerRecord['mode'] = $record->getMode();
$syncTrackerRecord['id'] = $record->getId();
if (!$record->isDeleteMode()) {
$syncTrackerRecord['values'] = $record->getData();
$syncTrackerRecord['values']['modifiedtime'] = $record->getModifiedTime();
$syncTrackerRecord['values']['id'] = $record->getId();
} else {
$syncTrackerRecord['_syncidentificationkey'] = $record->get('_syncidentificationkey');
}
$syncTrackerRecordList[] = $syncTrackerRecord;
}
return $syncTrackerRecordList;
}
public function fillMandatoryEmptyFields($moduleName, $recordLists, $user) {
$handler = vtws_getModuleHandlerFromName($moduleName, $user);
$meta = $handler->getMeta();
$fields = $meta->getModuleFields();
$mandatoryFields = $meta->getMandatoryFields();
$ownerFields = $meta->getOwnerFields();
$transformedRecords = array();
foreach ($recordLists as $record) {
foreach ($mandatoryFields as $fieldName) {
// ignore owner fields
if (in_array($fieldName, $ownerFields)) {
continue;
}
$fieldInstance = $fields[$fieldName];
$currentFieldValue = $record->get($fieldName);
if (!empty($currentFieldValue)) {
continue;
}
//Dont fill mandatory fields if empty is passed and if the record is in update mode
//Since sync app is using revise to update
if($record->getMode() == WSAPP_SyncRecordModel::WSAPP_UPDATE_MODE) {
continue;
}
$fieldDataType = $fieldInstance->getFieldDataType();
$defaultValue = $fieldInstance->getDefault();
$value = '';
switch ($fieldDataType) {
case 'date':
$value = $defaultValue;
if (empty($defaultValue)) {
$dateObject = new DateTime();
$value = $dateObject->format('Y-m-d');
}
break;
case 'text':
$value = '?????';
if (!empty($defaultValue)) {
$value = $defaultValue;
}
break;
case 'phone':
$value = '?????';
if (!empty($defaultValue)) {
$value = $defaultValue;
}
break;
}
$record->set($fieldName, $value);
}
$transformedRecords[] = $record;
}
return $transformedRecords;
}
}
?>