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>라는 파일을 찾을 때까지 각 모듈을 검색합니다.