三、odataproducer代码改写

2024-06-19 11:38
文章标签 代码 改写 odataproducer

本文主要是介绍三、odataproducer代码改写,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这两周导师一直在美国,所以联系起来很不方便,加上现有的资料很少,所以只能自己摸索,上周确定了思路,导师也说思路是正确的,那么这周就要对代码进行改写。

要改写的代码包括IDataServiceMetaDataProvider,IDataServiceQuery Provider,IDataServiceQueryProvider2,IServiceProvider ,IExpressionProvider,Metadata Mapping这几个部分,每一个部分的功能在上周的报告中已经说过,这里就不在赘述,那么我们一个个来。

 

首先是IDataServiceMetaDataProvider,用来描述实体集和实体的属性及实体间的联系,我们选择SugarCRM中的Contacts实体,首先定义Contacts实体,我们选取

id;   序号
first_name;    名
last_name;    姓
phone_mobile;手机
phone_fax; 传真
primary_address_street;  地址-街道
primary_address_city;地址-城市

primary_address_country;地址-国家
birthdate; 生日
其中id为主键,下面会用到

class Contacts
{//Key Edm.Int32public $id;//Edm.Stringpublic $first_name;//Edm.Stringpublic $last_name;//Edm.Stringpublic $phone_mobile;//Edm.Stringpublic $phone_fax;//Edm.Stringpublic $primary_address_street;//Edm.Stringpublic $primary_address_city;//Edm.Stringpublic $primary_address_country;//Edm.Stringpublic $birthdate;//Edm.String
}

 

然后创建元数据类class CreateSugarCRMMetadata

    public static function create(){$metadata = new ServiceBaseMetadata('SugarCRMEntities', 'SugarCRM');//Register the entity (resource) type 'Contacts'$ContactsEntityType = $metadata->addEntityType(new ReflectionClass('Contacts'), 'Contacts', 'SugarCRM');$metadata->addKeyProperty($ContactsEntityType, 'id', EdmPrimitiveType::INT32);$metadata->addPrimitiveProperty($ContactsEntityType, 'first_name', EdmPrimitiveType::STRING);$metadata->addPrimitiveProperty($ContactsEntityType, 'last_name', EdmPrimitiveType::STRING);$metadata->addPrimitiveProperty($ContactsEntityType, 'primary_address_street', EdmPrimitiveType::STRING);$metadata->addPrimitiveProperty($ContactsEntityType, 'primary_address_city', EdmPrimitiveType::STRING);$metadata->addPrimitiveProperty($ContactsEntityType, 'primary_address_country', EdmPrimitiveType::STRING);$metadata->addPrimitiveProperty($ContactsEntityType, 'phone_mobile', EdmPrimitiveType::STRING);$metadata->addPrimitiveProperty($ContactsEntityType, 'phone_fax', EdmPrimitiveType::STRING);$metadata->addPrimitiveProperty($ContactsEntityType, 'birthdate', EdmPrimitiveType::DATETIME);$ContactsResourceSet = $metadata->addResourceSet('Contacts', $ContactsEntityType);return $metadata;}

首先初始化了metadata对象,继承基类ServiceBaseMetadata,为其添加实体Contacts

然后为实体添加属性,分别为上面我们定义的属性,除了id使用添加主键的方法addKeyProperty,其他调用addPrimitiveProperty函数,最后将实体Contacts加入实体集

 

然后我们看IDataServiceQuery Provider和IDataServiceQuery Provider2这里我们直接用IDataServiceQuery Provider2

首先定义MySQL配置

/** The name of the database for WordPress */
define('DB_NAME', 'SugarCRM');/** MySQL database username */
define('DB_USER', 'root');/** MySQL database password */
define('DB_PASSWORD', '');/** MySQL hostname */
define('DB_HOST', 'localhost');


在构造函数中连接数据库

public function __construct(){$this->_connectionHandle = @mysql_connect(DB_HOST, DB_USER, DB_PASSWORD, true);if ( $this->_connectionHandle ) {} else {             die(print_r(mysql_error(), true));} mysql_select_db(DB_NAME, $this->_connectionHandle);}


IDataServiceQuery Provider2中有5个方法,这里我们只用到两个

第一个是getResourceSet(ResourceSet $resourceSet,$filter=null,$select=null,$orderby=null,$top=null,$skip=null),这个函数返回经过过滤器筛选的结果

public function getResourceSet(ResourceSet $resourceSet,$filter=null,$select=null,$orderby=null,$top=null,$skip=null){ODataException::createNotImplementedError($this->_message);$resourceSetName =  $resourceSet->getName();if ($resourceSetName !== 'Contacts' ) {die('(SugarCRMQueryProvider) Unknown resource set ' . $resourceSetName);}$returnResult = array();switch ($resourceSetName) {case 'Contacts':$query = "SELECT * FROM `contacts`";if ($filter !== null) {$query .= " AND $filter";}$stmt = mysql_query($query); $returnResult = $this->_serializeContacts($stmt);     break;                   }mysql_free_result($stmt);return $returnResult;}


这里stmt为执行sql语句返回的结果,作为_serializeContacts函数的参数,_serializeContacts参数用于将结果传入一个Contacts对象中

    private function _serializeContacts($record){$contacts = new Contacts();$contacts->id = $record['id'];$contacts->first_name = $record['first_name'];$contacts->last_name = $record['last_name'];$contacts->phone_mobile = $record['phone_mobile'];$contacts->phone_fax = $record['phone_fax'];$contacts->primary_address_street = $record['primary_address_street'];$contacts->primary_address_city = $record['primary_address_city'];$contacts->primary_address_county = $record['primary_address_county'];if (!is_null($record['birthdate'])) {$dateTime = new DateTime($record['birthdate']);$contacts->birthdate = $dateTime->format('Y-m-d\TH:i:s');} else {$contacts->birthdate = null;}return $contacts;}


而getResourceFromResourceSet(ResourceSet $resourceSet, KeyDescriptor $keyDescriptor)则是带有关键字的查询

 public function getResourceFromResourceSet(ResourceSet $resourceSet, KeyDescriptor $keyDescriptor){ODataException::createNotImplementedError($this->_message);$resourceSetName =  $resourceSet->getName();if ($resourceSetName !== 'Contacts' ) {die('(WordPressQueryProvider) Unknown resource set ' . $resourceSetName);}$namedKeyValues = $keyDescriptor->getValidatedNamedValues();$condition = null;foreach ($namedKeyValues as $key => $value) {$condition .= $key . ' = ' . $value[0] . ' and ';}$len = strlen($condition);$condition = substr($condition, 0, $len - 5);$query = "SELECT * FROM [$resourceSetName] WHERE $condition";$stmt = mysql_query($query);if (!mysql_num_rows($stmt)) {return null;}$data = mysql_fetch_assoc($stmt);switch ($resourceSetName) {case 'Contacts':$result = $this->_serializeContacts($data);break;}mysql_free_result($stmt);return $result;}


 

其中$keyDescriptor->getValidatedNamedValues()返回关键字数组,然后用循环取得关键字及对应的值

 

下面改写IDataService,分别改写

public function getService($serviceType){if(($serviceType === 'IDataServiceMetadataProvider') || ($serviceType === 'IDataServiceQueryProvider2') ||($serviceType === 'IDataServiceStreamProvider')) {if (is_null($this->_SugarCRMExpressionProvider)) {$this->_SugarCRMExpressionProvider = new SugarCRMDSExpressionProvider();    			}    	}if ($serviceType === 'IDataServiceMetadataProvider') {if (is_null($this->_SugarCRMMetadata)) {$this->_SugarCRMMetadata = CreateSugarCRMMetadata::create();// $this->_SugarCRMMetadata->mappedDetails = CreateSugarCRMMetadata::mappingInitialize();}return $this->_SugarCRMMetadata;} else if ($serviceType === 'IDataServiceQueryProvider2') {if (is_null($this->_SugarCRMQueryProvider)) {$this->_SugarCRMQueryProvider = new SugarCRMQueryProvider();}return $this->_SugarCRMQueryProvider;} else if ($serviceType === 'IDataServiceStreamProvider') {return new SugarCRMStreamProvider();}return null;}// For testing we overridden the DataService::handleRequest method, one thing is the// private memeber variable DataService::_dataServiceHost is not accessible in this class,// so we are using getHost() below.public function handleRequest(){try {$this->createProviders();$this->getHost()->validateQueryParameters();$requestMethod = $this->getOperationContext()->incomingRequest()->getMethod();if ($requestMethod !== ODataConstants::HTTP_METHOD_GET) {ODataException::createNotImplementedError(Messages::dataServiceOnlyReadSupport($requestMethod));}} catch (\Exception $exception) {throw $exception;}$uriProcessor = null;try {$uriProcessor = UriProcessor::process($this);return $uriProcessor;} catch (\Exception $exception) {throw $exception;}}

这两个函数,将metadata,queryprovider连接起来。

下一步的测试还需要跟导师沟通,下周将进行初步的测试。

 

这篇关于三、odataproducer代码改写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1074927

相关文章

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部