Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Allow semi-colons in the data source file name. Fix for ticket [e47b3d8346]. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
8e0bb4c6cde559d6a5277cb00fb47853 |
User & Date: | mistachkin 2013-05-01 00:06:00.044 |
Context
2013-05-01
| ||
00:28 | Update to comments and version history docs. check-in: 37f936471c user: mistachkin tags: trunk | |
00:06 | Allow semi-colons in the data source file name. Fix for ticket [e47b3d8346]. check-in: 8e0bb4c6cd user: mistachkin tags: trunk | |
2013-04-30
| ||
00:29 | Update release version to 1.0.86.0. check-in: 545d22c1ff user: mistachkin tags: trunk | |
Changes
Changes to System.Data.SQLite/SQLiteConnection.cs.
︙ | ︙ | |||
1398 1399 1400 1401 1402 1403 1404 | internal static SortedList<string, string> ParseConnectionString(string connectionString) { string s = connectionString; int n; SortedList<string, string> ls = new SortedList<string, string>(StringComparer.OrdinalIgnoreCase); // First split into semi-colon delimited values. | | | 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 | internal static SortedList<string, string> ParseConnectionString(string connectionString) { string s = connectionString; int n; SortedList<string, string> ls = new SortedList<string, string>(StringComparer.OrdinalIgnoreCase); // First split into semi-colon delimited values. string[] arParts = SQLiteConvert.NewSplit(s, ';', true); int x = arParts.Length; // For each semi-colon piece, split into key and value pairs by the presence of the = sign for (n = 0; n < x; n++) { if (arParts[n] == null) continue; |
︙ | ︙ |
Changes to System.Data.SQLite/SQLiteConvert.cs.
︙ | ︙ | |||
502 503 504 505 506 507 508 509 510 511 512 513 514 515 | } string[] ar = new string[ls.Count]; ls.CopyTo(ar, 0); return ar; } /// <summary> /// Convert a value to true or false. /// </summary> /// <param name="source">A string or number representing true or false</param> /// <returns></returns> public static bool ToBoolean(object source) | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 | } string[] ar = new string[ls.Count]; ls.CopyTo(ar, 0); return ar; } /// <summary> /// Splits the specified string into multiple strings based on a separator /// and returns the result as an array of strings. /// </summary> /// <param name="value"> /// The string to split into pieces based on the separator character. If /// this string is null, null will always be returned. If this string is /// empty, an array of zero strings will always be returned. /// </param> /// <param name="separator"> /// The character used to divide the original string into sub-strings. /// This character cannot be a backslash or a double-quote; otherwise, no /// work will be performed and null will be returned. /// </param> /// <param name="keepQuote"> /// If this parameter is non-zero, all double-quote characters will be /// retained in the returned list of strings; otherwise, they will be /// dropped. /// </param> /// <returns> /// The new array of strings or null if the input string is null -OR- the /// separator character is a double-quote (i.e. the character that is /// normally used to escape separator characters). /// </returns> internal static string[] NewSplit( string value, char separator, bool keepQuote ) { const char EscapeChar = '\\'; const char QuoteChar = '\"'; // // NOTE: It is illegal for the separator character to be either a // backslash or a double-quote because both of those characters // are used for escaping other characters (e.g. the separator // character). // if ((separator == EscapeChar) || (separator == QuoteChar)) return null; if (value == null) return null; int length = value.Length; if (length == 0) return new string[0]; List<string> list = new List<string>(); StringBuilder element = new StringBuilder(); int index = 0; bool escape = false; bool quote = false; while (index < length) { char character = value[index++]; if (escape) { // // HACK: Only consider the escape character to be an actual // "escape" if it is followed by a reserved character; // otherwise, emit the original escape character and // the current character in an effort to help preserve // the original string content. // if ((character != EscapeChar) && (character != QuoteChar) && (character != separator)) { element.Append(EscapeChar); } element.Append(character); escape = false; } else if (character == EscapeChar) { escape = true; } else if (character == QuoteChar) { if (keepQuote) element.Append(character); quote = !quote; } else if (character == separator) { if (quote) { element.Append(character); } else { list.Add(element.ToString()); element.Length = 0; } } else { element.Append(character); } } // // NOTE: An unbalanced escape or quote character in the string is // considered to be a fatal error; therefore, return null. // if (escape || quote) return null; if (element.Length > 0) list.Add(element.ToString()); return list.ToArray(); } /// <summary> /// Convert a value to true or false. /// </summary> /// <param name="source">A string or number representing true or false</param> /// <returns></returns> public static bool ToBoolean(object source) |
︙ | ︙ |
Added Tests/tkt-e47b3d8346.eagle.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | ############################################################################### # # tkt-e47b3d8346.eagle -- # # Written by Joe Mistachkin. # Released to the public domain, use at your own risk! # ############################################################################### package require Eagle package require Eagle.Library package require Eagle.Test runTestPrologue ############################################################################### package require System.Data.SQLite.Test runSQLiteTestPrologue ############################################################################### runTest {test tkt-e47b3d8346-1.1 {parse semi-colon in data source} -setup { unset -nocomplain result list pair } -body { set result [list] set list [object invoke -flags +NonPublic \ System.Data.SQLite.SQLiteConnection ParseConnectionString \ {Data Source="C:\full\path\to\file.db;more.data.here";}] object foreach -alias pair $list { lappend result [list [$pair Key] [$pair Value]] } set result } -cleanup { unset -nocomplain result list pair } -constraints {eagle System.Data.SQLite} -result \ {{{Data Source} {C:\full\path\to\file.db;more.data.here}}}} ############################################################################### runSQLiteTestEpilogue runTestEpilogue |