Sunday, April 27, 2025

Bible Study Chronological Flowchart

The following is a detailed explanation of the Bible study chronological flowchart project steps. It consists of six steps executed over a week, including preparing, researching, bridging the gaps, conducting word studies, interpreting the text, and forming life applications designed for the significant steps of the process. The flowchart begins with one’s unfamiliarity with the text and a desire to learn more about what God is communicating in the passage. It ends with familiarity, a well-informed interpretation, and life applications. 


Preparing

The first step is to prepare oneself for study. This requires choosing a passage to study, which may be an interesting topic or theme or an assigned reading. Once the text is selected, one should read it at least once using their favorite English Bible translation. Then, identify what comes before and after to locate it in its context.

This will provide a greater understanding of the text in terms of how it communicates essential ideas and, more importantly, how it fits into its local context. While reading the text, one should record observations, such as interesting topics, word choice, or themes that become apparent. For example, one should make observations asking questions of the text, such as who is in view or what is the topic, elucidate meaning by asking what happened and why, and finally identify any application or result of what was communicated.[1]

After reading through the text in its context, choose two or more English Bible translations that include study resources such as references, footnotes, and Scripture chains (references to related Scripture), either using electronic resources, such as an online Bible or a Bible software application (app), or paper books. Reread the passage using the alternative English translations, citing additional ideas or insights.

Finally, one or more Bible commentaries will be invaluable when working with difficult passages. Select at least two commentaries. Commentaries range in complexity from pastoral to technical. Christian Books organizes Bible commentaries under “Pastoral and Easy to Read” and “Technical and Semi-technical.”[2] Pastoral commentaries are easier to read and typically contain general information about the book and its relation to the canon of Scripture, a single or blended view of its interpretation, and life applications. Technical commentaries typically contain discussions of the literature genre, multiple views of interpretation, discussions of the significance of central themes, current academic topics, and references to and discussions of the original language. Which complexity and commentary you choose depends mainly on the level of detail required of the audience, the subject matter, and the goals for the lesson.

For example, suppose one were studying a passage from the Book of Hebrews. In that case, one should select commentaries that include biblical theology views, such as Schreiner’s Hebrews,[3] and a commentary on Hebrews with life application, such as Guthrie’s Hebrews.[4]

Devote a day (or session) to this step, ensuring the notes taken during the reading are preserved. After completing this step, one should have recorded the passage’s location in the book and chapter. Having read the text several times, one should be familiar with it and have made notes about interesting things found in it. Reading the text in preparation for deeper study is essential for practical and effective research.

Researching

Once the initial preparation step is complete, research the passage and its context, hence metadata, and identify any major topics or theological themes. Begin by locating the passage in the canon (chapter, book, testament), the author, date written, economic or political situation (if known), culture, and the major themes included in the passage. A good study Bible or a Bible overview guide, such as The Bible Guide: a Concise Overview of All 66 Books,[5] can provide the metadata about the passage. A Bible background text, such as The IVP Bible Background Commentary on the Old Testament,[6] and New Testament,[7] can provide additional information about the passage and its historical context.

Once the metadata has been recorded, reread the passage slowly and look for any topics or theological concepts that were not obvious from previous readings. For example, consider the author's viewpoints, the original audience, and their cultural, economic, and political conditions, making observations from ancient views.

Finally, outline the passage to list its major statements, concepts, and ideas. Use simple statements that summarize each section and reference the verse or verses that comprise the idea. For example, one could write of Hebrews 10:26-27 that the concept is “Deliberate sin results in fire and judgement (26-27).” An outline will be a helpful guide as one continues to reread and observe.

Devote a day (or session) to this step to ensure research is sound and all available metadata has been recorded. After this step, one should have identified the original author, audience, and cultural application. One will also have recorded and cited where the passage appears in the chapter, book, and testament canon. Finally, by rereading the passage from the historical context, one should have added any topics and theological themes to one’s notes. Researching the passage in this manner prepares one to take the next step to apply the passage to today, which is called bridging the gaps from then to now.

Bridging the Gaps

Once the research step is complete, analyze the text to understand how it was used in its original context and identify any gaps in understanding. Begin by rereading the passage with the historical context in mind. When doing so, locate any principles or ideas that may differ from then and now, including barriers that must be overcome to bridge the gaps of distance from the author's context and original audience to the modern interpreter.[8] The four barriers to distance are as follows: 1) distance of time, 2) cultural distance, 3) geographical distance, and 4) distance of language. These challenges for biblical interpretation require one to understand that the text was written “to someone who lived a long time ago in another part of the world where they spoke a different language and had different cultural values.”[9]

Once one has identified the gaps and formed conclusions regarding the differences (filling the gaps), reread the text and note any additional topics, interesting or unusual wording, or issues that may or may not relate to today easily. The goal is to form a picture of how the passage was used in its historical context. Should one encounter doubt or missing information, such as cultural nuances or mentions of historical events not already researched, one should return to the research step to find the missing data and repeat this step.

Devote a day (or session) to this step to ensure one fully understands the passage's context and historical application. Having identified the gaps and filled them, one should understand how the passage applies to today. After completion, one should better understand how the passage relates to Christians today. This knowledge will help conduct an in-depth study of keywords by reading the text critically.

Studying Keywords

Having identified the historical context and bridged the gap to today, study the unique or unusual words (keywords) in their original language to help interpret the passage, which requires choosing words for study,[10] determining what the word could mean,[11] and deciding the best meaning for its context in the text.[12]

Begin by reading the passage in parallel using the alternative English Bible translations and selecting words one may want to investigate. A keyword study Bible, in various English translations, can help identify the essential keywords. Choose those words that seem crucial, repeat figures of speech, or unclear or complicated words, used figuratively, theologically significant, critical to the passage, or rarely used elsewhere in the Bible. The general principle is to select words worthy of additional study. Studying every word is unnecessary, but it is better to identify as many words as possible, even if it means discarding easily understood ones.

The second step is more involved; often keywords are likely to have more than one meaning, and only some, ideally one, meaning best fits the context. When researching the word, identify all possible meanings by first using a concordance to find the word in the original language (Hebrew, Greek)[13] and then conducting context studies to locate where the word appears elsewhere in the Bible for each meaning.[14] One can also use an original language lexicon to identify all of the likely meanings of the word. Some lexicons provide additional details on the likelihood of each of the meanings. This will help determine the most likely meanings of the word. The goal is to determine all possible meanings of the word that fit the context.

Finally, examine the list of keyword meanings, compare them to the passage's context, and choose those that best fit the modern context. The goal is not to rewrite Scripture but to inject meaning that relates best to today without violating the original text's original principles, theological concepts, and purpose. Once the best meanings have been identified, rewrite the text using the meanings. Rereading the passage to ensure one has not changed or interjected concepts foreign to the text. The result should be a new text version with minor changes that include the modern meanings and application of the keywords. Repeat this process for each keyword.

Devote a day (or session) to this step to ensure one has identified all the keywords and better understands any alternative meanings and how they may alter the text for the reader. After completion, one should have identified a list of keywords, studied their meanings from key resources, and revised the text with the new or differing meanings. With this information, one is in a good position to interpret the text for today’s audience.

Interpreting the Text

Interpreting the text is the most critical step in the process. The data from the previous steps, including notes on topics, themes, keywords, observations, outline, and revised verses, is vital information needed for a well-researched, accurate interpretation. For example, the keyword studies are designed to peel back the nuances of translation to fix one’s eyes on the original meaning that best fits the context for today. Bridging the gaps helps to identify how the original audience perceived the passage and how a modern audience should perceive the text that is true to its origins. This information is vital to forming a well-researched interpretation.

Begin by identifying any preunderstandings one has formed about the passage. This includes any ideas or concepts one may have learned or been taught about the passage. One should list these before attempting the broader interpretation phase to compare what they have learned to what they thought they understood. This is critical to ensure the interpreter’s mind is open to allow the text to speak for itself.

Next, use the Scripture references in their Bible to read all related passages, making notes on any ideas or concepts that one learns, such as a repeated scene, quotation from the Old Testament, paraphrasing, and similar constructs that may help reveal its importance and context from the past.

Next, review one’s notes on the passage, such as the results of the keyword studies, the revised outline, and other metadata, and form an initial hypothesis about the text, noting any points as sub-bullets in the passage outline from the research step. Having completed that list, consult the work of Bible scholars to validate their findings and discover the advice and conclusions of other scholars. The best resource for helping one interpret the text, aside from one’s observations from previous steps, is to refer to the commentaries selected in the preparation step.

When reading detailed commentaries explaining the chosen passage, one should consider the author’s conclusions and insights, comparing them to one’s findings. Often, the scholar will identify topics or theological themes that have not been considered. Adding their knowledge to one’s study will help one reach a deeper level of familiarity and a well-informed interpretation. In doing so, one should challenge their preunderstanding of the passage, amending it with new insights, and then revise the passage outline created in the research step by adding the insights as sub-bullets for each concept. The result is an outline that contains an interpretation of the text that applies to today’s audience without altering the original application for the original audience.

Should one encounter situations where one’s observations conflict with biblical scholars or result in the rejection of observations made while reading the text, one should return to the study keywords step to help understand how the meanings of additional keywords cited in the commentaries affect interpretation.

Since this is the most critical step in the flowchart, devote at least two days (or sessions) to completing this step. Patience and devotion to thoroughness will pay dividends in the form of greater understanding and appreciation of God’s Word. The result is a set of principles and life applications that one can use to further one’s spiritual growth in Christ.

Forming Life Applications

This final step is where all of one’s work culminates into a revised text that reveals one or more life applications one can apply to one’s life or the life of others. Begin by reviewing one's notes and revising the passage outline. The result should be a text that reveals the key concepts and message of the text to reveal the biblical theological concepts (major events in the Bible centered on God’s redemption of mankind). The goal is to explore God’s Word and reveal God’s truths and life applications for Christians today.

Next, take a few moments and approach the next phase with prayer. Here, one will be looking at the text from a literary viewpoint identifying the genre(s) utilized and reading to identify the parts of the text such as dialogue, questions and answers, theological arguments, names of characters, purpose/result statements, means, conditional clauses, actions/roles of people and God, emotional terms, and the tone of the passage. This helps one form a literary view of the text that can help one identify how the message in the text was communicated to the audience. Take notes concerning these categories and review them, looking for patterns and supporting evidence for any hypothesis or observations made.

This is followed by a contemplative session of asking questions of the text to “understand the author’s original intent in its immediate context,”[15] then identifying the theme or epoch where the passage occurs, including how it relates to Christ’s sacrificial work on the cross. For example, list the main points, themes, or topics one has found in the text and write the answers to the following (or similar) questions horizontally.[16] Place answers for each question on the same line as each main point/theme/topic.

  • Where is this passage located in redemption history, and how does it relate to us?
  • What does this point mean for the non-Christian?
  • What does it mean for us as citizens, employees, and so forth?
  • What does it teach us about Christ?
  • What does it mean for us as individual Christians?
  • What does it mean for our church as a whole?

While one may find some repetition in the answers if the key points are less distinct, the application grid will be beneficial in relating God’s Word, as interpreted, to today. Thus, the application grid’s purpose is to help one get “the whole story right” (biblical theology) and apply “that story to our lives” (systematic theology).[17] It uses the grand redemptive story of the Bible and the lens of the gospel to identify the proper context of a passage within the biblical narrative that reveals the image of God.

Devote a day (or session) to this step to ensure one has a deeper understanding of the passage, its interpretation, and application to one’s life or the life of others. When the steps in the flowchart are complete, one has progressed from relative unfamiliarity with the passage to a completed, informed interpretation, greater familiarity with the text and its message, and a set of life applications that one has learned from God’s Word.

[1] Vern S. Poythress, Reading the Word of God in the Presence of God (Wheaton, IL: Crossway, 2016), https://ebookcentral.proquest.com/lib/liberty/detail.action?docID=6232853, 37-38.

[2] Christianbook, LLC, “Bible Commentaries - Old & New Testaments - Christianbook.com,” Christianbook.com (Christianbook, LLC, 2023), https://www.christianbook.com/page/academic/bible-commentaries?event=Academic.

[3] Thomas R. Schreiner, Hebrews, ed. T. Desmond Alexander et al., Evangelical Biblical Theology Commentary. (Bellingham, WA: Lexham Press, 2020).

[4] George H. Guthrie, Hebrews, The NIV Application Commentary: from Biblical text- to Contemporary Life (Grand Rapids, MI: Zondervan, 1998).

[5] B&H Editorial Staff, The Bible Guide: A Concise Overview of All 66 Books (Nashville, TN: B&H Publishing Group, 2018), https://ebookcentral.proquest.com/lib/liberty/detail.action?docID=5973423.

[6] John H Walton, Victor Harold Matthews, and Mark William Chavalas, The IVP Bible Background Commentary Old Testament (Downers Grove, IL : Intervarsity Press, 2000).

[7] Craig S. Keener, The IVP Bible Background Commentary: New Testament, Second (Downers Grove, IL: Intervarsity Press, 2014).

[8] William W. Klein, Craig L. Blomberg, and Robert L. Hubbard, Introduction to Biblical Interpretation, 3rd ed. (Grand Rapids, MI: Zondervan, 2017), 53-59.

[9] Klein, Blomberg, and Hubbard, Introduction to Biblical Interpretation, 59.

[10] J. Scott Duvall and J. Daniel Hays, Grasping God’s Word: A Hands-on Approach to Reading, Interpreting, and Applying the Bible. (Grand Rapids, MI: Zondervan, 2020), 170-173.

[11] Ibid., 173-180.

[12] Ibid., 180-183.

[13] Duvall and Hays, Grasping God’s Word, 176.

[14] Ibid., 178.

[15] Michael Lawrence, Biblical Theology in the Life of the Church: A Guide for Ministry (Wheaton, IL: Crossway, 2010), 182.

[16] Lawrence, Biblical Theology in the Life of the Church, 183-185.

[17] Ibid., 180.

Bibliography 

B&H Editorial Staff. The Bible Guide: A Concise Overview of All 66 Books. Nashville, TN: B&H Publishing Group, 2018. https://ebookcentral.proquest.com/lib/liberty/detail.action?docID=5973423.

Christianbook, LLC. “Bible Commentaries - Old & New Testaments - Christianbook.com.” Christianbook.com. Christianbook, LLC, 2023. https://www.christianbook.com/page/academic/bible-commentaries?event=Academic.

Duvall, J. Scott, and J. Daniels Hays. Grasping God’s Word: A Hands-on Approach to Reading, Interpreting, and Applying the Bible. Grand Rapids, MI: Zondervan, 2020.

Guthrie, George H. Hebrews. The NIV Application Commentary: from Biblical text- to Contemporary Life. Grand Rapids, MI: Zondervan, 1998.

Harrington, H. James. “Flowcharting.” In Evolutionary and Improvement Tools That Every Innovator Must Know, 71–94. New York, NY: Productivity Press, 2016. https://ebookcentral.proquest.com/lib/liberty/detail.action?docID=4689487.

Keener, Craig S. The IVP Bible Background Commentary: New Testament. Second. Downers Grove, IL: Intervarsity Press, 2014.

Klein, William W., Craig L. Blomberg, and Robert L. Hubbard. Introduction to Biblical Interpretation. 3rd ed. Grand Rapids, MI: Zondervan, 2017.

Lawrence, Michael. Biblical Theology in the Life of the Church: A Guide for Ministry. Wheaton, IL: Crossway, 2010.

Poythress, Vern S. Reading the Word of God in the Presence of God. Wheaton, IL: Crossway, 2016. https://ebookcentral.proquest.com/lib/liberty/detail.action?docID=6232853.

Schreiner, Thomas R. Hebrews. Edited by T. Desmond Alexander, Andreas J. Köstenberger, James M. Hamilton, Kenneth A. Mathews, and Terry L. Wilder. Evangelical Biblical Theology Commentary. Bellingham, WA: Lexham Press, 2020.

Walton, John H, Victor Harold Matthews, and Mark William Chavalas. The IVP Bible Background Commentary Old Testament. Downers Grove, IL : Intervarsity Press, 2000.

Thursday, June 28, 2018

MySQL 8.0 InnoDB Cluster on ARM64 with Oracle Linux and the Raspberry Pi 3B

Coming soon!

This blog will present a tutorial on configuring MySQL 8.0 InnoDB Cluster running Oracle Enterprise Linux 7 for ARM64 on Raspberry Pi 3 computers.


Friday, August 5, 2016

Announcing: MySQL Utilities release-1.6.4 GA

The MySQL Utilities Team is pleased to announce a new GA release of MySQL Utilities. This release includes a number of improvements for usability, stability, and a few enhancements for better compatibility with MySQL 5.7. A complete list of all improvements can be found in our release notes.

Many Improvements!


This release represents a stable release of the product and is a significant improvement from the 1.5 release. Along with defect patches, we also include the following enhancements.

  • Support for MySQL 5.7 
  • New! Binlog Utilities:
    • mysqlbinlogpurge - purge old binary logs
    • mysqlbinlogrotate - rotate the binary log
    • mysqlbinlogmove - relocate binary log files
  • New! Replication Utilities: 
    • mysqlslavetrx - skip transactions on one or more slaves to solve errant transactions and consistency error
  • New! General Utilities: 
    • mysqlgrants - show grants for users
  • Improved functionality of --exclude option with SQL wildcards
  • Improved packaging in RPM and Windows distributions
  • Improved accuracy of calculated disk usage for mysqldiskusage
  • Improved packaging in RPM and Windows distributions
  • Improved output for mysqldbcompare and mysqldiff
  • Improved SSL support
  • The Replication utilities have undergone a number of improvements for new 5.7 features as well as quality and usability improvements.
  • The documentation has been improved including more descriptions of SSL connections and clarification of replication commands.
  • Finally, this release contains a host of minor improvements for quality and robustness

How Can I Download MySQL Utilities?


You can download MySQL Utilities 1.6.4 GA from the following link using one of the pre-built installation repositories including a source download.

http://dev.mysql.com/downloads/tools/utilities/

Where is the Documentation?


You can find online documentation for MySQL Utilities version 1.6 at:

http://dev.mysql.com/doc/index-utils-fabric.html

Thursday, March 31, 2016

Announcing MySQL Utilities 1.6.3 Beta!

The MySQL Utilities Team is pleased to announce a new beta release of MySQL Utilities. This release includes a number of improvements for usability, stability, and a few enhancements. A complete list of all improvements can be found in our release notes.

New Enhancements!


This release represents a stable release of the product. Along with several defect patches, we also include the following enhancements.

Improved support for MySQL 5.7
Improved functionality of --exclude option with SQL wildcards
Improved packaging in RPM and Windows distributions
Improved accuracy of calculated disk usage for mysqldiskusage
...and a host of minor improvements for quality and robustness


How Can I Download MySQL Utilities?


You can download MySQL Utilities 1.6.3 Beta from the following link using one of the pre-built installation repositories including a source download. Click on "Development Releases" to see the 1.6.3 release downloads.

http://dev.mysql.com/downloads/tools/utilities/

Where is the Documentation?


You can find online documentation for MySQL Utilities version 1.6 at:

http://dev.mysql.com/doc/index-utils-fabric.html

Monday, February 22, 2016

New book: MySQL for the Internet of Things

Are you building an IOT solution and want to know how to store and retrieve your IOT data? Perhaps you're new to database systems and want to learn how to use them while you explore the exciting world of IOT.

This book is the answer for both scenarios; whether you're new to IOT and want to know how to leverage MySQL in your solution or you've wanted to learn more about MySQL, this book will provide many of the answers you seek.

The book also covers how to design your IOT solution around your data. Not only will you learn more about MySQL, but you will also see how best to deploy MySQL in your IOT solution using low-cost computer boards such as the Raspberry Pi, Beaglebone Black, Intel Galileo, and more.

Finally, the book will give you a thorough overview of how data can be augmented and annotated to make it easier to glean the golden nuggets of knowledge you seek while wading through your sensor data.



You can find my book at most online book sellers or directly from Apress.


Tuesday, January 19, 2016

New Release! MySQL Connector/Arduino 1.1

The newest release of the MySQL Connector/Arduino library release-1.1 alpha is available for download. This new version represents a major step forward for the library in ease of use. Here are just a few of the important changes in this release.

  • Added to Library Manager : yes, you can download and install the library from the Arduino IDE now. Just open the Library Manager and search for "MySQL".
  • More Example Sketches : there are many more example sketches of how to use the new library from basic connections to complex queries and more! 
  • Redesigned Classes : the library has been redesigned with new classes making it much easier to use a wider variety of shields and modules. Now, you pass in the Client class for your shield and so long as it adheres to the Ethernet.Client primitive, you can use any library to initiate the connector. No more #defines!
  • Better Memory Management : the new classes permit you to manage memory easier by allocating the MySQL_Query class dynamically leaving memory cleanup for the delete operation. No more free_* methods!
  • It's on GitHub! : yes, the code is now on GitHub making it much easier to log and track issues. See GitHub Repo.

Notes on Usage


If you have been using the previous versions of MySQL Connector/Arduino (1.0.4 and prior), do not despair as the old version remains in Launchpad and will be be left there for some time. Best of all, the new version does not cause conflicts with any of your existing sketches. That is, your existing sketches will not be affected by installing the new library.

However, if you want to use the newest version in your existing sketches, you will have to change a few things. Please see the section entitled "Changes from Previous Versions" in the reference manual located in the extras folder of the library source code.

How do I get it?


As mentioned, you can simply open the Library manager in the Arduino IDE from the Sketch->Include Library->Manage Libraries menu. This opens the Library Manager. In the filter your search box, enter "MySQL" then choose the connector and click Install. In seconds, the new library is installed and ready for use. Cool, eh?



You can also check the Library Manager periodically for updates to this or any of the libraries you have installed.

Of course, if you want to download the source code directly, you can find it on GitHub at GitHub Repo.

How do I use the library?


There is extensive documentation on how to use the library in the reference manual located in the extras folder. The document is named MySQL_Connector_Arduino_Reference_Manual.pdf.

What if I have Questions?


You can post questions to this blog or if you find a defect, open an issue of GitHub. However, before you do either, please read the documentation - even if you've been using the older versions as much has changed!

Enjoy!

Thursday, August 6, 2015

3D Printing with Delta Printers

I am very pleased to announce my latest book, "3D Printing with Delta Printers" (Apress 2015). This book is focused entirely on delta printers including how to properly, build, configure, calibrate, use, and maintain your delta printer. The book is a companion to my "Building and Maintaining Your 3D Printer" (Apress 2014).


You can find both books in bookstores and online book retailers.

Enjoy!

Wednesday, July 29, 2015

New! MySQL Connector/Arduino release-1.0.4 GA and Documentation

After several iterations and a long period of community evaluation, I am happy to report I've released the newest, stable release of the MySQL Connector/Arduino. This library is designed to allow you to connect your Arduino via an Ethernet or WiFi shield to a MySQL database server running on your network (or the Internet!).

New Documentation!

Best of all, I've written a reference manual that includes examples of how to use the connector in a variety of ways. Included in the document are advice on how to write your sketches, troubleshooting tips, and a long FAQ compiled from the many questions from my blogs.

Changes

The only code change in this release is to fix a defect when using the connector with the latest versions of MySQL.

Downloading the Connector

To download the connector library and the new reference manual, visit lp:mysql-arduino.

For More Information

As a reminder, there is a forum for Q&A which can be found here. I try to check and respond to forum entries weekly.

Happy Arduino!

Wednesday, March 4, 2015

Announcing MySQL Utilities release-1.6.1 Alpha!

The MySQL Utilities Team is pleased to announce a new alpha release of MySQL Utilities. This release includes a number of improvements for useabilty, stability, and a few enhancements. A complete list of all improvements can be found in our release notes.

New Enhancements!


This release represents a stable release of the product. Along with several defect patches, we also include the following enhancements.

Improved support for MySQL 5.7 early releases
Improved output for mysqldbcompare
Improved SSL support

New Utilities!


This release also has three new utilities for you to try out:

mysqlslavetrx - skip transactions on one or more slaves to solve errant transactions and consistency errors - docs
mysqlbinlogpurge - purge old binary logs - docs
mysqlbinlogrotate - rotate the binary logs - docs

How Can I Download MySQL Utilities?


You can download MySQL Utilities 1.6.1 Alpha from the following link using one of the pre-built installation repositories including a source download. Click on "Development Releases" to see the 1.6.1 release downloads.

http://dev.mysql.com/downloads/tools/utilities/

Where is the Documentation?


You can find online documentation for MySQL Utilities version 1.6 at:

http://dev.mysql.com/doc/index-utils-fabric.html

Announcing MySQL Utilities release-1.5.4 GA!

The MySQL Utilities Team is pleased to announce the general availability (GA) release of MySQL Utilities. This release includes a number of improvements for useabilty, stability, and a few enhancements. A complete list of all improvements can be found in our release notes.

New Enhancements!

 

This release represents a stable release of the product. Along with several defect patches, we also include the following enhancements.

  • Improved support for MySQL 5.7 early releases
  • Improved output for mysqldbcompare
  • Improved SSL support

How Can I Download MySQL Utilities?


You can download MySQL Utilities 1.5.2 GA from the following link using one of the pre-built installation repositories including a source download.

http://dev.mysql.com/downloads/tools/utilities/

Where is the Documentation?


You can find online documentation for MySQL Utilities version 1.5 at:

http://dev.mysql.com/doc/index-utils-fabric.html

New! Connector/Arduino release-1.0.3-rc is ready!

I've completed a new release of the Connector/Arduino! The new release contains some minor improvements as follows.

  • Code has been changed slightly to help with long latency issues over wifi and slow connections.
  • A new cleanup method was added to cleanup a final OK packet after a stored procedure call with a result.
  • Code now compiles without errors for the latest Beta Arduino IDE (const error).


Enjoy!

Sunday, September 28, 2014

Announcing MySQL Utilities release-1.5.2!

The MySQL Utilities Team is pleased to announce the general availability (GA) release of MySQL Utilities. This release includes a number of improvements for useabilty, stability, and a few enhancements. A complete list of all improvements can be found in our release_notes.

New Enhancements!

This release represents a stable release of the product. Along with several defect patches, we also include the following enhancements.
  • The mysqlserverclone utility now checks diskspace as a prerequisite to cloning the server.
  • The --force option was removed from the mysqlfailover utility to remove confusion on its purpose.
  • A warning is issued if the mysqld --skip-innodb option is used because this option is ignored in MySQL 5.7 and later.
  • Utilities can correctly parse and display the PROXY privilege for GRANT statements.
 

How Can I Download MySQL Utilities?

You can download MySQL Utilities 1.5.2 GA from the following link using one of the pre-built installation repositories including a source download. http://dev.mysql.com/downloads/tools/utilities/

Where is the Documentation?

You can find online documentation for MySQL Utilities version 1.5 at: http://dev.mysql.com/doc/index-utils-fabric.html

Announcing MySQL Utilities release-1.6.0-alpha

The MySQL Utilities Team is pleased to announce the alpha release of MySQL Utilities. This release represents a new evolution of the product including the following enhancements.
  • The mysqlprocgrep utility now displays the processes and connections killed during a --kill operation. The displayed rows come from the appropriate SHOW PROCESSLIST entries.
  • The mysqlbinlogmove utility was added. It relocates binary log files, and moves files based on their sequence number or modified date.
  • The mysqlgrants utility was added. It displays grants per object, and produces reports by user, user with grants, and GRANT statement.
  • Health reports can now be generated for a list of slaves without a master specified. In this case, "No master specified" appears for connection status for each slave, instead of an error.
 

How Can I Download MySQL Utilities?

You can download MySQL Utilities 1.6.0 Alpha from the following link using one of the pre-built installation repositories including a source download. Click on the Development Releases tab. http://dev.mysql.com/downloads/tools/utilities/

Do you want to learn more about DevOps and MySQL?

Are you attending Oracle Open World? Would you like to know more about Oracle DevOps products for managing your MySQL servers? If so, stop by Tuesday, September 30 at 10:15 in the Hotel Nikko - Bay View and join us for a hands on lab (HOL9234) for MySQL Utilities and Connector/Python.

We will present the basics for getting started using Python to manage your MySQL servers. MySQL Utilities includes utilities for a wide variety of operations from displaying GRANT statements to setting up automatic failover for replication.

Check out the abstract for the HOL here.

Thursday, September 4, 2014

3D Printing Mastery Just Got a Little Easier

My new book on 3D printing has been published! I must say this work has been a real joy to write. It's the book I wish existed when I first started playing with 3D printers.

Like most people who started with building their own 3D printer from scratch, I struggled to learn the concepts and get a firm foundation for how the machines work and how to work with them. I was dismayed by the lack of documentation and help available from most vendors. Indeed, most tend to say things like "do a Google search" rather than answer your questions directly.

Fortunately, there is a lot of information out there about 3D printing, especially from the RepRap community. Unfortunately, the sheer volume can be overwhelming for most and in some cases the information is either not entirely correct or is too specific for a certain printer to be a solution you can use. Furthermore, it can take hours to sift through the data to find what you need and even more time to separate fact from fiction.

I've already been through that and spent years sifting through the data. I have condensed everything I've learned into a medium-sized book that I think you will find to be the missing link from opening the box and setting up your printer for the first time to printing quality prints with confidence.

I cover topics ranging from how to calibrate your printer to troubleshooting hardware, software, and even printing problems. While it won't make you a master of your 3D printer overnight, it will take you a lot further along in a short amount of time!

Check it out: http://www.apress.com/9781430268093


Thursday, April 3, 2014

New! MySQL Utilities release-1.4.2-RC

The MySQL Utilities Team is pleased to announce the latest release candidate (RC) release of MySQL Utilities. This release includes a number of improvements for useabilty, stability, and a few enhancements. A complete list of all improvements can be found in our release_notes.

New Utilities!


We have also included two new utilities.
  • The mysqlrplsync utility was added, which checks data consistency between servers in a replicated setup. 
  • The mysqlrplms utility was added, which provides round-robin multi-source replication (a slave server continually cycles through multiple masters in order to store a consolidated data set).

How Can I Download MySQL Utilities?


You can download MySQL Utilities 1.4.2 from the following link using one of the pre-built installation repositories including a source download. Click on the Development Releases tab.

http://dev.mysql.com/downloads/tools/utilities/

Where is the Documentation?


You can find online documentation for MySQL Utilities version 1.4 at:

http://dev.mysql.com/doc/index-gui.html

Wednesday, April 2, 2014

Announcing MySQL Connector/Arduino 1.0.2 Beta

I've completed a new release of the Connector/Arduino! The new release contains some major improvements with memory handling.
  • The library has been trimmed to save memory.
    • Static strings moved to PROGMEM strings
    • Unused structures removed (e.g. ok_packet)
    • Moved two more methods to optional compilation
  • The WITH_SELECT is turned *OFF* by default. If you want to use select queries, be sure to uncomment this in the mysql.h file.
  • Added a CHANGES.txt file to track changes between releases.

Memory, What Memory?


If you have used previous versions of the connector in medium to large sketches or have long query strings or even many variables, chances are you have hit the memory limit for your wee Arduino board.

This can manifest itself in a number of ways. Most notably, the sketch may work for you until you add more code or more sensors in which it can fail to connect to the server. It can also exhibit random reboots or random freezes. If this is happening to you, it is most likely a memory issue.

That is, the old version of the connector consumed nearly 70% of available dynamic memory - the memory used for variables. When the Arduino exceeds its memory limit, sketches will exhibit strange behavior or the board may reboot.

Many people have encountered this so I've worked hard to try and squeeze more memory out of the connector. Which isn't easy considering it must keep a buffer of the data being sent to (or received from) the server.

Let's see an example. The old version of the connector (1.0.1b), when compiled with the hello_mysql example for a Uno, consumes about 68% of available dynamic memory leaving only 637 bytes for your own variables. That's fine for a simple sketch but if you want to do complex queries building INSERT statements from several sensors or including other libraries for additional features (like an LCD), you're not going to be happy.

While you can (and should) limit your memory use and even make use of PROGMEM for your static strings (and calling cmd_query_P()), it still isn't enough free memory for larger sketches. The following is the compile message generated by the beta release of the Arduino IDE (1.5.4).

Sketch uses 22,376 bytes (69%) of program storage space. Maximum is 32,256 bytes.
Global variables use 1,411 bytes (68%) of dynamic memory, leaving 637 bytes for local variables. Maximum is 2,048 bytes.

 

Now, with the new version of the library and SELECT turned on, the connector consumes only 58% of dynamic memory as shown below. While that is better, it isn't quite where we need to be.

Sketch uses 22,152 bytes (68%) of program storage space. Maximum is 32,256 bytes.
Global variables use 1,197 bytes (58%) of dynamic memory, leaving 851 bytes for local variables. Maximum is 2,048 bytes.

 

If we turn off the SELECT feature with the new version, we get a little better.

Sketch uses 20,736 bytes (64%) of program storage space. Maximum is 32,256 bytes.
Global variables use 1,064 bytes (51%) of dynamic memory, leaving 984 bytes for local variables. Maximum is 2,048 bytes.

 

Ah, now we're cooking. The dynamic memory usage is down to 51%. Much better.


Choosing the Right Board


One of the things users new to the connector have struggled with is choosing the right Arduino board for their project. The connector is a non-trivial library that consumes (relatively) a lot of memory. If you want to write a really big sketch using lots of variables, strings, etc., you will need to use a board with more memory.

This is especially true when you combine the connector with other libraries like those made for some sensors, shields, and more. The combined memory for the connector and the other libraries can consume a lot of dynamic memory leaving you very little to use for your own variables.

While most solve the problem by switching to a Mega board, that has its own issues because some of the pins differ from the smaller (memory-wise, not size-wise) boards. A few Google searches will quickly find solutions to these problems (hint: software serial).

So which board should you choose? I've done some research for you and have compiled a simple MySQL sketch using the new version of the connector on a variety of boards. The following lists the memory usage reports from the Arduino Beta IDE. In this case, the compilations are with SELECT turned off (which is the new default).

  • Duemilanove, Uno : 1,064 bytes (51%) of dynamic memory, leaving 984 bytes for local variables
  • Leonardo : 1,028 bytes (40%) of dynamic memory, leaving 1,532 bytes for local variables
  • Mega 2560 : 1,550 bytes (18%) of dynamic memory, leaving 6,642 bytes for local variables
  • Yun : 1,028 bytes (40%) of dynamic memory, leaving 1,532 bytes for local variables

As you can see, using the older Uno-style boards are going to limit your ability to write complex sketches with many variables, logic, etc. However, a Leonardo or even a Yun board may be a better choice especially if you run out of memory on the Uno-style board. Of course, the Mega is the best choice if your sketch is going to be very complex or if you need to store a lot of values in memory or use other, large libraries.

Conclusion


I hope this new version solves many of your problems with memory. I've tried to shrink it down as much as I can without radical changes. I believe the majority of the connection failures and freezes will be solved with this new version. Please feel free to provide feedback on this blog or (better) on the Oracle Connector/Arduino forum.

http://forums.mysql.com/list.php?175

Tuesday, February 4, 2014

Announcing MySQL Connector/Arduino 1.0.1 Beta

I've completed a new release of the Connector/Arduino. The new version supports a few refinements and a new feature.

  • New! disconnect() method - enables disconnect from server. Note: you must call mysql_connect() to reconnect.
  • Better error handling for dropped packets. No more random reboots when bad packet appears.
  • Library can recover from short-term loss of connectivity. Along with bad packets is a check to make sure what is received is valid making the connector ignore garbage packets associated with a dropped connection.
  • Detection of Out of Memory condition. Should there not be enough memory to allocate the buffer for the Connector, you will see an OOM error (enable the serial monitor to see the errors). This reduces random reboots when memory gets too low.
I made this release because a number of people were running into problems with noisy, tenuous, or just plain bad network connections. Also, some do not want to hold the connection open on the database server. This release addresses all of these issues.

Did you say disconnect?


Yes, that's right, you can now disconnect from the server should you want to write sketches that connect to the MySQL server for only a brief period then sleep, calculate the distance to Alpha-centuri, make coffee, etc. It is also helpful for those sketches that will update the database only once every few minutes, hours, or days permitting you to connect, run a query, then disconnect on the interval.

But wait...what about when the Ethernet shield goes wonky?


I have also devised a way to overcome the problem of the Ethernet shield controller going away. That is, if your Arduino looses connectivity for more than a few seconds (about 15-30), the Ethernet shield could wig out and fail to respond. The rest of your sketch will continue to run but calls to the Ethernet library will be ignored (how rude).

So...what to do? In short, we need to reboot the Ethernet shield. You could make a hardware-based connection to the reset button but some have reported problems with this solution. And it is a hard reset for the Arduino too - they are inseparable.

Rather than use hardware, I've devised a way to force the Arduino to reload its software. This won't fix any hardware issues like the reset button will but it will restore the Ethernet shield to proper operation.

Ok, I'm sold. How do I do it?


First, you need a variable and a define to set a threshold.

int num_fails;
#define MAX_FAILED_CONNECTS 5


Next, you need a method that will force the Arduino to reload. In this case, I use the tricky jump-to-zero address code which is sort of like a bootstrap (but not quite). Anyway, it works!

void soft_reset() {
  asm volatile("jmp 0");
}


To use this in your sketch, modify the loop() method (or where ever you put your MySQL connector code) as follows:

Note: this assumes your initial mysql_connect() call is in setup() like I originally intended. Modify the following accordingly if that is not the case.

void loop() {
  delay(1000);
  if (my_conn.is_connected()) {
    my_conn.cmd_query(QUERY_SQL); // <-- br="" goes="" here="" query="" your="">    delay(1000);
    num_fails = 0;
  } else {
    my_conn.disconnect();
    Serial.println("Connecting...");
    if (my_conn.mysql_connect(server_addr, 3306, user, password)) {
      delay(500);
      Serial.println("Success!");
      num_fails = 0;
    } else {
      num_fails++;
      Serial.println("Connect failed!");
      if (num_fails == MAX_FAILED_CONNECTS) {
        Serial.println("Ok, that's it. I'm outta here. Rebooting...");
        delay(2000);
        soft_reset();
      }
    }
  }
}


Notice the counter num_fails is incremented any time the connection to the MySQL server fails and is reset when it succeeds. If num_fails reaches the value of MAX_FAILED_CONNECTS, the sketch will call the soft_reset() method and the Arduino will be reloaded (not the same as restarting or resetting - keep that in mind if you use components that require a true reset to initialize).

So now if your sketch runs happily for a time but looses its connection to the database server for a long period, it will reboot itself and therefore reestablish a connection - assuming the network or server is back up.

Note: this code is in the hello_mysql_reboot sketch in the examples folder.

Enjoy!

Thursday, December 19, 2013

New! MySQL Utilities release-1.3.6 GA

The MySQL Utilities Team is pleased to announce the latest GA release of MySQL Utilities. This release includes a number of improvements for usability, stability, and a few enhancements. We have also included a performance upgrade for exporting, importing, and copying databases.

Improvements


The following highlights a few of the more significant improvements.

* mysqldbexport, mysqldbimport, and mysqldbcopy have multiprocessing support that allows for much improved performance
* mysqlfrm can now generate a .frm file with storage engine substitution
* Mac OS X packages added!
* mysqlserverinfo now includes the log files (error, general, slow)
* mysqlprocgrep can now search and kill processes by id
* mysqlmetagrep can now search the body of routines with the new --body option
* all utilities report license type with --version and --help
* all utilities have the new --license option to view the license text
* the mysqluc now reports errors with clearer text and tags the message with the name of the utility that returned the error
* mysqlindexcheck now warns user if there is not enough information to calculate best/worst indexes
* rpm, debian, and msi packages will update/remove old versions automatically when installing a newer version
* the documentation is now a separate reference manual (see link below)

The following spotlight some of the more important enhancements.

Multiprocessing with mysqldbexport, mysqldbimport, and mysqldbcopy


The performance of the mysqldbcopy, mysqldbexport and mysqldbimport utilities has been significantly improved. Moreover, a new --multiprocess option was added to allow concurrent execution making the most of the available CPU resources (the number of CPU cores).

Note: the --thread option in mysqldbcopy was replaced by the --multiprocess option.

Multiprocessing is applied at different levels according to the operating system. The utilities mysqldbcopy and mysqldbexport allow multiprocessing at the table-level for non-Windows systems and at the database-level for Windows system. The mysqldbimport utility allows multiprocessing at the file-level independently from the OS.

Other more specific options were also added for performance reasons for the other utility. A new --output-file option was added to mysqldbexport to specify a file to store the generated output which allows faster output than sending messages to the terminal.

Two additional additional options are now available in mysqldbimport: 1) --autocommit to enable autocommit for each operation because now by default a single commit is performed at the end of importing each file which is much faster, and 2) --max-bulk-insert to adjust the maximum number of inserts in a bulk, following the improved bulk insert support that is now provided.

Create New .frm Files with New Storage Engine


The mysqlfrm utility allows you to use the --new-storage-engine and the new --frmdir option to provide a directory to store the new .frm files. This feature is useful for those who want to recover the CREATE statement from existing .frm files and change the storage engine without having to launch the server. Try it out!

Mac OS X Installer


Yes, we now have a Mac OS X package installer. If you install Utilities with this installer, you will need to either use Connector/Python version 1.1.4 or later (which has a Mac OS X installer too) or use the Connector/Python 1.0.8 or later source code package and install manually.

How Can I Download MySQL Utilities?


You can download MySQL Utilities 1.3.6 from the following link using one of the pre-built installation repositories including a source download.

http://dev.mysql.com/downloads/tools/utilities/

If you are a commercial customer, you can download MySQL Utilities from the following link:

https://edelivery.oracle.com/

MySQL Utilities is also available on Lauchpad as a source download at:

https://code.launchpad.net/mysql-utilities

Where is the Documentation?


You can find online documentation for MySQL Utilities version 1.3 at:

http://dev.mysql.com/doc/index-gui.html

Wednesday, October 23, 2013

Introducing MySQL Connector/Arduino 1.0.0 beta

There is a new release of the Connector/Arduino on Launchpad! See https://launchpad.net/mysql-arduino. The new version supports a number of refinements and a few new features. These include:
  • Improved support for processing result sets
  • Conditional compilation to omit result set handling features to save program space
  • Support for the Arduino WiFi shield
  • New version() method to check version of the connector
  • Simplified download (no more patching SHA1!)

So What is It?


If you have never heard of Connector/Arduino, it is simply a library designed to allow the Arduino platform to connect to and issue queries to a MySQL Database server.

Simply add an Ethernet shield to your Arduino and use the library to connect your Arduino to a MySQL database server. Yes, no more web-based hand waving or third party systems! Cool.

New Feature : Improved Support for Result Sets


In the previous version of the connector, there was a method named show_results() which demonstrated how to read result sets (rows returned from the server from a SHOW or SELECT query).

Unfortunately, this method was too obtuse to be of any use to all but the most devoted connector fan (you had to know the source code really well). Perhaps worse, you had to modify the library directly to use the methods demonstrated.

Why was it like that? Simply because I felt SELECT queries would be very rare and used by only a very small number of people. I was wrong. Live and learn, eh?

The good news is the new version has additional methods that can be called from outside the library making it much, much easier to get results from your database. Let's see how to do this.

Example: Getting a Lookup Value


I think the most popular request for supporting SELECT queries was to allow for an easy way to query the database for a lookup value. Since lookup queries are (or should be) designed to return exactly one row, we can simplify the code as follows.

Recall when the MySQL server returns a result set, the first thing returned is a list of the columns in the result set. Next are the rows. So we must process the columns first.

  // SELECT query for lookup value (1 row returned)
  // Here we get a value from the database and use it.
  long head_count = 0;
  my_conn.cmd_query(QUERY_POP);
  // We ignore the columns but we have to read them to get that data out of the queue
  my_conn.get_columns();
  // Now we read the rows.
  row_values *row = NULL;
  do {
    row = my_conn.get_next_row();
    // We use the first value returned in the row - population of NYC!
    if (row != NULL) {
      head_count = atol(row->values[0]);
    }
  } while (row != NULL);
  // We're done with the buffers so Ok to clear them (and save precious memory).
  my_conn.free_columns_buffer();
  my_conn.free_row_buffer();
  // Now, let's do something with the data.
  Serial.print("NYC pop = ");
  Serial.println(head_count);


In this example, I query the database for the population of New York City (nervemind the validity of that value), then use the value by printing it out. Notice the basic structure is still there - read columns then read rows but in this case we ignore the columns because we don't need that data. We still need the free_*_buffer() calls to free memory however. I explain these methods in the next example.

Example: Processing Result Sets


The next most popular request for supporting result queries was being able to loop through a result set and do something with the data. In this example, I create a method in my sketch to execute the query and process the results. Let's look at the code first.

/**
 * do_query - execute a query and display results
 *
 * This method demonstrates how to execute a query, get the column
 * names and print them, then read rows printing the values. It
 * is a mirror of the show_results() example in the connector class.
 *
 * You can use this method as a template for writing methods that
 * must iterate over rows from a SELECT and operate on the values read.
 *
 */
/*
void do_query(const char *q) {
  column_names *c; // pointer to column values
  row_values *r;   // pointer to row values

  // First, execute query. If it returns a value pointer,
  // we have a result set to process. If not, we exit.
 

  if (!my_conn.cmd_query(q)) {
    return;
  }

  // Next, we read the column names and display them.
 
  // NOTICE: You must *always* read the column names even if
  //         you do not use them. This is so the connector can
  //         read the data out of the buffer. Row data follows the
  //         column data and thus must be read first.
 

  c = my_conn.get_columns();
  for (int i = 0; i < c->num_fields; i++) {
    Serial.print(c->fields[i]->name);
    if (i < c->num_fields - 1) {
      Serial.print(",");
    }
  }
  Serial.println();

  // Next, we use the get_next_row() iterator and read rows printing
  // the values returned until the get_next_row() returns NULL.
 

  int num_cols = c->num_fields;
  int rows = 0;
  do {
    r = my_conn.get_next_row();
    if (r) {
      rows++;
      for (int i = 0; i < num_cols; i++) {
        Serial.print(r->values[i]);
        if (i < num_cols - 1) {
          Serial.print(", ");
        }
      }
      Serial.println();
 

      // Note: we free the row read to free the memory allocated for it.
      // You should do this after you've processed the row.
 

      my_conn.free_row_buffer();
    }
  } while (r);
  Serial.print(rows);
  Serial.println(" rows in result.");

  // Finally, we are done so we free the column buffers
 

  my_conn.free_columns_buffer();
}


So what's going on here? Notice how the code is structured to execute the query and if there are results (cmd_query() does not return NULL), we read the column headers. Why? Because the server always sends the column data back first for every result set.

The return from the get_columns() method is a structure that contains an array of field structures. Here are the structures:

// Structure for retrieving a field (minimal implementation).
typedef struct {
  char *db;
  char *table;
  char *name;
} field_struct;

// Structure for storing result set metadata.
typedef struct {
  int num_fields;     // actual number of fields
  field_struct *fields[MAX_FIELDS];
} column_names;


Notice the column_names structure has a fields array. Use that array to get information about each field in the form of the field_struct (see above) structure. In that structure, you will be able to get the database name, table name, and column name. Notice in the example I simply print out the column name and a comma after each except the last column.

Next, we read the rows using a special iterator named get_next_row() which returns a pointer to a row structure that contains an array of the field values as follows:

// Structure for storing row data.
typedef struct {
  char *values[MAX_FIELDS];
} row_values;


In this case, while get_next_row() returns a valid pointer (not NULL indicating a row has been read), we access each field and print out the values.

You may be wondering what is MAX_FIELDS? Well, it is an easy way to make sure we limit our array to a maximum number of columns. This is defined in mysql.h and is set to 32. If you want to save a few bytes, you can change that value to something lower but beware: if you exceed that value, your code will wander off into la-la-land (via an unreferenced pointer). There is no end of array checking so tread lightly.

Notice also there are calls to free_row_buffer() and free_columns_buffer(). These are memory cleanup methods needed to free any memory allocated when reading columns and row values (hey - we got to put it somewhere!).

We call the free_row_buffer() after we are finished processing the row and the free_columns_buffer() at the end of the method. If you fail to add these to your own query handler method, you will run out of memory quickly.

Why is it a manual process? Well, like the MAX_FIELDS setting, I wanted to keep it simple and therefore save as much space as possible. Automatic garbage collection would have added a significant amount of code. Likewise array bound checking would have add a bit more.

You can use this method as a template to build your own custom query handler. For example, instead of printing the data to the serial monitor, you could display it in an LCD or perhaps use the information in another part of your sketch.


New Feature : Conditional Compilation


If you find you do not need the result set support, you can use conditional compilation to remove the methods and code from the connector. This can save you about 2k of program memory!

To do this, simply edit the mysql.h file and comment out this code:

//#define WITH_SELECT  // Comment out this for use without SELECT capability
                       // to save space.


This will tell the compiler to ignore key result set handling methods and code from the connector.

If you do this but find there are methods suddenly missing (via compilation errors), check your sketch to make sure you are not using show_results(), get_columns(), get_next_row(), and similar methods. This is because with the SELECT code turned off, these methods no longer exist in the compiled library. Uncomment the #define WITH_SELECT to add them back.

New Feature : Support for WiFi Shield


To use the WiFi shield, you need only make a few changes to your sketch and a minor change to the library.

Note: You will need to download the WiFi library and install it to use the WiFi shield. See http://arduino.cc/en/Main/ArduinoWiFiShield for more information.

First, add the #include for the WiFi library *before* the include for the connector (mysql.h).

#include <WiFi.h>  // Use this for WiFi
#include <mysql.h>


Next, setup your choice of WiFi connection options in your setup() method. While you're there, comment out the Ethernet.begin() call.

// WiFi card example
char ssid[] = "my_lonely_ssid";
char pass[] = "horse_no_name";

void setup() {
  Serial.begin(115200);
  while (!Serial); // wait for serial port to connect. Needed for Leonardo only

//  Ethernet.begin(mac_addr);

  // WiFi section
  int status = WiFi.begin(ssid, pass);
  // if you're not connected, stop here:
  if ( status != WL_CONNECTED) {
    Serial.println("Couldn't get a wifi connection");
    while(true);
  }
  // if you are connected, print out info about the connection:
  else {
    Serial.println("Connected to network");
    IPAddress ip = WiFi.localIP();
    Serial.print("My IP address is: ");
    Serial.println(ip);
  }
...


Lastly, you need to make one small change to the connector itself. Open the mysql.h file and uncomment these two lines:

#define WIFI       // Uncomment out this for use with the WiFi shield
#include <WiFi.h>  // Uncomment out this for use with the WiFi shield


This tells the connector to use the conditional compilation sections to turn on support for the WiFi shield.

New Feature : version() method


I've added a method to return the version of the connector as a string. If you don't have this method, you're using an old version of the connector. As more releases of the connector occur, this method will be key in diagnosing problems or checking for support of certain features.

(Somewhat) New Feature : Single File Download


This was actually added to the Launchpad site for the previous version of the connector (version 1.0.0 alpha). But I'm making it the default download method from now on. You can still get the code the old way (by using bzr to clone the tree) but the single file download makes it much easier.

Simply download the file, extract it, then place the two folders; mysql_connector and sha1 in your libraries folder then restart the IDE. Install done!

I hope you enjoy the new enhancements.