Files
OpenSimSearch/webroot/query.php
T
kcozens 9ee7375660 Use '/' between the parts of event landing point coordinates. Updated README.
Allow 0 or -1 to be considered as the "Any" category for event listings.
Event markers are seen on the map again but still can't search for events.


git-svn-id: http://forge.opensimulator.org/svn/ossearch/trunk@212 109abde3-1f22-4c10-b5d7-b6b0135cd00c
2014-05-11 17:52:37 +00:00

605 lines
17 KiB
PHP

<?php
//The description of the flags used in this file are being based on the
//DirFindFlags enum which is defined in OpenMetaverse/DirectoryManager.cs
//of the libopenmetaverse library.
include("databaseinfo.php");
//
// Search DB
//
mysql_connect ($DB_HOST, $DB_USER, $DB_PASSWORD);
mysql_select_db ($DB_NAME);
#
# Copyright (c)Melanie Thielker (http://opensimulator.org/)
#
###################### No user serviceable parts below #####################
//Join a series of terms together with optional parentheses around the result.
//This function is used in place of the simpler join to handle the cases where
//one or more of the supplied terms are an empty string. The parentheses can
//be added when mixing AND and OR clauses in a SQL query.
function join_terms($glue, $terms, $add_paren)
{
if (count($terms) > 1)
{
$type = join($glue, $terms);
if ($add_paren == True)
$type = "(" . $type . ")";
}
else
{
if (count($terms) == 1)
$type = $terms[0];
else
$type = "";
}
return $type;
}
function process_region_type_flags($flags)
{
$terms = array();
if ($flags & 16777216) //IncludePG (1 << 24)
$terms[] = "mature = 'PG'";
if ($flags & 33554432) //IncludeMature (1 << 25)
$terms[] = "mature = 'Mature'";
if ($flags & 67108864) //IncludeAdult (1 << 26)
$terms[] = "mature = 'Adult'";
return join_terms(" OR ", $terms, True);
}
#
# The XMLRPC server object
#
$xmlrpc_server = xmlrpc_server_create();
#
# Places Query
#
xmlrpc_server_register_method($xmlrpc_server, "dir_places_query",
"dir_places_query");
function dir_places_query($method_name, $params, $app_data)
{
$req = $params[0];
$flags = $req['flags'];
$text = $req['text'];
$category = $req['category'];
$query_start = $req['query_start'];
$pieces = split(" ", $text);
$text = join("%", $pieces);
if ($text == "%%%")
{
$response_xml = xmlrpc_encode(array(
'success' => False,
'errorMessage' => "Invalid search terms"
));
print $response_xml;
return;
}
$terms = array();
$type = process_region_type_flags($flags);
if ($type != "")
$type = " AND " . $type;
if ($flags & 1024)
$order = "dwell DESC,";
if ($category > 0)
$category = "searchcategory = '".mysql_real_escape_string($category)."' AND ";
else
$category = "";
$text = mysql_real_escape_string($text);
$result = mysql_query("SELECT * FROM parcels WHERE $category " .
"(parcelname LIKE '%$text%'" .
" OR description LIKE '%$text%')" .
$type . " ORDER BY $order parcelname" .
" LIMIT ".(0+$query_start).",101");
$data = array();
while (($row = mysql_fetch_assoc($result)))
{
$data[] = array(
"parcel_id" => $row["infouuid"],
"name" => $row["parcelname"],
"for_sale" => "False",
"auction" => "False",
"dwell" => $row["dwell"]);
}
$response_xml = xmlrpc_encode(array(
'success' => True,
'errorMessage' => "",
'data' => $data
));
print $response_xml;
}
#
# Popular Places Query
#
xmlrpc_server_register_method($xmlrpc_server, "dir_popular_query",
"dir_popular_query");
function dir_popular_query($method_name, $params, $app_data)
{
$req = $params[0];
$text = $req['text'];
$flags = $req['flags'];
$query_start = $req['query_start'];
$terms = array();
if ($flags & 0x1000) //PicturesOnly (1 << 12)
$terms[] = "has_picture = 1";
if ($flags & 0x0800) //PgSimsOnly (1 << 11)
$terms[] = "mature = 0";
if ($text != "")
{
$text = mysql_real_escape_string($text);
$terms[] = "(name LIKE '%$text%')";
}
if (count($terms) > 0)
$where = " WHERE " . join_terms(" AND ", $terms, False);
else
$where = "";
$result = mysql_query("SELECT * FROM popularplaces" . $where .
" LIMIT " . mysql_real_escape_string($query_start) . ",101");
$data = array();
while (($row = mysql_fetch_assoc($result)))
{
$data[] = array(
"parcel_id" => $row["infoUUID"],
"name" => $row["name"],
"dwell" => $row["dwell"]);
}
$response_xml = xmlrpc_encode(array(
'success' => True,
'errorMessage' => "",
'data' => $data));
print $response_xml;
}
#
# Land Query
#
xmlrpc_server_register_method($xmlrpc_server, "dir_land_query",
"dir_land_query");
function dir_land_query($method_name, $params, $app_data)
{
$req = $params[0];
$flags = $req['flags'];
$type = $req['type'];
$price = $req['price'];
$area = $req['area'];
$query_start = $req['query_start'];
$terms = array();
if ($type != 4294967295) //Include all types of land?
{
//Do this check first so we can bail out quickly on Auction search
if (($type & 26) == 2) // Auction (from SearchTypeFlags enum)
{
$response_xml = xmlrpc_encode(array(
'success' => False,
'errorMessage' => "No auctions listed"));
print $response_xml;
return;
}
if (($type & 24) == 8) //Mainland (24=0x18 [bits 3 & 4])
$terms[] = "parentestate = 1";
if (($type & 24) == 16) //Estate (24=0x18 [bits 3 & 4])
$terms[] = "parentestate <> 1";
}
$s = process_region_type_flags($flags);
if ($s != "")
$terms[] = $s;
if ($flags & 0x100000) //LimitByPrice (1 << 20)
$terms[] = "saleprice <= '" . mysql_real_escape_string($price) . "'";
if ($flags & 0x200000) //LimitByArea (1 << 21)
$terms[] = "area >= '" . mysql_real_escape_string($area) . "'";
//The PerMeterSort flag is always passed from a map item query.
//It doesn't hurt to have this as the default search order.
$order = "lsq"; //PerMeterSort (1 << 17)
if ($flags & 0x80000) //NameSort (1 << 19)
$order = "parcelname";
if ($flags & 0x10000) //PriceSort (1 << 16)
$order = "saleprice";
if ($flags & 0x40000) //AreaSort (1 << 18)
$order = "area";
if (!($flags & 0x8000)) //SortAsc (1 << 15)
$order .= " DESC";
if (count($terms) > 0)
$where = " WHERE " . join_terms(" AND ", $terms, False);
else
$where = "";
$sql = "SELECT *,saleprice/area AS lsq FROM parcelsales" . $where .
" ORDER BY " . $order . " LIMIT " .
mysql_real_escape_string($query_start) . ",101";
$result = mysql_query($sql);
$data = array();
while (($row = mysql_fetch_assoc($result)))
{
$data[] = array(
"parcel_id" => $row["infoUUID"],
"name" => $row["parcelname"],
"auction" => "false",
"for_sale" => "true",
"sale_price" => $row["saleprice"],
"landing_point" => $row["landingpoint"],
"region_UUID" => $row["regionUUID"],
"area" => $row["area"]);
}
$response_xml = xmlrpc_encode(array(
'success' => True,
'errorMessage' => "",
'data' => $data));
print $response_xml;
}
#
# Events Query
#
xmlrpc_server_register_method($xmlrpc_server, "dir_events_query",
"dir_events_query");
function dir_events_query($method_name, $params, $app_data)
{
$req = $params[0];
$text = $req['text'];
$flags = $req['flags'];
$query_start = $req['query_start'];
if ($text == "%%%")
{
$response_xml = xmlrpc_encode(array(
'success' => False,
'errorMessage' => "Invalid search terms"
));
print $response_xml;
return;
}
$pieces = explode("|", $text);
$day = $pieces[0];
$category = $pieces[1];
if (count($pieces) < 3)
$search_text = "";
else
$search_text = $pieces[2];
$terms = array();
if ($day == "u")
{
//This condition will include upcoming and in-progress events
$terms[] = "dateUTC+duration*60 >= " . time();
}
else
{
//Default timezone. Change this value if you use a different
//in-world timezone for your local standalone or grid.
date_default_timezone_set('America/Los_Angeles');
//To search for events in a given day we need to determine the
//start time for the day. Get current time, take out UTC offset,
//adjust time to start of day, add back the UTC time zone offset.
$time_info = gettimeofday();
$now = $time_info['sec'] - $time_info['minuteswest'] * 60;
$now -= ($now % 86400); //Adjust to start of day
$now += $time_info['minuteswest'] * 60;
//Is $day a number of days before or after current date?
if ($day != 0)
$now += $day * 86400;
$then = $now + 86400;
$terms[] = "(dateUTC >= $now AND dateUTC < $then)";
}
if ($category > 0)
$terms[] = "category = ".$category."";
$type = array();
if ($flags & 16777216) //IncludePG (1 << 24)
$type[] = "eventflags = 0";
if ($flags & 33554432) //IncludeMature (1 << 25)
$type[] = "eventflags = 1";
if ($flags & 67108864) //IncludeAdult (1 << 26)
$type[] = "eventflags = 2";
//Was there at least one PG, Mature, or Adult flag?
if (count($type) > 0)
$terms[] = join_terms(" OR ", $type, True);
if ($search_text != "")
{
$search_text = mysql_real_escape_string($search_text);
$terms[] = "(name LIKE '%$search_text%' OR " .
"description LIKE '%$search_text%')";
}
if (count($terms) > 0)
$where = " WHERE " . join_terms(" AND ", $terms, False);
else
$where = "";
$sql = "SELECT owneruuid,name,eventid,dateUTC,eventflags,globalPos FROM events". $where.
" LIMIT " . mysql_real_escape_string($query_start) . ",101";
$result = mysql_query($sql);
$data = array();
while (($row = mysql_fetch_assoc($result)))
{
$date = strftime("%m/%d %I:%M %p",$row["dateUTC"]);
//The landing point is only needed when this event query is
//called to allow placement of event markers on the world map.
$data[] = array(
"owner_id" => $row["owneruuid"],
"name" => $row["name"],
"event_id" => $row["eventid"],
"date" => $date,
"unix_time" => $row["dateUTC"],
"event_flags" => $row["eventflags"],
"landing_point" => $row["globalPos"]);
}
$response_xml = xmlrpc_encode(array(
'success' => True,
'errorMessage' => "",
'data' => $data));
print $response_xml;
}
#
# Classifieds Query
#
xmlrpc_server_register_method($xmlrpc_server, "dir_classified_query",
"dir_classified_query");
function dir_classified_query ($method_name, $params, $app_data)
{
$req = $params[0];
$text = $req['text'];
$flags = $req['flags'];
$category = $req['category'];
$query_start = $req['query_start'];
if ($text == "%%%")
{
$response_xml = xmlrpc_encode(array(
'success' => False,
'errorMessage' => "Invalid search terms"
));
print $response_xml;
return;
}
$terms = array();
//Renew Weekly flag is bit 5 (32) in $flags.
$f = array();
if ($flags & 4) //PG (1 << 2)
$f[] = "classifiedflags & 4 = 4";
if ($flags & 8) //Mature (1 << 3)
$f[] = "classifiedflags & 8 = 8";
if ($flags & 64) //Adult (1 << 6)
$f[] = "classifiedflags & 64 = 64";
//Was there at least one PG, Mature, or Adult flag?
if (count($f) > 0)
$terms[] = join_terms(" OR ", $f, True);
//Only restrict results based on category if it is not 0 (Any Category)
if ($category > 0)
$terms[] = "category = " . $category;
if ($text != "")
$terms[] = "(name LIKE '%$text%'" .
" OR description LIKE '%$text%')";
//Was there at least condition for the search?
if (count($terms) > 0)
$where = " WHERE " . join_terms(" AND ", $terms, False);
else
$where = "";
$sql = "SELECT * FROM classifieds" . $where .
" ORDER BY priceforlisting DESC" .
" LIMIT " . mysql_real_escape_string($query_start) . ",101";
$result = mysql_query($sql);
$data = array();
while (($row = mysql_fetch_assoc($result)))
{
$data[] = array(
"classifiedid" => $row["classifieduuid"],
"name" => $row["name"],
"classifiedflags" => $row["classifiedflags"],
"creation_date" => $row["creationdate"],
"expiration_date" => $row["expirationdate"],
"priceforlisting" => $row["priceforlisting"]);
}
$response_xml = xmlrpc_encode(array(
'success' => True,
'errorMessage' => "",
'data' => $data));
print $response_xml;
}
#
# Events Info Query
#
xmlrpc_server_register_method($xmlrpc_server, "event_info_query",
"event_info_query");
function event_info_query($method_name, $params, $app_data)
{
$req = $params[0];
$eventID = $req['eventID'];
$sql = "SELECT * FROM events WHERE eventID = " .
mysql_real_escape_string($eventID);
$result = mysql_query($sql);
$data = array();
while (($row = mysql_fetch_assoc($result)))
{
$date = strftime("%G-%m-%d %H:%M:%S",$row["dateUTC"]);
$category = "*Unspecified*";
if ($row['category'] == 18) $category = "Discussion";
if ($row['category'] == 19) $category = "Sports";
if ($row['category'] == 20) $category = "Live Music";
if ($row['category'] == 22) $category = "Commercial";
if ($row['category'] == 23) $category = "Nightlife/Entertainment";
if ($row['category'] == 24) $category = "Games/Contests";
if ($row['category'] == 25) $category = "Pageants";
if ($row['category'] == 26) $category = "Education";
if ($row['category'] == 27) $category = "Arts and Culture";
if ($row['category'] == 28) $category = "Charity/Support Groups";
if ($row['category'] == 29) $category = "Miscellaneous";
$data[] = array(
"event_id" => $row["eventid"],
"creator" => $row["creatoruuid"],
"name" => $row["name"],
"category" => $category,
"description" => $row["description"],
"date" => $date,
"dateUTC" => $row["dateUTC"],
"duration" => $row["duration"],
"covercharge" => $row["covercharge"],
"coveramount" => $row["coveramount"],
"simname" => $row["simname"],
"globalposition" => $row["globalPos"],
"eventflags" => $row["eventflags"]);
}
$response_xml = xmlrpc_encode(array(
'success' => True,
'errorMessage' => "",
'data' => $data));
print $response_xml;
}
#
# Classifieds Info Query
#
xmlrpc_server_register_method($xmlrpc_server, "classifieds_info_query",
"classifieds_info_query");
function classifieds_info_query($method_name, $params, $app_data)
{
$req = $params[0];
$classifiedID = $req['classifiedID'];
$sql = "SELECT * FROM classifieds WHERE classifieduuid = '" .
mysql_real_escape_string($classifiedID). "'";
$result = mysql_query($sql);
$data = array();
while (($row = mysql_fetch_assoc($result)))
{
$data[] = array(
"classifieduuid" => $row["classifieduuid"],
"creatoruuid" => $row["creatoruuid"],
"creationdate" => $row["creationdate"],
"expirationdate" => $row["expirationdate"],
"category" => $row["category"],
"name" => $row["name"],
"description" => $row["description"],
"parceluuid" => $row["parceluuid"],
"parentestate" => $row["parentestate"],
"snapshotuuid" => $row["snapshotuuid"],
"simname" => $row["simname"],
"posglobal" => $row["posglobal"],
"parcelname" => $row["parcelname"],
"classifiedflags" => $row["classifiedflags"],
"priceforlisting" => $row["priceforlisting"]);
}
$response_xml = xmlrpc_encode(array(
'success' => True,
'errorMessage' => "",
'data' => $data));
print $response_xml;
}
#
# Process the request
#
$request_xml = file_get_contents("php://input");
xmlrpc_server_call_method($xmlrpc_server, $request_xml, '');
xmlrpc_server_destroy($xmlrpc_server);
?>