Changeset 20816
- Timestamp:
- 10/05/08 23:04:37 (3 months ago)
- Location:
- lang/cplusplus/llv8call/trunk
- Files:
-
- 2 added
- 3 modified
-
ext/mysql/mysql.cc (modified) (13 diffs)
-
manual/articles/about-llv8call.html (modified) (1 diff)
-
manual/ext/index.html (modified) (1 diff)
-
manual/ext/mysql (added)
-
manual/ext/mysql/mysql.html (added)
Legend:
- Unmodified
- Added
- Removed
-
lang/cplusplus/llv8call/trunk/ext/mysql/mysql.cc
r20099 r20816 8 8 #include <string> 9 9 #include "v8ext.h" 10 #include "llv8-macros.h" 10 11 #include <cassert> 11 12 … … 42 43 // instance methods 43 44 44 static v8::Handle<v8::Value> _open(const v8::Arguments& args) { 45 assert_args(args,4);45 FUNCTION(_open) 46 ARG_COUNT(4); 46 47 MYSQL *conn = mysql_init(NULL); 47 String::Utf8Value server(args[0]);48 String::Utf8Value user(args[1]);49 String::Utf8Value password(args[2]);50 String::Utf8Value database(args[3]);48 ARG_str(server, 0); 49 ARG_str(user, 1); 50 ARG_str(password, 2); 51 ARG_str(database, 3); 51 52 if (mysql_real_connect(conn, *server, *user, *password, *database, 0, NULL, 0) == NULL) { 52 53 return throw_errmsg(conn); … … 55 56 return args.This(); 56 57 } 57 } 58 59 static v8::Handle<v8::Value> _close(const v8::Arguments& args) { 60 HandleScope h;58 END 59 60 FUNCTION(_close) 61 ARG_COUNT(0); 61 62 MYSQL* conn = handle<MYSQL>(args, 0); 62 63 mysql_close(conn); 63 64 return Undefined(); 64 } 65 66 static v8::Handle<v8::Value> _ping(const v8::Arguments& args) { 67 HandleScope h;65 END 66 67 FUNCTION(_ping) 68 ARG_COUNT(0); 68 69 MYSQL* conn = handle<MYSQL>(args, 0); 69 70 if (mysql_ping(conn) == 0) { … … 72 73 return False(); 73 74 } 74 } 75 76 static v8::Handle<v8::Value> _get_server_version(const v8::Arguments& args) { 77 HandleScope h;75 END 76 77 FUNCTION(_get_server_version) 78 ARG_COUNT(0); 78 79 MYSQL* conn = handle<MYSQL>(args, 0); 79 80 return Uint32::New(mysql_get_server_version(conn)); 80 } 81 82 static v8::Handle<v8::Value> _get_server_info(const v8::Arguments& args) { 83 HandleScope h;81 END 82 83 FUNCTION(_get_server_info) 84 ARG_COUNT(0); 84 85 MYSQL* conn = handle<MYSQL>(args, 0); 85 86 return String::New(mysql_get_server_info(conn)); 86 } 87 88 static v8::Handle<v8::Value> _get_host_info(const v8::Arguments& args) { 89 HandleScope h;87 END 88 89 FUNCTION(_get_host_info) 90 ARG_COUNT(0); 90 91 MYSQL* conn = handle<MYSQL>(args, 0); 91 92 return String::New(mysql_get_host_info(conn)); 92 } 93 94 static v8::Handle<v8::Value> _get_proto_info(const v8::Arguments& args) { 95 HandleScope h;93 END 94 95 FUNCTION(_get_proto_info) 96 ARG_COUNT(0); 96 97 MYSQL* conn = handle<MYSQL>(args, 0); 97 98 return Uint32::New(mysql_get_proto_info(conn)); 98 } 99 100 static v8::Handle<v8::Value> _character_set_name(const v8::Arguments& args) { 101 HandleScope h;99 END 100 101 FUNCTION(_character_set_name) 102 ARG_COUNT(0); 102 103 MYSQL* conn = handle<MYSQL>(args, 0); 103 104 const char *ret; … … 107 108 return throw_errmsg(conn); 108 109 } 109 } 110 111 static v8::Handle<v8::Value> _stat(const v8::Arguments& args) { 112 HandleScope h;110 END 111 112 FUNCTION(_stat) 113 ARG_COUNT(0); 113 114 MYSQL* conn = handle<MYSQL>(args, 0); 114 115 return String::New(mysql_stat(conn)); 115 } 116 117 static v8::Handle<v8::Value> _escape_string(const v8::Arguments& args) { 118 HandleScope h; 119 MYSQL* conn = handle<MYSQL>(args, 0); 120 assert_args(args, 1); 121 String::Utf8Value src(args[0]); 116 END 117 118 FUNCTION(_escape_string) 119 MYSQL* conn = handle<MYSQL>(args, 0); 120 ARG_COUNT(1); 121 ARG_str(src, 0); 122 122 char *buf = new char [src.length() * 2 + 1]; 123 123 mysql_real_escape_string(conn, buf, *src, src.length()); … … 125 125 delete [] buf; 126 126 return ret; 127 } 128 129 static v8::Handle<v8::Value> _thread_id(const v8::Arguments& args) { 130 HandleScope h; 131 MYSQL* conn = handle<MYSQL>(args, 0); 132 assert_args(args, 0); 127 END 128 129 FUNCTION(_thread_id) 130 ARG_COUNT(0); 131 MYSQL* conn = handle<MYSQL>(args, 0); 133 132 return Uint32::New( mysql_thread_id(conn) ); 134 } 135 136 static v8::Handle<v8::Value> _kill(const v8::Arguments& args) { 137 HandleScope h;138 MYSQL* conn = handle<MYSQL>(args, 0);139 assert_args(args, 1);140 if (mysql_kill(conn, args[0]->Uint32Value()) == 0) {133 END 134 135 FUNCTION(_kill) 136 ARG_COUNT(1); 137 ARG_uint(thread, 0); 138 MYSQL* conn = handle<MYSQL>(args, 0); 139 if (mysql_kill(conn, thread) == 0) { 141 140 return Undefined(); 142 141 } else { 143 142 return throw_errmsg(conn); 144 143 } 145 } 146 147 static v8::Handle<v8::Value> _commit(const v8::Arguments& args) { 148 HandleScope h;144 END 145 146 FUNCTION(_commit) 147 ARG_COUNT(0); 149 148 MYSQL* conn = handle<MYSQL>(args, 0); 150 149 … … 154 153 return throw_errmsg(conn); 155 154 } 156 } 157 158 static v8::Handle<v8::Value> _rollback(const v8::Arguments& args) { 159 HandleScope h;155 END 156 157 FUNCTION(_rollback) 158 ARG_COUNT(0); 160 159 MYSQL* conn = handle<MYSQL>(args, 0); 161 160 … … 165 164 return throw_errmsg(conn); 166 165 } 167 } 168 169 static v8::Handle<v8::Value> _cursor(const v8::Arguments& args) { 170 HandleScope h; 166 END 167 168 FUNCTION(_cursor) 171 169 MYSQL* conn = handle<MYSQL>(args, 0); 172 170 … … 175 173 obj->SetInternalField(1, Undefined()); 176 174 return obj; 177 } 175 END 178 176 179 177 ///////////////////////////////////////////////////////////// 180 178 // statement method 181 179 182 static v8::Handle<v8::Value> _cursor_execute(const v8::Arguments& args) { 183 HandleScope h; 184 MYSQL* conn = handle<MYSQL>(args, 0); 185 assert_args(args, 1); 186 String::Utf8Value str(args[0]); 180 FUNCTION(_cursor_execute) 181 MYSQL* conn = handle<MYSQL>(args, 0); 182 ARG_COUNT(1); 183 ARG_str(str, 0); 187 184 if (mysql_real_query(conn, *str, str.length()) == 0) { 188 185 MYSQL_RES * res = mysql_use_result(conn); … … 192 189 return throw_errmsg(conn); 193 190 } 194 } 195 196 static v8::Handle<v8::Value> _cursor_fetchall(const v8::Arguments& args) { 197 HandleScope h; 191 END 192 193 FUNCTION(_cursor_fetchall) 198 194 v8::Local<v8::Value> field = args.This()->GetInternalField(1); 199 195 if (field->IsExternal()) { … … 215 211 return ThrowException(String::New("send query first")); 216 212 } 217 } 218 219 static v8::Handle<v8::Value> _cursor_fetchone(const v8::Arguments& args) { 220 HandleScope h; 213 END 214 215 FUNCTION(_cursor_fetchone) 221 216 v8::Local<v8::Value> field = args.This()->GetInternalField(1); 222 217 if (field->IsExternal()) { … … 238 233 return ThrowException(String::New("send query first")); 239 234 } 240 } 241 242 static v8::Handle<v8::Value> _cursor_close(const v8::Arguments& args) { 243 HandleScope h; 235 END 236 237 FUNCTION(_cursor_close) 244 238 v8::Local<v8::Value> field = args.This()->GetInternalField(1); 245 239 if (field->IsExternal()) { … … 249 243 } 250 244 return Undefined(); 251 } 245 END 252 246 253 247 ///////////////////////////////////////////////////////////// 254 248 // class methods 255 249 256 static v8::Handle<v8::Value> _get_client_version(const v8::Arguments& args) { 250 FUNCTION(_get_client_version) 251 ARG_COUNT(0); 257 252 HandleScope h; 258 253 return Uint32::New(mysql_get_client_version()); 259 } 260 261 static v8::Handle<v8::Value> _get_client_info(const v8::Arguments& args) { 254 END 255 256 FUNCTION(_get_client_info) 262 257 HandleScope h; 263 258 return String::New(mysql_get_client_info()); 264 } 259 END 265 260 266 261 ///////////////////////////////////////////////////////////// 267 262 // initializer 268 V8EXTINIT_FUNC 269 Handle<Value> instantiate() { 270 HandleScope scope; 271 Handle<Object> target = Object::New(); 272 273 Handle<FunctionTemplate> ft = FunctionTemplate::New(_open); 274 ft->Set(String::New("GetClientVersion"), FunctionTemplate::New(_get_client_version)); 275 ft->Set(String::New("GetClientInfo"), FunctionTemplate::New(_get_client_info)); 276 ft->SetClassName(String::New("MySQL")); 277 Handle<ObjectTemplate> ot = ft->InstanceTemplate(); 278 ot->Set(String::New("Close"), FunctionTemplate::New(_close)); 279 ot->Set(String::New("Commit"), FunctionTemplate::New(_commit)); 280 ot->Set(String::New("Rollback"), FunctionTemplate::New(_rollback)); 281 ot->Set(String::New("Ping"), FunctionTemplate::New(_ping)); 282 ot->Set(String::New("Stat"), FunctionTemplate::New(_stat)); 283 ot->Set(String::New("GetServerVersion"), FunctionTemplate::New(_get_server_version)); 284 ot->Set(String::New("GetServerInfo"), FunctionTemplate::New(_get_server_info)); 285 ot->Set(String::New("GetHostInfo"), FunctionTemplate::New(_get_host_info)); 286 ot->Set(String::New("GetProtoInfo"), FunctionTemplate::New(_get_proto_info)); 287 ot->Set(String::New("CharacterSetName"), FunctionTemplate::New(_character_set_name)); 288 ot->Set(String::New("EscapeString"), FunctionTemplate::New(_escape_string)); 289 ot->Set(String::New("ThreadID"), FunctionTemplate::New(_thread_id)); 290 ot->Set(String::New("Kill"), FunctionTemplate::New(_kill)); 291 ot->Set(String::New("Cursor"), FunctionTemplate::New(_cursor)); 292 ot->SetInternalFieldCount(1); 293 target->Set( 294 String::New("MySQL"), 295 ft->GetFunction(), 296 PropertyAttribute(ReadOnly | DontDelete) 297 ); 298 263 264 MODULE() 299 265 { 300 Handle<FunctionTemplate> stmt = FunctionTemplate::New(); 301 stmt->SetClassName(String::New("MySQL.Cursor")); 302 Handle<ObjectTemplate> ot = stmt->InstanceTemplate(); 303 ot->SetInternalFieldCount(2); 304 ot->Set( String::New("Close"), FunctionTemplate::New(_cursor_close) ); 305 ot->Set( String::New("Execute"), FunctionTemplate::New(_cursor_execute) ); 306 ot->Set( String::New("FetchAll"), FunctionTemplate::New(_cursor_fetchall) ); 307 ot->Set( String::New("FetchOne"), FunctionTemplate::New(_cursor_fetchone) ); 308 target->Set( 309 String::New("Cursor"), 310 stmt->GetFunction(), 311 PropertyAttribute(ReadOnly | DontDelete) 312 ); 313 } 314 315 return target; 316 } 317 266 CLASS_WITH_CONSTRUCTOR(_open); 267 BIND_CM("GetClientVersion", _get_client_version); 268 BIND_CM("GetClientInfo", _get_client_info); 269 BIND_IM("Close", _close); 270 BIND_IM("Commit", _commit); 271 BIND_IM("Rollback", _rollback); 272 BIND_IM("Ping", _ping); 273 BIND_IM("Stat", _stat); 274 BIND_IM("GetServerVersion", _get_server_version); 275 BIND_IM("GetServerInfo", _get_server_info); 276 BIND_IM("GetHostInfo", _get_host_info); 277 BIND_IM("GetProtoInfo", _get_proto_info); 278 BIND_IM("CharacterSetName", _character_set_name); 279 BIND_IM("EscapeString", _escape_string); 280 BIND_IM("ThreadID", _thread_id); 281 BIND_IM("Kill", _kill); 282 BIND_IM("Cursor", _cursor); 283 INTERNALCOUNT(1); 284 EXPORT_CLASS("MySQL"); 285 } 286 287 { 288 CLASS(); 289 BIND_IM("Close", _cursor_close); 290 BIND_IM("Execute", _cursor_execute); 291 BIND_IM("FetchAll", _cursor_fetchall); 292 BIND_IM("FetchOne", _cursor_fetchone); 293 INTERNALCOUNT(2); 294 EXPORT_CLASS("Cursor"); 295 } 296 ENDMODULE -
lang/cplusplus/llv8call/trunk/manual/articles/about-llv8call.html
r20809 r20816 67 67 <div> 68 68 libv8.so とか libv8.dylib とかを /usr/local/lib/ などに置けば、<pre>./out/bin/llv8call</pre> で起動できる 69 です。 69 です。out/ 以下を /usr/local/lib/llv8call/ などにrename してつかうとよいです。 70 70 </div> 71 71 -
lang/cplusplus/llv8call/trunk/manual/ext/index.html
r20805 r20816 19 19 <ul> 20 20 <li><a href="clearsilver/clearsilver.html">clearsilver.clearsilver</a></li> 21 <li><a href="sqlite3/sqlite3.html">sqlite3.sqlite3</a></li> 21 22 <li><a href="fs/dir.html">fs.dir</a></li> 22 23 <li><a href="fs/file.html">fs.file</a></li> 23 24 <li><a href="libmemcached/libmemcached.html">libmemcached.libmemcached</a></li> 25 <li><a href="mysql/mysql.html">mysql.mysql</a></li> 24 26 <li><a href="shttpd/shttpd.html">shttpd.shttpd</a></li> 25 <li><a href="sqlite3/sqlite3.html">sqlite3.sqlite3</a></li>26 27 </ul> 27 28 <a href="../index.html">up</a>
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)