public function importPass()
 {
     $query = $this->getRemoteObjectsQuery();
     $items = $this->task->query($query);
     $itemsCount = $items->numRecords();
     $this->task->message(" * Found {$itemsCount} items to import");
     $total = 0;
     $updated = 0;
     $inserted = 0;
     foreach ($items as $item) {
         $this->task->progress(++$total, $itemsCount);
         // Build select query for existing object
         $values = array();
         $select = new SQLQuery("ID", "\"{$this->tableName}\"");
         foreach ($this->fields as $field => $class) {
             $value = intval($item[$field]);
             $values[] = $value;
             $select->addWhere(sprintf("\"{$field}\" = %d", $value));
         }
         $values[] = $item['ID'];
         // Check for existing record
         if ($localID = DB::query($select->sql())->value()) {
             // Update local many_many record instead of making new row
             DB::query(sprintf('UPDATE "%s" SET "LegacyID" = %d WHERE "ID" = %d', $this->tableName, $item['ID'], $localID));
             $updated++;
         } else {
             // Insert mapping into the many_many table
             $insert = "INSERT INTO \"{$this->tableName}\" (";
             $insert .= '"' . implode('", "', array_keys($this->fields)) . '"';
             $insert .= ', LegacyID';
             $insert .= ') VALUES (';
             $insert .= implode(', ', $values);
             $insert .= ')';
             DB::query($insert);
             $localID = DB::getGeneratedID($this->tableName);
             $inserted++;
         }
         // Mark this relation as imported in the remote table
         $conn = $this->task->getRemoteConnection();
         $conn->query(sprintf('UPDATE "%s" SET "_ImportedID" = %d, "_ImportedDate" = NOW() WHERE "ID" = %d', $this->tableName, $localID, $item['ID']));
     }
     // Done!
     $this->task->message(" * Result: {$inserted} added, {$updated} updated");
 }
 private function checkBlogEntryPermissions()
 {
     $authorsId = array();
     $sqlQuery = new SQLQuery();
     $sqlQuery->setFrom('SiteTree_versions');
     $sqlQuery->selectField('AuthorID');
     $sqlQuery->addWhere('RecordID = ' . $this->ID);
     $sqlQuery->setOrderBy('ID DESC');
     $rawSQL = $sqlQuery->sql();
     $result = $sqlQuery->execute();
     foreach ($result as $row) {
         $authorsId[] = $row['AuthorID'];
     }
     $sqlQuery->setDelete(true);
     if (in_array(Member::currentUser()->ID, $authorsId) || $this->parent->OwnerID == Member::currentUser()->ID || Permission::check('ADMIN')) {
         return true;
     } else {
         return false;
     }
 }
 public function testSelect()
 {
     $query = new SQLQuery('"Title"', '"MyTable"');
     $query->addSelect('"TestField"');
     $this->assertEquals('SELECT "Title", "TestField" FROM "MyTable"', $query->sql());
     // Test replacement of select
     $query->setSelect(array('Field' => '"Field"', 'AnotherAlias' => '"AnotherField"'));
     $this->assertEquals('SELECT "Field", "AnotherField" AS "AnotherAlias" FROM "MyTable"', $query->sql());
     // Check that ' as ' selects don't get mistaken as aliases
     $query->addSelect(array('Relevance' => "MATCH (Title, MenuTitle) AGAINST ('Two as One')"));
     $this->assertEquals('SELECT "Field", "AnotherField" AS "AnotherAlias", MATCH (Title, MenuTitle) AGAINST (' . '\'Two as One\') AS "Relevance" FROM "MyTable"', $query->sql());
 }
 public function testJoinSubSelect()
 {
     $query = new SQLQuery();
     $query->setFrom('MyTable');
     $query->addInnerJoin('(SELECT * FROM MyOtherTable)', 'Mot.MyTableID = MyTable.ID', 'Mot');
     $query->addLeftJoin('(SELECT MyLastTable.MyOtherTableID, COUNT(1) as MyLastTableCount FROM MyLastTable ' . 'GROUP BY MyOtherTableID)', 'Mlt.MyOtherTableID = Mot.ID', 'Mlt');
     $query->setOrderBy('COALESCE(Mlt.MyLastTableCount, 0) DESC');
     $this->assertSQLEquals('SELECT *, COALESCE(Mlt.MyLastTableCount, 0) AS "_SortColumn0" FROM MyTable ' . 'INNER JOIN (SELECT * FROM MyOtherTable) AS "Mot" ON Mot.MyTableID = MyTable.ID ' . 'LEFT JOIN (SELECT MyLastTable.MyOtherTableID, COUNT(1) as MyLastTableCount FROM MyLastTable ' . 'GROUP BY MyOtherTableID) AS "Mlt" ON Mlt.MyOtherTableID = Mot.ID ' . 'ORDER BY "_SortColumn0" DESC', $query->sql($parameters));
 }
예제 #5
0
 public function testWhereAny()
 {
     $query = new SQLQuery();
     $query->setFrom('MyTable');
     $query->whereAny(array("Monkey = 'Chimp'", "Color = 'Brown'"));
     $this->assertEquals("SELECT * FROM MyTable WHERE (Monkey = 'Chimp' OR Color = 'Brown')", $query->sql());
 }
예제 #6
0
 function augmentSQL(SQLQuery &$query)
 {
     if (!$this->stat('enabled')) {
         return false;
     }
     if (($lang = self::current_lang()) && !self::is_default_lang() || self::$bypass) {
         foreach ($query->from as $table => $dummy) {
             if (!isset($baseTable)) {
                 $baseTable = $table;
             }
             if (self::table_exists("{$table}_lang")) {
                 $query->renameTable($table, $table . '_lang');
                 if (stripos($query->sql(), '.ID')) {
                     // Every reference to ID is now OriginalLangID
                     $query->replaceText(".ID", ".OriginalLangID");
                     $query->where = str_replace("`ID`", "`OriginalLangID`", $query->where);
                     $query->select[] = "`{$baseTable}_lang`.OriginalLangID AS ID";
                 }
                 if ($query->where) {
                     foreach ($query->where as $i => $wherecl) {
                         if (substr($wherecl, 0, 4) == 'ID =') {
                             // Another reference to ID to be changed
                             $query->where[$i] = str_replace('ID =', 'OriginalLangID =', $wherecl);
                         } else {
                             $parts = explode(' AND ', $wherecl);
                             foreach ($parts as $j => $part) {
                                 // Divide this clause between the left ($innerparts[1]) and right($innerparts[2]) part of the condition
                                 ereg('(`?[[:alnum:]_-]*`?\\.?`?[[:alnum:]_-]*`?)(.*)', $part, $innerparts);
                                 if (strpos($innerparts[1], '.') === false) {
                                     //it may be ambiguous, so sometimes we will need to add the table
                                     $parts[$j] = ($this->isInAugmentedTable($innerparts[1], $table) ? "`{$table}_lang`." : "") . "{$part}";
                                 } else {
                                     /* if the table has been specified we have to determine if the original (without _lang) name has to be used
                                      * because we don't have the queried field in the augmented table (which usually means
                                      * that is not a translatable field)
                                      */
                                     $clauseparts = explode('.', $innerparts[1]);
                                     $originalTable = str_replace('`', '', str_replace('_lang', '', $clauseparts[0]));
                                     $parts[$j] = ($this->isInAugmentedTable($clauseparts[1], $originalTable) ? "`{$originalTable}_lang`" : "`{$originalTable}`") . ".{$clauseparts[1]}{$innerparts[2]}";
                                 }
                             }
                             $query->where[$i] = implode(' AND ', $parts);
                         }
                     }
                 }
                 if ($table != $baseTable) {
                     $query->from["{$table}_lang"] = $query->from[$table];
                 } else {
                     // _lang is now the base table (the first one)
                     $query->from = array("{$table}_lang" => $query->from[$table]) + $query->from;
                 }
                 // unless we are bypassing this query, add the language filter
                 if (!self::$bypass) {
                     $query->where[] = "`{$table}_lang`.Lang = '{$lang}'";
                 }
                 // unless this is a deletion, the query is applied to the joined table
                 if (!$query->delete) {
                     $query->from[$table] = "INNER JOIN `{$table}`" . " ON `{$table}_lang`.OriginalLangID = `{$table}`.ID";
                     /* if we are selecting fields (not doing counts for example) we need to select everything from
                      * the original table (was renamed to _lang) since some fields that we require may be there
                      */
                     if ($query->select[0][0] == '`') {
                         $query->select = array_merge(array("`{$table}`.*"), $query->select);
                     }
                 } else {
                     unset($query->from[$table]);
                 }
             } else {
                 $query->from[$table] = str_replace("`{$table}`.OriginalLangID", "`{$table}`.ID", $query->from[$table]);
             }
         }
     }
 }
예제 #7
0
	function testSelectWithOrderbyClause() {
		// numeric limit
		$query = new SQLQuery();
		$query->from[] = "MyTable";
		$query->orderby('MyName ASC');
		// can't escape as we don't know if ASC or DESC is appended
		$this->assertEquals("SELECT * FROM MyTable ORDER BY MyName ASC", $query->sql());
		
		// array limit
		$query = new SQLQuery();
		$query->from[] = "MyTable";
		$query->orderby(array('sort'=>'MyName'));
		$this->assertEquals("SELECT * FROM MyTable ORDER BY `MyName`", $query->sql());

		// array limit with start (MySQL specific)
		$query = new SQLQuery();
		$query->from[] = "MyTable";
		$query->orderby(array('sort'=>'MyName','dir'=>'desc'));
		$this->assertEquals("SELECT * FROM MyTable ORDER BY `MyName` DESC", $query->sql());
	}
예제 #8
0
 public function testInnerJoin()
 {
     $query = new SQLQuery();
     $query->from('MyTable');
     $query->innerJoin('MyOtherTable', 'MyOtherTable.ID = 2');
     $query->leftJoin('MyLastTable', 'MyOtherTable.ID = MyLastTable.ID');
     $this->assertEquals('SELECT * FROM MyTable ' . 'INNER JOIN "MyOtherTable" AS "MyOtherTable" ON MyOtherTable.ID = 2 ' . 'LEFT JOIN "MyLastTable" AS "MyLastTable" ON MyOtherTable.ID = MyLastTable.ID', $query->sql());
     $query = new SQLQuery();
     $query->from('MyTable');
     $query->innerJoin('MyOtherTable', 'MyOtherTable.ID = 2', 'table1');
     $query->leftJoin('MyLastTable', 'MyOtherTable.ID = MyLastTable.ID', 'table2');
     $this->assertEquals('SELECT * FROM MyTable ' . 'INNER JOIN "MyOtherTable" AS "table1" ON MyOtherTable.ID = 2 ' . 'LEFT JOIN "MyLastTable" AS "table2" ON MyOtherTable.ID = MyLastTable.ID', $query->sql());
 }
 /**
  * Run a remote query against the remote DB
  *
  * @param SQLQuery $query
  * @return SS_Query
  */
 public function query(SQLQuery $query)
 {
     return $this->getRemoteConnection()->query($query->sql());
 }
예제 #10
0
    /**
     * Test deprecation of SQLQuery::setDelete/getDelete
     */
    public function testDeprecatedSetDelete()
    {
        // Temporarily disable deprecation
        Deprecation::notification_version(null);
        $query = new SQLQuery();
        $query->setSelect(array('"SQLQueryTest_DO"."Name"'));
        $query->setFrom('"SQLQueryTest_DO"');
        $query->setWhere(array('"SQLQueryTest_DO"."Name"' => 'Andrew'));
        // Check SQL for select
        $this->assertSQLEquals(<<<EOS
SELECT "SQLQueryTest_DO"."Name" FROM "SQLQueryTest_DO"
WHERE ("SQLQueryTest_DO"."Name" = ?)
EOS
, $query->sql($parameters));
        $this->assertEquals(array('Andrew'), $parameters);
        // Check setDelete works
        $query->setDelete(true);
        $this->assertSQLEquals(<<<EOS
DELETE FROM "SQLQueryTest_DO"
WHERE ("SQLQueryTest_DO"."Name" = ?)
EOS
, $query->sql($parameters));
        $this->assertEquals(array('Andrew'), $parameters);
        // Check that setDelete back to false restores the state
        $query->setDelete(false);
        $this->assertSQLEquals(<<<EOS
SELECT "SQLQueryTest_DO"."Name" FROM "SQLQueryTest_DO"
WHERE ("SQLQueryTest_DO"."Name" = ?)
EOS
, $query->sql($parameters));
        $this->assertEquals(array('Andrew'), $parameters);
    }
 /**
  * Polls the message queue. Will return a map of senders with the lastest message ID
  * @see http://stackoverflow.com/questions/12102200/get-records-with-max-value-for-each-group-of-grouped-sql-results
  * @param SS_HTTPRequest $request
  */
 public function get_openchats(SS_HTTPRequest $request)
 {
     if (!Permission::checkMember(Member::currentUser(), "CMS_ACCESS_LiveChatAdmin")) {
         header("HTTP/1.0 403 Forbidden");
         die('You do not have permission to use the live chat module');
     }
     // find the messages that have been sent to you
     $query1 = new SQLQuery("*", "LiveChatMessage", "ToID = " . (int) Member::currentUserID());
     $query1->addOrderBy("ID DESC");
     $query1->addWhere("ClassName = 'LiveChatMessage'");
     $query2 = new SQLQuery("ID, FromID, FromName", '(' . $query1->sql() . ') x');
     $query2->addGroupBy("FromID, FromName");
     // only select the largest ID, unique for each sender
     $result = $query2->execute();
     $returnar = array();
     // add the names to the array
     foreach ($result as $id) {
         $member = Member::get()->byID($id['FromID']);
         $returnar[$id['ID']] = array("Name" => $member ? $member->getName() : $id['FromName'], "FromID" => $id['FromID'] ? $id['FromID'] : md5($id['FromName']));
     }
     header('Content-Type: application/json');
     die(json_encode($returnar));
 }