summaryrefslogblamecommitdiffstats
path: root/app/class/object.class.php
blob: bcd8dfaff849494276bcc5dd62e4f8885c713fa6 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12











                                         
                                                                   



























                                                                   
                                  



                           


                                  

                                          
                         


















                                                                                                



























































































                                                                                                                                          
















                                                                                                                













                                                                                              







                                                     
                                          





                                       

 














                                                                  
  
<?php

require_once "class/framework.class.php";

/*
 * Base class for Scrott database objects
 */
abstract class Object extends Framework
{
    /*
     * Constructor
     */
    function __construct($childTable = "object", $childCols = null)
    {
        $this->db = $this->getDbConnection();

        $this->table = "object";
        $this->cols = array(
            "guid",
            "perms",
            "owner",
            "parent",
            "name",
            "timeCreated",
            "timeUpdated",
            "type"
        );

        $this->childTable = $this->db->esc($childTable);
        $this->childCols = array();

        if (is_array($childCols))
        {
            foreach ($childCols as $col)
                $this->childCols[] = $this->db->esc($col);
        }
    }

    /*
     * Populate this object with data from the DB with a given GUID
     */
    function loadObj($guid = null)
    {
        if (is_null($guid))
            return;

        if (!$this->isGUID($guid))
            return;

        $escdGuid = $this->db->esc($guid);

        /* Base fields */
        $query = "SELECT * FROM `" . $this->table . "` WHERE `guid` = '" . $escdGuid . "'";
        $result = $this->db->query($query)[0];

        foreach ($this->cols as $col)
        {
            if (isset($result[$col]))
                $this->$col = $result[$col];
        }

        /* Child Table fields */
        $query = "SELECT * FROM `" . $this->childTable . "` WHERE `guid` = '" . $escdGuid . "'";
        $result = $this->db->query($query)[0];

        foreach ($this->childCols as $col)
        {
            if (isset($result[$col]))
                $this->$col = $result[$col];
        }
    }

    /*
     * Write this object to the database
     */
    function saveObj()
    {
        if (isset($this->guid))
        {
            /* Update Base */
            $updateStr = "";

            foreach ($this->cols as $col)
            {
                if (!isset($this->$col))
                    continue;

                $updateStr .= "`" . $col . "` = '" . $this->db->esc($this->$col) . "', ";
            }

            if (strlen($updateStr) > 0)
            {
                $updateStr = substr($updateStr, 0, -2); // remove ", " from the end
                $query = "UPDATE `" . $this->table . "` SET " . $updateStr . " WHERE `guid` = '" . $this->db->esc($this->guid) . "'";
                $this->db->query($query);
            }

            /* Update Child */
            $updateStr = "";

            foreach ($this->childCols as $col)
            {
                if (!isset($this->$col))
                    continue;

                $updateStr .= "`" . $col . "` = '" . $this->db->esc($this->$col) . "', ";
            }

            if (strlen($updateStr) > 0)
            {
                $updateStr = substr($updateStr, 0, -2); // remove ", " from the end
                $query = "UPDATE `" . $this->childTable . "` SET " . $updateStr . " WHERE `guid` = '" . $this->db->esc($this->guid) . "'";
                $this->db->query($query);
            }
        }

        else
        {
            $this->guid = $this->getNewGUID();

            /* Insert Base */
            $colsStr = "";
            $valsStr = "";

            foreach ($this->cols as $col)
            {
                if (!isset($this->$col))
                    continue;

                $colsStr .= "`" . $col . "`, ";
                $valsStr .= "'" . $this->db->esc($this->$col) . "', ";
            }

            if (strlen($colsStr) > 0)
            {
                $colsStr = substr($colsStr, 0, -2); // remove ", "
                $valsStr = substr($valsStr, 0, -2);
                $query = "INSERT INTO `" . $this->table . "` (" . $colsStr . ") VALUES (" . $valsStr . ")";
                $this->db->query($query);
            }

            /* Insert Child */
            $colsStr = "";
            $valsStr = "";

            foreach ($this->childCols as $col)
            {
                if (!isset($this->$col))
                    continue;

                $colsStr .= "`" . $col . "`, ";
                $valsStr .= "'" . $this->db->esc($this->$col) . "', ";
            }

            if (strlen($colsStr) > 0)
            {
                $colsStr = substr($colsStr, 0, -2); // remove ", "
                $valsStr = substr($valsStr, 0, -2);
                $query = "INSERT INTO `" . $this->childTable . "` (" . $colsStr . ") VALUES (" . $valsStr . ")";
                $this->db->query($query);
            }
        }
    }

    /*
     * Remove this object from the database
     */
    function delObj()
    {
        if (!isset($this->guid))
            return;

        /* Delete Base */
        $query = "DELETE FROM `" . $this->table . "` WHERE `guid` = '" . $this->db->esc($this->guid) . "'";
        $this->db->query($query);

        /* Delete Child */
        $query = "DELETE FROM `" . $this->childTable . "` WHERE `guid` = '" . $this->db->esc($this->guid) . "'";
        $this->db->query($query);
    }

    /*
     * Check whether given GUID exists
     */
    function isGUID($guid)
    {
        $query = "SELECT `guid` FROM `object` WHERE `guid` = '" . $this->db->esc($guid) . "'";
        $result = $this->db->query($query);

        if (count($result) > 0)
            return true;

        return false;
    }

    /*
     * Get a new, unique GUID for a new system object
     */
    function getNewGUID()
    {
        do
        {
            $sha = hash("sha256", rand());
            $guid = substr($sha, 0, 8);
        }
        while ($this->isGUID($guid));

        return $guid;
    }
}

/*
 * Concrete Database Object which can be used in a polymorphic way
 */
class DBObject extends Object
{
    /*
     * Constructor
     */
    function __construct($guid = null)
    {
        parent::__construct();
        $this->loadObj($guid);
    }
}

?>