From 4515cca57d6a5248114b03954fe7984ba477fcce Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Fri, 15 Mar 2013 01:06:16 +1000 Subject: Add grid server web scripts. --- web/query.php | 593 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 593 insertions(+) create mode 100644 web/query.php (limited to 'web/query.php') diff --git a/web/query.php b/web/query.php new file mode 100644 index 0000000..13b701b --- /dev/null +++ b/web/query.php @@ -0,0 +1,593 @@ + 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]; + + //Get todays date/time and adjust it to UTC + $now = time() - date_offset_get(new DateTime); + + $terms = array(); + + if ($day == "u") + $terms[] = "dateUTC > ".$now; + else + { + //Is $day a number of days before or after current date? + if ($day != 0) + $now += $day * 86400; + $now -= ($now % 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 * 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"]); + + $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"], + "region_UUID" => $row["simname"]); + } + + $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); +?> -- cgit v1.1