XML Query Parser
XML Query Parser 클래스는 XML 쿼리 파일을 입력 받아서 파싱한 후 SQL 쿼리(select, update, insert, delete 같은 쿼리 타입, 사용된 표현식, 연결/필터링 조건, 조건문에 따른 그룹/순서)를 생성하는 데 필요한 모든 정보를 관련 클래스 오브젝트 형태로 포함하는 PHP 파일을 생성합니다. 이 PHP 파일은 각 DB 클래스의 입력값으로 사용되고, 각 DB 클래스는 DBMS별로 적절한 이스케이프 문자와 커스텀 언어 구조를 사용해서 SQL을 생성합니다.
예를 들어, 다음과 같은 XML 쿼리가 있다고 가정해 보겠습니다.
# ./modules/document/queries/getCategory.xml
<query id="getCategory" action="select">
<tables>
<table name="document_categories" />
</tables>
<conditions>
<condition operation="equal" column="category_srl" var="category_srl" filter="number" notnull="notnull" />
</conditions>
</query>
executeQuery 함수를 사용해서 이 쿼리를 호출하면 XE는 파싱한 결과를 포함하는 PHP 형태의 캐시 파일이 생성되었는지 확인합니다. XML Query Parser 클래스를 호출하지 않았으면 PHP 파일을 생성해서 ./files/cache/queries에 저장합니다.
# ./files/cache/queries/document.getCategory.1.5.0.8.cache.php
<?php if(!defined('__ZBXE__')) exit();
$query = new Query();
$query->setQueryId("getCategory");
$query->setAction("select");
$query->setPriority("");
$category_srl1_argument = new ConditionArgument('category_srl', $args->category_srl, 'equal');
$category_srl1_argument->checkFilter('number');
$category_srl1_argument->checkNotNull();
$category_srl1_argument->createConditionValue();
if(!$category_srl1_argument->isValid()) return $category_srl1_argument->getErrorMessage();
if($category_srl1_argument !== null) $category_srl1_argument->setColumnType('number');
$query->setColumns(array(
new StarExpression()
));
$query->setTables(array(
new Table('`testtesttest_document_categories`', '`document_categories`')
));
$query->setConditions(array(
new ConditionGroup(array(
new ConditionWithArgument('`category_srl`',$category_srl1_argument,"equal")))
));
$query->setGroups(array());
$query->setOrder(array());
$query->setLimit();
return $query; ?>
그런 다음 DB별 executeQuery 메서드가 호출되고 위의 파일의 출력 값이 이 메서드의 입력으로 사용됩니다. DB 클래스는 SQL 쿼리를 생성하고 실행합니다. 예를 들어 위의 쿼리는 다음과 같은 SQL 쿼리가 됩니다.
select * from "xe_document_categories" as "document_categories" where ("category_srl" = 15)
cache.php 파일 역시 열(column) 타입에 관한 정보를 포함하고 있습니다. 이 정보는 테이블 스키마 파일에서 추출합니다. XE는 먼저 ./modules/<module_name>/schemas/<table_name> 안에서 해당 스키마 파일을 찾습니다. 찾는 파일이 없으면 <table_name>라는 파일을 찾을 때까지 각 모듈을 검색합니다.