Mysql.hx 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. /*
  2. * Copyright (c) 2005, The haXe Project Contributors
  3. * All rights reserved.
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions are met:
  6. *
  7. * - Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * - Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. *
  13. * THIS SOFTWARE IS PROVIDED BY THE HAXE PROJECT CONTRIBUTORS "AS IS" AND ANY
  14. * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  15. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  16. * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
  17. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  18. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  19. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  20. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  21. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  22. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  23. * DAMAGE.
  24. */
  25. package sys.db;
  26. private class D {
  27. static function load(fun,args) : Dynamic {
  28. return neko.Lib.load(lib,fun,args);
  29. }
  30. static var lib = try { neko.Lib.load("mysql5","connect",1); "mysql5"; } catch( e : Dynamic ) "mysql";
  31. public static var connect = load("connect",1);
  32. public static var select_db = load("select_db",2);
  33. public static var request = load("request",2);
  34. public static var close = load("close",1);
  35. public static var escape = load("escape", 2);
  36. public static var set_conv_funs = load("set_conv_funs", 4);
  37. public static var result_get_length = load("result_get_length",1);
  38. public static var result_get_nfields = load("result_get_nfields",1);
  39. public static var result_next = load("result_next",1);
  40. public static var result_get = load("result_get",2);
  41. public static var result_get_int = load("result_get_int",2);
  42. public static var result_get_float = load("result_get_float",2);
  43. public static var result_fields_names = neko.Lib.loadLazy(lib,"result_get_fields_names",1);
  44. }
  45. private class MysqlResultSet implements sys.db.ResultSet {
  46. public var length(getLength,null) : Int;
  47. public var nfields(getNFields,null) : Int;
  48. private var __r : Void;
  49. private var cache : Dynamic;
  50. public function new(r) {
  51. __r = r;
  52. }
  53. private function getLength() {
  54. return D.result_get_length(__r);
  55. }
  56. private function getNFields() {
  57. return D.result_get_nfields(__r);
  58. }
  59. public function hasNext() {
  60. if( cache == null )
  61. cache = next();
  62. return (cache != null);
  63. }
  64. public function next() : Dynamic {
  65. var c = cache;
  66. if( c != null ) {
  67. cache = null;
  68. return c;
  69. }
  70. c = D.result_next(__r);
  71. return c;
  72. }
  73. public function results() : List<Dynamic> {
  74. var l = new List();
  75. while( hasNext() )
  76. l.add(next());
  77. return l;
  78. }
  79. public function getResult( n : Int ) {
  80. return new String(D.result_get(__r,n));
  81. }
  82. public function getIntResult( n : Int ) : Int {
  83. return D.result_get_int(__r,n);
  84. }
  85. public function getFloatResult( n : Int ) : Float {
  86. return D.result_get_float(__r,n);
  87. }
  88. public function getFieldsNames() : Array<String> {
  89. var a = D.result_fields_names(__r);
  90. untyped {
  91. var i = 0;
  92. var l = __dollar__asize(a);
  93. while( i < l ) {
  94. a[i] = new String(a[i]);
  95. i += 1;
  96. }
  97. a = Array.new1(cast a,l);
  98. }
  99. return a;
  100. }
  101. }
  102. private class MysqlConnection implements sys.db.Connection {
  103. private var __c : Void;
  104. public function new(c) {
  105. __c = c;
  106. D.set_conv_funs(c, function(s) return new String(s), function(d) return untyped Date.new1(d), function(b) return haxe.io.Bytes.ofData(b));
  107. }
  108. public function request( s : String ) : sys.db.ResultSet {
  109. try {
  110. var r = D.request(this.__c, untyped s.__s);
  111. return new MysqlResultSet(r);
  112. } catch( e : Dynamic ) {
  113. untyped if( __dollar__typeof(e) == __dollar__tobject && __dollar__typeof(e.msg) == __dollar__tstring )
  114. e = e.msg;
  115. untyped __dollar__rethrow(e);
  116. return null;
  117. }
  118. }
  119. public function close() {
  120. D.close(__c);
  121. }
  122. public function escape( s : String ) {
  123. return new String(D.escape(__c,untyped s.__s));
  124. }
  125. public function quote( s : String ) {
  126. return "'"+escape(s)+"'";
  127. }
  128. public function addValue( s : StringBuf, v : Dynamic ) {
  129. var t = untyped __dollar__typeof(v);
  130. if( untyped (t == __dollar__tint || t == __dollar__tnull) )
  131. s.add(v);
  132. else if( untyped t == __dollar__tbool )
  133. s.addChar(if( v ) "1".code else "0".code);
  134. else {
  135. s.addChar("'".code);
  136. s.add(escape(Std.string(v)));
  137. s.addChar("'".code);
  138. }
  139. }
  140. public function lastInsertId() {
  141. return request("SELECT LAST_INSERT_ID()").getIntResult(0);
  142. }
  143. public function dbName() {
  144. return "MySQL";
  145. }
  146. public function startTransaction() {
  147. request("START TRANSACTION");
  148. }
  149. public function commit() {
  150. request("COMMIT");
  151. }
  152. public function rollback() {
  153. request("ROLLBACK");
  154. }
  155. private static var __use_date = Date;
  156. }
  157. @:core_api class Mysql {
  158. public static function connect( params : {
  159. host : String,
  160. port : Null<Int>,
  161. user : String,
  162. pass : String,
  163. socket : Null<String>,
  164. database : String
  165. } ) : sys.db.Connection {
  166. var o = untyped {
  167. host : params.host.__s,
  168. port : if( params.port == null ) 3306 else params.port,
  169. user : params.user.__s,
  170. pass : params.pass.__s,
  171. socket : if( params.socket == null ) null else params.socket.__s
  172. };
  173. var c = D.connect(o);
  174. try {
  175. D.select_db(c,untyped params.database.__s);
  176. } catch( e : Dynamic ) {
  177. D.close(c);
  178. neko.Lib.rethrow(e);
  179. }
  180. return new MysqlConnection(c);
  181. }
  182. }