Advertisement
Guest User

Untitled

a guest
May 2nd, 2016
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.00 KB | None | 0 0
  1. import PerfectLib
  2. import PostgreSQL
  3.  
  4. class FoodListHandler: PageHandler {
  5. let dbHost = "localhost"
  6. let dbName = "cat_food"
  7. let dbUsername = //PUT YOUR SYSTEM USERNAME HERE!
  8. let dbPassword = ""
  9.  
  10. func valuesForResponse(context: MustacheEvaluationContext, collector: MustacheEvaluationOutputCollector) throws -> MustacheEvaluationContext.MapType {
  11.  
  12. //open postgre db
  13. let pgsl = PostgreSQL.PGConnection()
  14.  
  15. pgsl.connectdb("host='\(dbHost)' dbname='\(dbName)' user='\(dbUsername)' password='\(dbPassword)'")
  16.  
  17. defer {
  18. pgsl.close()
  19. }
  20.  
  21. guard pgsl.status() != .Bad else {
  22. throw PerfectError.FileError(500, "Internal Server Error - failed to connect to db")
  23. }
  24.  
  25. //execute query
  26. let queryResult = pgsl.exec("SELECT * FROM food;")
  27.  
  28. guard queryResult.status() == .CommandOK || queryResult.status() == .TuplesOK else {
  29. throw PerfectError.FileError(500, "Internal Server Error - db query error")
  30. }
  31.  
  32. guard case let numberOfFields = queryResult.numFields() where numberOfFields != 0 else {
  33. throw PerfectError.FileError(500, "Internal Server Error - db returned nothing")
  34. }
  35.  
  36. guard case let numberOfRows = queryResult.numTuples() where numberOfRows != 0 else {
  37. throw PerfectError.FileError(204, "Internal Server Error - query returned empty result")
  38. }
  39.  
  40. //parse from db names and types to something we want to work with
  41. var parameters: [[String:Any]] = []
  42. 0.stride(to: numberOfRows, by: 1).forEach { indexOfRow in
  43. var parameter = [String:Any]()
  44.  
  45. 0.stride(to: numberOfFields, by: 1).forEach { indexOfField in
  46. guard let fieldName = queryResult.fieldName(indexOfField) else {
  47. return
  48. }
  49.  
  50. switch fieldName {
  51. case "name":
  52. parameter["name"] = queryResult.getFieldString(indexOfRow, fieldIndex: indexOfField)
  53. case "brand":
  54. parameter["brand"] = queryResult.getFieldString(indexOfRow, fieldIndex: indexOfField)
  55. case "with_glutein":
  56. parameter["contains glutein"] = queryResult.getFieldBool(indexOfRow, fieldIndex: indexOfField)
  57. case "price":
  58. parameter["price"] = queryResult.getFieldInt(indexOfRow, fieldIndex: indexOfField)
  59. default: break
  60. }
  61. }
  62.  
  63. //last row does not need comma, so we're setting flag
  64. if indexOfRow == numberOfRows-1 {
  65. parameter["last"] = true
  66. }
  67.  
  68. parameters.append(parameter)
  69. }
  70.  
  71. //and wrap this into MustacheEvaluationContext.MapType with approreate key
  72. let dict: MustacheEvaluationContext.MapType = ["whole list":parameters]
  73.  
  74. return dict
  75. }
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement