copy trunk, copy tags

git-svn-id: http://xe-core.googlecode.com/svn/trunk@7282 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
haneul 2010-02-05 09:55:26 +00:00
commit 4e35876019
19 changed files with 227 additions and 64 deletions

View file

@ -317,22 +317,30 @@
/**
* @brief 결과를 fetch
**/
function _fetch($result, $output) {
function _fetch($result, $output = null) {
if(!$this->isConnected() || $this->isError() || !$result) return;
while($tmp = ibase_fetch_object($result)) {
foreach($tmp as $key => $val) {
$type = $output->column_type[$key];
// type 값이 null 일때는 $key값이 alias인 경우라 실제 column 이름을 찾아 type을 구함
if($type == null) {
foreach($output->columns as $cols) {
if($cols['alias'] == $key) {
$type = $output->column_type[$cols['name']];
// table.column 형식인지 정규식으로 검사 함
preg_match("/\w+[.](\w+)/", $cols['name'], $matches);
if($matches) {
$type = $output->column_type[$matches[1]];
}
else {
$type = $output->column_type[$cols['name']];
}
}
}
}
if($type == "text" || $type == "bigtext") {
if(($type == "text" || $type == "bigtext") && $tmp->{$key}) {
$blob_data = ibase_blob_info($tmp->{$key});
$blob_hndl = ibase_blob_open($tmp->{$key});
$tmp->{$key} = ibase_blob_get($blob_hndl, $blob_data[0]);
@ -387,7 +395,7 @@
$query = sprintf("ALTER TABLE \"%s%s\" ADD \"%s\" ", $this->prefix, $table_name, $column_name);
if($size) $query .= sprintf(" %s(%s) ", $type, $size);
else $query .= sprintf(" %s ", $type);
if($default) $query .= sprintf(" DEFAULT '%s' ", $default);
if(!is_null($default)) $query .= sprintf(" DEFAULT '%s' ", $default);
if($notnull) $query .= " NOT NULL ";
$this->_query($query);
@ -434,9 +442,13 @@
* $is_unique? unique : none
**/
function addIndex($table_name, $index_name, $target_columns, $is_unique = false) {
// index name 크기가 31byte로 제한으로 index name을 넣지 않음
// Firebird에서는 index name을 넣지 않으면 "RDB$10"처럼 자동으로 이름을 부여함
// table을 삭제 할 경우 인덱스도 자동으로 삭제 됨
if(!is_array($target_columns)) $target_columns = array($target_columns);
$query = sprintf('CREATE %s INDEX "%s" ON "%s%s" ("%s");', $is_unique?'UNIQUE':'', $index_name, $this->prefix, $table_name, implode('", "',$target_columns));
$query = sprintf('CREATE %s INDEX "" ON "%s%s" ("%s");', $is_unique?'UNIQUE':'', $this->prefix, $table_name, implode('", "',$target_columns));
$this->_query($query);
if(!$this->transaction_started) @ibase_commit($this->fd);
@ -547,7 +559,7 @@
$name,
$this->column_type[$type],
$size?'('.$size.')':'',
$default?"DEFAULT '".$default."'":"",
is_null($default)?"":"DEFAULT '".$default."'",
$notnull?'NOT NULL':'');
if($auto_increment) $auto_increment_list[] = $name;
@ -575,15 +587,12 @@
if(count($index_list)) {
foreach($index_list as $key => $val) {
// index_name = prefix + 'idx_' + no
// index name 크기가 31byte로 제한되어 있어 일련번호로 대체
$this->idx_no++;
$index_name = $this->prefix;
$index_name .= "idx_";
$index_name .= sprintf("%04d", $this->idx_no);
// index name 크기가 31byte로 제한으로 index name을 넣지 않음
// Firebird에서는 index name을 넣지 않으면 "RDB$10"처럼 자동으로 이름을 부여함
// table을 삭제 할 경우 인덱스도 자동으로 삭제 됨
$schema = sprintf("CREATE INDEX \"%s\" ON \"%s\" (\"%s\");",
$index_name, $table_name, implode($val, "\",\""));
$schema = sprintf("CREATE INDEX \"\" ON \"%s\" (\"%s\");",
$table_name, implode($val, "\",\""));
$output = $this->_query($schema);
if(!$this->transaction_started) @ibase_commit($this->fd);
if(!$output) return false;
@ -726,9 +735,11 @@
ibase_blob_add($blh, $value);
$value = ibase_blob_close($blh);
}
else if($output->column_type[$name]=='number') {
else if($output->column_type[$name]=='number' ||
$output->column_type[$name]=='bignumber' ||
$output->column_type[$name]=='float') {
// 연산식이 들어갔을 경우 컬럼명이 있는 지 체크해 더블쿼터를 넣어줌
preg_match("/(?i)[a-z][a-z0-9_-]+/", $value, $matches);
preg_match("/(?i)[a-z][a-z0-9_]+/", $value, $matches);
foreach($matches as $key => $val) {
$value = str_replace($val, "\"".$val."\"", $value);
@ -980,15 +991,23 @@
foreach($tmp as $key => $val){
$type = $output->column_type[$key];
// type 값이 null 일때는 $key값이 alias인 경우라 실제 column 이름을 찾아 type을 구함
if($type == null) {
foreach($output->columns as $cols) {
if($cols['alias'] == $key) {
$type = $output->column_type[$cols['name']];
// table.column 형식인지 정규식으로 검사 함
preg_match("/\w+[.](\w+)/", $cols['name'], $matches);
if($matches) {
$type = $output->column_type[$matches[1]];
}
else {
$type = $output->column_type[$cols['name']];
}
}
}
}
if($type == "text" || $type == "bigtext") {
if(($type == "text" || $type == "bigtext") && $tmp->{$key}) {
$blob_data = ibase_blob_info($tmp->{$key});
$blob_hndl = ibase_blob_open($tmp->{$key});
$tmp->{$key} = ibase_blob_get($blob_hndl, $blob_data[0]);

View file

@ -23,7 +23,7 @@ var Validator = xe.createApp('Validator', {
this.cast('ADD_RULE', ['email_address', regEmail]);
// userid
var regUserid = /^[a-z]+[\w-]*[a-z0-9]+$/i;
var regUserid = /^[a-z]+[\w-]*[a-z0-9_]+$/i;
this.cast('ADD_RULE', ['userid', regUserid]);
this.cast('ADD_RULE', ['user_id', regUserid]);

View file

@ -13,7 +13,7 @@
* @brief XE의 전체 버전 표기
* 파일의 수정이 없더라도 공식 릴리즈시에 수정되어 함께 배포되어야
**/
define('__ZBXE_VERSION__', '1.4.0.3');
define('__ZBXE_VERSION__', '1.4.0.4');
/**
* @brief zbXE가 설치된 장소의 base path를 구함

View file

@ -135,13 +135,17 @@
if($ftp_info->sftp && $ftp_info->sftp == 'Y')
{
$oModuleInstaller = new SFTPModuleInstaller($package);
$oModuleInstaller->setPassword($ftp_password);
}
else if(function_exists(ftp_connect))
{
$oModuleInstaller = new PHPFTPModuleInstaller($package);
}
else
{
$oModuleInstaller = new FTPModuleInstaller($package);
$oModuleInstaller->setPassword($ftp_password);
}
$oModuleInstaller->setPassword($ftp_password);
$output = $oModuleInstaller->install();
if(!$output->toBool()) return $output;
}

View file

@ -150,6 +150,87 @@
}
}
class PHPFTPModuleInstaller extends ModuleInstaller {
function PHPFTPModuleInstaller(&$package)
{
$this->package =& $package;
}
function _copyDir(&$file_list) {
if(!$this->ftp_password) return new Object(-1,'msg_ftp_password_input');
$ftp_info = Context::getFTPInfo();
if($ftp_info->ftp_host)
{
$ftp_host = $ftp_info->ftp_host;
}
else
{
$ftp_host = "127.0.0.1";
}
$connection = ftp_connect($ftp_host, $ftp_info->ftp_port);
if(!$connection) return new Object(-1, 'msg_ftp_not_connected');
$login_result = ftp_login($connection, $ftp_info->ftp_user, $this->ftp_password);
if(!$login_result)
{
return new Object(-1,'msg_ftp_invalid_auth_info');
}
$_SESSION['ftp_password'] = $this->ftp_password;
$target_dir = $ftp_info->ftp_root_path.$this->target_path;
foreach($file_list as $k => $file){
$org_file = $file;
if($this->package->path == ".")
{
$file = substr($file,3);
}
$path = FileHandler::getRealPath("./".$this->target_path."/".$file);
$path_list = explode('/', dirname($this->target_path."/".$file));
$real_path = "./";
$ftp_path = $ftp_info->ftp_root_path;
for($i=0;$i<count($path_list);$i++)
{
if($path_list=="") continue;
$real_path .= $path_list[$i]."/";
$ftp_path .= $path_list[$i]."/";
if(!file_exists(FileHandler::getRealPath($real_path)))
{
if(!ftp_mkdir($connection, $ftp_path))
{
return new Object(-1, "msg_make_directory_failed");
}
if (function_exists('ftp_chmod')) {
if(!ftp_chmod($connection, 0755, $ftp_path))
{
return new Object(-1, "msg_permission_adjust_failed");
}
}
else
{
if(!ftp_site("CHMOD 755 ".$ftp_path))
{
return new Object(-1, "msg_permission_adjust_failed");
}
}
}
}
if(!ftp_put($connection, $target_dir .'/'. $file, FileHandler::getRealPath($this->download_path."/".$org_file), FTP_BINARY))
{
return new Object(-1, "msg_ftp_upload_failed");
}
}
ftp_close($connection);
return new Object();
}
}
class FTPModuleInstaller extends ModuleInstaller {
function FTPModuleInstaller(&$package)
{
@ -203,7 +284,7 @@
if(!file_exists(FileHandler::getRealPath($real_path)))
{
$oFtp->ftp_mkdir($ftp_path);
$oFtp->ftp_site("CHMOD 755 ".$path);
$oFtp->ftp_site("CHMOD 755 ".$ftp_path);
}
}
$oFtp->ftp_put($target_dir .'/'. $file, FileHandler::getRealPath($this->download_path."/".$org_file));

View file

@ -2,11 +2,11 @@
/**
* @file zh-TW.lang.php
* @author sol (sol@ngleader.com) 翻譯royallin
* @brief 自動安裝(autoinstall)模組正體中文語言
* @brief 自動安裝(autoinstall)模組正體中文語言
**/
$lang->autoinstall = '自動安裝';
$lang->about_autoinstall = '可幫助您安裝/更新XE程式及面板。';
$lang->about_autoinstall = '可幫助您安裝及更新 XE 程式和面板。';
$lang->package_update = '最近更新';
$lang->package_downloaded_count = '下載次數';
$lang->need_update = "需要更新。";
@ -16,7 +16,7 @@
$lang->order_download = "下載";
$lang->success_installed = "安裝成功";
$lang->view_all_package = "全部檢視";
$lang->description_ftp_note = "請先將FTP設定好否則無法執行自動安裝功能。";
$lang->description_ftp_note = "請先將 FTP 設定好,否則無法執行自動安裝功能。";
$lang->description_update = "如果您最近不是用自動安裝模組更新或安裝,請點擊更新按鈕更新。";
$lang->install = "安裝";
$lang->update = "更新";
@ -24,10 +24,10 @@
$lang->depending_programs = "此程式需要安裝";
$lang->require_update = "需要更新";
$lang->require_installation = "需要安裝";
$lang->description_install = "One Click Installer will also install/update all other programs which this program is depending on";
$lang->description_download = "如果FTP無法使用的話必須要手動下載並解壓縮到目標路徑。(假設目標路徑為 ./modules/board的話將檔案解壓縮到 ./modules就可以了)";
$lang->description_install = "自動安裝也能夠同時安裝與更新其他相關程式";
$lang->description_download = "如果 FTP 無法使用的話,必須要手動下載並解壓縮到目標路徑。(假設目標路徑為 ./modules/board的話將檔案解壓縮到 ./modules就可以了)";
$lang->path = "路徑";
$lang->cmd_download = "下載";
$lang->view_installed_packages = "已安裝套裝軟體";
$lang->msg_ftp_password_input = "Please input FTP password.";
$lang->msg_ftp_password_input = "請輸入 FTP 密碼";
?>

View file

@ -19,7 +19,7 @@
<column name="user_name" var="user_name" default="" />
<column name="email_address" var="email_address" filter="email" maxlength="250" />
<column name="homepage" var="homepage" filter="homepage" maxlength="250" />
<column name="tags" var="tags" />
<column name="tags" var="tags" default="" />
<column name="extra_vars" var="extra_vars" />
<column name="last_update" var="last_update" default="curdate()" />
<column name="ipaddress" var="ipaddress" default="ipaddress()" />

View file

@ -7,8 +7,8 @@
<column name="var_type" var="var_type" notnull="notnull" />
<column name="var_is_required" var="var_is_required" default="N" notnull="notnull" />
<column name="var_search" var="var_search" default="N" notnull="notnull" />
<column name="var_default" var="var_default" notnull="notnull" />
<column name="var_desc" var="var_desc" notnull="notnull" />
<column name="var_default" var="var_default" default="" />
<column name="var_desc" var="var_desc" default="" />
<column name="eid" var="eid" notnull="notnull" />
</columns>
<conditions>

View file

@ -5442,7 +5442,7 @@ var
regex_font_weight = /font-weight\s*:\s*([a-z]+);?/i,
regex_font_style = /font-style\s*:\s*italic;?/i,
regex_font_decoration = /text-decoration\s*:\s*([a-z -]+);?/i,
regex_$ = /$\d+\s*=(\s*"\d+"|\d+)/ig,
regex_jquery = /jQuery\d+\s*=(\s*"\d+"|\d+)/ig,
regex_quote_attr = /([\w-]+\s*=(?:\s*"[^"]+"|\s*'[^']+'))|([\w-]+)=([^\s]+)/g; //"
var
@ -5505,7 +5505,7 @@ xe.XE_XHTMLFormatter = $.Class({
if ($.browser.msie) {
// remove $ attributes
sContent = sContent.replace(regex_$, '');
sContent = sContent.replace(regex_jquery, '');
// quote all attrs
sContent = sContent.replace(/<(\w+) ([^>]+)>/g, function(m0,m1,m2){

View file

@ -46,6 +46,9 @@ function _editorAutoSave(exe) {
var fo_obj = editorAutoSaveObj.fo_obj;
var editor_sequence = editorAutoSaveObj.editor_sequence;
// 50초마다 동기화를 시킴 강제 실행은 제외
if(!exe) setTimeout('_editorAutoSave()', 50000);
// 현재 자동저장중이면 중지
if(editorAutoSaveObj.locked == true) return;
@ -54,7 +57,11 @@ function _editorAutoSave(exe) {
// 자동저장을 위한 준비
var title = fo_obj.title.value;
var content = editorGetContent(editor_sequence);
var content = '';
try{
content = editorGetContent(editor_sequence);
}catch(e){
}
// 내용이 이전에 저장하였던 것과 다르면 자동 저장을 함 또는 강제 저장 설정시 자동 저장
if(title != editorAutoSaveObj.title || content != editorAutoSaveObj.content || exe) {
@ -82,9 +89,6 @@ function _editorAutoSave(exe) {
exec_xml("editor","procEditorSaveDoc", params, function() { editorAutoSaveObj.locked = false; } );
show_waiting_message = true;
}
// 50초마다 동기화를 시킴 강제 실행은 제외
if(!exe) setTimeout('_editorAutoSave()', 50000);
}
// 자동저장된 모든 메세지를 삭제하는 루틴

View file

@ -15,7 +15,7 @@
<description xml:lang="jp">XMLファイルを用いて会員情報または掲示板などの情報を入力します。</description>
<description xml:lang="es">Ingresa la información del usuario o los datos del tablero utilizando el archivo XML.</description>
<description xml:lang="ru">Запись информации пользователей или форума, используя XML-файл.</description>
<description xml:lang="zh-TW">利用XML檔案匯入會員或討論板資料。</description>
<description xml:lang="zh-TW">利用 XML 檔案匯入會員或討論板資料。</description>
<version>0.2</version>
<date>2007-12-13</date>
<category>migration</category>

View file

@ -14,7 +14,7 @@
$lang->importer = '匯入';
$lang->source_type = '匯入目標';
$lang->type_member = '會員資料';
$lang->type_message = '短訊息(MemoBox)';
$lang->type_message = '短訊息';
$lang->type_ttxml = 'TTXML';
$lang->type_module = '討論板資料';
$lang->type_syncmember = '同步會員資料';
@ -31,31 +31,31 @@
);
$lang->import_step_desc = array(
1 => '請選擇要匯入的XML檔案類型。',
1 => '請選擇要匯入的 XML 檔案類型。',
12 => '請選擇要匯入的目標模組。',
121 => '文章:',
122 => '討論板:',
13 => '請選擇要匯入的目標分類。',
2 => "請輸入要匯入的XML檔案位置。\n可輸入相對或絕對路徑。",
2 => "請輸入要匯入的 XML 檔案位置。\n可輸入相對或絕對路徑。",
3 => '資料匯入後可能會導致會員資料和文章內容產生誤差。請以『user_id』進行同步即可解決。',
99 => '資料匯入中...',
);
// 訊息/提示
$lang->msg_sync_member = '按同步按鈕,即可開始進行會員資料和文章的同步。';
$lang->msg_no_xml_file = '找不到XML檔案請重新確認路徑。';
$lang->msg_no_xml_file = '找不到 XML 檔案,請重新確認路徑。';
$lang->msg_invalid_xml_file = 'XML檔案格式錯誤';
$lang->msg_importing = '%d個的資料中正在輸入 %d個。(長時間沒有回應時,請按「繼續進行」按鈕)';
$lang->msg_import_finished = '已完成輸入%d/%d個資料。根據情況的不同可能會出現沒有被匯入的資料。';
$lang->msg_importing = '%d個的資料中正在輸入 %d 個。(長時間沒有回應時,請按「繼續進行」按鈕)';
$lang->msg_import_finished = '已完成輸入 %d/%d 個資料。根據情況的不同,可能會出現沒有被匯入的資料。';
$lang->msg_sync_completed = '已完成會員和文章,評論的同步。';
// 其他
$lang->about_type_member = '資料匯入目標為會員資料時,請選擇此項。';
$lang->about_type_message = '資料匯入目標為短訊息(MemoBox)時,請選擇此項。';
$lang->about_type_ttxml = '資料匯入目標為TTXML(textcube系列)時,請選擇此項。';
$lang->about_ttxml_user_id = '請輸入匯入TTXML資料時指定為主題發表者的ID(必須是已註冊會員)。';
$lang->about_type_message = '資料匯入目標為短訊息時,請選擇此項。';
$lang->about_type_ttxml = '資料匯入目標為 TTXML (textcube系列)時,請選擇此項。';
$lang->about_ttxml_user_id = '請輸入匯入 TTXML 資料時,指定為主題發表者的 ID (必須是已註冊會員)。';
$lang->about_type_module = '資料匯入目標為討論板主題時,請選擇此項。';
$lang->about_type_syncmember = '匯入會員和文章資料後,需要同步會員資料時,請選擇此項。';
$lang->about_importer = "不僅可以匯入Zeroboard 4Zb5beta的資料也能夠把其他程式資料匯入到XE當中。\n匯入資料時,請利用<a href=\"http://svn.zeroboard.com/zeroboard_xe/migration_tools/\" onclick=\"winopen(this.href);return false;\">XML Exporter</a>建立XML檔案後再上傳。";
$lang->about_target_path = "為了下載附檔請輸入Zeroboard 4的安裝位置。\n位置在同一個主機時,請輸入如『/home/id/public_html/bbs』的路徑在不同主機時請輸入如『http://域名/bbs』的URL網址。";
$lang->about_importer = "不僅可以匯入 Zeroboard 4Zb5beta 的資料,也能夠把其他程式資料匯入到 XE 當中。\n匯入資料時,請利用 <a href=\"http://svn.zeroboard.com/zeroboard_xe/migration_tools/\" onclick=\"winopen(this.href);return false;\">XML Exporter</a> 建立 XML 檔案後再上傳。";
$lang->about_target_path = "為了下載附檔請輸入 Zeroboard 4 的安裝位置。\n位置在同一個主機時,請輸入如『/home/id/public_html/bbs』的路徑在不同主機時請輸入如『http://域名/bbs』的 URL 網址。";
?>

View file

@ -469,7 +469,7 @@ DAMAGES.
EndOfLicense;
$lang->install_condition_title = "確認安裝時必須要具備的條件";
$lang->install_condition_title = '確認安裝時必須要具備的條件';
$lang->install_checklist_title = array(
'php_version' => 'PHP版本',

View file

@ -149,7 +149,8 @@ class Auth_OpenID_XEStore extends Auth_OpenID_OpenIDStore {
function getAssociation($server_url, $handle = null)
{
$assoc = $this->_get_assoc($server_url, $handle);
return $assoc;
$assoc_o = new Auth_OpenID_Association($assoc->handle, $assoc->secret, $assoc->issued, $assoc->lifetime, $assoc->assoc_type);
return $assoc_o;
}

View file

@ -9,8 +9,8 @@
<column name="email_host" var="email_host" notnull="notnull" />
<column name="user_name" var="user_name" notnull="notnull" minlength="2" maxlength="40" />
<column name="nick_name" var="nick_name" notnull="notnull" minlength="2" maxlength="40" />
<column name="homepage" var="homepage" />
<column name="blog" var="blog" />
<column name="homepage" var="homepage" default="" />
<column name="blog" var="blog" default="" />
<column name="birthday" var="birthday" />
<column name="allow_mailing" var="allow_mailing" default="Y" />
<column name="allow_message" var="allow_message" />

View file

@ -7,9 +7,9 @@
<column name="url" var="url" />
<column name="open_window" var="open_window" />
<column name="expand" var="expand" />
<column name="normal_btn" var="normal_btn" />
<column name="hover_btn" var="hover_btn" />
<column name="active_btn" var="active_btn" />
<column name="normal_btn" var="normal_btn" default="" />
<column name="hover_btn" var="hover_btn" default="" />
<column name="active_btn" var="active_btn" default="" />
<column name="group_srls" var="group_srls" />
</columns>
<conditions>

View file

@ -290,17 +290,45 @@
if(!$output->toBool()) return $output;
}
if($oDB->isIndexExists('sites','idx_domain')){
$oDB->dropIndex('sites','idx_domain');
}
if(!$oDB->isIndexExists('sites','unique_domain')){
$oDB->addIndex('sites','unique_domain',array('domain'),true);
}
if($oDB->isIndexExists('sites','idx_domain')){
$oDB->dropIndex('sites','idx_domain');
}
if(!$oDB->isIndexExists('sites','unique_domain')){
$this->updateForUniqueSiteDomain();
$oDB->addIndex('sites','unique_domain',array('domain'),true);
}
return new Object(0, 'success_updated');
}
function updateForUniqueSiteDomain()
{
$output = executeQueryArray("module.getNonuniqueDomains");
if(!$output->data) return;
foreach($output->data as $data)
{
if($data->count == 1) continue;
$domain = $data->domain;
$args = null;
$args->domain = $domain;
$output2 = executeQueryArray("module.getSiteByDomain", $args);
$bFirst = true;
foreach($output2->data as $site)
{
if($bFirst)
{
$bFirst = false;
continue;
}
$domain .= "_";
$args = null;
$args->domain = $domain;
$args->site_srl = $site->site_srl;
$output3 = executeQuery("module.updateSite", $args);
}
}
}
/**
* @brief 캐시 파일 재생성
**/

View file

@ -0,0 +1,12 @@
<query id="getNonuniqueDomains" action="select">
<tables>
<table name="sites" />
</tables>
<columns>
<column name="domain" />
<column name="count(*)" alias="count" />
</columns>
<groups>
<group column="domain" />
</groups>
</query>

View file

@ -0,0 +1,14 @@
<query id="getSiteInfoByDomain" action="select">
<tables>
<table name="sites" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="sites.domain" var="domain" notnull="notnull" />
</conditions>
<navigation>
<index var="sort_index" default="site_srl" order="desc" />
</navigation>
</query>