xlang v4.0 Release
程序设计语言基础库文档
载入中...
搜索中...
未找到
Sqlite.xcsm
浏览该文件的文档.
1//xlang Source, Name:Sqlite.xcsm
2//Date: Wed Mar 00:26:43 2019
3
4
5class Sqlite : Sql.Connection{
6 static const String DRIVERNAME = "sqlite";
7
8 public static bool registry(){
9 if (Native.init()){
10 Sql.Database.reigstry(DRIVERNAME, new SqliteRegister());
11 return true;
12 }
13 return false;
14 }
15
16
17 static class SqliteRegister : Sql.ConnectionRegister{
19 if (drivername.equals("sqlite")){
20 return new Sqlite();
21 }
22 return nilptr;
23 }
24 };
25
26
27 public static class CSTDNative : Library{
28 static bool loaded = false;
29 public static bool load(){
30 if (loaded == false){
31 int cstd_os = _system_.getPlatformId();
32 try{
33 if (cstd_os == _system_.PLATFORM_WINDOWS){
34 loadLibrary("ntdll.dll");
35 }else
36 if (cstd_os == _system_.PLATFORM_LINUX){
37 loadLibrary("libc.so.6");
38 }else
39 if (cstd_os == _system_.PLATFORM_MACOSX){
40 loadLibrary("libc.dylib");
41 }
42 loaded = true;
43 }catch(Exception e){
45 }
46 }
47 return loaded;
48 }
49 public import{
50 Pointer cdecl memcpy(ObjectPtr dest, Pointer src, Pointer n);
51 Pointer cdecl strcpy(ObjectPtr dest, ObjectPtr src);
52 Pointer cdecl strlen(Pointer);
53 };
54 };
55 static class Native : Library{
56 static bool bloaded = false;
57
58 public static bool init(){
59 if (bloaded == false){
60 if (CSTDNative.load()){
61 try{
62 loadLibrary("sqlite3");
63 bloaded = true;
64 }catch(Exception e){
66 }
67 }
68 }
69 return bloaded;
70 }
71
72 public import {
73 int cdecl sqlite3_open(
74 String filename, /* Database filename (UTF-8) */
75 ObjectPtr ppDb /* OUT: SQLite db handle */
76 );
77
78 /*int cdecl sqlite3_key(
79 Pointer db, /* Database to be rekeyed * /
80 String pKey, int nKey /* The key * /
81 );*/
82
83 int cdecl sqlite3_close(
84 Pointer db);
85 int cdecl sqlite3_step(long pStmt);
86 int cdecl sqlite3_exec(
87 Pointer db, /* An open database */
88 String sql, /* SQL to be evaluated */
89 Pointer , /* Callback function */
90 Pointer , /* 1st argument to callback */
91 ObjectPtr msg /* Error msg written here */
92 );
93 int cdecl sqlite3_prepare(
94 Pointer db, /* Database handle. */
95 String zSql, /* UTF-8 encoded SQL statement. */
96 int nBytes, /* Length of zSql in bytes. */
97 ObjectPtr ppStmt, /* OUT: A pointer to the prepared statement */
98 ObjectPtr pzTail /* OUT: End of parsed string */
99 );
101 Pointer db, /* Database handle. */
102 String zSql, /* UTF-8 encoded SQL statement. */
103 int nBytes, /* Length of zSql in bytes. */
104 ObjectPtr ppStmt, /* OUT: A pointer to the prepared statement */
105 ObjectPtr pzTail /* OUT: End of parsed string */
106 );
107 int cdecl sqlite3_reset(Pointer pStmt);
108 int cdecl sqlite3_bind_int(Pointer pStmt, int, int);
109 int cdecl sqlite3_bind_int64(Pointer pStmt, int, long);
110 int cdecl sqlite3_bind_double(Pointer pStmt, int, double);
111 int cdecl sqlite3_bind_null(Pointer pStmt, int);
112 int cdecl sqlite3_bind_text(Pointer pStmt, int, String, int , Pointer);
113 int cdecl sqlite3_bind_blob(Pointer pStmt, int ,ObjectPtr, int , Pointer);
114 String cdecl sqlite3_errmsg(Pointer pStmt);
115 int cdecl sqlite3_errcode(Pointer db);
116 int cdecl sqlite3_column_int(Pointer pStmt, int i);
117 int cdecl sqlite3_changes(Pointer pStmt);
118 double cdecl sqlite3_column_double(Pointer pStmt, int i);
119 long cdecl sqlite3_column_int64(Pointer pStmt, int i);
120 String cdecl sqlite3_column_text(Pointer pStmt, int i);
121 int cdecl sqlite3_column_count(Pointer pStmt);
122 String cdecl sqlite3_column_name(Pointer pStmt, int N);
123 String cdecl sqlite3_column_decltype(Pointer pStmt, int N);
124 int cdecl sqlite3_finalize(Pointer pStmt);
125 long cdecl sqlite3_last_insert_rowid(Pointer pStmt);
126 };
127 };
128
129 static bool registried = registry();
130 long hdb = 0;
131
132 public void create(String uri, String username, String pwd)override{
133 int err = Native.sqlite3_open(uri, hdb);
134 if (err != 0){
135 throw new Sql.SqlException(err, "can not open database:" + uri);
136 }
137 /*if (pwd != nilptr){
138 err = Native.sqlite3_key(hdb, pwd, pwd.length());
139 if (err != 0){
140 throw new Sql.SqlException(err, "password incorrect");
141 }
142 }*/
143 }
144
149 public void setOption(int opt, Object option)override{
150 throw new Sql.DatabaseNotSupportException("setOption");
151 }
152
153 public void throw_sqlite_error(){
154 throw new Sql.SqlException(getErrorCode(),__file__ + ":" + __line__ + ", SQLITE: " + getError() );
155 }
156 public int getErrorCode()override{
157 return Native.sqlite3_errcode(hdb);
158 }
159
160 public String getError()override{
161 return Native.sqlite3_errmsg(hdb);
162 }
163
164 public Object getOption(int opt)override{
165 throw new Sql.DatabaseNotSupportException("getOption");
166 return nilptr;
167 }
168
170 return new SqlitePreparedStatement(this, sql);
171 }
172
174 return new SqlitePreparedStatement(this);
175 }
176
177 public bool isClosed()override{
178 return hdb != 0;
179 }
180
181 public long getLastInsertedRowId(){
182 return Native.sqlite3_last_insert_rowid(hdb);
183 }
184
185 public void close()override{
186 if (hdb != 0){
187 Native.sqlite3_close(hdb);
188 hdb = 0;
189 }
190 }
191
192 void finalize(){
193 close();
194 }
195
196 public static const int SYNCHRONOUS_FULL = 2;
197 public static const int SYNCHRONOUS_NORMAL = 1;
198 public static const int SYNCHRONOUS_OFF = 0;
199
200 public int enableSycnhronous(int n){
201 if (n < 0 || n > 2){
202 return -1;
203 }
204 String [] cof = {"FULL", "NORMAL", "OFF"};
205 return execute("PRAGMA synchronous = " + cof[n] + ";");
206 }
207
208 public int workBegin(){
209 return execute("BEGIN;");
210 }
211
212 public int commit(){
213 return execute("COMMIT;");
214 }
215
216 public int rollback(){
217 return execute("ROLLBACK;");
218 }
219
220 public String generateErrorText(long herr, String fallback){
221 if (herr != 0){
222 long len = CSTDNative.strlen(herr);
223 byte [] data = new byte[len + 1];
224 CSTDNative.memcpy(data, herr, len);
225 return new String(data, 0, len);
226 }
227 return fallback;
228 }
229
230 public int execute(String stmt){
231 if (hdb != 0){
232 long msg = 0;
233 int err = Native.sqlite3_exec(hdb, stmt, (long)0, (long)0, msg);
234 if (err != 0){
236 }
237 return err;
238 }
239 throw new Sql.SqlException(-1, "database not opened");
240 return -1;
241 }
242
243 public int get_changes(){
244 return Native.sqlite3_changes(hdb);
245 }
246
247 public long prepare(String sql){
248 long nstmt = 0;
249 if (hdb != 0){
250 int err = Native.sqlite3_prepare_v2(hdb, sql, sql.length(), nstmt, nilptr);
251 if (err != 0 || nstmt == 0){
253 }
254 return nstmt;
255 }
256 throw new Sql.SqlException(-1, "database not opened");
257 return nstmt;
258 }
259
260 public long getDb(){
261 return hdb;
262 }
263
264
265 public static class SqlitePreparedStatement : Sql.PreparedStatement{
268 long nstmt = 0;
269 int param_pos = 0;
270
271 public long getHandle(){
272 return nstmt;
273 }
274
276 sqlite = db;
277 sql_text = sql;
278 nstmt = sqlite.prepare(sql);
279 }
280
282 sqlite = db;
283 }
284
285 public int execute(String sql)override{
286 return sqlite.execute(sql);
287 }
288
289 public bool reset(){
290 return Native.sqlite3_reset(nstmt) == 0;
291 }
292 public int executeUpdate()override{
293 int r = Native.sqlite3_step(nstmt);
294 if (101 == r){
295 return 0;
296 }
297 return r;
298 }
299
300 public int execute()override{
301 int r = Native.sqlite3_step(nstmt);
302 if (101 == r){
303 return 0;
304 }
305 return r;
306 }
307
308 public Sql.ResultSet executeQuery()override{
309 return new SqliteResultSet(sqlite, this);
310 }
311
312 public Sql.ResultSet executeQuery(String sql)override{
313 nstmt = sqlite.prepare(sql);
314 return new SqliteResultSet(sqlite, this);
315 }
316
317 public int executeUpdate(String sql)override{
318 return sqlite.execute(sql);
319 }
320
321 public int get_changes()override{
322 return sqlite.get_changes();
323 }
324
325 public Sql.ResultSet getResult()override{
326 throw new Sql.DatabaseNotSupportException("getResult");
327 return nilptr;
328 }
329
330 public void close()override{
331 if (nstmt != 0){
332 Native.sqlite3_finalize(nstmt);
333 nstmt = 0;
334 }
335 sqlite = nilptr;
336 }
337
338
339 public void setValue(String value)override{
340 int res = 0;
341 if (value != nilptr){
342 res = Native.sqlite3_bind_text(nstmt, ++param_pos, value, value.length(), nilptr);
343 if (0 != res){
344 sqlite.throw_sqlite_error();
345 }
346 }else{
347 res = Native.sqlite3_bind_null(nstmt, ++param_pos);
348 if (0 != res){
349 sqlite.throw_sqlite_error();
350 }
351 }
352 }
353
354 public void setValue(int value)override{
355 int res = Native.sqlite3_bind_int(nstmt, ++param_pos, value);
356 if (0 != res){
357 sqlite.throw_sqlite_error();
358 }
359 }
360
361 public void setValue(long value)override{
362 int res = Native.sqlite3_bind_int64(nstmt, ++param_pos, value);
363 if (0 != res){
364 sqlite.throw_sqlite_error();
365 }
366 }
367
368 public void setValue(byte value)override{
369 int res = Native.sqlite3_bind_int(nstmt, ++param_pos, value);
370 if (0 != res){
371 sqlite.throw_sqlite_error();
372 }
373 }
374
375 public void setValue(double value)override{
376 int res = Native.sqlite3_bind_double(nstmt, ++param_pos, value);
377 if (0 != res){
378 sqlite.throw_sqlite_error();
379 }
380 }
381
382
383 public void setValue(int id, String value)override{
384 int res = 0;
385 if (value != nilptr){
386 res = Native.sqlite3_bind_text(nstmt, id, value, value.length(), nilptr);
387 if (0 != res){
388 sqlite.throw_sqlite_error();
389 }
390 }else{
391 res = Native.sqlite3_bind_null(nstmt, id);
392 if (0 != res){
393 sqlite.throw_sqlite_error();
394 }
395 }
396 }
397
398 public void setValue(int id, int value)override{
399 int res = Native.sqlite3_bind_int(nstmt, id, value);
400 if (0 != res){
401 sqlite.throw_sqlite_error();
402 }
403 }
404
405 public void setValue(int id, long value)override{
406 int res = Native.sqlite3_bind_int64(nstmt, id, value);
407 if (0 != res){
408 sqlite.throw_sqlite_error();
409 }
410 }
411
412 public void setValue(int id, byte value)override{
413 int res = Native.sqlite3_bind_int(nstmt, id, value);
414 if (0 != res){
415 sqlite.throw_sqlite_error();
416 }
417 }
418
419 public void setValue(int id, double value)override{
420 int res = Native.sqlite3_bind_double(nstmt, id, value);
421 if (0 != res){
422 sqlite.throw_sqlite_error();
423 }
424 }
425
426 public void setValues(Object [] args)override{
427 for (int i = 0; i < args.length; i++){
428 if (args[i].instanceOf(String)){
429 setValue((String)args[i]);
430 }else
431 if (args[i].instanceOf(int)){
432 setValue((int)args[i]);
433 }else
434 if (args[i].instanceOf(long)){
435 setValue((long)args[i]);
436 }else
437 if (args[i].instanceOf(byte)){
438 setValue((byte)args[i]);
439 }else
440 if (args[i].instanceOf(double)){
441 setValue((double)args[i]);
442 }else{
443 throw new Sql.SqlException(-1, "sql " + sql_text + " dont accept type:" + i);
444 }
445 }
446 }
447 };
448
449 public static class SqliteResultSet : Sql.ResultSet{
451 SqlitePreparedStatement sps;
453
454 public SqliteResultSet(Sqlite db, SqlitePreparedStatement _sps){
455 sqlite = db;
456 sps = _sps;
457 parseResult();
458 }
459
460 public int getColumnCount()override{
461 return Native.sqlite3_column_count(sps.getHandle());
462 }
463
464 public String getColumnName(int n){
465 return Native.sqlite3_column_name(sps.getHandle(), n);
466 }
467
468 public void parseResult(){
469 int ncolumn = Native.sqlite3_column_count(sps.getHandle());
470 for (int i = 0; i < ncolumn; i++){
471 String colutext = Native.sqlite3_column_name(sps.getHandle(), i);
472 __fields_Map.put(colutext, i);
473 }
474 }
475
476 public int label2idx(String label){
477 return __fields_Map.get(label);
478 }
479
480 public bool first()override{
481 throw new Sql.DatabaseNotSupportException("first");
482 return false;
483 }
484
485 public bool last()override{
486 throw new Sql.DatabaseNotSupportException("last");
487 return false;
488 }
489
490 public bool next()override{
491 int code = Native.sqlite3_step(sps.getHandle());
492 return 100 == code;
493 }
494
495 public bool previous()override{
496 throw new Sql.DatabaseNotSupportException("previous");
497 return false;
498 }
499
500 public bool isFirst()override{
501 throw new Sql.DatabaseNotSupportException("isFirst");
502 return false;
503 }
504
505 public bool isLast()override{
506 throw new Sql.DatabaseNotSupportException("isLast");
507 return false;
508 }
509
510 public bool isValid()override{
511 return sps != nilptr && (sps.getHandle() != 0);
512 }
513
514 public bool isEof()override{
515 throw new Sql.DatabaseNotSupportException("isEof");
516 return false;
517 }
518
519 public int getInt(String columnlabel)override{
520 return Native.sqlite3_column_int(sps.getHandle(), label2idx(columnlabel));
521 }
522
523 public long getLong(String columnlabel)override{
524 return Native.sqlite3_column_int64(sps.getHandle(), label2idx(columnlabel));
525 }
526
527 public double getDouble(String columnlabel)override{
528 return Native.sqlite3_column_double(sps.getHandle(), label2idx(columnlabel));
529 }
530
531 public byte getByte(String columnlabel)override{
532 return Native.sqlite3_column_int(sps.getHandle(), label2idx(columnlabel));
533 }
534
535 public bool getBoolean(String columnlabel)override{
536 return Native.sqlite3_column_int(sps.getHandle(), label2idx(columnlabel)) != 0;
537 }
538
539 public String getString(String columnlabel)override{
540 return Native.sqlite3_column_text(sps.getHandle(), label2idx(columnlabel));
541 }
542
543 public int getInt(int columnIndex)override{
544 return Native.sqlite3_column_int(sps.getHandle(), columnIndex);
545 }
546
547 public long getLong(int columnIndex)override{
548 return Native.sqlite3_column_int64(sps.getHandle(), columnIndex);
549 }
550
551 public double getDouble(int columnIndex)override{
552 return Native.sqlite3_column_double(sps.getHandle(), columnIndex);
553 }
554
555 public byte getByte(int columnIndex)override{
556 return Native.sqlite3_column_int(sps.getHandle(), columnIndex);
557 }
558
559 public bool getBoolean(int columnIndex)override{
560 return Native.sqlite3_column_int(sps.getHandle(), columnIndex)!= 0;
561 }
562
563 public String getString(int columnIndex)override{
564 return Native.sqlite3_column_text(sps.getHandle(), columnIndex);
565 }
566
567
568
569 public int findColumn(String label)override{
570 return label2idx(label);
571 }
572
573 public long getRowCount()override{
574 throw new Sql.DatabaseNotSupportException("getRow");
575 return 0;
576 }
577
578 public int getRow()override{
579 throw new Sql.DatabaseNotSupportException("getRow");
580 return 0;
581 }
582
583 public void close()override{
584
585 }
586
587 };
588};
系统和IO相关
static final int getPlatformId()
static final void output(String)
static const int PLATFORM_WINDOWS
static const int PLATFORM_LINUX
static const int PLATFORM_MACOSX
异常类
final String getMessage()
static final void loadLibrary(String)
bool get(K)
Iterator put(K, V)
static bool reigstry(String name, ConnectionRegister reg)
Definition xsql.xcs:210
static bool loaded
Definition Sqlite.xcsm:28
static bool load()
Definition Sqlite.xcsm:29
int cdecl sqlite3_bind_text(Pointer pStmt, int, String, int , Pointer)
int cdecl sqlite3_finalize(Pointer pStmt)
int cdecl sqlite3_bind_int(Pointer pStmt, int, int)
int cdecl sqlite3_close( Pointer db)
long cdecl sqlite3_column_int64(Pointer pStmt, int i)
double cdecl sqlite3_column_double(Pointer pStmt, int i)
int cdecl sqlite3_errcode(Pointer db)
String cdecl sqlite3_column_text(Pointer pStmt, int i)
int cdecl sqlite3_bind_double(Pointer pStmt, int, double)
int cdecl sqlite3_bind_null(Pointer pStmt, int)
int cdecl sqlite3_bind_blob(Pointer pStmt, int ,ObjectPtr, int , Pointer)
int cdecl sqlite3_prepare( Pointer db, String zSql, int nBytes, ObjectPtr ppStmt, ObjectPtr pzTail )
int cdecl sqlite3_exec( Pointer db, String sql, Pointer , Pointer , ObjectPtr msg )
int cdecl sqlite3_step(long pStmt)
String cdecl sqlite3_errmsg(Pointer pStmt)
int cdecl sqlite3_column_int(Pointer pStmt, int i)
String cdecl sqlite3_column_decltype(Pointer pStmt, int N)
int cdecl sqlite3_column_count(Pointer pStmt)
long cdecl sqlite3_last_insert_rowid(Pointer pStmt)
int cdecl sqlite3_reset(Pointer pStmt)
static bool bloaded
Definition Sqlite.xcsm:56
int cdecl sqlite3_bind_int64(Pointer pStmt, int, long)
int cdecl sqlite3_prepare_v2( Pointer db, String zSql, int nBytes, ObjectPtr ppStmt, ObjectPtr pzTail )
String cdecl sqlite3_column_name(Pointer pStmt, int N)
int cdecl sqlite3_changes(Pointer pStmt)
static bool init()
Definition Sqlite.xcsm:58
void setValue(int id, byte value) override
Definition Sqlite.xcsm:412
SqlitePreparedStatement(Sqlite db, String sql)
Definition Sqlite.xcsm:275
int get_changes() override
Definition Sqlite.xcsm:321
void setValue(int value) override
Definition Sqlite.xcsm:354
void setValue(int id, long value) override
Definition Sqlite.xcsm:405
void setValue(int id, int value) override
Definition Sqlite.xcsm:398
int execute(String sql) override
Definition Sqlite.xcsm:285
void setValue(long value) override
Definition Sqlite.xcsm:361
Sql.ResultSet executeQuery() override
Definition Sqlite.xcsm:308
void setValue(int id, String value) override
Definition Sqlite.xcsm:383
void setValue(int id, double value) override
Definition Sqlite.xcsm:419
Sql.ResultSet executeQuery(String sql) override
Definition Sqlite.xcsm:312
int executeUpdate() override
Definition Sqlite.xcsm:292
int executeUpdate(String sql) override
Definition Sqlite.xcsm:317
void setValue(String value) override
Definition Sqlite.xcsm:339
void setValues(Object [] args) override
Definition Sqlite.xcsm:426
Sql.ResultSet getResult() override
Definition Sqlite.xcsm:325
void setValue(byte value) override
Definition Sqlite.xcsm:368
void setValue(double value) override
Definition Sqlite.xcsm:375
Sql.Connection allocConnection(String drivername) override
Definition Sqlite.xcsm:18
String getString(int columnIndex) override
Definition Sqlite.xcsm:563
String getString(String columnlabel) override
Definition Sqlite.xcsm:539
bool getBoolean(int columnIndex) override
Definition Sqlite.xcsm:559
bool isFirst() override
Definition Sqlite.xcsm:500
bool next() override
Definition Sqlite.xcsm:490
int getRow() override
Definition Sqlite.xcsm:578
void close() override
Definition Sqlite.xcsm:583
bool isValid() override
Definition Sqlite.xcsm:510
bool isLast() override
Definition Sqlite.xcsm:505
int getColumnCount() override
Definition Sqlite.xcsm:460
String getColumnName(int n)
Definition Sqlite.xcsm:464
double getDouble(String columnlabel) override
Definition Sqlite.xcsm:527
int label2idx(String label)
Definition Sqlite.xcsm:476
long getRowCount() override
Definition Sqlite.xcsm:573
Map<String, int> __fields_Map
Definition Sqlite.xcsm:452
int getInt(String columnlabel) override
Definition Sqlite.xcsm:519
bool isEof() override
Definition Sqlite.xcsm:514
long getLong(int columnIndex) override
Definition Sqlite.xcsm:547
bool first() override
Definition Sqlite.xcsm:480
double getDouble(int columnIndex) override
Definition Sqlite.xcsm:551
SqlitePreparedStatement sps
Definition Sqlite.xcsm:451
bool previous() override
Definition Sqlite.xcsm:495
bool last() override
Definition Sqlite.xcsm:485
byte getByte(String columnlabel) override
Definition Sqlite.xcsm:531
long getLong(String columnlabel) override
Definition Sqlite.xcsm:523
SqliteResultSet(Sqlite db, SqlitePreparedStatement _sps)
Definition Sqlite.xcsm:454
bool getBoolean(String columnlabel) override
Definition Sqlite.xcsm:535
byte getByte(int columnIndex) override
Definition Sqlite.xcsm:555
int getInt(int columnIndex) override
Definition Sqlite.xcsm:543
int findColumn(String label) override
Definition Sqlite.xcsm:569
int getErrorCode() override
Definition Sqlite.xcsm:156
void throw_sqlite_error()
Definition Sqlite.xcsm:153
static const int SYNCHRONOUS_OFF
Definition Sqlite.xcsm:198
long getDb()
Definition Sqlite.xcsm:260
static const int SYNCHRONOUS_NORMAL
Definition Sqlite.xcsm:197
void close() override
Definition Sqlite.xcsm:185
void create(String uri, String username, String pwd) override
Definition Sqlite.xcsm:132
Object getOption(int opt) override
Definition Sqlite.xcsm:164
void finalize()
Definition Sqlite.xcsm:192
long hdb
Definition Sqlite.xcsm:130
int execute(String stmt)
Definition Sqlite.xcsm:230
int workBegin()
Definition Sqlite.xcsm:208
bool isClosed() override
Definition Sqlite.xcsm:177
static const String DRIVERNAME
Definition Sqlite.xcsm:6
static bool registry()
Definition Sqlite.xcsm:8
int commit()
Definition Sqlite.xcsm:212
long getLastInsertedRowId()
Definition Sqlite.xcsm:181
long prepare(String sql)
Definition Sqlite.xcsm:247
static const int SYNCHRONOUS_FULL
Definition Sqlite.xcsm:196
int enableSycnhronous(int n)
Definition Sqlite.xcsm:200
Sql.Statement createStatement() override
Definition Sqlite.xcsm:173
Sql.PreparedStatement prepareStatement(String sql) override
Definition Sqlite.xcsm:169
void setOption(int opt, Object option) override
Definition Sqlite.xcsm:149
String getError() override
Definition Sqlite.xcsm:160
int rollback()
Definition Sqlite.xcsm:216
static bool registried
Definition Sqlite.xcsm:129
String generateErrorText(long herr, String fallback)
Definition Sqlite.xcsm:220
int get_changes()
Definition Sqlite.xcsm:243
字符串类
int length()
bool equals(String)
Definition xsql.xcs:3