Location: PHPKode > projects > SENAYAN Library Automation > senayan3-stable14/ucs/ucpoll.php
<?php
/**
 * SLiMS Union Catalog polling
 *
 * Copyright (C) 2010  Arie Nugraha (hide@address.com)
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

require 'ucsysconfig.inc.php';
require 'ucserver.inc.php';
require LIB_DIR.'http_request.inc.php';
require INC_DIR.'ucs_nodes_poll.inc.php';

// check total node poll
$total_conn = ucs_nodes_poll::check_poll($dbs);
if ($total_conn >= $sysconf['server']['max_node_all']) {
    die(json_encode(array('status' => 'POLL_MAX', 'message' => 'Sorry for inconvinience, server connection poll is busy right now. Please try again later')));
}

// create http request object
$http_request = new http_request();
$http_request->get_http_request();
// get http content
$referer = trim($http_request->headers('REFERER'));
$body = trim($http_request->body());

// sent HTTP header
header('Content-type: text/json');

// check content
if ($body) {
    // encode to PHP array
    $biblio = json_decode($body, true);
    if (function_exists('json_last_error')) {
        // Define the errors.
        $json_errors = array(
            JSON_ERROR_DEPTH => 'JSON error: The maximum stack depth has been exceeded',
            JSON_ERROR_CTRL_CHAR => 'JSON error: Control character error, possibly incorrectly encoded',
            JSON_ERROR_SYNTAX => 'JSON error: Syntax error',
        );
        // get json error
        $json_error = json_last_error();
        if ($json_error) {
            die(json_encode(array('status' => 'JSON_ERROR', 'message' => $json_errors[$json_error])));
        }
    }

    // node ID
    $node_id = $biblio['node_info']['id'];
    // authentication
    if (isset($sysconf['node'][$node_id])) {
        // check for password
        if ($sysconf['node'][$node_id]['password'] === $biblio['node_info']['password']) {
            // check node poll
            $node_conn = ucs_nodes_poll::check_node_poll($dbs, $node_id);
            if ($node_conn >= $sysconf['server']['max_node_conn']) {
                die(json_encode(array('status' => 'NODE_POLL_MAX', 'message' => 'Your connection to server currently full. Please try again later')));
            }

            // master file reference cache
            $cache_author = array();
            $cache_subject = array();
            $cache_gmd = array();
            $cache_language = array();
            $cache_publisher = array();
            $cache_place = array();
            $cache_frequency = array();

            // set poll
            ucs_nodes_poll::set_node_poll($dbs, $node_id, $referer);

            // insert upload catalog data to database
            $r = 0;
            // prepare query
            $sql = "REPLACE INTO biblio (orig_biblio_id,gmd_id,title,edition,isbn_issn,publisher_id,publish_year,
                collation,series_title,call_number,language_id,publish_place_id,
                classification,notes,frequency_id,spec_detail_info,node_id,post_date,input_date,last_update)
                VALUES (%d,%d,'%s','%s','%s',%d,%d,'%s','%s','%s','%s',%d,'%s','%s',%d,'%s','%s','%s','%s','%s')";
            // execute statement
            foreach ($biblio['node_data'] as $data) {
                // SQL escaping string
                foreach ($data as $field => $val) {
                    if (is_string($val)) {
                        $data[$field] = $dbs->escape_string(trim($val));
                    }
                }

                // get current date
                $curr_date = date('Y-m-d H:i:s');

                // MASTER FILE FOREIGN KEY processing
                // gmd
                @$dbs->query('INSERT IGNORE INTO mst_gmd (gmd_code,gmd_name,input_date,last_update) VALUES (\''.$data['gmd_code'].'\', \''.$data['gmd_name'].'\', \''.$curr_date.'\', \''.$curr_date.'\')');
                $gmd_id = utility::getID($dbs, 'mst_gmd', 'gmd_id', 'gmd_name', $data['gmd_name'], $cache_gmd);

                $publisher_id = utility::getID($dbs, 'mst_publisher', 'publisher_id', 'publisher_name', $data['publisher_name'], $cache_publisher);
                $place_id = utility::getID($dbs, 'mst_place', 'place_id', 'place_name', $data['place_name'], $cache_place);

                @$dbs->query('INSERT IGNORE INTO mst_language (language_id,language_name,input_date,last_update) VALUES (\''.$data['language_id'].'\', \''.$data['language_name'].'\', \''.$curr_date.'\', \''.$curr_date.'\')');
                $language_id = utility::getID($dbs, 'mst_language', 'language_id', 'language_name', $data['language_name'], $cache_language);

                $frequency_id = $data['frequency']?utility::getID($dbs, 'mst_frequency', 'frequency_id', 'frequency', $data['frequency'], $cache_frequency):'NULL';

                // create original node biblio data
                $orig_biblio_id = $data['biblio_id'];
                // format SQL string
                $real_sql = sprintf($sql, $orig_biblio_id,$gmd_id,$data['title'],$data['edition'],$data['isbn_issn'],$publisher_id,$data['publish_year'],
                    $data['collation'],$data['series_title'],$data['call_number'],$language_id,$place_id,
                    $data['classification'],$data['notes'],1,$data['spec_detail_info'],$node_id,
                    $curr_date,$curr_date,$curr_date);
                // execute SQL query
                $dbs->query($real_sql);
                // get inserted biblio data
                $biblio_id = $dbs->insert_id;

                // check for errors
                if ($dbs->error) {
                    echo json_encode(array('status' => 'DB_ERROR', 'message' => 'Database error: '.$dbs->error.'! Maybe because same record(s) already uploaded to server!'));
                    // close poll
                    ucs_nodes_poll::clear_poll($dbs, $node_id);
                    die();
                } else {
                    // set authors
                    if ($data['authors']) {
                        $biblio_author_sql = 'INSERT IGNORE INTO biblio_author (biblio_id, author_id, level) VALUES ';
                        foreach ($data['authors'] as $author) {
                            $author['auth_list'] = $author['auth_list']?"'".$author['auth_list']."'":'NULL';
                            @$dbs->query('INSERT IGNORE INTO mst_author (author_name,authority_type,auth_list,input_date,last_update)
                                VALUES (\''.$author['name'].'\', \''.$author['type'].'\', '.$author['auth_list'].', \''.$curr_date.'\', \''.$curr_date.'\')');
                            $author['name'] = $dbs->escape_string(trim($author['name']));
                            $author_id = utility::getID($dbs, 'mst_author', 'author_id', 'author_name', $author['name'], $cache_author);
                            $biblio_author_sql .= " ($biblio_id, $author_id, ".$author['level']."),";
                        }
                        // remove last comma
                        $biblio_author_sql = substr_replace($biblio_author_sql, '', -1);
                        // execute query
                        $dbs->query($biblio_author_sql);
                        // echo $dbs->error;
                    }
                    // set topic
                    if ($data['subjects']) {
                        $biblio_subject_sql = 'INSERT IGNORE INTO biblio_topic (biblio_id, topic_id, level) VALUES ';
                        foreach ($data['subjects'] as $subject) {
                            $subject['auth_list'] = $subject['auth_list']?"'".$subject['auth_list']."'":'NULL';
                            @$dbs->query('INSERT IGNORE INTO mst_topic (topic,topic_type,auth_list,input_date,last_update)
                                VALUES (\''.$subject['name'].'\', \''.$subject['type'].'\', '.$subject['auth_list'].', \''.$curr_date.'\', \''.$curr_date.'\')');
                            $subject['name'] = $dbs->escape_string(trim($subject['name']));
                            $subject_id = utility::getID($dbs, 'mst_topic', 'topic_id', 'topic', $subject['name'], $cache_subject);
                            $biblio_subject_sql .= " ($biblio_id, $subject_id, ".$subject['level']."),";
                        }
                        // remove last comma
                        $biblio_subject_sql = substr_replace($biblio_subject_sql, '', -1);
                        // execute query
                        $dbs->query($biblio_subject_sql);
                        // echo $dbs->error;
                    }
                }
                $r++;
            }

            // close poll
            ucs_nodes_poll::clear_poll($dbs, $node_id);

            // write log
            utility::writeLogs($dbs, 'nodes', $biblio['node_info']['id'], 'ucs', 'Node '.$node_id.'('.$sysconf['node'][$node_id]['name'].') upload '.$r.' of catalog data');
            die(json_encode(array('status' => 'UPLOADED', 'message' => $r.' catalog record uploaded succesfully to '.$sysconf['server']['name'].'!')));
        } else {
            die(json_encode(array('status' => 'NOT_AUTHORIZED', 'message' => 'You not authorized to upload data to server '.$sysconf['server']['name'].'! Please check your ucnode.inc.php file for correct configuration!')));
        }
    } else {
        die(json_encode(array('status' => 'NOT_AUTHORIZED', 'message' => 'You not authorized to upload data to server '.$sysconf['server']['name'].'! Please check your ucnode.inc.php file for correct configuration!')));
    }
} else {
    die(json_encode(array('status' => 'NO_DATA', 'message' => 'Request is empty! Could be error on HTTP request')));
}
?>
Return current item: SENAYAN Library Automation