Хэл Фултон - Программирование на языке Ruby
- Название:Программирование на языке Ruby
- Автор:
- Жанр:
- Издательство:ДМК Пресс
- Год:2007
- Город:Москва
- ISBN:5-94074-357-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Хэл Фултон - Программирование на языке Ruby краткое содержание
Ruby — относительно новый объектно-ориентированный язык, разработанный Юкихиро Мацумото в 1995 году и позаимствовавший некоторые особенности у языков LISP, Smalltalk, Perl, CLU и других. Язык активно развивается и применяется в самых разных областях: от системного администрирования до разработки сложных динамических сайтов.
Книга является полноценным руководством по Ruby — ее можно использовать и как учебник, и как справочник, и как сборник ответов на вопросы типа «как сделать то или иное в Ruby». В ней приведено свыше 400 примеров, разбитых по различным аспектам программирования, и к которым автор дает обстоятельные комментарии.
Издание предназначено для программистов самого широкого круга и самой разной квалификации, желающих научиться качественно и профессионально работать на Ruby.
Программирование на языке Ruby - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Для работы с таблицами нужно уметь выполнять запросы. Для этого служат методы PGconn#exec
и PGconn#query
.
Метод exec
посылает переданную ему строку — SQL-запрос — серверу PostgreSQL и получает ответ в виде объекта PGresult
, если выполнение завершилось успешно. В противном случае он возбуждает исключение PGError
.
Метод query
также посылает свой строковый параметр в виде SQL-запроса. Но в случае успеха получает массив кортежей. В случае ошибки возвращается nil
, а подробности можно получить, вызвав метод error
.
Имеется специальный метод insert_table
для вставки записи в указанную таблицу. Вопреки названию он не создает новую таблицу, а добавляет данные в существующую. Этот метод возвращает объект PGconn
.
conn.insert_table("rtest",[[34]])
res = conn.query("select * from rtest")
res равно [["99"], ["34"]]
В этом примере в таблицу rtest
вставляется одна строка. Для простоты мы указали только одну колонку. Отметим, что объект res
класса PGresult
после обновления возвращает массив из двух кортежей. Чуть ниже мы рассмотрим методы, определенные в классе PGresult
.
В классе PGconn
определены также следующие полезные методы:
• db
возвращает имя базы, с которой установлено соединение;
• host
возвращает имя сервера, с которым установлено соединение;
• user
возвращает имя аутентифицированного пользователя;
• error
возвращает сообщение об ошибке;
• finish
, close
закрывают соединение;
• loimport(file)
импортирует файл в большой двоичный объект (BLOB), в случае успеха возвращает объект PGlarge
, иначе возбуждает исключение PGError
;
• loexport(oid, file)
выгружает BLOB с идентификатор oid
в указанный файл;
• locreate([mode])
возвращает объект PGlarge
в случае успеха, иначе возбуждает исключение PGError
;
• loopen(oid, [mode])
открывает BLOB с идентификатором oid
. Возвращает объект PGlarge
в случае успеха. Аргумент mode
задает режим работы с открытым объектом: "INV_READ"
или "INV_WRITE"
(если этот аргумент опущен, по умолчанию предполагается "INV_READ"
);
• lounlink(oid)
удаляет BLOB с идентификатором oid
.
Отметим, что пять последних методов ( loimport
, loexport
, locreate
, loopen
и lounlink
) работают с объектами класса PGlarge
. У этого класса есть собственные методы для доступа к объекту и его изменения. (BLOB'ы создаются в результате выполнения методов loimport
, locreate
, loopen
экземпляра.)
Ниже перечислены методы, определенные в классе PGlarge
:
• open([mode])
открывает BLOB. Аргумент mode
задает режим работы с объектом, как и в случае с методом PGconn#loopen
);
• close
закрывает BLOB (BLOB'ы также закрываются автоматически, когда их обнаруживает сборщик мусора);
• read([length])
пытается прочитать length
байтов из BLOB'a. Если параметр length
не задан, читаются все данные;
• write(str)
записывает строку в BLOB и возвращает число записанных байтов;
• tell
возвращает текущую позицию указателя;
• seek(offset, whence)
перемещает указатель в позицию offset
. Параметр whence
может принимать значения SEEK_SET
, SEEK_CUR
и SEEK_END
(равные соответственно 0,1,2);
• unlink
удаляет BLOB;
• oid
возвращает идентификатор BLOB'a;
• size
возвращает размер BLOB'a;
• export(file)
сохраняет BLOB в файле с указанным именем.
Более интересны методы экземпляра, определенные в классе PGresult
(перечислены ниже). Объект такого класса возвращается в результате успешного выполнения запроса. (Для экономии памяти вызывайте метод PGresult#clear
по завершении работы с таким объектом.)
• result
возвращает массив кортежей, описывающих результат запроса;
• each
— итератор;
• []
— метод доступа;
• fields
возвращает массив описаний полей результата запроса;
• num_tuples
возвращает число кортежей в результате запроса;
• fieldnum(name)
возвращает индекс поля с указанным именем;
• type(index)
возвращает целое число, соответствующее типу поля;
• size(index)
возвращает размер поля в байтах. 1 означает, что поле имеет переменную длину;
• getvalue(tup_num, field_num)
возвращает значение поля с указанным порядковым номером; tup_num
— номер строки;
• getlength(tup_num, field_num)
возвращает длину поля в байтах;
• cmdstatus
возвращает строку состояния для последнего запроса;
• clear
очищает объект PGresult
.
10.4.4. Интерфейс с LDAP
Для Ruby есть по меньшей мере три разных библиотеки, позволяющих работать с протоколом LDAP. Ruby/LDAP, написанная Такааки Татеиси (Takaaki Tateishi), — это довольно «тонкая» обертка. Если вы хорошо знакомы с LDAP, то ее может оказаться достаточно; в противном случае вы, наверное, сочтете ее слишком сложной. Пример:
conn = LDAP::Conn.new("rsads02.foo.com")
conn.bind("CN=username,CN=Users,DC=foo,DC=com", "password") do |bound|
bound.search("DC=foo,DC=com", LDAP::LDAP_SCOPE_SUBTREE,
"(&(name=*) (objectCategory=person))", ['name','ipPhone'])
do |user|
puts "#{user['name']} #{user['ipPhone']}"
end
end
Библиотека ActiveLDAP
организована по образцу ActiveRecord
. Вот пример ее использования, взятый с домашней страницы:
require 'activeldap'
require 'examples/objects/user'
require 'password'
# Установить соединение Ruby/ActiveLDAP и т. д.
ActiveLDAP::Base.connect(:password_block
=> Proc.new { Password.get('Password: ') },
:allow_anonymous => false)
# Загрузить запись с данными о пользователе
# (ее класс определен в примерах).
wad = User.new('wad')
# Напечатать общее имя.
р wad.cn
# Изменить общее имя.
wad.cn = "Will"
# Сохранить в LDAP.
wad.write
Есть также сравнительно недавняя библиотека, написанная Фрэнсисом Чианфрокка (Francis Cianfrocca), многие предпочитают именно ее:
require 'net/ldap'
ldap = Net::LDAP.new :host => server_ip_address,
:port => 389,
:auth => {
:method => :simple,
:username => "cn=manager,dc=example,dc=com",
:password => "opensesame"
}
filter = Net::LDAP::Filter.eq( "cn", "George*" )
treebase = "dc=example,dc=com"
ldap.search( :base => treebase, :filter => filter ) do |entry|
puts "DN: #{entry.dn}"
entry.each do |attribute, values|
puts " #{attribute}:"
values.each do |value|
puts " --->#{value}"
end
end
end
p ldap.get_operation_result
Какая из этих библиотек лучше — дело вкуса. Я рекомендую познакомиться со всеми и сформировать собственное мнение.
10.4.5. Интерфейс с Oracle
Oracle — одна из наиболее мощных и популярных СУБД в мире. Понятно, что было много попыток реализовать интерфейс с этой базой данных из Ruby. На сегодняшний день лучшей считается библиотека OCI8, которую написал Кубо Такехиро (Kubo Takehiro).
Читать дальшеИнтервал:
Закладка: