PageRenderTime 27ms CodeModel.GetById 29ms RepoModel.GetById 0ms app.codeStats 0ms

/eda/drivers/MySQL.ec

https://github.com/thexa4/sdk
C | 722 lines | 609 code | 74 blank | 39 comment | 98 complexity | 127951c97ce0e16ea96b1dce9478e62a MD5 | raw file
  1. import "ecere"
  2. import "eda"
  3. define MySQL = "MySQL";
  4. #ifdef COMMENTED_OUT_MYSQL_NEED_MATCH_MODIFIED_DRIVER_STRUCTURE
  5. #include <stdio.h>
  6. #include <stdarg.h>
  7. #include <mysql.h>
  8. #define DEFALT_SQL_STMT "SELECT * FROM db"
  9. static MySqlLib mySqlLib;
  10. static void LogMySqlError(MYSQL * mySql, String msg)
  11. {
  12. Logf("%s\n MySql Error: #%d %s\n", msg, mysql_errno(mySql), mysql_error(mySql));
  13. }
  14. static void LogMySqlErrorf(MYSQL * mySql, String format, ...)
  15. {
  16. char msg[MAX_F_STRING];
  17. va_list args;
  18. va_start(args, format);
  19. vsprintf(msg, format, args);
  20. va_end(args);
  21. Logf("%s\n MySql Error: #%d %s\n", msg, mysql_errno(mySql), mysql_error(mySql));
  22. }
  23. static class MySqlLib
  24. {
  25. MySqlLib()
  26. {
  27. mysql_library_init(0, null, null);
  28. }
  29. ~MySqlLib()
  30. {
  31. mysql_library_end();
  32. }
  33. }
  34. static class MySqlDataSource : struct
  35. {
  36. public:
  37. MYSQL * mySql;
  38. }
  39. static class MySqlDatabase : struct
  40. {
  41. public:
  42. MYSQL * mySql;
  43. MySqlDataSource src;
  44. }
  45. static class MySqlTable : struct
  46. {
  47. public:
  48. MYSQL * mySql;
  49. MYSQL_RES * myRes;
  50. MySqlDatabase dDb;
  51. MySqlField dFld;
  52. MySqlRow dRow;
  53. Field fld;
  54. Row row;
  55. }
  56. static class MySqlField : struct
  57. {
  58. public:
  59. MYSQL_FIELD * myFlds;
  60. MySqlTable dTbl;
  61. uint fldsCount;
  62. uint fldsPos;
  63. }
  64. static class MySqlRow : struct
  65. {
  66. public:
  67. MYSQL_ROW myRow;
  68. unsigned long *myLengths;
  69. MySqlTable dTbl;
  70. MySqlField dFld;
  71. Field fld;
  72. uint rowsCount;
  73. uint rowsPos;
  74. }
  75. class MySqlDataDriver : DataDriver
  76. {
  77. public:
  78. class_property(name) = "MySql";
  79. /* -------------------------------------------------------------------------------------------------- */
  80. /* --- Driver --------------------------------------------------------------------------------------- */
  81. uint ::DriverDefaultPort()
  82. {
  83. return MYSQL_PORT;
  84. }
  85. /* -------------------------------------------------------------------------------------------------- */
  86. /* --- Data Source ---------------------------------------------------------------------------------- */
  87. void ::SourceClose(DataSource ds)
  88. {
  89. MySqlDataSource src = (MySqlDataSource)ds.driverData;
  90. if(src)
  91. {
  92. if(src.mySql) mysql_close(src.mySql);
  93. delete src;
  94. ds.driverData = null;
  95. }
  96. }
  97. void ::SourceStatus(DataSource ds)
  98. {
  99. MySqlDataSource src = (MySqlDataSource)ds.driverData;
  100. const String pszT;
  101. Log(" ********************************************* \n");
  102. Log(" * MySql Status Info * \n");
  103. Log(" ********************************************* \n");
  104. pszT = mysql_get_client_info(); Logf(" Client info: %s\n", pszT);
  105. pszT = mysql_get_host_info(src.mySql); Logf(" Host info: %s\n", pszT);
  106. pszT = mysql_get_server_info(src.mySql); Logf(" Server info: %s\n", pszT);
  107. Log(" _____________________________________\n\n");
  108. Log(" ********************************************* \n");
  109. Log(" * Stats * \n");
  110. Log(" ********************************************* \n");
  111. pszT = mysql_stat(src.mySql); Logf(" %s\n", pszT);
  112. Log(" _____________________________________\n\n");
  113. }
  114. bool ::SourceConnect(DataSource ds, const String host, const String user, const String password, uint port)
  115. {
  116. bool success = false;
  117. MySqlDataSource src {};
  118. if(!mySqlLib) mySqlLib = { };
  119. if(src.mySql) mysql_close(src.mySql);
  120. if(src.mySql = mysql_init((MYSQL *) 0))
  121. {
  122. if(mysql_real_connect(src.mySql, host, user, password, null, port, null, 0))
  123. {
  124. src.mySql->reconnect = 1;
  125. success = true;
  126. }
  127. else
  128. {
  129. LogMySqlErrorf(src.mySql, "Can't connect to the mysql server on port %d !\n", port);
  130. mysql_close(src.mySql);
  131. }
  132. }
  133. else
  134. {
  135. LogMySqlError(src.mySql, "Can't initialize mysql socket");
  136. mysql_close(src.mySql);
  137. }
  138. ds.driverData = (void *)src;
  139. return success;
  140. }
  141. uint ::SourceDatabasesCount(DataSource ds)
  142. {
  143. MySqlDataSource src = (MySqlDataSource)ds.driverData;
  144. Log("TODO: MySql - DataSourceDatabasesCount");
  145. return 0;
  146. }
  147. /* -------------------------------------------------------------------------------------------------- */
  148. /* --- Database ------------------------------------------------------------------------------------- */
  149. void ::DatabaseClose(Database db)
  150. {
  151. MySqlDatabase dDb = (MySqlDatabase)db.driverData;
  152. Log("TODO: MySql - DatabaseClose");
  153. }
  154. uint ::DatabaseTablesCount(Database db)
  155. {
  156. MySqlDatabase dDb = (MySqlDatabase)db.driverData;
  157. Log("TODO: MySql - DatabaseTablesCount");
  158. return 0;
  159. }
  160. uint ::DatabaseViewsCount(Database db)
  161. {
  162. MySqlDatabase dDb = (MySqlDatabase)db.driverData;
  163. Log("TODO: MySql - DatabaseViewsCount");
  164. return 0;
  165. }
  166. String ::DatabaseNameGet(Database db)
  167. {
  168. MySqlDatabase dDb = (MySqlDatabase)db.driverData;
  169. Log("TODO: MySql - DatabaseNameGet");
  170. return null;
  171. }
  172. bool ::DatabaseNameSet(Database db, const String value)
  173. {
  174. MySqlDatabase dDb = (MySqlDatabase)db.driverData;
  175. Log("TODO: MySql - DatabaseNameSet");
  176. return false;
  177. }
  178. bool ::DatabaseOpen(Database db, DataSource ds, const String name, OpenOptions options)
  179. {
  180. MySqlDataSource src = (MySqlDataSource)ds.driverData;
  181. MySqlDatabase dDb { mySql = src.mySql, src = src };
  182. Table databases;
  183. db.driver = ds.driver;
  184. db.driverData = (void *)dDb;
  185. databases = ds.OpenTable(null, { databasesList });
  186. if(databases)
  187. {
  188. if(databases.row.field.Seek("SCHEMA_NAME", firstEqual))
  189. {
  190. if(!databases.row.Seek(name, firstEqual))
  191. {
  192. if(options.create == create)
  193. {
  194. char ddl[MAX_F_STRING];
  195. sprintf(ddl, "CREATE DATABASE IF NOT EXISTS %s", name); // [[DEFAULT] CHARACTER SET, [[DEFAULT] COLLATE]]
  196. if(mysql_query(src.mySql, ddl))
  197. LogMySqlErrorf(src.mySql, "Couldn't execute DDL statement on the server!\n %s", ddl);
  198. }
  199. else
  200. {
  201. Logf("Database (%s) does not exist.\n", name);
  202. return false;
  203. }
  204. }
  205. }
  206. else
  207. Log("Unable to detect if database exists!\n");
  208. databases.Close();
  209. }
  210. else
  211. Log("Unable to detect if database exists!\n");
  212. if(mysql_select_db(dDb.mySql, name) < 0)
  213. {
  214. LogMySqlErrorf(src.mySql, "Can't open the %s database!\n", db);
  215. return false;
  216. }
  217. return true;
  218. }
  219. bool ::DatabaseDelete(Database db, DataSource ds, const String name)
  220. {
  221. if(db)
  222. {
  223. MySqlDatabase dDb = (MySqlDatabase)db.driverData;
  224. }
  225. else
  226. {
  227. MySqlDataSource src = (MySqlDataSource)ds.driverData;
  228. }
  229. Log("TODO: MySql - DatabaseDelete");
  230. return false;
  231. }
  232. /* -------------------------------------------------------------------------------------------------- */
  233. /* --- Table ---------------------------------------------------------------------------------------- */
  234. void ::TableClose(Table tbl)
  235. {
  236. MySqlTable dTbl = (MySqlTable)tbl.driverData;
  237. if(dTbl.myRes) mysql_free_result(dTbl.myRes);
  238. }
  239. uint ::TableFieldsCount(Table tbl)
  240. {
  241. MySqlTable dTbl = (MySqlTable)tbl.driverData;
  242. return mysql_num_fields(dTbl.myRes);
  243. }
  244. uint ::TableRowsCount(Table tbl)
  245. {
  246. MySqlTable dTbl = (MySqlTable)tbl.driverData;
  247. return (uint)mysql_num_rows(dTbl.myRes);
  248. }
  249. Field ::TableField(Table tbl)
  250. {
  251. MySqlTable dTbl = (MySqlTable)tbl.driverData;
  252. if(!dTbl.fld)
  253. {
  254. dTbl.dFld = MySqlField { mysql_fetch_fields(dTbl.myRes), dTbl = dTbl, fldsCount = mysql_num_fields(dTbl.myRes), fldsPos = -1 };
  255. dTbl.fld = Field { driver = tbl.driver, driverData = dTbl.dFld };
  256. }
  257. return dTbl.fld;
  258. }
  259. Row ::TableRow(Table tbl)
  260. {
  261. MySqlTable dTbl = (MySqlTable)tbl.driverData;
  262. if(!dTbl.row)
  263. {
  264. dTbl.dRow = MySqlRow { dTbl = dTbl, rowsCount = (uint)mysql_num_rows(dTbl.myRes), rowsPos = -1 };
  265. dTbl.row = Row { driver = tbl.driver, driverData = dTbl.dRow };
  266. }
  267. return dTbl.row;
  268. }
  269. String ::TableNameGet(Table tbl)
  270. {
  271. MySqlTable dTbl = (MySqlTable)tbl.driverData;
  272. Log("TODO: MySql - TableNameGet");
  273. return null;
  274. }
  275. bool ::TableNameSet(Table tbl, const String value)
  276. {
  277. MySqlTable dTbl = (MySqlTable)tbl.driverData;
  278. Log("TODO: MySql - TableNameSet");
  279. return false;
  280. }
  281. bool ::TableOpen(Table tbl, Database db, DataSource ds, const String query, OpenOptions options)
  282. {
  283. char sql[MAX_F_STRING];
  284. MySqlDataSource src;
  285. MySqlDatabase dDb;
  286. MySqlTable dTbl { };
  287. Table tables;
  288. tbl.driverData = (void *)dTbl;
  289. if(db)
  290. {
  291. dDb = (MySqlDatabase)db.driverData;
  292. src = dDb.src;
  293. dTbl.mySql = dDb.mySql;
  294. tbl.driver = db.driver;
  295. if(options.type == tableRows)
  296. tables = db.OpenTable(null, { tablesList });
  297. else if(options.type == viewRows)
  298. ;
  299. }
  300. else
  301. {
  302. src = (MySqlDataSource)ds.driverData;
  303. dTbl.mySql = src.mySql;
  304. tbl.driver = ds.driver;
  305. if(options.type == tableRows)
  306. tables = ds.OpenTable(null, { tablesList });
  307. else if(options.type == viewRows)
  308. ;
  309. }
  310. if(options.type == tableRows)
  311. {
  312. if(tables)
  313. {
  314. if(tables.row.field.Seek("TABLE_NAME", firstEqual))
  315. {
  316. if(!tables.row.Seek(query, firstEqual))
  317. {
  318. if(options.create == create)
  319. {
  320. char ddl[MAX_F_STRING];
  321. sprintf(ddl, "CREATE TABLE IF NOT EXISTS %s (a INT);", query);
  322. if(mysql_query(src.mySql, ddl))
  323. LogMySqlErrorf(src.mySql, "Couldn't execute DDL statement on the server!\n %s", ddl);
  324. }
  325. else
  326. {
  327. Logf("Table (%s) does not exist.\n", query);
  328. return false;
  329. }
  330. }
  331. }
  332. else
  333. Log("Unable to detect if table exists!\n");
  334. tables.Close();
  335. }
  336. else
  337. Log("Unable to detect if table exists!\n");
  338. }
  339. switch(options.type)
  340. {
  341. case queryRows:
  342. if(!mysql_query(dTbl.mySql, query))
  343. {
  344. if(options.access == integral)
  345. dTbl.myRes = mysql_store_result(dTbl.mySql);
  346. else
  347. dTbl.myRes = mysql_use_result(dTbl.mySql);
  348. }
  349. else
  350. LogMySqlErrorf(dTbl.mySql, "Couldn't execute %s on the server!", sql);
  351. break;
  352. case tableRows:
  353. sprintf(sql, "SELECT * FROM %s", query);
  354. if(!mysql_query(dTbl.mySql, sql))
  355. {
  356. if(options.access == integral)
  357. dTbl.myRes = mysql_store_result(dTbl.mySql);
  358. else
  359. dTbl.myRes = mysql_use_result(dTbl.mySql);
  360. }
  361. else
  362. LogMySqlErrorf(dTbl.mySql, "Couldn't execute %s on the server!", sql);
  363. break;
  364. case viewRows:
  365. break;
  366. case processesList:
  367. dTbl.myRes = mysql_list_processes(dTbl.mySql);
  368. break;
  369. case databasesList:
  370. dTbl.myRes = mysql_list_dbs(dTbl.mySql, null);
  371. break;
  372. case tablesList:
  373. dTbl.myRes = mysql_list_tables(dTbl.mySql, null);
  374. break;
  375. case fieldsList:
  376. sprintf(sql, "SHOW COLUMNS FROM %s", query);
  377. if(!mysql_query(dTbl.mySql, sql))
  378. dTbl.myRes = mysql_store_result(dTbl.mySql);
  379. else
  380. LogMySqlErrorf(dTbl.mySql, "Listing fields for table %s failed!", query);
  381. break;
  382. }
  383. if(dTbl.myRes)
  384. {
  385. //dTbl.fldsCount = mysql_num_fields(dTbl.myRes);
  386. //dTbl.flds = mysql_fetch_fields(dTbl.myRes);
  387. //dTbl.fldsPos = 0;
  388. return true;
  389. }
  390. return false;
  391. }
  392. bool ::TableDelete(Table tbl, Database db, const String name)
  393. {
  394. if(tbl)
  395. {
  396. MySqlTable dTbl = (MySqlTable)tbl.driverData;
  397. }
  398. else
  399. {
  400. MySqlDatabase dDb = (MySqlDatabase)db.driverData;
  401. }
  402. Log("TODO: MySql - TableDelete");
  403. return false;
  404. }
  405. /* -------------------------------------------------------------------------------------------------- */
  406. /* --- Field ---------------------------------------------------------------------------------------- */
  407. bool FieldEnd(Field fld)
  408. {
  409. MySqlField dFld = (MySqlField)fld.driverData;
  410. return dFld.fldsPos == dFld.fldsCount;
  411. }
  412. bool FieldNext(Field fld)
  413. {
  414. MySqlField dFld = (MySqlField)fld.driverData;
  415. /*if(dFld.fldsPos == -1)
  416. ;//dFld.fldsPos = 0;
  417. */
  418. if(dFld.fldsPos == dFld.fldsCount)
  419. return false;
  420. dFld.fldsPos++;
  421. return true;
  422. }
  423. bool FieldPrevious(Field fld)
  424. {
  425. MySqlField dFld = (MySqlField)fld.driverData;
  426. if(dFld.fldsPos == -1)
  427. dFld.fldsPos = dFld.fldsCount ? dFld.fldsCount + 1 : 0;
  428. else if(dFld.fldsPos == 0)
  429. {
  430. dFld.fldsPos = dFld.fldsCount;
  431. return false;
  432. }
  433. dFld.fldsPos--;
  434. return true;
  435. }
  436. bool FieldSeek(Field fld, String value, SeekOptions options)
  437. {
  438. MySqlField dFld = (MySqlField)fld.driverData;
  439. if(options == reset)
  440. {
  441. if(dFld.fldsCount)
  442. {
  443. dFld.fldsPos = -1;
  444. return true;
  445. }
  446. }
  447. else if(options == first)
  448. {
  449. if(dFld.fldsCount)
  450. {
  451. dFld.fldsPos = 0;
  452. return true;
  453. }
  454. }
  455. else if(options == firstEqual)
  456. {
  457. int len = strlen(value);
  458. for(dFld.fldsPos = 0; dFld.fldsPos < dFld.fldsCount; dFld.fldsPos++)
  459. if(dFld.myFlds[dFld.fldsPos].org_name_length == len && !strncmp(dFld.myFlds[dFld.fldsPos].org_name, value, len))
  460. break;
  461. if(dFld.fldsPos == dFld.fldsCount)
  462. {
  463. dFld.fldsPos = -1;
  464. return false;
  465. }
  466. return true;
  467. }
  468. else if(options == last)
  469. {
  470. if(dFld.fldsCount)
  471. {
  472. dFld.fldsPos = dFld.fldsCount - 1;
  473. return true;
  474. }
  475. }
  476. else if(options == none)
  477. {
  478. dFld.fldsPos = -1;
  479. return false;
  480. }
  481. return false;
  482. }
  483. String ::FieldNameGet(Field fld)
  484. {
  485. MySqlField dFld = (MySqlField)fld.driverData;
  486. String name = new char [dFld.myFlds[dFld.fldsPos].org_name_length + 1];
  487. strncpy(name, dFld.myFlds[dFld.fldsPos].org_name, dFld.myFlds[dFld.fldsPos].org_name_length);
  488. name[dFld.myFlds[dFld.fldsPos].org_name_length] = '\0';
  489. return name;
  490. }
  491. bool ::FieldNameSet(Field fld, const String value)
  492. {
  493. MySqlField dFld = (MySqlField)fld.driverData;
  494. Log("TODO: MySql - FieldNameSet");
  495. return false;
  496. }
  497. /* -------------------------------------------------------------------------------------------------- */
  498. /* --- Row ------------------------------------------------------------------------------------------ */
  499. Field ::RowField(Row row)
  500. {
  501. MySqlRow dRow = (MySqlRow)row.driverData;
  502. MySqlTable dTbl = dRow.dTbl;
  503. if(!dRow.fld)
  504. {
  505. dRow.dFld = MySqlField { mysql_fetch_fields(dTbl.myRes), dTbl, mysql_num_fields(dTbl.myRes), -1 };
  506. dRow.fld = Field { driver = row.driver, driverData = dRow.dFld };
  507. }
  508. return dRow.fld;
  509. }
  510. bool ::RowEnd(Row row)
  511. {
  512. MySqlRow dRow = (MySqlRow)row.driverData;
  513. return dRow.rowsPos == dRow.rowsCount;
  514. }
  515. bool ::RowNext(Row row)
  516. {
  517. MySqlRow dRow = (MySqlRow)row.driverData;
  518. MySqlTable dTbl = dRow.dTbl;
  519. if(dRow.rowsPos == -1)
  520. dRow.rowsPos = 0;
  521. if(dRow.rowsPos == dRow.rowsCount)
  522. return false;
  523. dRow.rowsPos++;
  524. dRow.myRow = mysql_fetch_row(dTbl.myRes); // this won't work in all situations...
  525. dRow.myLengths = mysql_fetch_lengths(dTbl.myRes);
  526. return true;
  527. }
  528. bool ::RowPrevious(Row row)
  529. {
  530. MySqlRow dRow = (MySqlRow)row.driverData;
  531. MySqlTable dTbl = dRow.dTbl;
  532. if(dRow.rowsPos == -1)
  533. dRow.rowsPos = dRow.rowsCount ? dRow.rowsCount + 1 : 0;
  534. else if(dRow.rowsPos == 0)
  535. {
  536. dRow.rowsPos = dRow.rowsCount;
  537. return false;
  538. }
  539. dRow.rowsPos--;
  540. dRow.myRow = mysql_fetch_row(dTbl.myRes); // this won't work at all...
  541. Log("TODO: MySql - FieldNameSet");
  542. return false;
  543. return true;
  544. }
  545. bool ::RowSeek(Row row, const String value, SeekOptions options)
  546. {
  547. MySqlRow dRow = (MySqlRow)row.driverData;
  548. if(options == first || options == reset)
  549. {
  550. if(dRow.rowsCount)
  551. {
  552. dRow.rowsPos = -1;
  553. mysql_data_seek(dRow.dTbl.myRes, 0);
  554. if(options == first)
  555. row.Next(row);
  556. return true;
  557. }
  558. }
  559. else if(options == firstEqual)
  560. {
  561. dRow.rowsPos = -1;
  562. mysql_data_seek(dRow.dTbl.myRes, 0);
  563. while(row.Next(row))
  564. if(!strcmp(row.stringValue, value))
  565. return true;
  566. return false;
  567. }
  568. /*else if(options == Last)
  569. {
  570. if(dFld.fldsCount)
  571. {
  572. dFld.fldsPos = dFld.fldsCount - 1;
  573. return true;
  574. }
  575. }*/
  576. /*else if(options == null)
  577. {
  578. dFld.fldsPos = -1;
  579. return false;
  580. }*/
  581. //Log("TODO: MySql - RowSeek");
  582. return false;
  583. }
  584. String ::RowStringValueGet(Row row)
  585. {
  586. char temp[4096];
  587. MySqlRow dRow = (MySqlRow)row.driverData;
  588. MySqlTable dTbl = dRow.dTbl;
  589. MySqlField dFld = dRow.dFld;
  590. switch(dFld.myFlds[dFld.fldsPos].type)
  591. {
  592. case FIELD_TYPE_TINY:
  593. case FIELD_TYPE_SHORT:
  594. case FIELD_TYPE_LONG:
  595. case FIELD_TYPE_INT24:
  596. case FIELD_TYPE_LONGLONG:
  597. {
  598. char temp[32];
  599. sprintf(temp, "%d", dRow.myRow[dFld.fldsPos]);
  600. return CopyString(temp);
  601. }
  602. case FIELD_TYPE_DECIMAL:
  603. return CopyString("FIELD_TYPE_DECIMAL");
  604. case FIELD_TYPE_FLOAT:
  605. return CopyString("FIELD_TYPE_FLOAT");
  606. case FIELD_TYPE_DOUBLE:
  607. return CopyString("FIELD_TYPE_DOUBLE");
  608. case FIELD_TYPE_TIMESTAMP:
  609. return CopyString("FIELD_TYPE_TIMESTAMP");
  610. case FIELD_TYPE_DATE:
  611. return CopyString("FIELD_TYPE_DATE");
  612. case FIELD_TYPE_TIME:
  613. return CopyString("FIELD_TYPE_TIME");
  614. case FIELD_TYPE_DATETIME:
  615. return CopyString("FIELD_TYPE_DATETIME");
  616. case FIELD_TYPE_YEAR:
  617. return CopyString("FIELD_TYPE_YEAR");
  618. case FIELD_TYPE_STRING:
  619. return dRow.myRow[dFld.fldsPos];
  620. case FIELD_TYPE_VAR_STRING:
  621. return dRow.myRow[dFld.fldsPos];
  622. case FIELD_TYPE_BLOB:
  623. return CopyString("FIELD_TYPE_BLOB");
  624. case FIELD_TYPE_SET:
  625. return CopyString("FIELD_TYPE_SET");
  626. case FIELD_TYPE_ENUM:
  627. return CopyString("FIELD_TYPE_ENUM");
  628. case FIELD_TYPE_NULL:
  629. return CopyString("FIELD_TYPE_NULL");
  630. //case FIELD_TYPE_CHAR:
  631. // return CopyString("FIELD_TYPE_CHAR");
  632. default:
  633. return CopyString("DEFAULT");
  634. }
  635. //sprintf(temp, "%.*s", (int)dRow.myLengths[dFld.fldsPos], dRow.myRow[dFld.fldsPos] ? dRow.myRow[dFld.fldsPos] : "null");
  636. /*if(!dFld || dRow.myRow[dFld.fldsPos] == null || !strlen(dRow.myRow[dFld.fldsPos]))
  637. return null;
  638. return dRow.myRow[dFld.fldsPos];*/
  639. //return CopyString(temp);
  640. }
  641. bool ::RowStringValueSet(Row row, const String value)
  642. {
  643. MySqlRow dRow = (MySqlRow)row.driverData;
  644. Log("TODO: MySql - RowStringValueSet");
  645. return false;
  646. }
  647. }
  648. #endif